1 /* 2 * SPDX-FileCopyrightText: Copyright (c) 2011-2025 Yegor Bugayenko 3 * SPDX-License-Identifier: MIT 4 */ 5 package com.qulice.checkstyle; 6 7 import com.puppycrawl.tools.checkstyle.api.DetailAST; 8 import java.util.stream.Stream; 9 10 /** 11 * Utility class which simplifies traversing DetailAST objects. 12 * 13 * DetailAST APIs for working with child nodes require writing 14 * imperative code, which generally looks less readable then 15 * declarative Stream manipulations. This class integrates DetailAST 16 * with Java Streams. 17 * 18 * @since 1.0 19 */ 20 class ChildStream { 21 /** 22 * Node, whose children will be traversed by this ChildStream object. 23 */ 24 private final DetailAST node; 25 26 /** 27 * Creates a new child stream factory. 28 * 29 * @param node Node which will used by this object. 30 */ 31 ChildStream(final DetailAST node) { 32 this.node = node; 33 } 34 35 /** 36 * Creates a new stream which sequentially yields all 37 * children. Any two streams returned by this method are 38 * independent. 39 * 40 * Implementation may be simplified using Stream.iterate when Java 8 support 41 * is dropped. 42 * 43 * @return Stream of children 44 */ 45 Stream<DetailAST> children() { 46 final Stream.Builder<DetailAST> builder = Stream.builder(); 47 DetailAST child = this.node.getFirstChild(); 48 while (child != null) { 49 builder.accept(child); 50 child = child.getNextSibling(); 51 } 52 return builder.build(); 53 } 54 }