From bf508ae03ef982e2330cba3d9c48c052df716500 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 17 Feb 2012 21:00:45 +0400 Subject: [PATCH] KT-1245 Report syntax errors in kompiler --- .../jet/compiler/CompileSession.java | 38 +++++++++++++++++-- .../jet/compiler/ErrorCollector.java | 10 ++--- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java index e7d1c920373..ce1b038662a 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java @@ -17,15 +17,21 @@ package org.jetbrains.jet.compiler; import com.google.common.base.Predicates; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiErrorElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiRecursiveElementWalkingVisitor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.Severity; +import org.jetbrains.jet.lang.diagnostics.SimpleDiagnosticFactory; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade; @@ -126,13 +132,39 @@ public class CompileSession { } return false; } + + final ErrorCollector errorCollector = new ErrorCollector(); + + reportSyntaxErrors(errorCollector); + analyzeAndReportSemanticErrors(errorCollector); + + errorCollector.flushTo(out); + return !errorCollector.hasErrors; + } + + private void analyzeAndReportSemanticErrors(ErrorCollector errorCollector) { List allNamespaces = new ArrayList(mySourceFiles); allNamespaces.addAll(myLibrarySourceFiles); myBindingContext = AnalyzerFacade.analyzeFilesWithJavaIntegration( myEnvironment.getProject(), allNamespaces, Predicates.alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY); - ErrorCollector errorCollector = new ErrorCollector(myBindingContext); - errorCollector.report(out); - return !errorCollector.hasErrors; + + for (Diagnostic diagnostic : myBindingContext.getDiagnostics()) { + errorCollector.report(diagnostic); + } + } + + private void reportSyntaxErrors(final ErrorCollector errorCollector) { + for (JetFile file : mySourceFiles) { + file.accept(new PsiRecursiveElementWalkingVisitor() { + @Override + public void visitErrorElement(PsiErrorElement element) { + String description = element.getErrorDescription(); + String message = StringUtil.isEmpty(description) ? "Syntax error" : description; + Diagnostic diagnostic = SimpleDiagnosticFactory.create(Severity.ERROR, message).on(element); + errorCollector.report(diagnostic); + } + }); + } } @NotNull diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/ErrorCollector.java b/compiler/cli/src/org/jetbrains/jet/compiler/ErrorCollector.java index 0d1814dafa0..c2c9a84a334 100644 --- a/compiler/cli/src/org/jetbrains/jet/compiler/ErrorCollector.java +++ b/compiler/cli/src/org/jetbrains/jet/compiler/ErrorCollector.java @@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithTextRange; import org.jetbrains.jet.lang.diagnostics.Severity; -import org.jetbrains.jet.lang.resolve.BindingContext; import java.io.PrintStream; import java.util.Collection; @@ -36,13 +35,10 @@ class ErrorCollector { boolean hasErrors; - public ErrorCollector(BindingContext bindingContext) { - for (Diagnostic diagnostic : bindingContext.getDiagnostics()) { - report(diagnostic); - } + public ErrorCollector() { } - private void report(Diagnostic diagnostic) { + public void report(Diagnostic diagnostic) { hasErrors |= diagnostic.getSeverity() == Severity.ERROR; if(diagnostic instanceof DiagnosticWithTextRange) { DiagnosticWithTextRange diagnosticWithTextRange = (DiagnosticWithTextRange) diagnostic; @@ -53,7 +49,7 @@ class ErrorCollector { } } - void report(final PrintStream out) { + void flushTo(final PrintStream out) { if(!maps.isEmpty()) { for (PsiFile psiFile : maps.keySet()) { String path = psiFile.getVirtualFile().getPath();