Skip to content

Commit cfae81a

Browse files
Stephan202Error Prone Team
authored and
Error Prone Team
committed
Optimize VisitorState#getConstantExpression
By avoiding a second pass over the string. Fixes #4586 FUTURE_COPYBARA_INTEGRATE_REVIEW=#4586 from PicnicSupermarket:sschroevers/optimize-getConstantExpression ff02145 PiperOrigin-RevId: 677291745
1 parent be99217 commit cfae81a

File tree

5 files changed

+19
-20
lines changed

5 files changed

+19
-20
lines changed

check_api/src/main/java/com/google/errorprone/VisitorState.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
5252
import com.sun.tools.javac.tree.TreeMaker;
5353
import com.sun.tools.javac.util.Context;
54+
import com.sun.tools.javac.util.Convert;
5455
import com.sun.tools.javac.util.Name;
5556
import com.sun.tools.javac.util.Names;
5657
import com.sun.tools.javac.util.Options;
@@ -770,24 +771,20 @@ private static final class SharedState {
770771
* Like {@link Elements#getConstantExpression}, but doesn't over-escape single quotes in strings.
771772
*/
772773
public String getConstantExpression(Object value) {
773-
String escaped = getElements().getConstantExpression(value);
774-
if (value instanceof String) {
775-
// Don't escape single-quotes in string literals
776-
StringBuilder sb = new StringBuilder();
777-
for (int i = 0; i < escaped.length(); i++) {
778-
char c = escaped.charAt(i);
779-
if (c == '\\' && i + 1 < escaped.length()) {
780-
char next = escaped.charAt(++i);
781-
if (next != '\'') {
782-
sb.append(c);
783-
}
784-
sb.append(next);
785-
} else {
786-
sb.append(c);
787-
}
774+
if (!(value instanceof CharSequence str)) {
775+
return getElements().getConstantExpression(value);
776+
}
777+
778+
// Don't escape single-quotes in string literals.
779+
StringBuilder sb = new StringBuilder("\"");
780+
for (int i = 0; i < str.length(); i++) {
781+
char c = str.charAt(i);
782+
if (c == '\'') {
783+
sb.append('\'');
784+
} else {
785+
sb.append(Convert.quote(c));
788786
}
789-
return sb.toString();
790787
}
791-
return escaped;
788+
return sb.append('"').toString();
792789
}
793790
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState
7373
MethodSymbol symbol = getSymbol(parent);
7474
String argReplacement =
7575
Streams.concat(
76-
Stream.of(state.getConstantExpression(symbol.getSimpleName().toString())),
76+
Stream.of(state.getConstantExpression(symbol.getSimpleName())),
7777
Streams.zip(
7878
symbol.getParameters().stream(),
7979
parent.getArguments().stream(),

core/src/main/java/com/google/errorprone/bugpatterns/flogger/FloggerArgumentToString.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ Description unwrapArguments(
351351
if (!fixed) {
352352
return NO_MATCH;
353353
}
354-
fix.replace(tree.getArguments().get(0), state.getConstantExpression(sb.toString()));
354+
fix.replace(tree.getArguments().get(0), state.getConstantExpression(sb));
355355
return describeMatch(tree, fix.build());
356356
}
357357

core/src/main/java/com/google/errorprone/bugpatterns/flogger/FloggerStringConcatenation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ protected Void defaultAction(Tree tree, Void unused) {
112112
tree,
113113
SuggestedFix.replace(
114114
argument,
115-
state.getConstantExpression(formatString.toString())
115+
state.getConstantExpression(formatString)
116116
+ ", "
117117
+ formatArguments.stream().map(state::getSourceForNode).collect(joining(", "))));
118118
}

core/src/test/java/com/google/errorprone/VisitorStateTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ public void getConstantExpression() {
106106
assertThat(visitorState.getConstantExpression("hello \n world"))
107107
.isEqualTo("\"hello \\n world\"");
108108
assertThat(visitorState.getConstantExpression('\'')).isEqualTo("'\\''");
109+
assertThat(visitorState.getConstantExpression(new StringBuilder("hello ' world")))
110+
.isEqualTo("\"hello ' world\"");
109111
}
110112

111113
// The following is taken from ErrorProneJavacPluginTest. There may be an easier way.

0 commit comments

Comments
 (0)