diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByUtils.java b/core/src/main/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByUtils.java index a1a089875a1..deb83e7674e 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByUtils.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByUtils.java @@ -19,6 +19,7 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.errorprone.util.ASTHelpers.getSymbol; import static com.google.errorprone.util.ASTHelpers.isStatic; +import static com.google.errorprone.util.ErrorProneLog.deferredDiagnosticHandler; import com.google.common.collect.ImmutableSet; import com.google.errorprone.VisitorState; @@ -31,6 +32,7 @@ import com.sun.tools.javac.parser.ParserFactory; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.Log; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -80,11 +82,15 @@ static JCTree.JCExpression parseString(String guardedByString, Context context) /* keepDocComments= */ false, /* keepEndPos= */ true, /* keepLineMap= */ false); + Log log = Log.instance(context); + Log.DeferredDiagnosticHandler deferredDiagnosticHandler = deferredDiagnosticHandler(log); JCTree.JCExpression exp; try { exp = parser.parseExpression(); } catch (RuntimeException e) { throw new IllegalGuardedBy(e.getMessage()); + } finally { + log.popDiagnosticHandler(deferredDiagnosticHandler); } int len = (parser.getEndPos(exp) - exp.getStartPosition()); if (len != guardedByString.length()) { diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByCheckerTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByCheckerTest.java index 52b0d37decd..5aa520090c8 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByCheckerTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/threadsafety/GuardedByCheckerTest.java @@ -2511,4 +2511,23 @@ public static void t(I other) { """) .doTest(); } + + @Test + public void parseError() { + compilationHelper + .addSourceLines( + "IllegalStartOfExpression.java", + """ + package example; + + import com.google.errorprone.annotations.concurrent.GuardedBy; + + public class IllegalStartOfExpression { + @GuardedBy("itself (synchronized blocks)") + // BUG: Diagnostic contains: could not resolve + int field; + } + """) + .doTest(); + } }