Skip to content

Commit 6551909

Browse files
nick-someoneError Prone Team
authored and
Error Prone Team
committed
For InlineMe - avoid rewriting callsites where there are interior comments, with a flag to revert the behavior if you don't care about removing comments.
PiperOrigin-RevId: 405014564
1 parent 2ca990d commit 6551909

File tree

1 file changed

+28
-3
lines changed
  • core/src/main/java/com/google/errorprone/bugpatterns/inlineme

1 file changed

+28
-3
lines changed

core/src/main/java/com/google/errorprone/bugpatterns/inlineme/Inliner.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@
5252
import com.sun.source.tree.Tree;
5353
import com.sun.tools.javac.code.Attribute;
5454
import com.sun.tools.javac.code.Symbol.MethodSymbol;
55+
import com.sun.tools.javac.parser.JavaTokenizer;
56+
import com.sun.tools.javac.parser.ScannerFactory;
57+
import com.sun.tools.javac.parser.Tokens.Token;
58+
import com.sun.tools.javac.parser.Tokens.TokenKind;
5559
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
60+
import java.nio.CharBuffer;
5661
import java.util.HashMap;
5762
import java.util.Map;
5863
import java.util.regex.Matcher;
@@ -73,19 +78,21 @@ public final class Inliner extends BugChecker
7378

7479
public static final String FINDING_TAG = "JavaInlineMe";
7580

76-
private static final Splitter PACKAGE_SPLITTER = Splitter.on('.');
77-
7881
static final String PREFIX_FLAG = "InlineMe:Prefix";
82+
static final String SKIP_COMMENTS_FLAG = "InlineMe:SkipInliningsWithComments";
7983

80-
private static final String INLINE_ME = "InlineMe";
84+
private static final Splitter PACKAGE_SPLITTER = Splitter.on('.');
8185

86+
private static final String INLINE_ME = "InlineMe";
8287
private static final String VALIDATION_DISABLED = "InlineMeValidationDisabled";
8388

8489
private final ImmutableSet<String> apiPrefixes;
90+
private final boolean skipCallsitesWithComments;
8591

8692
public Inliner(ErrorProneFlags flags) {
8793
this.apiPrefixes =
8894
ImmutableSet.copyOf(flags.getSet(PREFIX_FLAG).orElse(ImmutableSet.<String>of()));
95+
this.skipCallsitesWithComments = flags.getBoolean(SKIP_COMMENTS_FLAG).orElse(true);
8996
}
9097

9198
// TODO(b/163596864): Add support for inlining fields
@@ -149,6 +156,10 @@ private Description match(
149156
return Description.NO_MATCH;
150157
}
151158

159+
if (skipCallsitesWithComments && stringContainsComments(state.getSourceForNode(tree), state)) {
160+
return Description.NO_MATCH;
161+
}
162+
152163
Attribute.Compound inlineMe =
153164
symbol.getRawAttributes().stream()
154165
.filter(a -> a.type.tsym.getSimpleName().contentEquals(INLINE_ME))
@@ -257,6 +268,20 @@ private Description match(
257268
return describe(tree, fix, api);
258269
}
259270

271+
// Implementation borrowed from Refaster's comment-checking code.
272+
private static boolean stringContainsComments(String source, VisitorState state) {
273+
JavaTokenizer tokenizer =
274+
new JavaTokenizer(ScannerFactory.instance(state.context), CharBuffer.wrap(source)) {};
275+
for (Token token = tokenizer.readToken();
276+
token.kind != TokenKind.EOF;
277+
token = tokenizer.readToken()) {
278+
if (token.comments != null && !token.comments.isEmpty()) {
279+
return true;
280+
}
281+
}
282+
return false;
283+
}
284+
260285
private static ImmutableList<String> getStrings(Attribute.Compound attribute, String name) {
261286
return getValue(attribute, name)
262287
.map(MoreAnnotations::asStrings)

0 commit comments

Comments
 (0)