|
13 | 13 | import java.util.HashMap; |
14 | 14 | import java.util.List; |
15 | 15 | import java.util.function.Consumer; |
16 | | -import java.util.function.Predicate; |
| 16 | +import java.util.stream.Stream; |
17 | 17 |
|
18 | 18 | public interface Refactoring { |
19 | 19 | class State { |
@@ -173,57 +173,30 @@ public static boolean isWhitespace(Liblkqllang.Token token) { |
173 | 173 | } |
174 | 174 |
|
175 | 175 | /** |
176 | | - * Helper for refactor writers: Returns the first token that satisfies the predicate 'pred', |
177 | | - * iterating on tokens from 'fromTok' (including 'fromTok'). |
178 | | - * |
179 | | - * <p>If no token is found, return the null token. |
180 | | - */ |
181 | | - public static Liblkqllang.Token firstWithPred( |
182 | | - Liblkqllang.Token fromTok, |
183 | | - Predicate<Liblkqllang.Token> pred |
184 | | - ) { |
185 | | - var curTok = fromTok; |
186 | | - while (!curTok.isNone() && !pred.test(curTok)) { |
187 | | - curTok = curTok.next(); |
188 | | - } |
189 | | - return curTok; |
190 | | - } |
191 | | - |
192 | | - /** |
193 | | - * Helper for findAll. Visit all children of 'node', calling 'cons' on each of them. TODO: Hoist |
194 | | - * in Java bindings (see eng/libadalang/langkit#859) |
| 176 | + * Internal helper for stream method. |
| 177 | + * Visit all children of 'node', calling 'cons' on each of them. |
| 178 | + * TODO: Hoist in Java bindings (see eng/libadalang/langkit#859) |
195 | 179 | */ |
196 | 180 | private static void visitChildren( |
197 | 181 | Liblkqllang.LkqlNode node, |
198 | 182 | Consumer<Liblkqllang.LkqlNode> cons |
199 | 183 | ) { |
200 | | - if (node == null || node.isNone()) { |
201 | | - return; |
| 184 | + if (node != null && !node.isNone()) { |
| 185 | + cons.accept(node); |
| 186 | + for (var child : node.children()) visitChildren(child, cons); |
202 | 187 | } |
| 188 | + } |
203 | 189 |
|
204 | | - for (var c : node.children()) { |
205 | | - if (c != null && !c.isNone()) { |
206 | | - cons.accept(c); |
207 | | - visitChildren(c, cons); |
208 | | - } |
209 | | - } |
| 190 | + /** Creates a node stream visiting all children of the input node. */ |
| 191 | + public static Stream<Liblkqllang.LkqlNode> stream(Liblkqllang.LkqlNode root) { |
| 192 | + final var b = Stream.<Liblkqllang.LkqlNode>builder(); |
| 193 | + visitChildren(root, b); |
| 194 | + return b.build(); |
210 | 195 | } |
211 | 196 |
|
212 | | - /** |
213 | | - * Helper for refactor writers: Find all nodes that are children of root and which satisfies the |
214 | | - * predicate 'pred'. TODO: Hoist in Java bindings (see eng/libadalang/langkit#859) |
215 | | - */ |
216 | | - static List<Liblkqllang.LkqlNode> findAll( |
217 | | - Liblkqllang.LkqlNode root, |
218 | | - Predicate<Liblkqllang.LkqlNode> pred |
219 | | - ) { |
220 | | - var result = new ArrayList<Liblkqllang.LkqlNode>(); |
221 | | - visitChildren(root, c -> { |
222 | | - if (pred.test(c)) { |
223 | | - result.add(c); |
224 | | - } |
225 | | - }); |
226 | | - return result; |
| 197 | + /** Creates a token stream starting at the input token. */ |
| 198 | + public static Stream<Liblkqllang.Token> streamFrom(Liblkqllang.Token start) { |
| 199 | + return Stream.iterate(start, t -> !t.isNone(), t -> t.next()); |
227 | 200 | } |
228 | 201 |
|
229 | 202 | void applyRefactor(State state); |
|
0 commit comments