Skip to content

Commit 10ea73c

Browse files
WIP : Fix for reformatting issue with unnamed vars GH9255
Update JavaLexer to generate correct token type for `var _`. Add lexer and formatting tests.
1 parent f02cbe4 commit 10ea73c

3 files changed

Lines changed: 68 additions & 7 deletions

File tree

java/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,9 @@ else if ('0' <= c && c <= '9') { // float literal
11961196
next = nextToken();
11971197
} while (next != null && AFTER_VAR_TOKENS.contains(next.id()));
11981198

1199-
varKeyword = next != null && next.id() == JavaTokenId.IDENTIFIER;
1199+
varKeyword = next != null
1200+
&& (next.id() == JavaTokenId.IDENTIFIER
1201+
|| next.id() == JavaTokenId.UNDERSCORE);
12001202
}
12011203

12021204
input.backup(input.readLengthEOF()- len);

java/java.lexer/test/unit/src/org/netbeans/lib/java/lexer/JavaLexerBatchTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,23 @@ public void testVarIdent() {
560560
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.SEMICOLON, ";");
561561
}
562562

563+
public void testVarUnnamed() {
564+
String text = "var _ = 0;";
565+
InputAttributes attr = new InputAttributes();
566+
attr.setValue(JavaTokenId.language(), "version", Integer.valueOf(22), true);
567+
TokenHierarchy<?> hi = TokenHierarchy.create(text, false, JavaTokenId.language(), EnumSet.noneOf(JavaTokenId.class), attr);
568+
TokenSequence<?> ts = hi.tokenSequence();
569+
570+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.VAR, "var");
571+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
572+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.UNDERSCORE, "_");
573+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
574+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.EQ, "=");
575+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
576+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.INT_LITERAL, "0");
577+
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.SEMICOLON, ";");
578+
}
579+
563580
public void testVarWeird() {
564581
String text = "var = 0; varu = 0; val = 0; if (a.var);";
565582
InputAttributes attr = new InputAttributes();

java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6274,13 +6274,12 @@ public void testForNoCondition() throws Exception {
62746274
}
62756275

62766276
public void testForVar1() throws Exception {
6277+
sourceLevel = "10";
62776278
testFile = new File(getWorkDir(), "Test.java");
62786279
TestUtilities.copyStringToFile(testFile, "");
62796280
FileObject testSourceFO = FileUtil.toFileObject(testFile);
62806281
DataObject testSourceDO = DataObject.find(testSourceFO);
62816282
EditorCookie ec = (EditorCookie) testSourceDO.getCookie(EditorCookie.class);
6282-
String oldLevel = JavaSourceTest.SourceLevelQueryImpl.sourceLevel;
6283-
JavaSourceTest.SourceLevelQueryImpl.sourceLevel = "1.10";
62846283
final Document doc = ec.openDocument();
62856284
doc.putProperty(Language.class, JavaTokenId.language());
62866285
String content
@@ -6299,17 +6298,15 @@ public void testForVar1() throws Exception {
62996298
+ " }\n"
63006299
+ "}\n";
63016300
reformat(doc, content, golden);
6302-
JavaSourceTest.SourceLevelQueryImpl.sourceLevel = oldLevel;
63036301
}
63046302

63056303
public void testForVar2() throws Exception {
6304+
sourceLevel = "10";
63066305
testFile = new File(getWorkDir(), "Test.java");
63076306
TestUtilities.copyStringToFile(testFile, "");
63086307
FileObject testSourceFO = FileUtil.toFileObject(testFile);
63096308
DataObject testSourceDO = DataObject.find(testSourceFO);
63106309
EditorCookie ec = (EditorCookie) testSourceDO.getCookie(EditorCookie.class);
6311-
String oldLevel = JavaSourceTest.SourceLevelQueryImpl.sourceLevel;
6312-
JavaSourceTest.SourceLevelQueryImpl.sourceLevel = "1.10";
63136310
final Document doc = ec.openDocument();
63146311
doc.putProperty(Language.class, JavaTokenId.language());
63156312
String content
@@ -6328,7 +6325,52 @@ public void testForVar2() throws Exception {
63286325
+ " }\n"
63296326
+ "}\n";
63306327
reformat(doc, content, golden);
6331-
JavaSourceTest.SourceLevelQueryImpl.sourceLevel = oldLevel;
6328+
}
6329+
6330+
public void testForVarUnnamed() throws Exception {
6331+
sourceLevel = "22";
6332+
testFile = new File(getWorkDir(), "Test.java");
6333+
TestUtilities.copyStringToFile(testFile, "");
6334+
FileObject testSourceFO = FileUtil.toFileObject(testFile);
6335+
DataObject testSourceDO = DataObject.find(testSourceFO);
6336+
EditorCookie ec = (EditorCookie) testSourceDO.getCookie(EditorCookie.class);
6337+
final Document doc = ec.openDocument();
6338+
doc.putProperty(Language.class, JavaTokenId.language());
6339+
String content
6340+
= """
6341+
package hierbas.del.litoral;
6342+
6343+
public class Test {
6344+
6345+
public static void main(String[] args) {
6346+
int[] orderIDs = {34, 45, 23, 27, 15};
6347+
int total = 0;
6348+
for ( var _:orderIDs) {
6349+
total++;
6350+
}
6351+
}
6352+
}
6353+
""";
6354+
6355+
String golden
6356+
= """
6357+
package hierbas.del.litoral;
6358+
6359+
public class Test {
6360+
6361+
public static void main(String[] args) {
6362+
int[] orderIDs = {34, 45, 23, 27, 15};
6363+
int total = 0;
6364+
for (var _ : orderIDs) {
6365+
total++;
6366+
}
6367+
}
6368+
}
6369+
""";
6370+
6371+
//check no change then formatted
6372+
reformat(doc, golden, golden);
6373+
reformat(doc, content, golden);
63326374
}
63336375

63346376
public void testTryBlockAfterIf() throws Exception {

0 commit comments

Comments
 (0)