String () { final @NonNls StringBuilder buffer = new StringBuilder(); buffer.append("Types:\n").append(getTypeEvaluator().getReport()).append("\n"); buffer.append("Conversions:\n"); final String[] conversions = new String[myConversions.size()]; int k = 0; for (PsiElement expr : myConversions.keySet()) { final Object conversion = myConversions.get(expr); if (conversion instanceof Pair && ((Pair<?, ?>)conversion).first == null) { conversions[k++] = (expr.getText() + " -> " + ((Pair<?, ?>)conversion).second + "\n"); } else { conversions[k++] = (expr.getText() + " -> " + conversion + "\n"); } } Arrays.sort(conversions); for (String conversion : conversions) { buffer.append(conversion); } buffer.append("\nNew expression type changes:\n"); final String[] newChanges = new String[myNewExpressionTypeChange.size()]; k = 0; for (Map.Entry<TypeMigrationUsageInfo, PsiType> entry : myNewExpressionTypeChange.entrySet()) { final PsiElement element = entry.getKey().getElement(); newChanges[k++] = (element != null ? element.getText() : entry.getKey()) + " -> " + entry.getValue().getCanonicalText() + "\n"; } Arrays.sort(newChanges); for (String change : newChanges) { buffer.append(change); } buffer.append("Fails:\n"); final ArrayList<Pair<SmartPsiElementPointer<PsiElement>, PsiType>> failsList = new ArrayList<>(myFailedConversions.keySet()); failsList.sort((o1, o2) -> { final PsiElement element1 = o1.getFirst().getElement(); final PsiElement element2 = o2.getFirst().getElement(); if (element1 == null || element2 == null) return 0; return element1.getText().compareTo(element2.getText()); }); for (Pair<SmartPsiElementPointer<PsiElement>, PsiType> p : failsList) { final PsiElement element = p.getFirst().getElement(); if (element != null) { buffer.append(element.getText()).append("->").append(p.getSecond().getCanonicalText()).append("\n"); } } return buffer.toString(); }