< prev index next >

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

Print this page

1101                 }
1102             });
1103             return super.visit(dt);
1104         }
1105 
1106         private List<Type> map(List<Type> ts, List<Type> pts) {
1107             if (ts.nonEmpty()) {
1108                 List<Type> tail1 = map(ts.tail, pts != null ? pts.tail : null);
1109                 Type t = visit(ts.head, pts != null && pts.nonEmpty() ? pts.head : null);
1110                 if (tail1 != ts.tail || t != ts.head)
1111                     return tail1.prepend(t);
1112             }
1113             return ts;
1114         }
1115     }
1116 
1117     /**
1118      * A special tree scanner that would only visit portions of a given tree.
1119      * The set of nodes visited by the scanner can be customized at construction-time.
1120      */
1121     abstract static class FilterScanner extends com.sun.tools.javac.tree.TreeScanner {
1122 
1123         final Predicate<JCTree> treeFilter;
1124 
1125         FilterScanner(final Set<JCTree.Tag> validTags) {
1126             this.treeFilter = t -> validTags.contains(t.getTag());
1127         }
1128 
1129         @Override
1130         public void scan(JCTree tree) {
1131             if (tree != null) {
1132                 if (treeFilter.test(tree)) {
1133                     super.scan(tree);
1134                 } else {
1135                     skip(tree);
1136                 }
1137             }
1138         }
1139 
1140         /**
1141          * handler that is executed when a node has been discarded
1142          */
1143         void skip(JCTree tree) {}
1144     }
1145 
1146     /**
1147      * A tree scanner suitable for visiting the target-type dependent nodes of
1148      * a given argument expression.
1149      */
1150     static class PolyScanner extends FilterScanner {
1151 
1152         PolyScanner() {
1153             super(EnumSet.of(CONDEXPR, PARENS, LAMBDA, REFERENCE, SWITCH_EXPRESSION));
1154         }
1155     }
1156 
1157     /**
1158      * A tree scanner suitable for visiting the target-type dependent nodes nested
1159      * within a lambda expression body.
1160      */
1161     static class LambdaReturnScanner extends FilterScanner {
1162 
1163         LambdaReturnScanner() {

1101                 }
1102             });
1103             return super.visit(dt);
1104         }
1105 
1106         private List<Type> map(List<Type> ts, List<Type> pts) {
1107             if (ts.nonEmpty()) {
1108                 List<Type> tail1 = map(ts.tail, pts != null ? pts.tail : null);
1109                 Type t = visit(ts.head, pts != null && pts.nonEmpty() ? pts.head : null);
1110                 if (tail1 != ts.tail || t != ts.head)
1111                     return tail1.prepend(t);
1112             }
1113             return ts;
1114         }
1115     }
1116 
1117     /**
1118      * A special tree scanner that would only visit portions of a given tree.
1119      * The set of nodes visited by the scanner can be customized at construction-time.
1120      */
1121     public abstract static class FilterScanner extends com.sun.tools.javac.tree.TreeScanner {
1122 
1123         final Predicate<JCTree> treeFilter;
1124 
1125         protected FilterScanner(final Set<JCTree.Tag> validTags) {
1126             this.treeFilter = t -> validTags.contains(t.getTag());
1127         }
1128 
1129         @Override
1130         public void scan(JCTree tree) {
1131             if (tree != null) {
1132                 if (treeFilter.test(tree)) {
1133                     super.scan(tree);
1134                 } else {
1135                     skip(tree);
1136                 }
1137             }
1138         }
1139 
1140         /**
1141          * handler that is executed when a node has been discarded
1142          */
1143         protected void skip(JCTree tree) {}
1144     }
1145 
1146     /**
1147      * A tree scanner suitable for visiting the target-type dependent nodes of
1148      * a given argument expression.
1149      */
1150     static class PolyScanner extends FilterScanner {
1151 
1152         PolyScanner() {
1153             super(EnumSet.of(CONDEXPR, PARENS, LAMBDA, REFERENCE, SWITCH_EXPRESSION));
1154         }
1155     }
1156 
1157     /**
1158      * A tree scanner suitable for visiting the target-type dependent nodes nested
1159      * within a lambda expression body.
1160      */
1161     static class LambdaReturnScanner extends FilterScanner {
1162 
1163         LambdaReturnScanner() {
< prev index next >