diff --git a/src/main/java/com/google/testing/compile/Parser.java b/src/main/java/com/google/testing/compile/Parser.java index c2b7314a..feff89c2 100644 --- a/src/main/java/com/google/testing/compile/Parser.java +++ b/src/main/java/com/google/testing/compile/Parser.java @@ -63,7 +63,8 @@ static ParseResult parse(Iterable sources, String sour for (JavaFileObject source : sources) { log.useSource(source); JavacParser parser = - parserFactory.newParser( + newParser( + parserFactory, source.getCharContent(false), /* keepDocComments= */ true, /* keepEndPos= */ true, @@ -84,6 +85,31 @@ static ParseResult parse(Iterable sources, String sour } } + private static final boolean IS_END_POS_TABLE_PRESENT = getIsEndPosTablePresent(); + + private static boolean getIsEndPosTablePresent() { + try { + // JDK versions before https://bugs.openjdk.org/browse/JDK-8372948 + Class.forName("com.sun.tools.javac.tree.EndPosTable"); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + private static JavacParser newParser( + ParserFactory parserFactory, + CharSequence source, + boolean keepDocComments, + boolean keepEndPos, + boolean keepLineMap) { + if (IS_END_POS_TABLE_PRESENT) { + return parserFactory.newParser(source, keepDocComments, keepEndPos, keepLineMap); + } + return parserFactory.newParser( + source, keepDocComments, keepLineMap, /* parseModuleInfo */ false); + } + /** Returns {@code true} if errors were found while parsing source files. */ private static boolean foundParseErrors(List> diagnostics) { return diagnostics.stream().anyMatch(d -> d.getKind().equals(ERROR));