< prev index next >

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

Print this page

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

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