From f7c5e6cbc99b4258f6f6ef4cfe65cfd9402c4323 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Tue, 12 Jan 2021 11:29:53 -0800 Subject: [PATCH] Improve handling of type parameter names that start with `_` PiperOrigin-RevId: 351412076 --- .../errorprone/names/NamingConventions.java | 10 ++++++---- .../bugpatterns/TypeParameterNaming.java | 3 ++- .../bugpatterns/TypeParameterNamingTest.java | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/check_api/src/main/java/com/google/errorprone/names/NamingConventions.java b/check_api/src/main/java/com/google/errorprone/names/NamingConventions.java index d2d0a1cf9c0..7b991dbdedd 100644 --- a/check_api/src/main/java/com/google/errorprone/names/NamingConventions.java +++ b/check_api/src/main/java/com/google/errorprone/names/NamingConventions.java @@ -18,8 +18,8 @@ import static com.google.common.collect.ImmutableList.toImmutableList; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; -import java.util.Arrays; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -32,8 +32,9 @@ public class NamingConventions { private static final String CASE_TRANSITION = "(?<=[a-z0-9])(?=[A-Z])"; private static final String TRAILING_DIGITS = "(? splitToLowercaseTerms(String identifierName) // Degenerate case of names which contain only underscore return ImmutableList.of(identifierName); } - return Arrays.stream(TERM_SPLITTER.split(identifierName)) + return TERM_SPLITTER + .splitToStream(identifierName) .map(String::toLowerCase) .collect(toImmutableList()); } diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/TypeParameterNaming.java b/core/src/main/java/com/google/errorprone/bugpatterns/TypeParameterNaming.java index dd55d418f7f..724f29d464a 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/TypeParameterNaming.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/TypeParameterNaming.java @@ -205,7 +205,8 @@ private static List typeVariablesEnclosing(Symbol sym) { } private static String suggestedSingleLetter(String id, Tree tree) { - char firstLetter = id.charAt(0); + char firstLetter = + Ascii.toUpperCase(NamingConventions.splitToLowercaseTerms(id).get(0).charAt(0)); Symbol sym = ASTHelpers.getSymbol(tree); List enclosingTypeSymbols = typeVariablesEnclosing(sym); diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/TypeParameterNamingTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/TypeParameterNamingTest.java index a926158d418..c7cf3020d53 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/TypeParameterNamingTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/TypeParameterNamingTest.java @@ -294,6 +294,25 @@ public void negativeCases_manyNumberedTypes() { .doTest(); } + @Test + public void refactoring_underscore() { + refactoring + .addInputLines( + "in/Test.java", // + "class Test {", + " public <_T> void method(_T t) {", + " }", + "}") + .addOutputLines( + "in/Test.java", // + "class Test {", + " public void method(T t) {", + " }", + "}") + .setFixChooser(FixChoosers.FIRST) + .doTest(TestMode.TEXT_MATCH); + } + @Test public void classifyTypeName_singleLetter() { assertKindOfName("T").isEqualTo(LETTER_WITH_MAYBE_NUMERAL);