Skip to content

Commit 7440ff1

Browse files
cushonError Prone Team
authored and
Error Prone Team
committed
In StringConcatToTextBlock, don't assume that string literals always have source position information
Annotations on record constructors appear to get desugared early, so string literals on those annotations don't have source positions when they're copied to generated record members. PiperOrigin-RevId: 737721235
1 parent 04fe835 commit 7440ff1

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

core/src/main/java/com/google/errorprone/bugpatterns/StringConcatToTextBlock.java

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static com.google.errorprone.util.ASTHelpers.getReceiver;
2929
import static com.google.errorprone.util.ASTHelpers.getStartPosition;
3030
import static com.google.errorprone.util.ASTHelpers.getType;
31+
import static com.google.errorprone.util.ASTHelpers.hasExplicitSource;
3132
import static com.google.errorprone.util.ASTHelpers.isSameType;
3233
import static java.util.stream.Collectors.joining;
3334

@@ -84,6 +85,9 @@ && isSameType(getType(parent), state.getSymtab().stringType, state)) {
8485
return NO_MATCH;
8586
}
8687
}
88+
if (!hasExplicitSource(tree, state)) {
89+
return NO_MATCH;
90+
}
8791
ImmutableList<ErrorProneToken> tokens = state.getTokensForNode(tree);
8892
ImmutableList<String> strings =
8993
tokens.stream()

core/src/test/java/com/google/errorprone/bugpatterns/StringConcatToTextBlockTest.java

+28
Original file line numberDiff line numberDiff line change
@@ -243,4 +243,32 @@ class Test {
243243
""")
244244
.doTest(TEXT_MATCH);
245245
}
246+
247+
@Test
248+
public void annotationString() {
249+
refactoringHelper
250+
.addInputLines(
251+
"Anno.java",
252+
"""
253+
import java.lang.annotation.Documented;
254+
import java.lang.annotation.ElementType;
255+
import java.lang.annotation.Retention;
256+
import java.lang.annotation.RetentionPolicy;
257+
import java.lang.annotation.Target;
258+
259+
@Retention(RetentionPolicy.RUNTIME)
260+
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
261+
@interface Anno {}
262+
""")
263+
.expectUnchanged()
264+
.addInputLines(
265+
"Test.java",
266+
"""
267+
import java.util.StringJoiner;
268+
269+
record Test(@SuppressWarnings("foo") @Anno int foo) {}
270+
""")
271+
.expectUnchanged()
272+
.doTest(TEXT_MATCH);
273+
}
246274
}

0 commit comments

Comments
 (0)