From d37389da6321138c5d547b14476b2f4178af949f Mon Sep 17 00:00:00 2001 From: Clement Dessoude Date: Sat, 22 Aug 2020 09:29:13 +0200 Subject: [PATCH] fix: fix parsing of unannPrimitiveType in primary fix #412 --- .../java-parser/src/productions/classes.js | 18 +++++++++--------- .../java-parser/src/productions/expressions.js | 4 +--- packages/java-parser/test/bugs-spec.js | 5 +++++ packages/prettier-plugin-java/src/options.js | 1 + .../src/printers/classes.js | 6 +++--- .../src/printers/expressions.js | 2 +- .../test/unit-test/expressions/_input.java | 17 ++++++++++------- .../test/unit-test/expressions/_output.java | 10 ++++++++++ 8 files changed, 40 insertions(+), 23 deletions(-) diff --git a/packages/java-parser/src/productions/classes.js b/packages/java-parser/src/productions/classes.js index 78e709b9..539ea419 100644 --- a/packages/java-parser/src/productions/classes.js +++ b/packages/java-parser/src/productions/classes.js @@ -222,19 +222,19 @@ function defineRules($, t) { $.OR([ // Spec Deviation: The array type "dims" suffix was extracted to this rule // to avoid backtracking for performance reasons. - { - ALT: () => { - $.SUBRULE($.unannPrimitiveType); - $.OPTION({ - GATE: () => this.BACKTRACK_LOOKAHEAD($.isDims), - DEF: () => $.SUBRULE2($.dims) - }); - } - }, + { ALT: () => $.SUBRULE($.unannPrimitiveTypeWithOptionalDimsSuffix) }, { ALT: () => $.SUBRULE($.unannReferenceType) } ]); }); + $.RULE("unannPrimitiveTypeWithOptionalDimsSuffix", () => { + $.SUBRULE($.unannPrimitiveType); + $.OPTION({ + GATE: () => this.BACKTRACK_LOOKAHEAD($.isDims), + DEF: () => $.SUBRULE2($.dims) + }); + }); + // https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-UnannPrimitiveType $.RULE("unannPrimitiveType", () => { $.OR([ diff --git a/packages/java-parser/src/productions/expressions.js b/packages/java-parser/src/productions/expressions.js index aff08417..44ea717e 100644 --- a/packages/java-parser/src/productions/expressions.js +++ b/packages/java-parser/src/productions/expressions.js @@ -219,9 +219,7 @@ function defineRules($, t) { { ALT: () => $.SUBRULE($.literal) }, { ALT: () => $.CONSUME(t.This) }, { ALT: () => $.CONSUME(t.Void) }, - // should be extracted to primitive type with optional dims suffix? - { ALT: () => $.SUBRULE($.numericType) }, - { ALT: () => $.CONSUME(t.Boolean) }, + { ALT: () => $.SUBRULE($.unannPrimitiveTypeWithOptionalDimsSuffix) }, { ALT: () => $.SUBRULE($.fqnOrRefType) }, { GATE: () => isCastExpression, diff --git a/packages/java-parser/test/bugs-spec.js b/packages/java-parser/test/bugs-spec.js index eeca5983..e643ce19 100644 --- a/packages/java-parser/test/bugs-spec.js +++ b/packages/java-parser/test/bugs-spec.js @@ -87,4 +87,9 @@ describe("The Java Parser fixed bugs", () => { const input = "(left) < right"; expect(() => javaParser.parse(input, "expression")).to.not.throw(); }); + + it("issue #412 - should parse a double[][] as primaryPrefix", () => { + const input = "double[][]"; + expect(() => javaParser.parse(input, "primaryPrefix")).to.not.throw(); + }); }); diff --git a/packages/prettier-plugin-java/src/options.js b/packages/prettier-plugin-java/src/options.js index d1a2f9b0..092c8460 100644 --- a/packages/prettier-plugin-java/src/options.js +++ b/packages/prettier-plugin-java/src/options.js @@ -74,6 +74,7 @@ module.exports = { { value: "variableInitializer" }, { value: "unannType" }, { value: "unannPrimitiveType" }, + { value: "unannPrimitiveTypeWithOptionalDimsSuffix" }, { value: "unannReferenceType" }, { value: "unannClassOrInterfaceType" }, { value: "unannClassType" }, diff --git a/packages/prettier-plugin-java/src/printers/classes.js b/packages/prettier-plugin-java/src/printers/classes.js index de7147ca..cb5c57c9 100644 --- a/packages/prettier-plugin-java/src/printers/classes.js +++ b/packages/prettier-plugin-java/src/printers/classes.js @@ -300,10 +300,10 @@ class ClassesPrettierVisitor { } unannType(ctx) { - if (ctx.unannReferenceType !== undefined) { - return this.visit(ctx.unannReferenceType); - } + return this.visitSingle(ctx); + } + unannPrimitiveTypeWithOptionalDimsSuffix(ctx) { const unannPrimitiveType = this.visit(ctx.unannPrimitiveType); const dims = this.visit(ctx.dims); diff --git a/packages/prettier-plugin-java/src/printers/expressions.js b/packages/prettier-plugin-java/src/printers/expressions.js index ee56c5d0..c9c593a9 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.js +++ b/packages/prettier-plugin-java/src/printers/expressions.js @@ -362,7 +362,7 @@ class ExpressionsPrettierVisitor { } primaryPrefix(ctx, params) { - if (ctx.This || ctx.Void || ctx.Boolean) { + if (ctx.This || ctx.Void) { return printTokenWithComments(this.getSingle(ctx)); } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java index 495d4bae..31e77d8d 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_input.java @@ -89,7 +89,7 @@ public void printIf() { } if(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { - + } if(myValue != 42 && myValue == 42) { @@ -103,11 +103,11 @@ public void printSwitch() { } switch(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { - + } switch(myValue != 42) { - + } switch(myValue != 42 && myValue == 42) { @@ -117,17 +117,17 @@ public void printSwitch() { public void printWhile() { while/*infinite*/ (true) /*stop the program*/throw new RuntimeException(); - + while(myValue == 42 || myValue == 42 && myValue == 42 && myValue == 42 || myValue == 42 && myValue == 42) { } while(myValue != 42 && 42/42 || myValue & 42 && myValue > 42 || myValue < 42 && myValue == 42) { - + } while(myValue != 42) { - + } while(myValue != 42 && myValue == 42) { @@ -178,9 +178,12 @@ public void longFullyQualifiedName() { com .me.very.very.very.very.very.very.very.very.very.very.very.very.very.longg.fully.qualified.name.FullyQualifiedName.builder() .build(); - + com.FullyQualifiedName.builder(); } + public void unannTypePrimitiveWithMethodReferenceSuffix(String[] args) { + List.of(new double[][] { 1,2,3,4.1,5.6846465}, new double[][] { 1,2,3,4.1,5.6846465}, new double[][] { 1,2,3,4.1,5.6846465}).toArray(double[][]::new); + } } diff --git a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java index 95af907a..ea959ee8 100644 --- a/packages/prettier-plugin-java/test/unit-test/expressions/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/expressions/_output.java @@ -235,4 +235,14 @@ public void longFullyQualifiedName() { com.FullyQualifiedName.builder(); } + + public void unannTypePrimitiveWithMethodReferenceSuffix(String[] args) { + List + .of( + new double[][] { 1, 2, 3, 4.1, 5.6846465 }, + new double[][] { 1, 2, 3, 4.1, 5.6846465 }, + new double[][] { 1, 2, 3, 4.1, 5.6846465 } + ) + .toArray(double[][]::new); + } }