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