diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/StringRules.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/StringRules.java index c45c0550f5..d4c2cdf0f7 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/StringRules.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/StringRules.java @@ -162,6 +162,39 @@ String after(Object object) { } } + /** + * Prefer direct invocation of {@link String#String(char[], int, int)} over the indirection + * introduced by alternatives. + */ + static final class NewStringFromCharArraySubSequence { + @BeforeTemplate + String before(char[] data, int offset, int count) { + return Refaster.anyOf( + String.valueOf(data, offset, count), String.copyValueOf(data, offset, count)); + } + + @AfterTemplate + String after(char[] data, int offset, int count) { + return new String(data, offset, count); + } + } + + /** + * Prefer direct invocation of {@link String#String(char[])} over the indirection introduced by + * alternatives. + */ + static final class NewStringFromCharArray { + @BeforeTemplate + String before(char[] data) { + return Refaster.anyOf(String.valueOf(data), new String(data, 0, data.length)); + } + + @AfterTemplate + String after(char[] data) { + return new String(data); + } + } + /** * Prefer direct delegation to {@link String#valueOf(Object)} over the indirection introduced by * {@link Objects#toString(Object)}. diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestInput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestInput.java index e547a75974..a6b2f1cb33 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestInput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestInput.java @@ -73,6 +73,18 @@ String testStringValueOf() { return Objects.toString("foo"); } + ImmutableSet testNewStringFromCharArraySubSequence() { + return ImmutableSet.of( + String.valueOf(new char[] {'f', 'o', 'o'}, 0, 1), + String.copyValueOf(new char[] {'b', 'a', 'r'}, 2, 3)); + } + + ImmutableSet testNewStringFromCharArray() { + return ImmutableSet.of( + String.valueOf(new char[] {'f', 'o', 'o'}), + new String(new char[] {'b', 'a', 'r'}, 0, new char[] {'b', 'a', 'r'}.length)); + } + Function testStringValueOfMethodReference() { return Objects::toString; } diff --git a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestOutput.java b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestOutput.java index 8cb371ccc6..d5e1241aaa 100644 --- a/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestOutput.java +++ b/error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/StringRulesTestOutput.java @@ -75,6 +75,16 @@ String testStringValueOf() { return String.valueOf("foo"); } + ImmutableSet testNewStringFromCharArraySubSequence() { + return ImmutableSet.of( + new String(new char[] {'f', 'o', 'o'}, 0, 1), new String(new char[] {'b', 'a', 'r'}, 2, 3)); + } + + ImmutableSet testNewStringFromCharArray() { + return ImmutableSet.of( + new String(new char[] {'f', 'o', 'o'}), new String(new char[] {'b', 'a', 'r'})); + } + Function testStringValueOfMethodReference() { return String::valueOf; }