src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java

changeset 1515
b61e5f801f7c
parent 1510
7873d37f5b37
child 1587
f1f605f85850
equal deleted inserted replaced
1514:be443002e970 1515:b61e5f801f7c
857 super.visitClassDef(tree); 857 super.visitClassDef(tree);
858 } 858 }
859 finally { 859 finally {
860 frameStack = prevStack; 860 frameStack = prevStack;
861 } 861 }
862 if (frameStack.nonEmpty() && enclosingLambda() != null) { 862 if (!tree.sym.isStatic() && frameStack.nonEmpty() && enclosingLambda() != null) {
863 // Any class defined within a lambda is an implicit 'this' reference 863 // Any (non-static) class defined within a lambda is an implicit 'this' reference
864 // because its constructor will reference the enclosing class 864 // because its constructor will reference the enclosing class
865 ((LambdaTranslationContext) context()).addSymbol(tree.sym.type.getEnclosingType().tsym, CAPTURED_THIS); 865 ((LambdaTranslationContext) context()).addSymbol(tree.sym.type.getEnclosingType().tsym, CAPTURED_THIS);
866 } 866 }
867 } 867 }
868 868
992 /** 992 /**
993 * Return a valid owner given the current declaration stack 993 * Return a valid owner given the current declaration stack
994 * (required to skip synthetic lambda symbols) 994 * (required to skip synthetic lambda symbols)
995 */ 995 */
996 private Symbol owner() { 996 private Symbol owner() {
997 return owner(false);
998 }
999
1000 @SuppressWarnings("fallthrough")
1001 private Symbol owner(boolean skipLambda) {
997 List<Frame> frameStack2 = frameStack; 1002 List<Frame> frameStack2 = frameStack;
998 while (frameStack2.nonEmpty()) { 1003 while (frameStack2.nonEmpty()) {
999 switch (frameStack2.head.tree.getTag()) { 1004 switch (frameStack2.head.tree.getTag()) {
1000 case VARDEF: 1005 case VARDEF:
1001 if (((JCVariableDecl)frameStack2.head.tree).sym.isLocal()) { 1006 if (((JCVariableDecl)frameStack2.head.tree).sym.isLocal()) {
1010 case CLASSDEF: 1015 case CLASSDEF:
1011 return ((JCClassDecl)frameStack2.head.tree).sym; 1016 return ((JCClassDecl)frameStack2.head.tree).sym;
1012 case METHODDEF: 1017 case METHODDEF:
1013 return ((JCMethodDecl)frameStack2.head.tree).sym; 1018 return ((JCMethodDecl)frameStack2.head.tree).sym;
1014 case LAMBDA: 1019 case LAMBDA:
1015 return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym; 1020 if (!skipLambda)
1021 return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym;
1016 default: 1022 default:
1017 frameStack2 = frameStack2.tail; 1023 frameStack2 = frameStack2.tail;
1018 } 1024 }
1019 } 1025 }
1020 Assert.error(); 1026 Assert.error();
1309 (MethodType) generatedLambdaSig(), 1315 (MethodType) generatedLambdaSig(),
1310 TreeInfo.types(syntheticParams)); 1316 TreeInfo.types(syntheticParams));
1311 } 1317 }
1312 1318
1313 Type enclosingType() { 1319 Type enclosingType() {
1314 //local inner classes defined inside a lambda are always non-static 1320 return owner.isStatic() ?
1315 return owner.enclClass().type; 1321 Type.noType :
1322 owner.enclClass().type;
1316 } 1323 }
1317 1324
1318 Type generatedLambdaSig() { 1325 Type generatedLambdaSig() {
1319 return types.erasure(tree.descriptorType); 1326 return types.erasure(tree.descriptorType);
1320 } 1327 }

mercurial