Skip to content

Commit 75798fe

Browse files
committed
feat(java): 添加 Java 24 未命名变量和模式测试
确保解析器对 Java 24 新语法(如未命名模式变量和 lambda 参数)不会崩溃。更新了词法和语法文件以支持这些特性。
1 parent 948159b commit 75798fe

3 files changed

Lines changed: 36 additions & 7 deletions

File tree

chapi-ast-java/src/main/antlr/JavaLexer.g4

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ SEMI : ';';
141141
COMMA : ',';
142142
DOT : '.';
143143
144+
// Java 22+ (preview, continued into later releases): unnamed variables / patterns
145+
UNDERSCORE : '_';
146+
144147
// Operators
145148
146149
ASSIGN : '=';

chapi-ast-java/src/main/antlr/JavaParser.g4

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,13 @@ variableDeclarator
255255
;
256256

257257
variableDeclaratorId
258-
: identifier ('[' ']')*
258+
: (identifier | UNDERSCORE) ('[' ']')*
259+
;
260+
261+
// Java 22+ (preview, continued into later releases): unnamed variables / patterns
262+
variableName
263+
: identifier
264+
| UNDERSCORE
259265
;
260266

261267
variableInitializer
@@ -310,7 +316,7 @@ lambdaLVTIList
310316
;
311317

312318
lambdaLVTIParameter
313-
: variableModifier* VAR identifier
319+
: variableModifier* VAR (identifier | UNDERSCORE)
314320
;
315321

316322
qualifiedName
@@ -474,7 +480,7 @@ blockStatement
474480
;
475481

476482
localVariableDeclaration
477-
: variableModifier* (VAR identifier '=' expression | typeType variableDeclarators)
483+
: variableModifier* (VAR (identifier | UNDERSCORE) '=' expression | typeType variableDeclarators)
478484
;
479485

480486
identifier
@@ -539,7 +545,7 @@ statement
539545
;
540546

541547
catchClause
542-
: CATCH '(' variableModifier* catchType identifier ')' block
548+
: CATCH '(' variableModifier* catchType (identifier | UNDERSCORE) ')' block
543549
;
544550

545551
catchType
@@ -559,7 +565,7 @@ resources
559565
;
560566

561567
resource
562-
: variableModifier* (classOrInterfaceType variableDeclaratorId | VAR identifier) '=' expression
568+
: variableModifier* (classOrInterfaceType variableDeclaratorId | VAR (identifier | UNDERSCORE)) '=' expression
563569
| qualifiedName
564570
;
565571

@@ -574,7 +580,7 @@ switchLabel
574580
: CASE (
575581
constantExpression = expression
576582
| enumConstantName = IDENTIFIER
577-
| typeType varName = identifier
583+
| typeType varName = variableName
578584
)
579585
| DEFAULT
580586
;
@@ -697,8 +703,9 @@ lambdaExpression
697703

698704
lambdaParameters
699705
: identifier
706+
| UNDERSCORE
700707
| '(' formalParameterList? ')'
701-
| '(' identifier (',' identifier)* ')'
708+
| '(' (identifier | UNDERSCORE) (',' (identifier | UNDERSCORE))* ')'
702709
| '(' lambdaLVTIList? ')'
703710
;
704711

chapi-ast-java/src/test/kotlin/chapi/ast/javaast/JavaIdentCallAppTest.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ internal class JavaIdentCallAppTest {
2222
JavaAnalyser().identFullInfo(code, "AllInOne8.java")
2323
}
2424

25+
@Test
26+
fun shouldNotCrashForJava24UnnamedVariablesAndPatterns() {
27+
val code = """
28+
public class Java24Unnamed {
29+
public void test(Object o) {
30+
// unnamed pattern variable (Java 22+)
31+
switch (o) {
32+
case String _ -> { }
33+
default -> { }
34+
}
35+
36+
// unnamed lambda parameter (Java 22+)
37+
Runnable r = (_) -> { };
38+
}
39+
}
40+
"""
41+
JavaAnalyser().identFullInfo(code, "Java24Unnamed.java")
42+
}
43+
2544
private val helloworld = """
2645
public class HelloWorld {
2746
public static void main(String []args) {

0 commit comments

Comments
 (0)