Skip to content

Commit 0a4563f

Browse files
authored
Issue #106: Retain error messages from annotation processors (#170)
* Issue #106: Retain error messages from annotation processors Fix #106
1 parent 082f454 commit 0a4563f

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java

+21
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,10 @@ else if ( hasPointer )
755755
errors.add( new CompilerMessage( buffer.toString(), CompilerMessage.Kind.ERROR ) );
756756
return errors;
757757
}
758+
else if ( line.startsWith( "An annotation processor threw an uncaught exception." ) ) {
759+
CompilerMessage annotationProcessingError = parseAnnotationProcessorStream( input );
760+
errors.add( annotationProcessingError );
761+
}
758762

759763
// new error block?
760764
if ( !line.startsWith( " " ) && hasPointer )
@@ -800,6 +804,23 @@ else if ( ( buffer.length() == 0 ) && isMisc( line ) )
800804
}
801805
}
802806

807+
private static CompilerMessage parseAnnotationProcessorStream( final BufferedReader input )
808+
throws IOException
809+
{
810+
String line = input.readLine();
811+
final StringBuilder buffer = new StringBuilder();
812+
813+
while (line != null) {
814+
if (!line.startsWith( "Consult the following stack trace for details." )) {
815+
buffer.append(line);
816+
buffer.append(EOL);
817+
}
818+
line = input.readLine();
819+
}
820+
821+
return new CompilerMessage( buffer.toString(), CompilerMessage.Kind.ERROR );
822+
}
823+
803824
private static boolean isMisc( String line )
804825
{
805826
return startsWithPrefix( line, MISC_PREFIXES );

plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/JavacCompilerTest.java

+42
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
package org.codehaus.plexus.compiler.javac;
22

3+
import org.codehaus.plexus.compiler.CompilerMessage;
34
import org.junit.jupiter.api.BeforeEach;
5+
import org.junit.jupiter.api.Test;
6+
7+
import java.io.BufferedReader;
8+
import java.io.IOException;
9+
import java.io.StringReader;
10+
import java.util.List;
11+
12+
import static org.hamcrest.MatcherAssert.assertThat;
13+
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
414

515
/*
616
* Licensed to the Apache Software Foundation (ASF) under one
@@ -33,4 +43,36 @@ public void setUp()
3343
super.setUp();
3444
setForceJavacCompilerUse( true );
3545
}
46+
47+
@Test
48+
void parseModernStream_withAnnotationProcessingErrors() throws IOException
49+
{
50+
String input =
51+
"\n" +
52+
"\n" +
53+
"An annotation processor threw an uncaught exception.\n" +
54+
"Consult the following stack trace for details.\n" +
55+
"java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x1da51a35) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x1da51a35\n" +
56+
"\tat lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment(LombokProcessor.java:433)\n" +
57+
"\tat lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:92)\n" +
58+
"\tat lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160)\n" +
59+
"\tat lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213)\n" +
60+
"\tat lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64)\n" +
61+
"\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:702)\n" +
62+
"\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:829)\n" +
63+
"\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:925)\n" +
64+
"\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1269)\n" +
65+
"\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1384)\n" +
66+
"\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1261)\n" +
67+
"\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:935)\n" +
68+
"\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)\n" +
69+
"\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)\n" +
70+
"\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)\n" +
71+
"\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)\n";
72+
73+
List<CompilerMessage> compilerMessages = JavacCompiler.parseModernStream( 1,
74+
new BufferedReader( new StringReader( input ) ) );
75+
76+
assertThat( compilerMessages, hasSize( 1 ) );
77+
}
3678
}

0 commit comments

Comments
 (0)