diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java b/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java index 2a9617f927a..1322f06ce71 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java @@ -16,8 +16,6 @@ package org.jetbrains.jet.cli.common.messages; -import com.google.common.collect.Lists; -import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; @@ -36,9 +34,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; + +import static org.jetbrains.jet.lang.diagnostics.DiagnosticUtils.sortedDiagnostics; /** * @author Pavel Talanov @@ -116,35 +113,12 @@ public final class AnalyzerWithCompilerReport { public static boolean reportDiagnostics(@NotNull BindingContext bindingContext, @NotNull MessageCollector messageCollector) { boolean hasErrors = false; - List diagnostics = Lists.newArrayList(bindingContext.getDiagnostics()); - sortDiagnostics(diagnostics); - for (Diagnostic diagnostic : diagnostics) { + for (Diagnostic diagnostic : sortedDiagnostics(bindingContext.getDiagnostics())) { hasErrors |= reportDiagnostic(diagnostic, messageCollector); } return hasErrors; } - private static void sortDiagnostics(@NotNull List diagnostics) { - Comparator diagnosticComparator = new Comparator() { - @Override - public int compare(Diagnostic d1, Diagnostic d2) { - String path1 = d1.getPsiFile().getViewProvider().getVirtualFile().getPath(); - String path2 = d2.getPsiFile().getViewProvider().getVirtualFile().getPath(); - if (!path1.equals(path2)) return path1.compareTo(path2); - - TextRange range1 = DiagnosticUtils.firstRange(d1.getTextRanges()); - TextRange range2 = DiagnosticUtils.firstRange(d2.getTextRanges()); - - if (!range1.equals(range2)) { - return DiagnosticUtils.TEXT_RANGE_COMPARATOR.compare(range1, range2); - } - - return d1.getFactory().getName().compareTo(d2.getFactory().getName()); - } - }; - Collections.sort(diagnostics, diagnosticComparator); - } - private void reportSyntaxErrors(@NotNull Collection files) { for (JetFile file : files) { reportSyntaxErrors(file, messageCollectorWrapper); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java index 14f1e144554..f4b67301c87 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticUtils.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.diagnostics; +import com.google.common.collect.Lists; import com.intellij.lang.ASTNode; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; @@ -30,6 +31,7 @@ import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -39,7 +41,7 @@ import java.util.List; */ public class DiagnosticUtils { @NotNull - public static final Comparator TEXT_RANGE_COMPARATOR = new Comparator() { + private static final Comparator TEXT_RANGE_COMPARATOR = new Comparator() { @Override public int compare(TextRange o1, TextRange o2) { if (o1.getStartOffset() != o2.getStartOffset()) { @@ -155,10 +157,34 @@ public class DiagnosticUtils { } @NotNull - public static TextRange firstRange(@NotNull List ranges) { + private static TextRange firstRange(@NotNull List ranges) { return Collections.min(ranges, TEXT_RANGE_COMPARATOR); } + @NotNull + public static List sortedDiagnostics(@NotNull Collection diagnostics) { + Comparator diagnosticComparator = new Comparator() { + @Override + public int compare(Diagnostic d1, Diagnostic d2) { + String path1 = d1.getPsiFile().getViewProvider().getVirtualFile().getPath(); + String path2 = d2.getPsiFile().getViewProvider().getVirtualFile().getPath(); + if (!path1.equals(path2)) return path1.compareTo(path2); + + TextRange range1 = firstRange(d1.getTextRanges()); + TextRange range2 = firstRange(d2.getTextRanges()); + + if (!range1.equals(range2)) { + return TEXT_RANGE_COMPARATOR.compare(range1, range2); + } + + return d1.getFactory().getName().compareTo(d2.getFactory().getName()); + } + }; + List result = Lists.newArrayList(diagnostics); + Collections.sort(result, diagnosticComparator); + return result; + } + public static final class LineAndColumn { public static final LineAndColumn NONE = new LineAndColumn(-1, -1);