--- a/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue May 14 13:55:35 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue May 14 15:04:06 2013 -0700
@@ -25,12 +25,12 @@
package com.sun.tools.javac.comp;
import com.sun.tools.javac.tree.*;
-import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.tree.TreeTranslator;
+import com.sun.tools.javac.code.Attribute;
import com.sun.tools.javac.code.Kinds;
import com.sun.tools.javac.code.Scope;
import com.sun.tools.javac.code.Symbol;
@@ -46,7 +46,6 @@
import com.sun.tools.javac.comp.Lower.BasicFreeVarCollector;
import com.sun.tools.javac.jvm.*;
import com.sun.tools.javac.util.*;
-import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
@@ -238,6 +237,24 @@
MethodSymbol sym = (MethodSymbol)localContext.translatedSym;
MethodType lambdaType = (MethodType) sym.type;
+ {
+ MethodSymbol owner = (MethodSymbol) localContext.owner;
+ ListBuffer<Attribute.TypeCompound> ownerTypeAnnos = new ListBuffer<Attribute.TypeCompound>();
+ ListBuffer<Attribute.TypeCompound> lambdaTypeAnnos = new ListBuffer<Attribute.TypeCompound>();
+
+ for (Attribute.TypeCompound tc : owner.getRawTypeAttributes()) {
+ if (tc.position.onLambda == tree) {
+ lambdaTypeAnnos.append(tc);
+ } else {
+ ownerTypeAnnos.append(tc);
+ }
+ }
+ if (lambdaTypeAnnos.nonEmpty()) {
+ owner.annotations.setTypeAttributes(ownerTypeAnnos.toList());
+ sym.annotations.setTypeAttributes(lambdaTypeAnnos.toList());
+ }
+ }
+
//create the method declaration hoisting the lambda body
JCMethodDecl lambdaDecl = make.MethodDef(make.Modifiers(sym.flags_field),
sym.name,
@@ -373,12 +390,15 @@
if (lambdaContext.getSymbolMap(PARAM).containsKey(tree.sym)) {
Symbol translatedSym = lambdaContext.getSymbolMap(PARAM).get(tree.sym);
result = make.Ident(translatedSym).setType(tree.type);
+ translatedSym.annotations.setTypeAttributes(tree.sym.getRawTypeAttributes());
} else if (lambdaContext.getSymbolMap(LOCAL_VAR).containsKey(tree.sym)) {
Symbol translatedSym = lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym);
result = make.Ident(translatedSym).setType(tree.type);
+ translatedSym.annotations.setTypeAttributes(tree.sym.getRawTypeAttributes());
} else if (lambdaContext.getSymbolMap(TYPE_VAR).containsKey(tree.sym)) {
Symbol translatedSym = lambdaContext.getSymbolMap(TYPE_VAR).get(tree.sym);
result = make.Ident(translatedSym).setType(translatedSym.type);
+ translatedSym.annotations.setTypeAttributes(tree.sym.getRawTypeAttributes());
} else if (lambdaContext.getSymbolMap(CAPTURED_VAR).containsKey(tree.sym)) {
Symbol translatedSym = lambdaContext.getSymbolMap(CAPTURED_VAR).get(tree.sym);
result = make.Ident(translatedSym).setType(tree.type);
@@ -1676,24 +1696,33 @@
* synthetic lambda body
*/
Symbol translate(Name name, final Symbol sym, LambdaSymbolKind skind) {
+ Symbol ret;
switch (skind) {
case CAPTURED_THIS:
- return sym; // self represented
+ ret = sym; // self represented
+ break;
case TYPE_VAR:
// Just erase the type var
- return new VarSymbol(sym.flags(), name,
+ ret = new VarSymbol(sym.flags(), name,
types.erasure(sym.type), sym.owner);
+ break;
case CAPTURED_VAR:
- return new VarSymbol(SYNTHETIC | FINAL, name, types.erasure(sym.type), translatedSym) {
+ ret = new VarSymbol(SYNTHETIC | FINAL, name, types.erasure(sym.type), translatedSym) {
@Override
public Symbol baseSymbol() {
//keep mapping with original captured symbol
return sym;
}
};
+ break;
default:
- return makeSyntheticVar(FINAL, name, types.erasure(sym.type), translatedSym);
+ ret = makeSyntheticVar(FINAL, name, types.erasure(sym.type), translatedSym);
}
+ if (ret != sym) {
+ ret.annotations.setDeclarationAttributes(sym.getRawAttributes());
+ ret.annotations.setTypeAttributes(sym.getRawTypeAttributes());
+ }
+ return ret;
}
void addSymbol(Symbol sym, LambdaSymbolKind skind) {