55 import java.util.HashMap;
56 import java.util.HashSet;
57 import java.util.LinkedHashMap;
58 import java.util.Map;
59 import java.util.Objects;
60 import java.util.Optional;
61 import java.util.Set;
62 import java.util.function.Consumer;
63 import java.util.function.Supplier;
64
65 import static com.sun.tools.javac.comp.LambdaToMethod.LambdaSymbolKind.*;
66 import static com.sun.tools.javac.code.Flags.*;
67 import static com.sun.tools.javac.code.Kinds.Kind.*;
68 import static com.sun.tools.javac.code.TypeTag.*;
69 import static com.sun.tools.javac.tree.JCTree.Tag.*;
70 import static com.sun.tools.javac.jvm.Pool.DynamicMethod;
71
72 import javax.lang.model.element.ElementKind;
73 import javax.lang.model.type.TypeKind;
74
75 import com.sun.tools.javac.code.Type.IntersectionClassType;
76 import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
77 import com.sun.tools.javac.main.Option;
78
79 /**
80 * This pass desugars lambda expressions into static methods
81 *
82 * <p><b>This is NOT part of any supported API.
83 * If you write code that depends on this, you do so at your own risk.
84 * This code and its internal interfaces are subject to change or
85 * deletion without notice.</b>
86 */
87 public class LambdaToMethod extends TreeTranslator {
88
89 private Attr attr;
90 private JCDiagnostic.Factory diags;
91 private Log log;
92 private Lower lower;
93 private Names names;
94 private Symtab syms;
697
698 }
699 }
700
701 JCBlock trans_block = new LambdaBodyTranslator().translate(block);
702 if (completeNormally && isTarget_Void) {
703 //there's no return statement and the lambda (possibly inferred)
704 //return type is java.lang.Void; emit a synthetic return statement
705 trans_block.stats = trans_block.stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType)));
706 }
707 return trans_block;
708 }
709
710 private JCMethodDecl makeDeserializeMethod(Symbol kSym) {
711 ListBuffer<JCCase> cases = new ListBuffer<>();
712 ListBuffer<JCBreak> breaks = new ListBuffer<>();
713 for (Map.Entry<String, ListBuffer<JCStatement>> entry : kInfo.deserializeCases.entrySet()) {
714 JCBreak br = make.Break(null);
715 breaks.add(br);
716 List<JCStatement> stmts = entry.getValue().append(br).toList();
717 cases.add(make.Case(make.Literal(entry.getKey()), stmts));
718 }
719 JCSwitch sw = make.Switch(deserGetter("getImplMethodName", syms.stringType), cases.toList());
720 for (JCBreak br : breaks) {
721 br.target = sw;
722 }
723 JCBlock body = make.Block(0L, List.of(
724 sw,
725 make.Throw(makeNewClass(
726 syms.illegalArgumentExceptionType,
727 List.of(make.Literal("Invalid lambda deserialization"))))));
728 JCMethodDecl deser = make.MethodDef(make.Modifiers(kInfo.deserMethodSym.flags()),
729 names.deserializeLambda,
730 make.QualIdent(kInfo.deserMethodSym.getReturnType().tsym),
731 List.nil(),
732 List.of(make.VarDef(kInfo.deserParamSym, null)),
733 List.nil(),
734 body,
735 null);
736 deser.sym = kInfo.deserMethodSym;
737 deser.type = kInfo.deserMethodSym.type;
|
55 import java.util.HashMap;
56 import java.util.HashSet;
57 import java.util.LinkedHashMap;
58 import java.util.Map;
59 import java.util.Objects;
60 import java.util.Optional;
61 import java.util.Set;
62 import java.util.function.Consumer;
63 import java.util.function.Supplier;
64
65 import static com.sun.tools.javac.comp.LambdaToMethod.LambdaSymbolKind.*;
66 import static com.sun.tools.javac.code.Flags.*;
67 import static com.sun.tools.javac.code.Kinds.Kind.*;
68 import static com.sun.tools.javac.code.TypeTag.*;
69 import static com.sun.tools.javac.tree.JCTree.Tag.*;
70 import static com.sun.tools.javac.jvm.Pool.DynamicMethod;
71
72 import javax.lang.model.element.ElementKind;
73 import javax.lang.model.type.TypeKind;
74
75 import com.sun.source.tree.CaseTree.CaseKind;
76 import com.sun.tools.javac.code.Type.IntersectionClassType;
77 import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
78 import com.sun.tools.javac.main.Option;
79
80 /**
81 * This pass desugars lambda expressions into static methods
82 *
83 * <p><b>This is NOT part of any supported API.
84 * If you write code that depends on this, you do so at your own risk.
85 * This code and its internal interfaces are subject to change or
86 * deletion without notice.</b>
87 */
88 public class LambdaToMethod extends TreeTranslator {
89
90 private Attr attr;
91 private JCDiagnostic.Factory diags;
92 private Log log;
93 private Lower lower;
94 private Names names;
95 private Symtab syms;
698
699 }
700 }
701
702 JCBlock trans_block = new LambdaBodyTranslator().translate(block);
703 if (completeNormally && isTarget_Void) {
704 //there's no return statement and the lambda (possibly inferred)
705 //return type is java.lang.Void; emit a synthetic return statement
706 trans_block.stats = trans_block.stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType)));
707 }
708 return trans_block;
709 }
710
711 private JCMethodDecl makeDeserializeMethod(Symbol kSym) {
712 ListBuffer<JCCase> cases = new ListBuffer<>();
713 ListBuffer<JCBreak> breaks = new ListBuffer<>();
714 for (Map.Entry<String, ListBuffer<JCStatement>> entry : kInfo.deserializeCases.entrySet()) {
715 JCBreak br = make.Break(null);
716 breaks.add(br);
717 List<JCStatement> stmts = entry.getValue().append(br).toList();
718 cases.add(make.Case(JCCase.STATEMENT, List.of(make.Literal(entry.getKey())), stmts, null));
719 }
720 JCSwitch sw = make.Switch(deserGetter("getImplMethodName", syms.stringType), cases.toList());
721 for (JCBreak br : breaks) {
722 br.target = sw;
723 }
724 JCBlock body = make.Block(0L, List.of(
725 sw,
726 make.Throw(makeNewClass(
727 syms.illegalArgumentExceptionType,
728 List.of(make.Literal("Invalid lambda deserialization"))))));
729 JCMethodDecl deser = make.MethodDef(make.Modifiers(kInfo.deserMethodSym.flags()),
730 names.deserializeLambda,
731 make.QualIdent(kInfo.deserMethodSym.getReturnType().tsym),
732 List.nil(),
733 List.of(make.VarDef(kInfo.deserParamSym, null)),
734 List.nil(),
735 body,
736 null);
737 deser.sym = kInfo.deserMethodSym;
738 deser.type = kInfo.deserMethodSym.type;
|