31 import com.sun.tools.javac.code.Attribute.TypeCompound;
32 import com.sun.tools.javac.code.Source.Feature;
33 import com.sun.tools.javac.code.Symbol.*;
34 import com.sun.tools.javac.code.Type.IntersectionClassType;
35 import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
36 import com.sun.tools.javac.resources.CompilerProperties.Errors;
37 import com.sun.tools.javac.tree.*;
38 import com.sun.tools.javac.tree.JCTree.*;
39 import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind;
40 import com.sun.tools.javac.util.*;
41 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
42 import com.sun.tools.javac.util.List;
43
44 import static com.sun.tools.javac.code.Flags.*;
45 import static com.sun.tools.javac.code.Kinds.Kind.*;
46 import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
47 import static com.sun.tools.javac.code.TypeTag.CLASS;
48 import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
49 import static com.sun.tools.javac.code.TypeTag.VOID;
50 import static com.sun.tools.javac.comp.CompileStates.CompileState;
51
52 /** This pass translates Generic Java to conventional Java.
53 *
54 * <p><b>This is NOT part of any supported API.
55 * If you write code that depends on this, you do so at your own risk.
56 * This code and its internal interfaces are subject to change or
57 * deletion without notice.</b>
58 */
59 public class TransTypes extends TreeTranslator {
60 /** The context key for the TransTypes phase. */
61 protected static final Context.Key<TransTypes> transTypesKey = new Context.Key<>();
62
63 /** Get the instance for this context. */
64 public static TransTypes instance(Context context) {
65 TransTypes instance = context.get(transTypesKey);
66 if (instance == null)
67 instance = new TransTypes(context);
68 return instance;
69 }
70
544 tree.type = types.erasure(types.findDescriptorSymbol(tree.type.tsym).owner.type);
545 }
546 result = tree;
547 }
548 finally {
549 returnType = prevRetType;
550 }
551 }
552
553 public void visitSwitch(JCSwitch tree) {
554 Type selsuper = types.supertype(tree.selector.type);
555 boolean enumSwitch = selsuper != null &&
556 selsuper.tsym == syms.enumSym;
557 Type target = enumSwitch ? erasure(tree.selector.type) : syms.intType;
558 tree.selector = translate(tree.selector, target);
559 tree.cases = translateCases(tree.cases);
560 result = tree;
561 }
562
563 public void visitCase(JCCase tree) {
564 tree.pat = translate(tree.pat, null);
565 tree.stats = translate(tree.stats);
566 result = tree;
567 }
568
569 public void visitSynchronized(JCSynchronized tree) {
570 tree.lock = translate(tree.lock, erasure(tree.lock.type));
571 tree.body = translate(tree.body);
572 result = tree;
573 }
574
575 public void visitTry(JCTry tree) {
576 tree.resources = translate(tree.resources, syms.autoCloseableType);
577 tree.body = translate(tree.body);
578 tree.catchers = translateCatchers(tree.catchers);
579 tree.finalizer = translate(tree.finalizer);
580 result = tree;
581 }
582
583 public void visitConditional(JCConditional tree) {
584 tree.cond = translate(tree.cond, syms.booleanType);
585 tree.truepart = translate(tree.truepart, erasure(tree.type));
586 tree.falsepart = translate(tree.falsepart, erasure(tree.type));
587 tree.type = erasure(tree.type);
588 result = retype(tree, tree.type, pt);
589 }
590
591 public void visitIf(JCIf tree) {
592 tree.cond = translate(tree.cond, syms.booleanType);
593 tree.thenpart = translate(tree.thenpart);
594 tree.elsepart = translate(tree.elsepart);
595 result = tree;
596 }
597
598 public void visitExec(JCExpressionStatement tree) {
599 tree.expr = translate(tree.expr, null);
600 result = tree;
601 }
602
603 public void visitReturn(JCReturn tree) {
604 if (!returnType.hasTag(VOID))
605 tree.expr = translate(tree.expr, returnType);
606 result = tree;
607 }
608
609 public void visitThrow(JCThrow tree) {
610 tree.expr = translate(tree.expr, erasure(tree.expr.type));
611 result = tree;
612 }
613
614 public void visitAssert(JCAssert tree) {
615 tree.cond = translate(tree.cond, syms.booleanType);
616 if (tree.detail != null)
617 tree.detail = translate(tree.detail, erasure(tree.detail.type));
618 result = tree;
619 }
620
621 public void visitApply(JCMethodInvocation tree) {
622 tree.meth = translate(tree.meth, null);
623 Symbol meth = TreeInfo.symbol(tree.meth);
624 Type mt = meth.erasure(types);
625 boolean useInstantiatedPtArgs =
|
31 import com.sun.tools.javac.code.Attribute.TypeCompound;
32 import com.sun.tools.javac.code.Source.Feature;
33 import com.sun.tools.javac.code.Symbol.*;
34 import com.sun.tools.javac.code.Type.IntersectionClassType;
35 import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
36 import com.sun.tools.javac.resources.CompilerProperties.Errors;
37 import com.sun.tools.javac.tree.*;
38 import com.sun.tools.javac.tree.JCTree.*;
39 import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind;
40 import com.sun.tools.javac.util.*;
41 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
42 import com.sun.tools.javac.util.List;
43
44 import static com.sun.tools.javac.code.Flags.*;
45 import static com.sun.tools.javac.code.Kinds.Kind.*;
46 import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
47 import static com.sun.tools.javac.code.TypeTag.CLASS;
48 import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
49 import static com.sun.tools.javac.code.TypeTag.VOID;
50 import static com.sun.tools.javac.comp.CompileStates.CompileState;
51 import com.sun.tools.javac.tree.JCTree.JCBreak;
52
53 /** This pass translates Generic Java to conventional Java.
54 *
55 * <p><b>This is NOT part of any supported API.
56 * If you write code that depends on this, you do so at your own risk.
57 * This code and its internal interfaces are subject to change or
58 * deletion without notice.</b>
59 */
60 public class TransTypes extends TreeTranslator {
61 /** The context key for the TransTypes phase. */
62 protected static final Context.Key<TransTypes> transTypesKey = new Context.Key<>();
63
64 /** Get the instance for this context. */
65 public static TransTypes instance(Context context) {
66 TransTypes instance = context.get(transTypesKey);
67 if (instance == null)
68 instance = new TransTypes(context);
69 return instance;
70 }
71
545 tree.type = types.erasure(types.findDescriptorSymbol(tree.type.tsym).owner.type);
546 }
547 result = tree;
548 }
549 finally {
550 returnType = prevRetType;
551 }
552 }
553
554 public void visitSwitch(JCSwitch tree) {
555 Type selsuper = types.supertype(tree.selector.type);
556 boolean enumSwitch = selsuper != null &&
557 selsuper.tsym == syms.enumSym;
558 Type target = enumSwitch ? erasure(tree.selector.type) : syms.intType;
559 tree.selector = translate(tree.selector, target);
560 tree.cases = translateCases(tree.cases);
561 result = tree;
562 }
563
564 public void visitCase(JCCase tree) {
565 tree.pats = translate(tree.pats, null);
566 tree.stats = translate(tree.stats);
567 result = tree;
568 }
569
570 public void visitSwitchExpression(JCSwitchExpression tree) {
571 Type selsuper = types.supertype(tree.selector.type);
572 boolean enumSwitch = selsuper != null &&
573 selsuper.tsym == syms.enumSym;
574 Type target = enumSwitch ? erasure(tree.selector.type) : syms.intType;
575 tree.selector = translate(tree.selector, target);
576 tree.cases = translate(tree.cases);
577 tree.type = erasure(tree.type);
578 result = retype(tree, tree.type, pt);
579 }
580
581 public void visitSynchronized(JCSynchronized tree) {
582 tree.lock = translate(tree.lock, erasure(tree.lock.type));
583 tree.body = translate(tree.body);
584 result = tree;
585 }
586
587 public void visitTry(JCTry tree) {
588 tree.resources = translate(tree.resources, syms.autoCloseableType);
589 tree.body = translate(tree.body);
590 tree.catchers = translateCatchers(tree.catchers);
591 tree.finalizer = translate(tree.finalizer);
592 result = tree;
593 }
594
595 public void visitConditional(JCConditional tree) {
596 tree.cond = translate(tree.cond, syms.booleanType);
597 tree.truepart = translate(tree.truepart, erasure(tree.type));
598 tree.falsepart = translate(tree.falsepart, erasure(tree.type));
599 tree.type = erasure(tree.type);
600 result = retype(tree, tree.type, pt);
601 }
602
603 public void visitIf(JCIf tree) {
604 tree.cond = translate(tree.cond, syms.booleanType);
605 tree.thenpart = translate(tree.thenpart);
606 tree.elsepart = translate(tree.elsepart);
607 result = tree;
608 }
609
610 public void visitExec(JCExpressionStatement tree) {
611 tree.expr = translate(tree.expr, null);
612 result = tree;
613 }
614
615 public void visitReturn(JCReturn tree) {
616 if (!returnType.hasTag(VOID))
617 tree.expr = translate(tree.expr, returnType);
618 result = tree;
619 }
620
621 @Override
622 public void visitBreak(JCBreak tree) {
623 if (tree.isValueBreak()) {
624 tree.value = translate(tree.value, erasure(tree.value.type));
625 tree.value.type = erasure(tree.value.type);
626 tree.value = retype(tree.value, tree.value.type, pt);
627 }
628 result = tree;
629 }
630
631 public void visitThrow(JCThrow tree) {
632 tree.expr = translate(tree.expr, erasure(tree.expr.type));
633 result = tree;
634 }
635
636 public void visitAssert(JCAssert tree) {
637 tree.cond = translate(tree.cond, syms.booleanType);
638 if (tree.detail != null)
639 tree.detail = translate(tree.detail, erasure(tree.detail.type));
640 result = tree;
641 }
642
643 public void visitApply(JCMethodInvocation tree) {
644 tree.meth = translate(tree.meth, null);
645 Symbol meth = TreeInfo.symbol(tree.meth);
646 Type mt = meth.erasure(types);
647 boolean useInstantiatedPtArgs =
|