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()) { |
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 } |