KT-1245 Report syntax errors in kompiler

This commit is contained in:
Maxim Shafirov
2012-02-17 21:00:45 +04:00
parent 27d3148252
commit bf508ae03e
2 changed files with 38 additions and 10 deletions
@@ -17,15 +17,21 @@
package org.jetbrains.jet.compiler; package org.jetbrains.jet.compiler;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiErrorElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager; import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly; import org.jetbrains.annotations.TestOnly;
import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.ClassFileFactory; import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; 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.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade;
@@ -126,13 +132,39 @@ public class CompileSession {
} }
return false; return false;
} }
final ErrorCollector errorCollector = new ErrorCollector();
reportSyntaxErrors(errorCollector);
analyzeAndReportSemanticErrors(errorCollector);
errorCollector.flushTo(out);
return !errorCollector.hasErrors;
}
private void analyzeAndReportSemanticErrors(ErrorCollector errorCollector) {
List<JetFile> allNamespaces = new ArrayList<JetFile>(mySourceFiles); List<JetFile> allNamespaces = new ArrayList<JetFile>(mySourceFiles);
allNamespaces.addAll(myLibrarySourceFiles); allNamespaces.addAll(myLibrarySourceFiles);
myBindingContext = AnalyzerFacade.analyzeFilesWithJavaIntegration( myBindingContext = AnalyzerFacade.analyzeFilesWithJavaIntegration(
myEnvironment.getProject(), allNamespaces, Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY); myEnvironment.getProject(), allNamespaces, Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY);
ErrorCollector errorCollector = new ErrorCollector(myBindingContext);
errorCollector.report(out); for (Diagnostic diagnostic : myBindingContext.getDiagnostics()) {
return !errorCollector.hasErrors; 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 @NotNull
@@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.diagnostics.DiagnosticWithTextRange; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithTextRange;
import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.diagnostics.Severity;
import org.jetbrains.jet.lang.resolve.BindingContext;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.Collection; import java.util.Collection;
@@ -36,13 +35,10 @@ class ErrorCollector {
boolean hasErrors; boolean hasErrors;
public ErrorCollector(BindingContext bindingContext) { public ErrorCollector() {
for (Diagnostic diagnostic : bindingContext.getDiagnostics()) {
report(diagnostic);
}
} }
private void report(Diagnostic diagnostic) { public void report(Diagnostic diagnostic) {
hasErrors |= diagnostic.getSeverity() == Severity.ERROR; hasErrors |= diagnostic.getSeverity() == Severity.ERROR;
if(diagnostic instanceof DiagnosticWithTextRange) { if(diagnostic instanceof DiagnosticWithTextRange) {
DiagnosticWithTextRange diagnosticWithTextRange = (DiagnosticWithTextRange) diagnostic; DiagnosticWithTextRange diagnosticWithTextRange = (DiagnosticWithTextRange) diagnostic;
@@ -53,7 +49,7 @@ class ErrorCollector {
} }
} }
void report(final PrintStream out) { void flushTo(final PrintStream out) {
if(!maps.isEmpty()) { if(!maps.isEmpty()) {
for (PsiFile psiFile : maps.keySet()) { for (PsiFile psiFile : maps.keySet()) {
String path = psiFile.getVirtualFile().getPath(); String path = psiFile.getVirtualFile().getPath();