From 63d8ef23b9749c13a05f653f1323dca27a93a794 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 16 Feb 2011 16:42:27 +0100 Subject: [PATCH] jdk 6+: do not swallow error message endings --- .../src/com/intellij/compiler/OutputParser.java | 3 ++- .../impl/javaCompiler/CompilerParsingThread.java | 13 +++++++++++++ .../javaCompiler/javac/JavacOutputParser.java | 12 ++++++++++++ .../lang/ant/config/execution/OutputParser.java | 15 ++++++++++++--- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/OutputParser.java b/java/compiler/impl/src/com/intellij/compiler/OutputParser.java index 4f5c325155ee..37f688263173 100644 --- a/java/compiler/impl/src/com/intellij/compiler/OutputParser.java +++ b/java/compiler/impl/src/com/intellij/compiler/OutputParser.java @@ -15,9 +15,9 @@ */ package com.intellij.compiler; +import com.intellij.compiler.impl.javaCompiler.FileObject; import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.compiler.impl.javaCompiler.FileObject; import org.jetbrains.annotations.NonNls; import java.util.ArrayList; @@ -29,6 +29,7 @@ public abstract class OutputParser { public interface Callback { @NonNls String getNextLine(); @NonNls String getCurrentLine(); + void pushBack(String line); void setProgressText(String text); void fileProcessed(@NonNls String path); void fileGenerated(@NonNls FileObject path); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/CompilerParsingThread.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/CompilerParsingThread.java index 58e74794bec9..e440d1d8666f 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/CompilerParsingThread.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/CompilerParsingThread.java @@ -44,6 +44,7 @@ public class CompilerParsingThread implements Runnable, OutputParser.Callback { private final boolean myIsUnitTestMode; private FileObject myClassFileToProcess = null; private String myLastReadLine = null; + private String myPushBackLine = null; private volatile boolean myProcessExited = false; private final CompileContext myContext; @@ -104,6 +105,12 @@ public class CompilerParsingThread implements Runnable, OutputParser.Callback { } public final String getNextLine() { + final String pushBack = myPushBackLine; + if (pushBack != null) { + myPushBackLine = null; + myLastReadLine = pushBack; + return pushBack; + } final String line = readLine(myCompilerOutStreamReader); if (LOG.isDebugEnabled()) { LOG.debug("LIne read: #" + line + "#"); @@ -120,6 +127,12 @@ public class CompilerParsingThread implements Runnable, OutputParser.Callback { return myLastReadLine; } + @Override + public void pushBack(String line) { + myLastReadLine = null; + myPushBackLine = line; + } + public final void fileGenerated(FileObject path) { // javac first logs file generated, then starts to write the file to disk, // so this thread sometimes can stumble on not yet existing file, diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacOutputParser.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacOutputParser.java index b1c2e5c5e428..f5d106e3494f 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacOutputParser.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/javac/JavacOutputParser.java @@ -127,6 +127,14 @@ public class JavacOutputParser extends OutputParser { final CharSequence chars = prevLine == null ? line : prevLine; final int offset = Math.max(0, Math.min(chars.length(), nextLine.indexOf('^'))); colNum = EditorUtil.calcColumnNumber(null, chars,0, offset, myTabSize); + String messageEnd = callback.getNextLine(); + while (isMessageEnd(messageEnd)) { + messages.add(messageEnd.trim()); + messageEnd = callback.getNextLine(); + } + if (messageEnd != null) { + callback.pushBack(messageEnd); + } break; } if (prevLine != null) { @@ -168,6 +176,10 @@ public class JavacOutputParser extends OutputParser { return true; } + private static boolean isMessageEnd(String line) { + return line != null && line.length() > 0 && Character.isWhitespace(line.charAt(0)); + } + private static List convertMessages(List messages) { if(messages.size() <= 1) { diff --git a/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java b/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java index a739bf0167c9..3c5b1ca1cc10 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/execution/OutputParser.java @@ -15,9 +15,9 @@ */ package com.intellij.lang.ant.config.execution; +import com.intellij.compiler.impl.javaCompiler.FileObject; import com.intellij.compiler.impl.javaCompiler.javac.JavacOutputParser; import com.intellij.compiler.impl.javaCompiler.jikes.JikesOutputParser; -import com.intellij.compiler.impl.javaCompiler.FileObject; import com.intellij.execution.process.OSProcessHandler; import com.intellij.lang.ant.AntBundle; import com.intellij.openapi.application.ApplicationManager; @@ -240,7 +240,7 @@ public class OutputParser{ } com.intellij.compiler.OutputParser.Callback callback = new com.intellij.compiler.OutputParser.Callback() { - private int myIndex = 0; + private int myIndex = -1; @Nullable public String getCurrentLine() { @@ -251,7 +251,16 @@ public class OutputParser{ } public String getNextLine() { - return javacMessages.get(myIndex++); + final int next = myIndex + 1; + if (next >= javacMessages.size()) { + return null; + } + return javacMessages.get(myIndex = next); + } + + @Override + public void pushBack(String line) { + myIndex--; } public void message(final CompilerMessageCategory category,