src/share/classes/com/sun/tools/javac/tree/JCTree.java

changeset 1510
7873d37f5b37
parent 1496
f785dcac17b7
child 1521
71f35e4b93a5
     1.1 --- a/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Mon Jan 21 11:16:28 2013 -0800
     1.2 +++ b/src/share/classes/com/sun/tools/javac/tree/JCTree.java	Mon Jan 21 20:13:56 2013 +0000
     1.3 @@ -607,6 +607,42 @@
     1.4      }
     1.5  
     1.6      /**
     1.7 +     * Common supertype for all poly expression trees (lambda, method references,
     1.8 +     * conditionals, method and constructor calls)
     1.9 +     */
    1.10 +    public static abstract class JCPolyExpression extends JCExpression {
    1.11 +
    1.12 +        /**
    1.13 +         * A poly expression can only be truly 'poly' in certain contexts
    1.14 +         */
    1.15 +        public enum PolyKind {
    1.16 +            /** poly expression to be treated as a standalone expression */
    1.17 +            STANDALONE,
    1.18 +            /** true poly expression */
    1.19 +            POLY;
    1.20 +        }
    1.21 +
    1.22 +        /** is this poly expression a 'true' poly expression? */
    1.23 +        public PolyKind polyKind;
    1.24 +    }
    1.25 +
    1.26 +    /**
    1.27 +     * Common supertype for all functional expression trees (lambda and method references)
    1.28 +     */
    1.29 +    public static abstract class JCFunctionalExpression extends JCPolyExpression {
    1.30 +
    1.31 +        public JCFunctionalExpression() {
    1.32 +            //a functional expression is always a 'true' poly
    1.33 +            polyKind = PolyKind.POLY;
    1.34 +        }
    1.35 +
    1.36 +        /** target descriptor inferred for this functional expression. */
    1.37 +        public Type descriptorType;
    1.38 +        /** list of target types inferred for this functional expression. */
    1.39 +        public List<TypeSymbol> targets;
    1.40 +    }
    1.41 +
    1.42 +    /**
    1.43       * A class definition.
    1.44       */
    1.45      public static class JCClassDecl extends JCStatement implements ClassTree {
    1.46 @@ -1147,7 +1183,7 @@
    1.47      /**
    1.48       * A ( ) ? ( ) : ( ) conditional expression
    1.49       */
    1.50 -    public static class JCConditional extends JCExpression implements ConditionalExpressionTree {
    1.51 +    public static class JCConditional extends JCPolyExpression implements ConditionalExpressionTree {
    1.52          public JCExpression cond;
    1.53          public JCExpression truepart;
    1.54          public JCExpression falsepart;
    1.55 @@ -1373,7 +1409,7 @@
    1.56      /**
    1.57       * A method invocation
    1.58       */
    1.59 -    public static class JCMethodInvocation extends JCExpression implements MethodInvocationTree {
    1.60 +    public static class JCMethodInvocation extends JCPolyExpression implements MethodInvocationTree {
    1.61          public List<JCExpression> typeargs;
    1.62          public JCExpression meth;
    1.63          public List<JCExpression> args;
    1.64 @@ -1416,7 +1452,7 @@
    1.65      /**
    1.66       * A new(...) operation.
    1.67       */
    1.68 -    public static class JCNewClass extends JCExpression implements NewClassTree {
    1.69 +    public static class JCNewClass extends JCPolyExpression implements NewClassTree {
    1.70          public JCExpression encl;
    1.71          public List<JCExpression> typeargs;
    1.72          public JCExpression clazz;
    1.73 @@ -1502,18 +1538,29 @@
    1.74      /**
    1.75       * A lambda expression.
    1.76       */
    1.77 -    public static class JCLambda extends JCExpression implements LambdaExpressionTree {
    1.78 +    public static class JCLambda extends JCFunctionalExpression implements LambdaExpressionTree {
    1.79 +
    1.80 +        public enum ParameterKind {
    1.81 +            IMPLICIT,
    1.82 +            EXPLICIT;
    1.83 +        }
    1.84  
    1.85          public List<JCVariableDecl> params;
    1.86          public JCTree body;
    1.87 -        public Type targetType;
    1.88          public boolean canCompleteNormally = true;
    1.89          public List<Type> inferredThrownTypes;
    1.90 +        public ParameterKind paramKind;
    1.91  
    1.92          public JCLambda(List<JCVariableDecl> params,
    1.93                          JCTree body) {
    1.94              this.params = params;
    1.95              this.body = body;
    1.96 +            if (params.isEmpty() ||
    1.97 +                params.head.vartype != null) {
    1.98 +                paramKind = ParameterKind.EXPLICIT;
    1.99 +            } else {
   1.100 +                paramKind = ParameterKind.IMPLICIT;
   1.101 +            }
   1.102          }
   1.103          @Override
   1.104          public Tag getTag() {
   1.105 @@ -1812,15 +1859,15 @@
   1.106      /**
   1.107       * Selects a member expression.
   1.108       */
   1.109 -    public static class JCMemberReference extends JCExpression implements MemberReferenceTree {
   1.110 +    public static class JCMemberReference extends JCFunctionalExpression implements MemberReferenceTree {
   1.111          public ReferenceMode mode;
   1.112          public ReferenceKind kind;
   1.113          public Name name;
   1.114          public JCExpression expr;
   1.115          public List<JCExpression> typeargs;
   1.116 -        public Type targetType;
   1.117          public Symbol sym;
   1.118          public Type varargsElement;
   1.119 +        public PolyKind refPolyKind;
   1.120  
   1.121          /**
   1.122           * Javac-dependent classification for member references, based

mercurial