68 import com.sun.tools.javac.platform.PlatformDescription;
69 import com.sun.tools.javac.processing.*;
70 import com.sun.tools.javac.tree.*;
71 import com.sun.tools.javac.tree.JCTree.JCClassDecl;
72 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
73 import com.sun.tools.javac.tree.JCTree.JCExpression;
74 import com.sun.tools.javac.tree.JCTree.JCLambda;
75 import com.sun.tools.javac.tree.JCTree.JCMemberReference;
76 import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
77 import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
78 import com.sun.tools.javac.util.*;
79 import com.sun.tools.javac.util.Context.Key;
80 import com.sun.tools.javac.util.DefinedBy.Api;
81 import com.sun.tools.javac.util.JCDiagnostic.Factory;
82 import com.sun.tools.javac.util.Log.DiagnosticHandler;
83 import com.sun.tools.javac.util.Log.DiscardDiagnosticHandler;
84 import com.sun.tools.javac.util.Log.WriterKind;
85
86 import static com.sun.tools.javac.code.Kinds.Kind.*;
87
88 import com.sun.tools.javac.code.Lint;
89 import com.sun.tools.javac.code.Lint.LintCategory;
90 import com.sun.tools.javac.code.Symbol.ModuleSymbol;
91
92 import com.sun.tools.javac.resources.CompilerProperties.Errors;
93 import com.sun.tools.javac.resources.CompilerProperties.Fragments;
94 import com.sun.tools.javac.resources.CompilerProperties.Notes;
95 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
96
97 import static com.sun.tools.javac.code.TypeTag.CLASS;
98 import static com.sun.tools.javac.main.Option.*;
99 import com.sun.tools.javac.tree.JCTree.JCBindingPattern;
100 import com.sun.tools.javac.tree.JCTree.JCInstanceOf;
101 import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*;
102
103 import static javax.tools.StandardLocation.CLASS_OUTPUT;
104 import static javax.tools.StandardLocation.ANNOTATION_PROCESSOR_PATH;
105
106 import com.sun.tools.javac.tree.JCTree.JCModuleDecl;
107 import com.sun.tools.javac.tree.JCTree.JCRecordPattern;
108 import com.sun.tools.javac.tree.JCTree.JCSwitch;
109 import com.sun.tools.javac.tree.JCTree.JCSwitchExpression;
1603 }
1604 @Override
1605 public void visitRecordPattern(JCRecordPattern that) {
1606 hasPatterns = true;
1607 super.visitRecordPattern(that);
1608 }
1609 @Override
1610 public void visitSwitch(JCSwitch tree) {
1611 hasPatterns |= tree.patternSwitch;
1612 super.visitSwitch(tree);
1613 }
1614 @Override
1615 public void visitSwitchExpression(JCSwitchExpression tree) {
1616 hasPatterns |= tree.patternSwitch;
1617 super.visitSwitchExpression(tree);
1618 }
1619 }
1620 ScanNested scanner = new ScanNested();
1621 scanner.scan(env.tree);
1622 for (Env<AttrContext> dep: scanner.dependencies) {
1623 if (!compileStates.isDone(dep, CompileState.WARN))
1624 desugaredEnvs.put(dep, desugar(warn(flow(attribute(dep)))));
1625 }
1626
1627 //We need to check for error another time as more classes might
1628 //have been attributed and analyzed at this stage
1629 if (shouldStop(CompileState.TRANSTYPES))
1630 return;
1631
1632 if (verboseCompilePolicy)
1633 printNote("[desugar " + env.enclClass.sym + "]");
1634
1635 JavaFileObject prev = log.useSource(env.enclClass.sym.sourcefile != null ?
1636 env.enclClass.sym.sourcefile :
1637 env.toplevel.sourcefile);
1638 try {
1639 //save tree prior to rewriting
1640 JCTree untranslated = env.tree;
1641
1642 make.at(Position.FIRSTPOS);
1643 TreeMaker localMake = make.forToplevel(env.toplevel);
1644
1684 return;
1685 }
1686
1687 //translate out inner classes
1688 List<JCTree> cdefs = lower.translateTopLevelClass(env, env.tree, localMake);
1689 compileStates.put(env, CompileState.LOWER);
1690
1691 if (shouldStop(CompileState.LOWER))
1692 return;
1693
1694 if (scanner.hasLambdas) {
1695 if (shouldStop(CompileState.UNLAMBDA))
1696 return;
1697
1698 for (JCTree def : cdefs) {
1699 LambdaToMethod.instance(context).translateTopLevelClass(env, def, localMake);
1700 }
1701 compileStates.put(env, CompileState.UNLAMBDA);
1702 }
1703
1704 //generate code for each class
1705 for (List<JCTree> l = cdefs; l.nonEmpty(); l = l.tail) {
1706 JCClassDecl cdef = (JCClassDecl)l.head;
1707 results.add(new Pair<>(env, cdef));
1708 }
1709 }
1710 finally {
1711 log.useSource(prev);
1712 }
1713
1714 }
1715
1716 /** Generates the source or class file for a list of classes.
1717 * The decision to generate a source file or a class file is
1718 * based upon the compiler's options.
1719 * Generation stops if an error occurs while writing files.
1720 */
1721 public void generate(Queue<Pair<Env<AttrContext>, JCClassDecl>> queue) {
1722 generate(queue, null);
1723 }
|
68 import com.sun.tools.javac.platform.PlatformDescription;
69 import com.sun.tools.javac.processing.*;
70 import com.sun.tools.javac.tree.*;
71 import com.sun.tools.javac.tree.JCTree.JCClassDecl;
72 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
73 import com.sun.tools.javac.tree.JCTree.JCExpression;
74 import com.sun.tools.javac.tree.JCTree.JCLambda;
75 import com.sun.tools.javac.tree.JCTree.JCMemberReference;
76 import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
77 import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
78 import com.sun.tools.javac.util.*;
79 import com.sun.tools.javac.util.Context.Key;
80 import com.sun.tools.javac.util.DefinedBy.Api;
81 import com.sun.tools.javac.util.JCDiagnostic.Factory;
82 import com.sun.tools.javac.util.Log.DiagnosticHandler;
83 import com.sun.tools.javac.util.Log.DiscardDiagnosticHandler;
84 import com.sun.tools.javac.util.Log.WriterKind;
85
86 import static com.sun.tools.javac.code.Kinds.Kind.*;
87
88 import com.sun.tools.javac.code.Symbol.ModuleSymbol;
89
90 import com.sun.tools.javac.resources.CompilerProperties.Errors;
91 import com.sun.tools.javac.resources.CompilerProperties.Fragments;
92 import com.sun.tools.javac.resources.CompilerProperties.Notes;
93 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
94
95 import static com.sun.tools.javac.code.TypeTag.CLASS;
96 import static com.sun.tools.javac.main.Option.*;
97 import com.sun.tools.javac.tree.JCTree.JCBindingPattern;
98 import com.sun.tools.javac.tree.JCTree.JCInstanceOf;
99 import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*;
100
101 import static javax.tools.StandardLocation.CLASS_OUTPUT;
102 import static javax.tools.StandardLocation.ANNOTATION_PROCESSOR_PATH;
103
104 import com.sun.tools.javac.tree.JCTree.JCModuleDecl;
105 import com.sun.tools.javac.tree.JCTree.JCRecordPattern;
106 import com.sun.tools.javac.tree.JCTree.JCSwitch;
107 import com.sun.tools.javac.tree.JCTree.JCSwitchExpression;
1601 }
1602 @Override
1603 public void visitRecordPattern(JCRecordPattern that) {
1604 hasPatterns = true;
1605 super.visitRecordPattern(that);
1606 }
1607 @Override
1608 public void visitSwitch(JCSwitch tree) {
1609 hasPatterns |= tree.patternSwitch;
1610 super.visitSwitch(tree);
1611 }
1612 @Override
1613 public void visitSwitchExpression(JCSwitchExpression tree) {
1614 hasPatterns |= tree.patternSwitch;
1615 super.visitSwitchExpression(tree);
1616 }
1617 }
1618 ScanNested scanner = new ScanNested();
1619 scanner.scan(env.tree);
1620 for (Env<AttrContext> dep: scanner.dependencies) {
1621 if (!compileStates.isDone(dep, CompileState.WARN))
1622 desugaredEnvs.put(dep, desugar(warn(flow(attribute(dep)))));
1623 }
1624
1625 //We need to check for error another time as more classes might
1626 //have been attributed and analyzed at this stage
1627 if (shouldStop(CompileState.TRANSTYPES))
1628 return;
1629
1630 if (verboseCompilePolicy)
1631 printNote("[desugar " + env.enclClass.sym + "]");
1632
1633 JavaFileObject prev = log.useSource(env.enclClass.sym.sourcefile != null ?
1634 env.enclClass.sym.sourcefile :
1635 env.toplevel.sourcefile);
1636 try {
1637 //save tree prior to rewriting
1638 JCTree untranslated = env.tree;
1639
1640 make.at(Position.FIRSTPOS);
1641 TreeMaker localMake = make.forToplevel(env.toplevel);
1642
1682 return;
1683 }
1684
1685 //translate out inner classes
1686 List<JCTree> cdefs = lower.translateTopLevelClass(env, env.tree, localMake);
1687 compileStates.put(env, CompileState.LOWER);
1688
1689 if (shouldStop(CompileState.LOWER))
1690 return;
1691
1692 if (scanner.hasLambdas) {
1693 if (shouldStop(CompileState.UNLAMBDA))
1694 return;
1695
1696 for (JCTree def : cdefs) {
1697 LambdaToMethod.instance(context).translateTopLevelClass(env, def, localMake);
1698 }
1699 compileStates.put(env, CompileState.UNLAMBDA);
1700 }
1701
1702 if (shouldStop(CompileState.STRICT_FIELDS_PROXIES))
1703 return;
1704 for (JCTree def : cdefs) {
1705 LocalProxyVarsGen.instance(context).translateTopLevelClass(def, localMake);
1706 }
1707 compileStates.put(env, CompileState.STRICT_FIELDS_PROXIES);
1708
1709 //generate code for each class
1710 for (List<JCTree> l = cdefs; l.nonEmpty(); l = l.tail) {
1711 JCClassDecl cdef = (JCClassDecl)l.head;
1712 results.add(new Pair<>(env, cdef));
1713 }
1714 }
1715 finally {
1716 log.useSource(prev);
1717 }
1718
1719 }
1720
1721 /** Generates the source or class file for a list of classes.
1722 * The decision to generate a source file or a class file is
1723 * based upon the compiler's options.
1724 * Generation stops if an error occurs while writing files.
1725 */
1726 public void generate(Queue<Pair<Env<AttrContext>, JCClassDecl>> queue) {
1727 generate(queue, null);
1728 }
|