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