Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 // Generated by scripts/tree_gen.py. | |
| 5 | |
| 6 ///////////////////////////////////////////////////////////////////////// | |
| 7 // CSS specific types: | |
| 8 ///////////////////////////////////////////////////////////////////////// | |
| 9 | |
| 10 | |
| 11 // TODO(terry): Type and TypeParameter defined for frog/tree.dart. | |
| 12 class Type { } | |
| 13 class TypeParameter extends Node { } | |
| 14 | |
| 15 | |
| 16 class Identifier extends Node { | |
| 17 String name; | |
| 18 | |
| 19 Identifier(this.name, SourceSpan span): super(span) {} | |
| 20 | |
| 21 visit(TreeVisitor visitor) => visitor.visitIdentifier(this); | |
| 22 | |
| 23 String toString() => name; | |
| 24 } | |
| 25 | |
| 26 class SelectorGroup extends Node { | |
| 27 // List of SimpleSelector(s) list contain any mix SimpleSelector or | |
| 28 // SimpleSlectorName (or class derived from SimpleSelectorName e.g., | |
| 29 // IdSelector, ClassSelector, ElementSelector, PseudoClassSelector, | |
| 30 // PseudoElementSelector, NotSelector, or Attribute | |
| 31 List<Node> selectors; | |
|
nweiz
2011/11/10 00:04:39
Why isn't this List<SimpleSelector>?
terry
2011/11/22 16:40:47
Should be.
Done.
| |
| 32 | |
| 33 SelectorGroup(this.selectors, SourceSpan span): super(span) {} | |
| 34 | |
| 35 visit(TreeVisitor visitor) => visitor.visitSelectorGroup(this); | |
| 36 | |
| 37 String toString() { | |
| 38 StringBuffer buff = new StringBuffer(); | |
| 39 for (selector in selectors) { | |
| 40 buff.add(selector.toString()); | |
| 41 buff.add(' '); | |
| 42 } | |
| 43 return buff.toString(); | |
| 44 } | |
| 45 } | |
| 46 | |
|
nweiz
2011/11/10 00:04:39
As mentioned elsewhere, there should be a represen
terry
2011/11/22 16:40:47
Yep added combinator descendant (space) and NONE.
| |
| 47 /* All other selectors (element, #id, .class, attribute, pseudo, negation, | |
| 48 * namespace, *) are derived from this selector. | |
| 49 */ | |
| 50 class SimpleSelector extends Node { | |
| 51 Token _combinator; // +, >, ~ or NONE (space) | |
|
nweiz
2011/11/10 00:04:39
Related to the sequence of simple selector issue,
terry
2011/11/22 16:40:47
I have for now maybe I'm being too pedantic (even
| |
| 52 | |
| 53 // name is of type IdSelector, ClassSelector, ElementSelector, | |
| 54 // PseudoClassSelector, PseudoElementSelector, NotSelector, or Attribute | |
|
nweiz
2011/11/10 00:04:39
Is this really true? Aren't all these subclasses o
terry
2011/11/22 16:40:47
No comment is outdated.
On 2011/11/10 00:04:39, nw
| |
| 55 var _name; | |
| 56 | |
| 57 SimpleSelector(this._name, [this._combinator = TokenKind.COMBINATOR_NONE]); | |
| 58 | |
| 59 // Wildcard can be a String just return _name otherwise if identifier we'll | |
| 60 // drill into the Identifier and return it's name. | |
| 61 String get name() => _name is Identifier ? _name.name : _name; | |
|
nweiz
2011/11/10 00:04:39
Ah, so _name is an Identifier or a String. Why doe
terry
2011/11/22 16:40:47
It's an identifier or wildcard nothing else String
| |
| 62 | |
| 63 bool isCombinatorNone() => _combinator == TokenKind.COMBINATOR_NONE; | |
| 64 bool isCombinatorPlus() => _combinator == TokenKind.COMBINATOR_PLUS; | |
| 65 bool isCombinatorGreater() => _combinator == TokenKind.COMBINATOR_GREATER; | |
| 66 bool isCombinatorTilde() => _combinator == TokenKind.COMBINATOR_TILDE; | |
| 67 | |
| 68 visit(TreeVisitor visitor) => visitor.visitSimpleSelectorName(this); | |
| 69 | |
| 70 String toString() => name; | |
| 71 } | |
| 72 | |
| 73 // element name | |
| 74 class ElementSelector extends SimpleSelector { | |
| 75 ElementSelector(String name, [Token combinator = TokenKind.COMBINATOR_NONE]) : | |
| 76 super(name, combinator); | |
| 77 | |
| 78 bool isWildcard() => name == '*'; | |
|
nweiz
2011/11/10 00:04:39
A universal selector is not really the same thing
terry
2011/11/22 16:40:47
Your right I removed it when I added notion of wil
| |
| 79 | |
| 80 visit(TreeVisitor visitor) => visitor.visitElementSelector(this); | |
| 81 | |
| 82 String toString() => "$name"; | |
| 83 } | |
| 84 | |
| 85 // namespace|element | |
| 86 class NamespaceSelector extends SimpleSelector { | |
| 87 var _namespace; // null, '*' or identifier name | |
| 88 | |
| 89 NamespaceSelector(this._namespace, String name, | |
| 90 [Token combinator = TokenKind.COMBINATOR_NONE]) : super(name, combinator); | |
|
nweiz
2011/11/10 00:04:39
I really don't like the overloading of _name that'
terry
2011/11/22 16:40:47
Right it's an identifier or wildcard.
On 2011/11/1
| |
| 91 | |
| 92 String get namespace() => _namespace is Identifier ? | |
|
nweiz
2011/11/10 00:04:39
Same comment as SimpleSelector._name above.
terry
2011/11/22 16:40:47
namespace is never a string either Identifier or W
| |
| 93 _namespace.name : _namespace; | |
| 94 | |
| 95 bool isWildcardElement() => _name.isWildcard(); | |
|
nweiz
2011/11/10 00:04:39
Why is this something that goes through NamespaceS
terry
2011/11/22 16:40:47
Shouldn't it's on simpleSelector.
On 2011/11/10 00
| |
| 96 | |
| 97 bool isNamespaceWildcard() => _namespace == '*'; | |
| 98 | |
| 99 SimpleSelector get nameAsElementSelector() => _name; | |
| 100 | |
| 101 visit(TreeVisitor visitor) => visitor.visitNamespaceSelector(this); | |
| 102 | |
| 103 String toString() => "$namespace|$name"; | |
| 104 } | |
| 105 | |
| 106 // #id | |
| 107 class IdSelector extends SimpleSelector { | |
| 108 IdSelector(String name, [Token combinator = TokenKind.COMBINATOR_NONE]) : | |
| 109 super(name, combinator); | |
| 110 | |
| 111 visit(TreeVisitor visitor) => visitor.visitIdSelector(this); | |
| 112 | |
| 113 String toString() => "#$name"; | |
| 114 } | |
| 115 | |
| 116 // .class | |
| 117 class ClassSelector extends SimpleSelector { | |
| 118 ClassSelector(String name, [Token combinator = TokenKind.COMBINATOR_NONE]) : | |
| 119 super(name, combinator); | |
| 120 | |
| 121 visit(TreeVisitor visitor) => visitor.visitClassSelector(this); | |
| 122 | |
| 123 String toString() => ".$name"; | |
| 124 } | |
| 125 | |
| 126 // :pseudoClass | |
| 127 class PseudoClassSelector extends SimpleSelector { | |
| 128 PseudoClassSelector(String name, | |
| 129 [Token combinator = TokenKind.COMBINATOR_NONE]) : super(name, combinator); | |
| 130 | |
| 131 visit(TreeVisitor visitor) => visitor.visitPseudoClassSelector(this); | |
| 132 | |
| 133 String toString() => ":$name"; | |
| 134 } | |
| 135 | |
| 136 // ::pseudoElement | |
| 137 class PseudoElementSelector extends SimpleSelector { | |
| 138 PseudoElementSelector(String name, | |
| 139 [Token combinator = TokenKind.COMBINATOR_NONE]) : super(name, combinator); | |
| 140 | |
| 141 visit(TreeVisitor visitor) => visitor.visitPseudoElementSelector(this); | |
| 142 | |
| 143 String toString() => "::$name"; | |
| 144 } | |
| 145 | |
| 146 // TODO(terry): Implement | |
| 147 // NOT | |
| 148 class NotSelector extends SimpleSelector { | |
| 149 NotSelector(String name, [Token combinator = TokenKind.COMBINATOR_NONE]) : | |
| 150 super(name, combinator); | |
| 151 | |
| 152 visit(TreeVisitor visitor) => visitor.visitNotSelector(this); | |
| 153 } | |
| 154 | |
| 155 // TODO(terry): Implement | |
| 156 // [attribute] | |
| 157 class Attribute extends Node { | |
| 158 var name; // NamespaceSelector or SimpleSelector | |
| 159 int matchType; // ~=, |=, ^=, $=, *=, = | |
| 160 String value; | |
| 161 } | |
| 162 | |
| 163 interface TreeVisitor { | |
| 164 void visitSelectorGroup(SelectorGroup node); | |
| 165 void visitSimpleSelector(SimpleSelector node); | |
| 166 void visitElementSelector(ElementSelector node); | |
| 167 void visitNamespaceSelector(NamespaceSelector node); | |
| 168 void visitIdSelector(IdSelector node); | |
| 169 void visitClassSelector(ClassSelector node); | |
| 170 void visitPseudoClassSelector(PseudoClassSelector node); | |
| 171 void visitPseudoElementSelector(PseudoElementSelector node); | |
| 172 void visitNotSelector(NotSelector node); | |
| 173 | |
| 174 void visitIdentifier(Identifier node); | |
| 175 | |
| 176 // TODO(terry): Defined for ../tree.dart. | |
| 177 void visitTypeReference(TypeReference node); | |
| 178 } | |
| 179 | |
| 180 class TreePrinter implements TreeVisitor { | |
| 181 var output; | |
| 182 TreePrinter(this.output) { output.printer = this; } | |
| 183 | |
| 184 void visitSelectorGroup(SelectorGroup node) { | |
| 185 output.heading('Selector Group', node.span); | |
| 186 output.writeNodeList('selectors', node.selectors); | |
| 187 output.writeln(''); | |
| 188 } | |
| 189 | |
| 190 void visitSimpleSelector(SimpleSelector node) { | |
| 191 if (node.isCombinatorNone()) { | |
| 192 output.writeValue('combinator', "NONE"); | |
| 193 } else if (node.isCombinatorPlus()) { | |
| 194 output.writeValue('combinator', "+"); | |
| 195 } else if (node.isCombinatorGreater()) { | |
| 196 output.writeValue('combinator', ">"); | |
| 197 } else if (node.isCombinatorTilde()) { | |
| 198 output.writeValue('combinator', "~"); | |
| 199 } else { | |
| 200 output.writeValue('combinator', "ERROR UNKNOWN"); | |
| 201 } | |
| 202 } | |
| 203 | |
| 204 void visitNamespaceSelector(NamespaceSelector node) { | |
| 205 output.heading('Namespace Selector', node.span); | |
| 206 visitSimpleSelector(node); | |
| 207 output.writeValue('namespace', node._namespace); | |
| 208 output.writeNode('name', node._name); | |
| 209 } | |
| 210 | |
| 211 void visitElementSelector(ElementSelector node) { | |
| 212 output.heading('Element Selector', node.span); | |
| 213 visitSimpleSelector(node); | |
| 214 if (node.isWildcard()) { | |
| 215 output.writeValue('name', '*'); | |
| 216 } else { | |
| 217 output.writeNode('name', node.name); | |
| 218 } | |
| 219 } | |
| 220 | |
| 221 void visitIdSelector(IdSelector node) { | |
| 222 output.heading('Id Selector', node.span); | |
| 223 visitSimpleSelector(node); | |
| 224 output.writeNode('name', node._name); | |
| 225 } | |
| 226 | |
| 227 void visitClassSelector(ClassSelector node) { | |
| 228 output.heading('Class Selector', node.span); | |
| 229 visitSimpleSelector(node); | |
| 230 output.writeNode('name', node._name); | |
| 231 } | |
| 232 | |
| 233 void visitPseudoClassSelector(PseudoClassSelector node) { | |
| 234 output.heading('Pseudo Class Selector', node.span); | |
| 235 visitSimpleSelector(node); | |
| 236 output.writeNode('name', node._name); | |
| 237 } | |
| 238 | |
| 239 void visitPseudoElementSelector(PseudoElementSelector node) { | |
| 240 output.heading('Pseudo Element Selector', node.span); | |
| 241 visitSimpleSelector(node); | |
| 242 output.writeNode('name', node._name); | |
| 243 } | |
| 244 | |
| 245 void visitNotSelector(NotSelector node) { | |
| 246 visitSimpleSelector(node); | |
| 247 output.heading('Not Selector', node.span); | |
| 248 } | |
| 249 | |
| 250 void visitIdentifier(Identifier node) { | |
| 251 output.heading('Identifier(' + output.toValue(node.name) + ")", node.span); | |
| 252 } | |
| 253 | |
| 254 // TODO(terry): Defined for frog/tree.dart. | |
| 255 void visitTypeReference(TypeReference node) { | |
| 256 output.heading('Unimplemented'); | |
| 257 } | |
| 258 } | |
| OLD | NEW |