| 14 | * Useful for cases where every single node needs to be visited. |
| 15 | */ |
| 16 | export class CombinedRecursiveAstVisitor extends RecursiveAstVisitor implements t.RecursiveVisitor { |
| 17 | override visit(node: AST | t.Node): void { |
| 18 | if (node instanceof ASTWithSource) { |
| 19 | this.visit(node.ast); |
| 20 | } else { |
| 21 | node.visit(this); |
| 22 | } |
| 23 | } |
| 24 | |
| 25 | visitElement(element: t.Element): void { |
| 26 | this.visitAllTemplateNodes(element.attributes); |
| 27 | this.visitAllTemplateNodes(element.inputs); |
| 28 | this.visitAllTemplateNodes(element.outputs); |
| 29 | this.visitAllTemplateNodes(element.directives); |
| 30 | this.visitAllTemplateNodes(element.references); |
| 31 | this.visitAllTemplateNodes(element.children); |
| 32 | } |
| 33 | |
| 34 | visitTemplate(template: t.Template): void { |
| 35 | this.visitAllTemplateNodes(template.attributes); |
| 36 | this.visitAllTemplateNodes(template.inputs); |
| 37 | this.visitAllTemplateNodes(template.outputs); |
| 38 | this.visitAllTemplateNodes(template.directives); |
| 39 | this.visitAllTemplateNodes(template.templateAttrs); |
| 40 | this.visitAllTemplateNodes(template.variables); |
| 41 | this.visitAllTemplateNodes(template.references); |
| 42 | this.visitAllTemplateNodes(template.children); |
| 43 | } |
| 44 | |
| 45 | visitContent(content: t.Content): void { |
| 46 | this.visitAllTemplateNodes(content.children); |
| 47 | } |
| 48 | |
| 49 | visitBoundAttribute(attribute: t.BoundAttribute): void { |
| 50 | this.visit(attribute.value); |
| 51 | } |
| 52 | |
| 53 | visitBoundEvent(attribute: t.BoundEvent): void { |
| 54 | this.visit(attribute.handler); |
| 55 | } |
| 56 | |
| 57 | visitBoundText(text: t.BoundText): void { |
| 58 | this.visit(text.value); |
| 59 | } |
| 60 | |
| 61 | visitIcu(icu: t.Icu): void { |
| 62 | Object.keys(icu.vars).forEach((key) => this.visit(icu.vars[key])); |
| 63 | Object.keys(icu.placeholders).forEach((key) => this.visit(icu.placeholders[key])); |
| 64 | } |
| 65 | |
| 66 | visitDeferredBlock(deferred: t.DeferredBlock): void { |
| 67 | deferred.visitAll(this); |
| 68 | } |
| 69 | |
| 70 | visitDeferredTrigger(trigger: t.DeferredTrigger): void { |
| 71 | if (trigger instanceof t.BoundDeferredTrigger) { |
| 72 | this.visit(trigger.value); |
| 73 | } else if (trigger instanceof t.ViewportDeferredTrigger && trigger.options !== null) { |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…