| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| part of '../visitor.dart'; |
| |
| /// The base type for all nodes in a CSS abstract syntax tree. |
| abstract class TreeNode { |
| /// The source code this [TreeNode] represents. |
| final SourceSpan? span; |
| |
| TreeNode(this.span); |
| |
| TreeNode clone(); |
| |
| /// Classic double-dispatch visitor for implementing passes. |
| dynamic visit(VisitorBase visitor); |
| |
| /// A multiline string showing the node and its children. |
| String toDebugString() { |
| var to = TreeOutput(); |
| var tp = _TreePrinter(to, true); |
| visit(tp); |
| return to.buf.toString(); |
| } |
| } |
| |
| /// The base type for expressions. |
| abstract class Expression extends TreeNode { |
| Expression(SourceSpan? span) : super(span); |
| @override |
| Expression clone(); |
| } |
| |
| /// Simple class to provide a textual dump of trees for debugging. |
| class TreeOutput { |
| int depth = 0; |
| final StringBuffer buf = StringBuffer(); |
| VisitorBase? printer; |
| |
| void write(String s) { |
| for (var i = 0; i < depth; i++) { |
| buf.write(' '); |
| } |
| buf.write(s); |
| } |
| |
| void writeln(String s) { |
| write(s); |
| buf.write('\n'); |
| } |
| |
| void heading(String name, [span]) { |
| write(name); |
| if (span != null) { |
| buf.write(' (${span.message('')})'); |
| } |
| buf.write('\n'); |
| } |
| |
| String toValue(value) { |
| if (value == null) { |
| return 'null'; |
| } else if (value is Identifier) { |
| return value.name; |
| } else { |
| return value.toString(); |
| } |
| } |
| |
| void writeNode(String label, TreeNode? node) { |
| write('$label: '); |
| depth += 1; |
| if (node != null) { |
| node.visit(printer!); |
| } else { |
| writeln('null'); |
| } |
| depth -= 1; |
| } |
| |
| void writeValue(String label, value) { |
| var v = toValue(value); |
| writeln('$label: $v'); |
| } |
| |
| void writeNodeList(String label, List<TreeNode>? list) { |
| writeln('$label ['); |
| if (list != null) { |
| depth += 1; |
| for (var node in list) { |
| node.visit(printer!); |
| } |
| depth -= 1; |
| writeln(']'); |
| } |
| } |
| |
| @override |
| String toString() => buf.toString(); |
| } |