forked from checkstyle/checkstyle
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Issue checkstyle#12507: Support record patterns preview
- Loading branch information
Showing
9 changed files
with
1,459 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
44 changes: 44 additions & 0 deletions
44
src/test/java/com/puppycrawl/tools/checkstyle/grammar/java19/Java19AstRegressionTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/////////////////////////////////////////////////////////////////////////////////////////////// | ||
// checkstyle: Checks Java source code and other text files for adherence to a set of rules. | ||
// Copyright (C) 2001-2022 the original author or authors. | ||
// | ||
// This library is free software; you can redistribute it and/or | ||
// modify it under the terms of the GNU Lesser General Public | ||
// License as published by the Free Software Foundation; either | ||
// version 2.1 of the License, or (at your option) any later version. | ||
// | ||
// This library is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
// Lesser General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU Lesser General Public | ||
// License along with this library; if not, write to the Free Software | ||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
/////////////////////////////////////////////////////////////////////////////////////////////// | ||
|
||
package com.puppycrawl.tools.checkstyle.grammar.java19; | ||
|
||
import org.junit.jupiter.api.Test; | ||
|
||
import com.puppycrawl.tools.checkstyle.AbstractTreeTestSupport; | ||
|
||
public class Java19AstRegressionTest extends AbstractTreeTestSupport { | ||
|
||
@Override | ||
protected String getPackageLocation() { | ||
return "com/puppycrawl/tools/checkstyle/grammar/java19"; | ||
} | ||
|
||
@Test | ||
public void testRecordPatternsWithNestedDecomposition() throws Exception { | ||
verifyAst(getPath("ExpectedRecordPatternsPreviewNestedDecomposition.txt"), | ||
getNonCompilablePath("RecordPatternsPreviewNestedDecomposition.java")); | ||
} | ||
|
||
@Test | ||
public void testRecordPatternsPreview() throws Exception { | ||
verifyAst(getPath("ExpectedRecordPatternsPreview.txt"), | ||
getNonCompilablePath("InputRecordPatternsPreview.java")); | ||
} | ||
} |
116 changes: 116 additions & 0 deletions
116
...compilable/com/puppycrawl/tools/checkstyle/grammar/java19/InputRecordPatternsPreview.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
//non-compiled with javac: Compilable with Java19 | ||
package com.puppycrawl.tools.checkstyle.grammar.java19; | ||
|
||
public class InputRecordPatternsPreview { | ||
record Box<T>(T t) { | ||
} | ||
|
||
class A { | ||
} | ||
|
||
class B extends A { | ||
} | ||
|
||
sealed interface I permits C, D { | ||
} | ||
|
||
final class C implements I { | ||
} | ||
|
||
final class D implements I { | ||
} | ||
|
||
record Pair<T>(T x, T y) { | ||
} | ||
|
||
record Tuple(Object o1, Object o2, Object o3) {} | ||
record VarArgs(Object... objArgs){} | ||
|
||
|
||
static void test1(Box<Object> bo) { | ||
if (bo instanceof Box<Object>(String s)) { | ||
System.out.println("String " + s); | ||
} | ||
} | ||
|
||
static void test2(Box<Object> bo) { | ||
if (bo instanceof Box<?>(var s)) { | ||
System.out.println("String " + s); | ||
} | ||
} | ||
|
||
void test3(Box<I> bo) { | ||
C c = new C(); | ||
if (bo instanceof Box<I>(var s)) { | ||
System.out.println("String " + s); | ||
} | ||
else if (bo instanceof Box b) { | ||
|
||
} | ||
else if (bo instanceof Box<I> b && bo.t.equals(c)) { | ||
|
||
} | ||
else if (bo != null && bo.t.equals(c)) { | ||
|
||
} | ||
} | ||
|
||
static void test4(Pair<I> p) { | ||
if (p instanceof Pair<I>(C t1, C t2)) { | ||
System.out.println(t2); | ||
} | ||
else if (p instanceof Pair<I>(D t1, D t2)) { | ||
System.out.println(t1); | ||
} | ||
} | ||
|
||
static void test5(Tuple t) { | ||
if (t instanceof Tuple(String x, String y, String z)) { | ||
System.out.println(x + y + z); | ||
} | ||
else if (t instanceof Tuple(Integer x, Integer y, Integer z)) { | ||
System.out.println(x + y + z); | ||
} | ||
} | ||
|
||
static void test5(VarArgs v) { | ||
if (v instanceof VarArgs(Integer[] ints)) { | ||
int l = ints.length; | ||
} | ||
else if (v instanceof VarArgs(Object[] objects) | ||
&& objects.length > 2) { | ||
int l = objects.length; | ||
} | ||
else if (v instanceof VarArgs(Object[] objects) | ||
&& objects.length < 2){ | ||
int l = objects.length; | ||
} | ||
|
||
} | ||
|
||
static void m1(Pair<I> p1) { | ||
switch (p1) { | ||
case Pair<I>(I i,C c) -> | ||
System.out.println("C!"); | ||
case Pair<I>(I i,D d) -> | ||
System.out.println("D!"); | ||
} | ||
|
||
switch (p1) { | ||
case Pair<I>(C c,I i) -> | ||
System.out.println("T!"); | ||
case Pair<I>(D d,C c) -> | ||
System.out.println("C!"); | ||
case Pair<I>(D d1,D d2) -> | ||
System.out.println("D!"); | ||
} | ||
} | ||
|
||
String m2(Pair<I> p1) { | ||
return switch (p1) { | ||
case Pair<I>(C c,I i) -> "T!"; | ||
case Pair<I>(D d,C c) -> "C!"; | ||
case Pair<I>(D d1,D d2) -> "D!"; | ||
}; | ||
} | ||
} |
77 changes: 77 additions & 0 deletions
77
.../puppycrawl/tools/checkstyle/grammar/java19/RecordPatternsPreviewNestedDecomposition.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
public class RecordPatternsPreviewNestedDecomposition { | ||
record A(Object o) { | ||
} | ||
|
||
record B(Object o) { | ||
} | ||
|
||
record Point(int x, int y) { | ||
} | ||
|
||
enum Color {RED, GREEN, BLUE} | ||
|
||
record ColoredPoint(Point p, Color c) { | ||
} | ||
|
||
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) { | ||
} | ||
|
||
void method(Object param) { | ||
switch (param) { | ||
case A(Object o) -> { | ||
} | ||
case B(var o) -> { | ||
} | ||
default -> { | ||
} | ||
} | ||
if (param instanceof A(var o)) { | ||
|
||
} | ||
} | ||
|
||
// Decompose record | ||
static void p1(Rectangle r) { | ||
if (r instanceof Rectangle(ColoredPoint ul,ColoredPoint lr)) { | ||
System.out.println(ul.c()); | ||
} | ||
} | ||
|
||
// We can decompose this record further, since Point is also | ||
// a record | ||
static void p2(Rectangle r) { | ||
if (r instanceof Rectangle(ColoredPoint(Point p1,Color c1), | ||
ColoredPoint lr1) | ||
&& r instanceof Rectangle(ColoredPoint(Point p2,Color c2), | ||
ColoredPoint lr2) && lr2.c == Color.BLUE) { | ||
System.out.println(r); | ||
} | ||
} | ||
|
||
// We can keep decomposing down to the last "inner" record | ||
static void p3(Rectangle r) { | ||
if (r instanceof Rectangle(ColoredPoint(Point p1,Color c1), | ||
ColoredPoint lr1) | ||
&& r instanceof Rectangle( | ||
ColoredPoint(Point(int x,int y),Color c2), | ||
ColoredPoint lr2)) { | ||
System.out.println(r); | ||
} | ||
} | ||
|
||
static void p4() { | ||
int x1 = 0; | ||
int x2 = 0; | ||
int y1 = 0; | ||
int y2 = 0; | ||
Color c1 = Color.BLUE; | ||
Color c2 = Color.GREEN; | ||
Rectangle r = new Rectangle(new ColoredPoint(new Point(x1, y1), c1), | ||
new ColoredPoint(new Point(x2, y2), c2)); | ||
if (r instanceof Rectangle( | ||
ColoredPoint(Point(var x,var y),var c), | ||
var lr)) { | ||
System.out.println(x); | ||
} | ||
} | ||
} |
Oops, something went wrong.