--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java Mon Sep 09 11:43:16 2019 -0400
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java Wed Nov 27 09:00:01 2019 +0100
@@ -38,6 +38,7 @@
import com.sun.tools.javac.code.Directive.RequiresDirective;
import com.sun.tools.javac.code.Scope.*;
import com.sun.tools.javac.code.Symbol.*;
+import com.sun.tools.javac.comp.MatchBindingsComputer.BindingSymbol;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.DefinedBy.Api;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@@ -238,6 +239,10 @@
*/
TYPETEST,
+ /** Patterns.
+ */
+ BINDINGPATTERN,
+
/** Indexed array expressions, of type Indexed.
*/
INDEXED,
@@ -2135,10 +2140,10 @@
*/
public static class JCInstanceOf extends JCExpression implements InstanceOfTree {
public JCExpression expr;
- public JCTree clazz;
- protected JCInstanceOf(JCExpression expr, JCTree clazz) {
+ public JCTree pattern;
+ protected JCInstanceOf(JCExpression expr, JCTree pattern) {
this.expr = expr;
- this.clazz = clazz;
+ this.pattern = pattern;
}
@Override
public void accept(Visitor v) { v.visitTypeTest(this); }
@@ -2146,7 +2151,13 @@
@DefinedBy(Api.COMPILER_TREE)
public Kind getKind() { return Kind.INSTANCE_OF; }
@DefinedBy(Api.COMPILER_TREE)
- public JCTree getType() { return clazz; }
+ public JCTree getType() { return pattern instanceof JCPattern ? pattern.hasTag(BINDINGPATTERN) ? ((JCBindingPattern) pattern).vartype : null : pattern; }
+
+ @Override @DefinedBy(Api.COMPILER_TREE)
+ public JCPattern getPattern() {
+ return pattern instanceof JCPattern ? (JCPattern) pattern : null;
+ }
+
@DefinedBy(Api.COMPILER_TREE)
public JCExpression getExpression() { return expr; }
@Override @DefinedBy(Api.COMPILER_TREE)
@@ -2160,6 +2171,60 @@
}
/**
+ * Pattern matching forms.
+ */
+ public static abstract class JCPattern extends JCTree
+ implements PatternTree {
+ public JCExpression constExpression() {
+ return null;
+ }
+ }
+
+ public static class JCBindingPattern extends JCPattern
+ implements BindingPatternTree {
+ public Name name;
+ public BindingSymbol symbol;
+ public JCTree vartype;
+
+ protected JCBindingPattern(Name name, BindingSymbol symbol, JCTree vartype) {
+ this.name = name;
+ this.symbol = symbol;
+ this.vartype = vartype;
+ }
+
+ @DefinedBy(Api.COMPILER_TREE)
+ public Name getBinding() {
+ return name;
+ }
+
+ @Override @DefinedBy(Api.COMPILER_TREE)
+ public Tree getType() {
+ return vartype;
+ }
+
+ @Override
+ public void accept(Visitor v) {
+ v.visitBindingPattern(this);
+ }
+
+ @DefinedBy(Api.COMPILER_TREE)
+ public Kind getKind() {
+ return Kind.BINDING_PATTERN;
+ }
+
+ @Override
+ @DefinedBy(Api.COMPILER_TREE)
+ public <R, D> R accept(TreeVisitor<R, D> v, D d) {
+ return v.visitBindingPattern(this, d);
+ }
+
+ @Override
+ public Tag getTag() {
+ return BINDINGPATTERN;
+ }
+ }
+
+ /**
* An array selection
*/
public static class JCArrayAccess extends JCExpression implements ArrayAccessTree {
@@ -3133,6 +3198,7 @@
JCBinary Binary(Tag opcode, JCExpression lhs, JCExpression rhs);
JCTypeCast TypeCast(JCTree expr, JCExpression type);
JCInstanceOf TypeTest(JCExpression expr, JCTree clazz);
+ JCBindingPattern BindingPattern(Name name, JCTree vartype);
JCArrayAccess Indexed(JCExpression indexed, JCExpression index);
JCFieldAccess Select(JCExpression selected, Name selector);
JCIdent Ident(Name idname);
@@ -3197,6 +3263,7 @@
public void visitBinary(JCBinary that) { visitTree(that); }
public void visitTypeCast(JCTypeCast that) { visitTree(that); }
public void visitTypeTest(JCInstanceOf that) { visitTree(that); }
+ public void visitBindingPattern(JCBindingPattern that) { visitTree(that); }
public void visitIndexed(JCArrayAccess that) { visitTree(that); }
public void visitSelect(JCFieldAccess that) { visitTree(that); }
public void visitReference(JCMemberReference that) { visitTree(that); }