From 3b4b1025f857ddf695035950ed47560c8b121b5d Mon Sep 17 00:00:00 2001 From: ghm Date: Thu, 20 Oct 2022 14:15:56 -0700 Subject: [PATCH] AnnotationPosition: don't fail on record compact constructors. Fixes external #3494 PiperOrigin-RevId: 482595425 --- .../errorprone/bugpatterns/AnnotationPosition.java | 3 +++ .../bugpatterns/AnnotationPositionTest.java | 14 ++++++++++++++ .../BugCheckerRefactoringTestHelper.java | 3 ++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/AnnotationPosition.java b/core/src/main/java/com/google/errorprone/bugpatterns/AnnotationPosition.java index 9d637d05a20..b1764f11eab 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/AnnotationPosition.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/AnnotationPosition.java @@ -159,6 +159,9 @@ private static List annotationTokens( endPos = getStartPosition(methodTree.getReturnType()); } else if (!methodTree.getParameters().isEmpty()) { endPos = getStartPosition(methodTree.getParameters().get(0)); + if (endPos < annotationEnd) { + endPos = state.getEndPosition(methodTree); + } } else if (methodTree.getBody() != null && !methodTree.getBody().getStatements().isEmpty()) { endPos = getStartPosition(methodTree.getBody().getStatements().get(0)); } else { diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/AnnotationPositionTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/AnnotationPositionTest.java index c369794da57..60876f9e404 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/AnnotationPositionTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/AnnotationPositionTest.java @@ -529,4 +529,18 @@ public void varKeyword() { .expectUnchanged() .doTest(TEXT_MATCH); } + + @Test + public void recordAnnotation() { + assumeTrue(RuntimeVersion.isAtLeast16()); + refactoringHelper + .addInputLines( + "Test.java", + "public record Test(String bar) {", + " @SuppressWarnings(\"unused\")", + " public Test {}", + "}") + .expectUnchanged() + .doTest(TEXT_MATCH); + } } diff --git a/test_helpers/src/main/java/com/google/errorprone/BugCheckerRefactoringTestHelper.java b/test_helpers/src/main/java/com/google/errorprone/BugCheckerRefactoringTestHelper.java index 09220a4fa16..45d4d1af7d0 100644 --- a/test_helpers/src/main/java/com/google/errorprone/BugCheckerRefactoringTestHelper.java +++ b/test_helpers/src/main/java/com/google/errorprone/BugCheckerRefactoringTestHelper.java @@ -95,7 +95,8 @@ void verifyMatch(JavaFileObject refactoredSource, JavaFileObject expectedSource) private String maybeFormat(String input) { try { return new Formatter().formatSource(input); - } catch (FormatterException e) { + // TODO(b/254713810): Remove the AIOOBE catch below. + } catch (FormatterException | ArrayIndexOutOfBoundsException e) { return input; } }