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() {
|