String () { @NonNls StringBuilder buffer = new StringBuilder(); buffer.append("Victims:\n"); for (final PsiElement element : myElements) { final PsiType type = myTypes.get(element); if (type == null) { continue; } if (element instanceof PsiParameter param) { final PsiElement declarationScope = param.getDeclarationScope(); if (declarationScope instanceof PsiMethod method) { buffer.append(" parameter " + method.getParameterList().getParameterIndex(param) + " of " + memberString(method)); } else { buffer.append(" parameter of foreach"); } } else if (element instanceof PsiField) { buffer.append(" field " + memberString(((PsiField)element))); } else if (element instanceof PsiLocalVariable) { buffer.append(" local " + variableString(((PsiLocalVariable)element))); } else if (element instanceof PsiMethod) { buffer.append(" return of " + memberString(((PsiMethod)element))); } else if (element instanceof PsiNewExpression) { buffer.append(" " + element.getText()); } else if (element instanceof PsiTypeCastExpression) { buffer.append(" " + element.getText()); } else { buffer.append(" unknown: " + (element == null ? "null" : element.getClass().getName())); } buffer.append(" " + type.getCanonicalText() + "\n"); } buffer.append("Variables: " + myTypeVariableFactory.getNumber() + "\n"); buffer.append("Bound variables: "); if (myBoundVariables == null) { buffer.append(" not specified\n"); } else { for (final PsiTypeVariable boundVariable : myBoundVariables) { buffer.append(boundVariable.getIndex() + ", "); } } buffer.append("Constraints: " + myConstraints.size() + "\n"); for (final Constraint constraint : myConstraints) { buffer.append(" " + constraint + "\n"); } return buffer.toString(); }