Skip to content

Commit b4fc2c9

Browse files
Java ConvertToARM fix: Fix case where existing variable (without declaration) is guarded and other variables are used outside the new block
Example: ============== Source ============== import java.io.ByteArrayOutputStream; import java.io.InputStream; public class Test { public static byte[] test(InputStream input) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); int len; byte[] buffer = new byte[1024]; while ((len = input.read(buffer)) != -1) { outStream.write(buffer, 0, len); } input.close(); return outStream.toByteArray(); } } ============== Result ============== import java.io.ByteArrayOutputStream; import java.io.InputStream; public class Test { public static byte[] test(InputStream input) throws Exception { try (input) { outStream = new ByteArrayOutputStream(); int len; byte[] buffer = new byte[1024]; while ((len = input.read(buffer)) != -1) { outStream.write(buffer, 0, len); } } return outStream.toByteArray(); } } ==================================== Problem is here, that the result variable is used outside the new try block, but the declaration is not written. Closes: #9046
1 parent 190f8f3 commit b4fc2c9

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

java/java.hints/src/org/netbeans/modules/java/hints/jdk/ConvertToARM.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,12 +612,16 @@ private static BlockTree rewriteOwnerBlock(
612612
final List<StatementTree> statements = new ArrayList<StatementTree>(originalStatements.size());
613613
int state = var != null ? 0 : 1; //0 - ordinary,1 - replace by try, 2 - remove
614614
final Set<Tree> toRemove = new HashSet<Tree>(oldStms);
615+
boolean preVarDeclsWritten = false;
615616
for (StatementTree statement : originalStatements) {
616617
if (removeStms.contains(statement)) {
617618
continue;
618619
}
619620
if (var == statement) {
620-
statements.addAll(preVarDecls);
621+
if (!preVarDeclsWritten) {
622+
preVarDeclsWritten = true;
623+
statements.addAll(preVarDecls);
624+
}
621625
if (var.getKind() == Kind.TRY) {
622626
gen.copyComments(statement, newTry, true);
623627
gen.copyComments(statement, newTry, false);
@@ -658,6 +662,10 @@ private static BlockTree rewriteOwnerBlock(
658662
gen.copyComments(tt.getFinallyBlock(), nt, false);
659663
}
660664
}
665+
if (!preVarDeclsWritten) {
666+
preVarDeclsWritten = true;
667+
statements.addAll(preVarDecls);
668+
}
661669
statement = newTry;
662670
} else if (state == 2) {
663671
if (!toRemove.contains(statement)) {
@@ -667,6 +675,7 @@ private static BlockTree rewriteOwnerBlock(
667675
}
668676
statements.add(statement);
669677
}
678+
670679
return tm.Block(statements, false);
671680
}
672681

java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertToARMTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,4 +1554,58 @@ public void testPreserveComments228141() throws Exception {
15541554
}
15551555
}
15561556
}
1557+
1558+
// Case:
1559+
public void testGH9046() throws Exception {
1560+
HintTest
1561+
.create()
1562+
.input("""
1563+
package test;
1564+
import java.io.ByteArrayOutputStream;
1565+
import java.io.InputStream;
1566+
1567+
public class Test {
1568+
1569+
public static byte[] test(InputStream input) throws Exception {
1570+
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
1571+
int len;
1572+
1573+
byte[] buffer = new byte[1024];
1574+
1575+
while ((len = input.read(buffer)) != -1) {
1576+
outStream.write(buffer, 0, len);
1577+
}
1578+
input.close();
1579+
1580+
return outStream.toByteArray();
1581+
}
1582+
}
1583+
""")
1584+
.sourceLevel("17")
1585+
.run(ConvertToARM.class)
1586+
.findWarning("12:22-12:27:verifier:TXT_ConvertToARM")
1587+
.applyFix("TXT_ConvertToARM")
1588+
.assertOutput("""
1589+
package test;
1590+
import java.io.ByteArrayOutputStream;
1591+
import java.io.InputStream;
1592+
1593+
public class Test {
1594+
1595+
public static byte[] test(InputStream input) throws Exception {
1596+
ByteArrayOutputStream outStream;
1597+
try (input) {
1598+
outStream = new ByteArrayOutputStream();
1599+
int len;
1600+
byte[] buffer = new byte[1024];
1601+
while ((len = input.read(buffer)) != -1) {
1602+
outStream.write(buffer, 0, len);
1603+
}
1604+
}
1605+
1606+
return outStream.toByteArray();
1607+
}
1608+
}
1609+
""");
1610+
}
15571611
}

0 commit comments

Comments
 (0)