// Copyright (c) 2011, 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. // Generated by scripts/tree_gen.py. ///////////////////////////////////////////////////////////////////////// // CSS specific types: ///////////////////////////////////////////////////////////////////////// class Identifier extends ASTNode { String name; Identifier(this.name, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitIdentifier(this); String toString() => name; } class StringValue extends ASTNode { String value; StringValue(this.value, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitStringValue(this); String toString() => value; } // CDO/CDC (Comment Definition Open ). class CommentDefinition extends ASTNode { String comment; CommentDefinition(this.comment, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitCommentDefinition(this); String toString() => ''; } class Template extends ASTNode { TemplateSignature signature; TemplateContent content; Template(this.signature, this.content, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitTemplate(this); String toString() => "${signature.toString()} \r{\r${content.toString()}\r}\r"; } class TemplateSignature extends ASTNode { String name; List> params; // Map of {type:, name:} TemplateSignature(this.name, this.params, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitTemplateSignature(this); String paramsAsString() { StringBuffer buff = new StringBuffer(); bool first = true; for (final param in params) { if (!first) { buff.add(", "); } if (param['type'] != null) { buff.add(param['type']); buff.add(' '); } buff.add(param['name']); first = false; } return buff.toString(); } String toString() => "template ${name}(${paramsAsString()})"; } class TemplateChildren extends ASTNode { List children; TemplateChildren(this.children, SourceSpan span): super(span); TemplateChildren.empty(SourceSpan span): children = [], super(span); add(var child) { if (children == null) { children = new List(); } children.add(child); } ASTNode get last => children.last; ASTNode removeLast() => children.removeLast(); bool get anyChildren => children != null && children.length > 0; visit(TreeVisitor visitor) => visitor.visitTemplateChildren(this); String toString() { StringBuffer buff = new StringBuffer(); if (children != null) { for (final child in children) { buff.add(child.toString()); } } return buff.toString(); } } class TemplateGetter extends ASTNode { String name; List> params; TemplateDocument docFrag; TemplateGetter(this.name, this.params, this.docFrag, SourceSpan span) : super(span); visit(TreeVisitor visitor) => visitor.visitTemplateGetter(this); String paramsAsString() { StringBuffer buff = new StringBuffer(); bool first = true; for (final param in params) { if (!first) { buff.add(", "); } if (param['type'] != null && param['type'].length > 0) { buff.add(param['type']); buff.add(' '); } buff.add(param['name']); first = false; } return buff.toString(); } String getterSignatureAsString() => "${name}(${paramsAsString()})"; } class TemplateContent extends ASTNode { css.Stylesheet css; TemplateDocument html; List getters; TemplateContent(this.css, this.html, this.getters, SourceSpan span) : super(span); visit(TreeVisitor visitor) => visitor.visitTemplateContent(this); } class TemplateDocument extends TemplateChildren { TemplateDocument(List children, SourceSpan span): super(children, span); visit(TreeVisitor visitor) => visitor.visitTemplateDocument(this); } class TemplateElement extends TemplateChildren { int tagTokenId; List attributes; StringValue _varName; TemplateElement(this.tagTokenId, SourceSpan span): super.empty(span); TemplateElement.fragment(SourceSpan span) : super.empty(span), tagTokenId = -1; TemplateElement.attributes(this.tagTokenId, this.attributes, this._varName, SourceSpan span): super.empty(span); bool get isFragment => tagTokenId == -1; bool get anyAttributes => attributes != null; visit(TreeVisitor visitor) => visitor.visitTemplateElement(this); bool get hasVar => _varName != null; String get varName => hasVar ? _varName.value : null; String attributesToString() { StringBuffer buff = new StringBuffer(); if (attributes != null) { for (final attr in attributes) { buff.add(' ${attr.toString()}'); } } return buff.toString(); } String get tagName => isFragment ? 'root' : TokenKind.tagNameFromTokenId(tagTokenId); bool get scoped => !TokenKind.unscopedTag(tagTokenId); String tagStartToString() => "<${tagName}${attributesToString()}>"; String tagEndToString() => ""; String toString() { StringBuffer buff = new StringBuffer(tagStartToString()); if (children != null) { for (final child in children) { buff.add(child.toString()); } buff.add(tagEndToString()); } return buff.toString(); } } class TemplateAttribute extends ASTNode { String name; String value; TemplateAttribute(this.name, this.value, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitTemplateAttribute(this); String toString() => "${name}=\"${value}\""; } class TemplateText extends ASTNode { String value; TemplateText(this.value, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitTemplateText(this); String toString() => value; } class TemplateExpression extends ASTNode { String expression; TemplateExpression(this.expression, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitTemplateExpression(this); String toString() => "\$\{${expression}}"; } class TemplateEachCommand extends ASTNode { String listName; String loopItem; TemplateDocument documentFragment; TemplateEachCommand(this.listName, this.loopItem, this.documentFragment, SourceSpan span): super(span); bool get hasLoopItem => loopItem != null; String get loopNameOptional => hasLoopItem ? " ${loopItem}" : ""; visit(TreeVisitor visitor) => visitor.visitTemplateEachCommand(this); String toString() => "\$\{#each ${listName}${loopNameOptional}}"; } class TemplateWithCommand extends ASTNode { String objectName; String blockItem; TemplateDocument documentFragment; TemplateWithCommand(this.objectName, this.blockItem, this.documentFragment, SourceSpan span): super(span); bool get hasBlockItem => blockItem != null; String get blockNameOptional => hasBlockItem ? " ${blockItem}" : ""; visit(TreeVisitor visitor) => visitor.visitTemplateWithCommand(this); String toString() => "\$\{#with ${objectName}${blockNameOptional}}"; } class TemplateCall extends ASTNode { String toCall; String params; TemplateCall(this.toCall, this.params, SourceSpan span): super(span); visit(TreeVisitor visitor) => visitor.visitTemplateCall(this); String toString() => "\$\{#${toCall}${params}}"; } interface TreeVisitor { void visitIdentifier(Identifier node); void visitStringValue(StringValue node); void visitCommentDefinition(CommentDefinition node); void visitTemplate(Template node); void visitTemplateSignature(TemplateSignature node); void visitTemplateChildren(TemplateChildren node); void visitTemplateDocument(TemplateDocument node); void visitTemplateContent(TemplateContent node); void visitTemplateElement(TemplateElement node); void visitTemplateAttribute(TemplateAttribute node); void visitTemplateText(TemplateText node); void visitTemplateExpression(TemplateExpression node); void visitTemplateEachCommand(TemplateEachCommand node); void visitTemplateWithCommand(TemplateWithCommand node); void visitTemplateCall(TemplateCall node); void visitTemplateGetter(TemplateGetter node); } class TreePrinter implements TreeVisitor { var output; TreePrinter(this.output) { output.printer = this; } void visitIdentifier(Identifier node) { output.heading('Identifier(${output.toValue(node.name)})', node.span); } void visitStringValue(StringValue node) { output.heading('"${output.toValue(node.value)}"', node.span); } void visitCommentDefinition(CommentDefinition node) { output.heading('CommentDefinition (CDO/CDC)', node.span); output.depth++; output.writeValue('comment value', node.comment); output.depth--; } void visitTemplate(Template node) { output.heading('Template', node.span); output.depth++; visitTemplateSignature(node.signature); visitTemplateContent(node.content); output.depth--; } void visitTemplateSignature(TemplateSignature node) { output.heading('TemplateSignature', node.span); output.depth++; output.writeValue('Template', node); output.depth--; } void visitTemplateChildren(TemplateChildren node) { output.writeNodeList('children', node.children); } void visitTemplateContent(TemplateContent node) { visitTemplateDocument(node.html); if (node.css != null) { output.depth++; output.writeValue('---CSS---', node.css.toString()); output.depth--; } if (node.getters != null) { output.depth++; output.writeNodeList('---GETTERS---', node.getters); output.depth--; } } void visitTemplateDocument(TemplateDocument node) { output.heading('Content', node.span); output.depth++; // TODO(terry): Ugly use of 'as Dynamic' instead of children[0] to // surpress warning. assert(node.children.length == 1 && (node.children as Dynamic)[0].tagTokenId == -1); output.writeNodeList("document", node.children); output.depth--; } void visitTemplateElement(TemplateElement node) { output.heading('Element', node.span); output.depth++; output.writeValue('tag', node.tagName); if (node.attributes != null && (node.attributes.length > 0)) { output.writeNodeList("attributes", node.attributes); } visitTemplateChildren(node); output.depth--; } void visitTemplateAttribute(TemplateAttribute node) { output.heading('Attribute', node.span); output.depth++; output.writeValue('name', node.name); output.writeValue('value', node.value); output.depth--; } void visitTemplateText(TemplateText node) { output.heading('Text', node.span); output.writeValue('value', node.value); } void visitTemplateExpression(TemplateExpression node) { output.heading('Interpolate', node.span); output.writeValue('expression', "\$\{${node.expression}\}"); } void visitTemplateEachCommand(TemplateEachCommand node) { output.heading('#each', node.span); output.writeValue('list', node.listName); visitTemplateDocument(node.documentFragment); } void visitTemplateWithCommand(TemplateWithCommand node) { output.heading('#with', node.span); output.writeValue('object', node.objectName); visitTemplateDocument(node.documentFragment); } void visitTemplateCall(TemplateCall node) { output.heading('#call template', node.span); output.writeValue('templateToCall', node.toCall); output.writeValue('params', node.params); } void visitTemplateGetter(TemplateGetter node) { output.heading('template getter', node.span); output.writeValue('getter Signature', node.getterSignatureAsString()); visitTemplateDocument(node.docFrag); } }