diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java new file mode 100644 index 00000000000..b6ea15aa364 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.codegen; + +/** + * @author abreslav + */ +public interface CompilationErrorHandler { + + CompilationErrorHandler THROW_EXCEPTION = new CompilationErrorHandler() { + @Override + public void reportError(String message, String fileUrl) { + throw new IllegalStateException(message); + } + }; + + void reportError(String message, String fileUrl); +} diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java index 84e40db7f9e..b2097c462e1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java @@ -100,11 +100,20 @@ public class GenerationState { } public void compileCorrectNamespaces(BindingContext bindingContext, List namespaces) { + compileCorrectNamespaces(bindingContext, namespaces, CompilationErrorHandler.THROW_EXCEPTION); + } + + public void compileCorrectNamespaces(BindingContext bindingContext, List namespaces, CompilationErrorHandler errorHandler) { typeMapper = new JetTypeMapper(standardLibrary, bindingContext); bindingContexts.push(bindingContext); try { for (JetNamespace namespace : namespaces) { - generateNamespace(namespace); + try { + generateNamespace(namespace); + } + catch (Throwable e) { + errorHandler.reportError("Exception: " + e.getClass().getCanonicalName() + ": " + e.getMessage(), namespace.getContainingFile().getVirtualFile().getUrl()); + } } } finally { diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java index f43532c0c28..f09506cd271 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java @@ -18,6 +18,7 @@ import com.intellij.util.Chunk; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.codegen.ClassBuilderFactory; import org.jetbrains.jet.codegen.ClassFileFactory; +import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.diagnostics.Diagnostic; @@ -101,7 +102,12 @@ public class JetCompiler implements TranslatingCompiler { } if (!errors) { - generationState.compileCorrectNamespaces(bindingContext, namespaces); + generationState.compileCorrectNamespaces(bindingContext, namespaces, new CompilationErrorHandler() { + @Override + public void reportError(String message, String fileUrl) { + compileContext.addMessage(CompilerMessageCategory.WARNING, message, fileUrl, 0, 0); + } + }); /////////// // GenerationState generationState2 = new GenerationState(compileContext.getProject(), ClassBuilderFactory.TEXT); // generationState2.compileCorrectNamespaces(bindingContext, namespaces);