Skip to content

Commit ac7ebf5

Browse files
cushonError Prone Team
authored and
Error Prone Team
committed
Handle var in MustBeClosedChecker
Fixes #4164 PiperOrigin-RevId: 658802144
1 parent ccd3ca6 commit ac7ebf5

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.google.errorprone.bugpatterns;
1818

19+
import static com.google.errorprone.fixes.SuggestedFixes.prettyType;
1920
import static com.google.errorprone.fixes.SuggestedFixes.qualifyType;
2021
import static com.google.errorprone.matchers.Description.NO_MATCH;
2122
import static com.google.errorprone.matchers.Matchers.instanceMethod;
@@ -28,6 +29,7 @@
2829
import static com.google.errorprone.util.ASTHelpers.getSymbol;
2930
import static com.google.errorprone.util.ASTHelpers.getType;
3031
import static com.google.errorprone.util.ASTHelpers.hasAnnotation;
32+
import static com.google.errorprone.util.ASTHelpers.hasExplicitSource;
3133
import static com.google.errorprone.util.ASTHelpers.isConsideredFinal;
3234
import static com.google.errorprone.util.ASTHelpers.isSameType;
3335
import static com.google.errorprone.util.ASTHelpers.isSubtype;
@@ -467,16 +469,29 @@ private static Optional<Change> extractToResourceInCurrentTry(
467469
private static Optional<Change> splitVariableDeclarationAroundTry(
468470
ExpressionTree tree, VariableTree var, VisitorState state, NameSuggester suggester) {
469471
int initPos = getStartPosition(var.getInitializer());
470-
int afterTypePos = state.getEndPosition(var.getType());
472+
Tree type = var.getType();
473+
String typePrefix;
474+
int startPos;
475+
if (hasExplicitSource(type, state)) {
476+
startPos = state.getEndPosition(type);
477+
typePrefix = "";
478+
} else {
479+
startPos = getStartPosition(var);
480+
typePrefix = prettyType(getType(type), state);
481+
}
471482
String name = suggester.suggestName(tree);
472483
return Change.builder(
473484
SuggestedFix.builder()
474485
.replace(
475-
afterTypePos,
486+
startPos,
476487
initPos,
477488
String.format(
478-
" %s;\ntry (var %s = %s) {\n%s =",
479-
var.getName(), name, state.getSourceForNode(tree), var.getName()))
489+
"%s %s;\ntry (var %s = %s) {\n%s =",
490+
typePrefix,
491+
var.getName(),
492+
name,
493+
state.getSourceForNode(tree),
494+
var.getName()))
480495
.replace(tree, name)
481496
.build())
482497
.closeBraceAfter(var)

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,47 @@ public void forLoopUnfixable() {
155155
.expectUnchanged()
156156
.doTest();
157157
}
158+
159+
@Test
160+
public void localVariableTypeInference() {
161+
refactoringHelper
162+
.addInputLines(
163+
"Closeable.java",
164+
"class Closeable implements AutoCloseable {",
165+
" @Override",
166+
" public void close() {}",
167+
" public int method() {",
168+
" return 1;",
169+
" }",
170+
" }")
171+
.expectUnchanged()
172+
.addInputLines(
173+
"Foo.java",
174+
"import com.google.errorprone.annotations.MustBeClosed;",
175+
"class Foo {",
176+
" @MustBeClosed",
177+
" Closeable mustBeClosedMethod() {",
178+
" return null;",
179+
" }",
180+
"}")
181+
.expectUnchanged()
182+
.addInputLines(
183+
"Test.java",
184+
"class Test {",
185+
" void test(Foo foo) {",
186+
" var bar = foo.mustBeClosedMethod().method();",
187+
" }",
188+
"}")
189+
.addOutputLines(
190+
"Test.java",
191+
"class Test {",
192+
" void test(Foo foo) {",
193+
" int bar;",
194+
" try (var closeable = foo.mustBeClosedMethod()) {",
195+
" bar = closeable.method();",
196+
" }",
197+
" }",
198+
"}")
199+
.doTest();
200+
}
158201
}

0 commit comments

Comments
 (0)