From 9255859e2befef69d987074a94b2490749b757fe Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 9 Apr 2013 14:07:50 +0400 Subject: [PATCH] [r=nik] catch unexpected errors when parsing class files and emit compilation warnings (IDEA-104818 External build: Error in compiler) --- .../jps/incremental/java/OutputFilesSink.java | 16 ++++++++++++++-- .../incremental/messages/CompilerMessage.java | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java index 29ca799bb01c..519762b92954 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/OutputFilesSink.java @@ -15,6 +15,7 @@ */ package org.jetbrains.jps.incremental.java; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.io.FileUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -39,6 +40,7 @@ import java.util.Set; * Date: 2/16/12 */ class OutputFilesSink implements OutputFileConsumer { + private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.java.OutputFilesSink"); private final CompileContext myContext; private final ModuleLevelBuilder.OutputConsumer myOutputConsumer; private final Callbacks.Backend myMappingsCallback; @@ -84,8 +86,18 @@ class OutputFilesSink implements OutputFileConsumer { if (!isTemp && outKind == JavaFileObject.Kind.CLASS && !Utils.errorsDetected(myContext)) { // register in mappings any non-temp class file - final ClassReader reader = new ClassReader(content.getBuffer(), content.getOffset(), content.getLength()); - myMappingsCallback.associate(FileUtil.toSystemIndependentName(fileObject.getFile().getPath()), sourcePath, reader); + try { + final ClassReader reader = new ClassReader(content.getBuffer(), content.getOffset(), content.getLength()); + myMappingsCallback.associate(FileUtil.toSystemIndependentName(fileObject.getFile().getPath()), sourcePath, reader); + } + catch (Throwable e) { + // need this to make sure that unexpected errors in, for example, ASM will not ruin the compilation + final String message = "Class dependency information may be incomplete! Error parsing generated class " + fileObject.getFile().getPath(); + LOG.info(message, e); + myContext.processMessage(new CompilerMessage( + JavaBuilder.BUILDER_NAME, BuildMessage.Kind.WARNING, message + "\n" + CompilerMessage.getTextFromThrowable(e), sourcePath) + ); + } } } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/CompilerMessage.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/CompilerMessage.java index 90580fccd3ec..01c857c2e9ef 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/CompilerMessage.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/messages/CompilerMessage.java @@ -97,7 +97,7 @@ public class CompilerMessage extends BuildMessage { return getCompilerName() + ":" + getKind().name() + ":" + super.toString(); } - private static String getTextFromThrowable(Throwable internalError) { + public static String getTextFromThrowable(Throwable internalError) { StringBuilder text = new StringBuilder(); text.append("Error: "); final String msg = internalError.getMessage();