< prev index next >

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

Print this page
rev 51104 : imported patch switch


  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;


< prev index next >