From 41d70f9b774170e6d3d375333caf4c3ce5cdac63 Mon Sep 17 00:00:00 2001 From: Jordan Kiesel Date: Sun, 11 May 2025 00:49:05 -0600 Subject: [PATCH] fix: limit TypePattern's VariableDeclaratorList to a single VariableDeclarator --- packages/java-parser/api.d.ts | 18 ------------- .../src/productions/blocks-and-statements.js | 4 +-- .../java-parser/src/productions/classes.js | 26 +++---------------- .../src/productions/expressions.js | 2 +- .../pattern-matching/pattern-matching-spec.js | 5 ++++ .../src/printers/classes.ts | 5 ---- 6 files changed, 12 insertions(+), 48 deletions(-) diff --git a/packages/java-parser/api.d.ts b/packages/java-parser/api.d.ts index e04b3de4f..0273bfe2c 100644 --- a/packages/java-parser/api.d.ts +++ b/packages/java-parser/api.d.ts @@ -171,10 +171,6 @@ export abstract class JavaCstVisitor implements ICstVisitor { param?: IN ): OUT; isDims(ctx: IsDimsCtx, param?: IN): OUT; - isFollowingVariableDeclarator( - ctx: IsFollowingVariableDeclaratorCtx, - param?: IN - ): OUT; compilationUnit(ctx: CompilationUnitCtx, param?: IN): OUT; ordinaryCompilationUnit(ctx: OrdinaryCompilationUnitCtx, param?: IN): OUT; modularCompilationUnit(ctx: ModularCompilationUnitCtx, param?: IN): OUT; @@ -503,10 +499,6 @@ export abstract class JavaCstVisitorWithDefaults param?: IN ): OUT; isDims(ctx: IsDimsCtx, param?: IN): OUT; - isFollowingVariableDeclarator( - ctx: IsFollowingVariableDeclaratorCtx, - param?: IN - ): OUT; compilationUnit(ctx: CompilationUnitCtx, param?: IN): OUT; ordinaryCompilationUnit(ctx: OrdinaryCompilationUnitCtx, param?: IN): OUT; modularCompilationUnit(ctx: ModularCompilationUnitCtx, param?: IN): OUT; @@ -1802,16 +1794,6 @@ export type IsDimsCtx = { RBrace?: IToken[]; }; -export interface IsFollowingVariableDeclaratorCstNode extends CstNode { - name: "isFollowingVariableDeclarator"; - children: IsFollowingVariableDeclaratorCtx; -} - -export type IsFollowingVariableDeclaratorCtx = { - Comma: IToken[]; - variableDeclarator: VariableDeclaratorCstNode[]; -}; - export interface CompilationUnitCstNode extends CstNode { name: "compilationUnit"; children: CompilationUnitCtx; diff --git a/packages/java-parser/src/productions/blocks-and-statements.js b/packages/java-parser/src/productions/blocks-and-statements.js index e3b09135e..9f3228b1c 100644 --- a/packages/java-parser/src/productions/blocks-and-statements.js +++ b/packages/java-parser/src/productions/blocks-and-statements.js @@ -41,12 +41,12 @@ export function defineRules($, t) { }); // https://docs.oracle.com/javase/specs/jls/se22/html/jls-14.html#jls-LocalVariableDeclaration - $.RULE("localVariableDeclaration", () => { + $.RULE("localVariableDeclaration", isSingleDeclarator => { $.MANY(() => { $.SUBRULE($.variableModifier); }); $.SUBRULE($.localVariableType); - $.SUBRULE($.variableDeclaratorList); + $.SUBRULE($.variableDeclaratorList, { ARGS: [isSingleDeclarator] }); }); // https://docs.oracle.com/javase/specs/jls/se22/html/jls-14.html#jls-LocalVariableType diff --git a/packages/java-parser/src/productions/classes.js b/packages/java-parser/src/productions/classes.js index bb9487ecc..fefe0d599 100644 --- a/packages/java-parser/src/productions/classes.js +++ b/packages/java-parser/src/productions/classes.js @@ -154,11 +154,12 @@ export function defineRules($, t) { }); // https://docs.oracle.com/javase/specs/jls/se22/html/jls-8.html#jls-VariableDeclaratorList - $.RULE("variableDeclaratorList", () => { + $.RULE("variableDeclaratorList", isSingleDeclarator => { $.SUBRULE($.variableDeclarator); $.MANY({ - // required to distinguish from patternList - GATE: () => this.BACKTRACK_LOOKAHEAD($.isFollowingVariableDeclarator), + // TypePattern has a semantic requirement that its VariableDeclaratorList + // consists of a single VariableDeclarator + GATE: () => !isSingleDeclarator, DEF: () => { $.CONSUME(t.Comma); $.SUBRULE2($.variableDeclarator); @@ -729,23 +730,4 @@ export function defineRules($, t) { tokenMatcher(this.LA(1), t.LSquare) && tokenMatcher(this.LA(2), t.RSquare) ); }); - - /* - * The following sequence can either be a variable declarator or a component pattern if next token is a comma - * This check if the following sequence is **not** a component pattern sequence - */ - $.RULE("isFollowingVariableDeclarator", () => { - const hasDims = - tokenMatcher(this.LA(3), t.LSquare) && - tokenMatcher(this.LA(4), t.RSquare); - const offset = hasDims ? 2 : 0; - if ( - tokenMatcher(this.LA(offset + 3), t.Identifier) || - tokenMatcher(this.LA(offset + 3), t.Underscore) - ) { - return false; - } - - return !tokenMatcher(this.LA(3), t.LBrace); - }); } diff --git a/packages/java-parser/src/productions/expressions.js b/packages/java-parser/src/productions/expressions.js index ce665a228..46d6980a6 100644 --- a/packages/java-parser/src/productions/expressions.js +++ b/packages/java-parser/src/productions/expressions.js @@ -595,7 +595,7 @@ export function defineRules($, t) { // https://docs.oracle.com/javase/specs/jls/se22/html/jls-14.html#jls-TypePattern $.RULE("typePattern", () => { - $.SUBRULE($.localVariableDeclaration); + $.SUBRULE($.localVariableDeclaration, { ARGS: [true] }); }); // https://docs.oracle.com/javase/specs/jls/se22/html/jls-14.html#jls-RecordPattern diff --git a/packages/java-parser/test/pattern-matching/pattern-matching-spec.js b/packages/java-parser/test/pattern-matching/pattern-matching-spec.js index 15069502b..0a533c3f4 100644 --- a/packages/java-parser/test/pattern-matching/pattern-matching-spec.js +++ b/packages/java-parser/test/pattern-matching/pattern-matching-spec.js @@ -84,4 +84,9 @@ describe("Pattern matching", () => { javaParser.parse(input, "componentPatternList") ).to.not.throw(); }); + + it("should parse switch label with multiple qualified case patterns", () => { + const input = "case b.B _, c.C _"; + expect(() => javaParser.parse(input, "switchLabel")).to.not.throw(); + }); }); diff --git a/packages/prettier-plugin-java/src/printers/classes.ts b/packages/prettier-plugin-java/src/printers/classes.ts index 107fb07e1..5cde0be68 100644 --- a/packages/prettier-plugin-java/src/printers/classes.ts +++ b/packages/prettier-plugin-java/src/printers/classes.ts @@ -56,7 +56,6 @@ import { FormalParameterListCtx, InstanceInitializerCtx, InterfaceTypeListCtx, - IsFollowingVariableDeclaratorCtx, IToken, MethodBodyCtx, MethodDeclarationCtx, @@ -1072,8 +1071,4 @@ export class ClassesPrettierVisitor extends BaseCstPrettierPrinter { isDims() { return "isDims"; } - - isFollowingVariableDeclarator() { - return "isFollowingVariableDeclarator"; - } }