KT-1245 Report syntax errors in kompiler
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user