Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(298)

Side by Side Diff: pkg/csslib/lib/src/tree.dart

Issue 268623002: [html5lib] implement querySelector/querySelectorAll (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/csslib/lib/src/tokenkind.dart ('k') | pkg/csslib/lib/visitor.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of csslib.visitor; 5 part of csslib.visitor;
6 6
7 ///////////////////////////////////////////////////////////////////////// 7 /////////////////////////////////////////////////////////////////////////
8 // CSS specific types: 8 // CSS specific types:
9 ///////////////////////////////////////////////////////////////////////// 9 /////////////////////////////////////////////////////////////////////////
10 10
11 class Identifier extends TreeNode { 11 class Identifier extends TreeNode {
12 String name; 12 String name;
13 13
14 Identifier(this.name, Span span): super(span); 14 Identifier(this.name, Span span): super(span);
15 15
16 Identifier clone() => new Identifier(name, span); 16 Identifier clone() => new Identifier(name, span);
17 17
18 void visit(VisitorBase visitor) => visitor.visitIdentifier(this); 18 visit(VisitorBase visitor) => visitor.visitIdentifier(this);
19 19
20 String toString() => name; 20 String toString() => name;
21 } 21 }
22 22
23 class Wildcard extends TreeNode { 23 class Wildcard extends TreeNode {
24 Wildcard(Span span): super(span); 24 Wildcard(Span span): super(span);
25 Wildcard clone() => new Wildcard(span); 25 Wildcard clone() => new Wildcard(span);
26 void visit(VisitorBase visitor) => visitor.visitWildcard(this); 26 visit(VisitorBase visitor) => visitor.visitWildcard(this);
27 27
28 String get name => '*'; 28 String get name => '*';
29 } 29 }
30 30
31 class ThisOperator extends TreeNode { 31 class ThisOperator extends TreeNode {
32 ThisOperator(Span span): super(span); 32 ThisOperator(Span span): super(span);
33 ThisOperator clone() => new ThisOperator(span); 33 ThisOperator clone() => new ThisOperator(span);
34 void visit(VisitorBase visitor) => visitor.visitThisOperator(this); 34 visit(VisitorBase visitor) => visitor.visitThisOperator(this);
35 35
36 String get name => '&'; 36 String get name => '&';
37 } 37 }
38 38
39 class Negation extends TreeNode { 39 class Negation extends TreeNode {
40 Negation(Span span): super(span); 40 Negation(Span span): super(span);
41 Negation clone() => new Negation(span); 41 Negation clone() => new Negation(span);
42 void visit(VisitorBase visitor) => visitor.visitNegation(this); 42 visit(VisitorBase visitor) => visitor.visitNegation(this);
43 43
44 String get name => 'not'; 44 String get name => 'not';
45 } 45 }
46 46
47 // /* .... */ 47 // /* .... */
48 class CssComment extends TreeNode { 48 class CssComment extends TreeNode {
49 final String comment; 49 final String comment;
50 50
51 CssComment(this.comment, Span span): super(span); 51 CssComment(this.comment, Span span): super(span);
52 CssComment clone() => new CssComment(comment, span); 52 CssComment clone() => new CssComment(comment, span);
53 void visit(VisitorBase visitor) => visitor.visitCssComment(this); 53 visit(VisitorBase visitor) => visitor.visitCssComment(this);
54 } 54 }
55 55
56 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->). 56 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
57 class CommentDefinition extends CssComment { 57 class CommentDefinition extends CssComment {
58 CommentDefinition(String comment, Span span): super(comment, span); 58 CommentDefinition(String comment, Span span): super(comment, span);
59 CommentDefinition clone() => new CommentDefinition(comment, span); 59 CommentDefinition clone() => new CommentDefinition(comment, span);
60 void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); 60 visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
61 } 61 }
62 62
63 class SelectorGroup extends TreeNode { 63 class SelectorGroup extends TreeNode {
64 final List<Selector> selectors; 64 final List<Selector> selectors;
65 65
66 SelectorGroup(this.selectors, Span span): super(span); 66 SelectorGroup(this.selectors, Span span): super(span);
67 67
68 SelectorGroup clone() => new SelectorGroup(selectors, span); 68 SelectorGroup clone() => new SelectorGroup(selectors, span);
69 69
70 void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); 70 visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
71 } 71 }
72 72
73 class Selector extends TreeNode { 73 class Selector extends TreeNode {
74 final List<SimpleSelectorSequence> simpleSelectorSequences; 74 final List<SimpleSelectorSequence> simpleSelectorSequences;
75 75
76 Selector(this.simpleSelectorSequences, Span span) : super(span); 76 Selector(this.simpleSelectorSequences, Span span) : super(span);
77 77
78 void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq); 78 void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq);
79 79
80 int get length => simpleSelectorSequences.length; 80 int get length => simpleSelectorSequences.length;
81 81
82 Selector clone() { 82 Selector clone() {
83 var simpleSequences = simpleSelectorSequences 83 var simpleSequences = simpleSelectorSequences
84 .map((ss) => ss.clone()) 84 .map((ss) => ss.clone())
85 .toList(); 85 .toList();
86 86
87 return new Selector(simpleSequences, span); 87 return new Selector(simpleSequences, span);
88 } 88 }
89 89
90 void visit(VisitorBase visitor) => visitor.visitSelector(this); 90 visit(VisitorBase visitor) => visitor.visitSelector(this);
91 } 91 }
92 92
93 class SimpleSelectorSequence extends TreeNode { 93 class SimpleSelectorSequence extends TreeNode {
94 /** +, >, ~, NONE */ 94 /** +, >, ~, NONE */
95 int combinator; 95 int combinator;
96 final SimpleSelector simpleSelector; 96 final SimpleSelector simpleSelector;
97 97
98 SimpleSelectorSequence(this.simpleSelector, Span span, 98 SimpleSelectorSequence(this.simpleSelector, Span span,
99 [int combinator = TokenKind.COMBINATOR_NONE]) 99 [int combinator = TokenKind.COMBINATOR_NONE])
100 : combinator = combinator, super(span); 100 : combinator = combinator, super(span);
101 101
102 bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; 102 bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
103 bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; 103 bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
104 bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER; 104 bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER;
105 bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE; 105 bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE;
106 bool get isCombinatorDescendant => 106 bool get isCombinatorDescendant =>
107 combinator == TokenKind.COMBINATOR_DESCENDANT; 107 combinator == TokenKind.COMBINATOR_DESCENDANT;
108 108
109 String get _combinatorToString => 109 String get _combinatorToString =>
110 isCombinatorDescendant ? ' ' : 110 isCombinatorDescendant ? ' ' :
111 isCombinatorPlus ? ' + ' : 111 isCombinatorPlus ? ' + ' :
112 isCombinatorGreater ? ' > ' : 112 isCombinatorGreater ? ' > ' :
113 isCombinatorTilde ? ' ~ ' : ''; 113 isCombinatorTilde ? ' ~ ' : '';
114 114
115 SimpleSelectorSequence clone() => 115 SimpleSelectorSequence clone() =>
116 new SimpleSelectorSequence(simpleSelector, span, combinator); 116 new SimpleSelectorSequence(simpleSelector, span, combinator);
117 117
118 void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); 118 visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
119 119
120 String toString() => simpleSelector.name; 120 String toString() => simpleSelector.name;
121 } 121 }
122 122
123 /* All other selectors (element, #id, .class, attribute, pseudo, negation, 123 /* All other selectors (element, #id, .class, attribute, pseudo, negation,
124 * namespace, *) are derived from this selector. 124 * namespace, *) are derived from this selector.
125 */ 125 */
126 abstract class SimpleSelector extends TreeNode { 126 abstract class SimpleSelector extends TreeNode {
127 final _name; // Wildcard, ThisOperator, Identifier, Negation, others? 127 final _name; // Wildcard, ThisOperator, Identifier, Negation, others?
128 128
129 SimpleSelector(this._name, Span span) : super(span); 129 SimpleSelector(this._name, Span span) : super(span);
130 130
131 String get name => _name.name; 131 String get name => _name.name;
132 132
133 bool get isWildcard => _name is Wildcard; 133 bool get isWildcard => _name is Wildcard;
134 134
135 bool get isThis => _name is ThisOperator; 135 bool get isThis => _name is ThisOperator;
136 136
137 void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); 137 visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
138 } 138 }
139 139
140 // element name 140 // element name
141 class ElementSelector extends SimpleSelector { 141 class ElementSelector extends SimpleSelector {
142 ElementSelector(name, Span span) : super(name, span); 142 ElementSelector(name, Span span) : super(name, span);
143 void visit(VisitorBase visitor) => visitor.visitElementSelector(this); 143 visit(VisitorBase visitor) => visitor.visitElementSelector(this);
144 144
145 ElementSelector clone() => new ElementSelector(_name, span); 145 ElementSelector clone() => new ElementSelector(_name, span);
146 146
147 String toString() => name; 147 String toString() => name;
148 } 148 }
149 149
150 // namespace|element 150 // namespace|element
151 class NamespaceSelector extends SimpleSelector { 151 class NamespaceSelector extends SimpleSelector {
152 final _namespace; // null, Wildcard or Identifier 152 final _namespace; // null, Wildcard or Identifier
153 153
154 NamespaceSelector(this._namespace, var name, Span span) : super(name, span); 154 NamespaceSelector(this._namespace, var name, Span span) : super(name, span);
155 155
156 String get namespace => 156 String get namespace =>
157 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; 157 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name;
158 158
159 bool get isNamespaceWildcard => _namespace is Wildcard; 159 bool get isNamespaceWildcard => _namespace is Wildcard;
160 160
161 SimpleSelector get nameAsSimpleSelector => _name; 161 SimpleSelector get nameAsSimpleSelector => _name;
162 162
163 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); 163 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
164 164
165 void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); 165 visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
166 166
167 String toString() => "$namespace|${nameAsSimpleSelector.name}"; 167 String toString() => "$namespace|${nameAsSimpleSelector.name}";
168 } 168 }
169 169
170 // [attr op value] 170 // [attr op value]
171 class AttributeSelector extends SimpleSelector { 171 class AttributeSelector extends SimpleSelector {
172 final int _op; 172 final int _op;
173 final _value; 173 final _value;
174 174
175 AttributeSelector(Identifier name, this._op, this._value, 175 AttributeSelector(Identifier name, this._op, this._value,
176 Span span) : super(name, span); 176 Span span) : super(name, span);
177 177
178 int get operatorKind => _op;
179
180 get value => _value;
181
178 String matchOperator() { 182 String matchOperator() {
179 switch (_op) { 183 switch (_op) {
180 case TokenKind.EQUALS: 184 case TokenKind.EQUALS:
181 return '='; 185 return '=';
182 case TokenKind.INCLUDES: 186 case TokenKind.INCLUDES:
183 return '~='; 187 return '~=';
184 case TokenKind.DASH_MATCH: 188 case TokenKind.DASH_MATCH:
185 return '|='; 189 return '|=';
186 case TokenKind.PREFIX_MATCH: 190 case TokenKind.PREFIX_MATCH:
187 return '^='; 191 return '^=';
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 } else { 223 } else {
220 return '"${_value}"'; 224 return '"${_value}"';
221 } 225 }
222 } else { 226 } else {
223 return ''; 227 return '';
224 } 228 }
225 } 229 }
226 230
227 AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); 231 AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
228 232
229 void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); 233 visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
230 234
231 String toString() => "[$name${matchOperator()}${valueToString()}]"; 235 String toString() => "[$name${matchOperator()}${valueToString()}]";
232 } 236 }
233 237
234 // #id 238 // #id
235 class IdSelector extends SimpleSelector { 239 class IdSelector extends SimpleSelector {
236 IdSelector(Identifier name, Span span) : super(name, span); 240 IdSelector(Identifier name, Span span) : super(name, span);
237 IdSelector clone() => new IdSelector(_name, span); 241 IdSelector clone() => new IdSelector(_name, span);
238 void visit(VisitorBase visitor) => visitor.visitIdSelector(this); 242 visit(VisitorBase visitor) => visitor.visitIdSelector(this);
239 243
240 String toString() => "#$_name"; 244 String toString() => "#$_name";
241 } 245 }
242 246
243 // .class 247 // .class
244 class ClassSelector extends SimpleSelector { 248 class ClassSelector extends SimpleSelector {
245 ClassSelector(Identifier name, Span span) : super(name, span); 249 ClassSelector(Identifier name, Span span) : super(name, span);
246 ClassSelector clone() => new ClassSelector(_name, span); 250 ClassSelector clone() => new ClassSelector(_name, span);
247 void visit(VisitorBase visitor) => visitor.visitClassSelector(this); 251 visit(VisitorBase visitor) => visitor.visitClassSelector(this);
248 252
249 String toString() => ".$_name"; 253 String toString() => ".$_name";
250 } 254 }
251 255
252 // :pseudoClass 256 // :pseudoClass
253 class PseudoClassSelector extends SimpleSelector { 257 class PseudoClassSelector extends SimpleSelector {
254 PseudoClassSelector(Identifier name, Span span) : super(name, span); 258 PseudoClassSelector(Identifier name, Span span) : super(name, span);
255 void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); 259 visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
256 260
257 PseudoClassSelector clone() => new PseudoClassSelector(_name, span); 261 PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
258 262
259 String toString() => ":$name"; 263 String toString() => ":$name";
260 } 264 }
261 265
262 // ::pseudoElement 266 // ::pseudoElement
263 class PseudoElementSelector extends SimpleSelector { 267 class PseudoElementSelector extends SimpleSelector {
264 PseudoElementSelector(Identifier name, Span span) : super(name, span); 268 PseudoElementSelector(Identifier name, Span span) : super(name, span);
265 void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); 269 visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
266 270
267 PseudoElementSelector clone() => new PseudoElementSelector(_name, span); 271 PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
268 272
269 String toString() => "::$name"; 273 String toString() => "::$name";
270 } 274 }
271 275
272 // :pseudoClassFunction(expression) 276 // :pseudoClassFunction(expression)
273 class PseudoClassFunctionSelector extends PseudoClassSelector { 277 class PseudoClassFunctionSelector extends PseudoClassSelector {
274 final SelectorExpression expression; 278 final SelectorExpression expression;
275 279
276 PseudoClassFunctionSelector(Identifier name, this.expression, Span span) 280 PseudoClassFunctionSelector(Identifier name, this.expression, Span span)
277 : super(name, span); 281 : super(name, span);
278 282
279 PseudoClassFunctionSelector clone() => 283 PseudoClassFunctionSelector clone() =>
280 new PseudoClassFunctionSelector(_name, expression, span); 284 new PseudoClassFunctionSelector(_name, expression, span);
281 285
282 void visit(VisitorBase visitor) => 286 visit(VisitorBase visitor) =>
283 visitor.visitPseudoClassFunctionSelector(this); 287 visitor.visitPseudoClassFunctionSelector(this);
284 } 288 }
285 289
286 // ::pseudoElementFunction(expression) 290 // ::pseudoElementFunction(expression)
287 class PseudoElementFunctionSelector extends PseudoElementSelector { 291 class PseudoElementFunctionSelector extends PseudoElementSelector {
288 final SelectorExpression expression; 292 final SelectorExpression expression;
289 293
290 PseudoElementFunctionSelector(Identifier name, this.expression, Span span) 294 PseudoElementFunctionSelector(Identifier name, this.expression, Span span)
291 : super(name, span); 295 : super(name, span);
292 296
293 PseudoElementFunctionSelector clone() => 297 PseudoElementFunctionSelector clone() =>
294 new PseudoElementFunctionSelector(_name, expression, span); 298 new PseudoElementFunctionSelector(_name, expression, span);
295 299
296 void visit(VisitorBase visitor) => 300 visit(VisitorBase visitor) =>
297 visitor.visitPseudoElementFunctionSelector(this); 301 visitor.visitPseudoElementFunctionSelector(this);
298 } 302 }
299 303
300 class SelectorExpression extends TreeNode { 304 class SelectorExpression extends TreeNode {
301 final List<Expression> expressions = []; 305 final List<Expression> expressions;
302 306
303 SelectorExpression(Span span): super(span); 307 SelectorExpression(this.expressions, Span span): super(span);
304 308
305 void add(Expression expression) { 309 SelectorExpression clone() {
306 expressions.add(expression); 310 return new SelectorExpression(
311 expressions.map((e) => e.clone()).toList(), span);
307 } 312 }
308 313
309 SelectorExpression clone() { 314 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
310 var selectorExpr = new SelectorExpression(span);
311 for (var expr in expressions) {
312 selectorExpr.add(expr.clone());
313 }
314 return selectorExpr;
315 }
316
317 void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
318 } 315 }
319 316
320 // :NOT(negation_arg) 317 // :NOT(negation_arg)
321 class NegationSelector extends SimpleSelector { 318 class NegationSelector extends SimpleSelector {
322 final SimpleSelector negationArg; 319 final SimpleSelector negationArg;
323 320
324 NegationSelector(this.negationArg, Span span) 321 NegationSelector(this.negationArg, Span span)
325 : super(new Negation(span), span); 322 : super(new Negation(span), span);
326 323
327 NegationSelector clone() => new NegationSelector(negationArg, span); 324 NegationSelector clone() => new NegationSelector(negationArg, span);
328 325
329 void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); 326 visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
330 } 327 }
331 328
332 class NoOp extends TreeNode { 329 class NoOp extends TreeNode {
333 NoOp() : super(null); 330 NoOp() : super(null);
334 331
335 NoOp clone() => new NoOp(); 332 NoOp clone() => new NoOp();
336 333
337 void visit(VisitorBase visitor) => visitor.visitNoOp(this); 334 visit(VisitorBase visitor) => visitor.visitNoOp(this);
338 } 335 }
339 336
340 class StyleSheet extends TreeNode { 337 class StyleSheet extends TreeNode {
341 /** 338 /**
342 * Contains charset, ruleset, directives (media, page, etc.), and selectors. 339 * Contains charset, ruleset, directives (media, page, etc.), and selectors.
343 */ 340 */
344 final List<TreeNode> topLevels; 341 final List<TreeNode> topLevels;
345 342
346 StyleSheet(this.topLevels, Span span) : super(span) { 343 StyleSheet(this.topLevels, Span span) : super(span) {
347 for (final node in topLevels) { 344 for (final node in topLevels) {
348 assert(node is TopLevelProduction || node is Directive); 345 assert(node is TopLevelProduction || node is Directive);
349 } 346 }
350 } 347 }
351 348
352 /** Selectors only in this tree. */ 349 /** Selectors only in this tree. */
353 StyleSheet.selector(this.topLevels, Span span) : super(span); 350 StyleSheet.selector(this.topLevels, Span span) : super(span);
354 351
355 StyleSheet clone() { 352 StyleSheet clone() {
356 var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); 353 var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
357 return new StyleSheet(clonedTopLevels, span); 354 return new StyleSheet(clonedTopLevels, span);
358 } 355 }
359 356
360 void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); 357 visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
361 } 358 }
362 359
363 class TopLevelProduction extends TreeNode { 360 class TopLevelProduction extends TreeNode {
364 TopLevelProduction(Span span) : super(span); 361 TopLevelProduction(Span span) : super(span);
365 TopLevelProduction clone() => new TopLevelProduction(span); 362 TopLevelProduction clone() => new TopLevelProduction(span);
366 void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); 363 visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
367 } 364 }
368 365
369 class RuleSet extends TopLevelProduction { 366 class RuleSet extends TopLevelProduction {
370 final SelectorGroup _selectorGroup; 367 final SelectorGroup _selectorGroup;
371 final DeclarationGroup _declarationGroup; 368 final DeclarationGroup _declarationGroup;
372 369
373 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span); 370 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span);
374 371
375 SelectorGroup get selectorGroup => _selectorGroup; 372 SelectorGroup get selectorGroup => _selectorGroup;
376 DeclarationGroup get declarationGroup => _declarationGroup; 373 DeclarationGroup get declarationGroup => _declarationGroup;
377 374
378 RuleSet clone() { 375 RuleSet clone() {
379 var cloneSelectorGroup = _selectorGroup.clone(); 376 var cloneSelectorGroup = _selectorGroup.clone();
380 var cloneDeclarationGroup = _declarationGroup.clone(); 377 var cloneDeclarationGroup = _declarationGroup.clone();
381 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); 378 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
382 } 379 }
383 380
384 void visit(VisitorBase visitor) => visitor.visitRuleSet(this); 381 visit(VisitorBase visitor) => visitor.visitRuleSet(this);
385 } 382 }
386 383
387 class Directive extends TreeNode { 384 class Directive extends TreeNode {
388 Directive(Span span) : super(span); 385 Directive(Span span) : super(span);
389 386
390 bool get isBuiltIn => true; // Known CSS directive? 387 bool get isBuiltIn => true; // Known CSS directive?
391 bool get isExtension => false; // SCSS extension? 388 bool get isExtension => false; // SCSS extension?
392 389
393 Directive clone() => new Directive(span); 390 Directive clone() => new Directive(span);
394 void visit(VisitorBase visitor) => visitor.visitDirective(this); 391 visit(VisitorBase visitor) => visitor.visitDirective(this);
395 } 392 }
396 393
397 class ImportDirective extends Directive { 394 class ImportDirective extends Directive {
398 /** import name specified. */ 395 /** import name specified. */
399 final String import; 396 final String import;
400 397
401 /** Any media queries for this import. */ 398 /** Any media queries for this import. */
402 final List<MediaQuery> mediaQueries; 399 final List<MediaQuery> mediaQueries;
403 400
404 ImportDirective(this.import, this.mediaQueries, Span span) : super(span); 401 ImportDirective(this.import, this.mediaQueries, Span span) : super(span);
405 402
406 ImportDirective clone() { 403 ImportDirective clone() {
407 var cloneMediaQueries = []; 404 var cloneMediaQueries = [];
408 for (var mediaQuery in mediaQueries) { 405 for (var mediaQuery in mediaQueries) {
409 cloneMediaQueries.add(mediaQuery.clone()); 406 cloneMediaQueries.add(mediaQuery.clone());
410 } 407 }
411 return new ImportDirective(import, cloneMediaQueries, span); 408 return new ImportDirective(import, cloneMediaQueries, span);
412 } 409 }
413 410
414 void visit(VisitorBase visitor) => visitor.visitImportDirective(this); 411 visit(VisitorBase visitor) => visitor.visitImportDirective(this);
415 } 412 }
416 413
417 /** 414 /**
418 * MediaExpression grammar: 415 * MediaExpression grammar:
419 * '(' S* media_feature S* [ ':' S* expr ]? ')' S* 416 * '(' S* media_feature S* [ ':' S* expr ]? ')' S*
420 */ 417 */
421 class MediaExpression extends TreeNode { 418 class MediaExpression extends TreeNode {
422 final bool andOperator; 419 final bool andOperator;
423 final Identifier _mediaFeature; 420 final Identifier _mediaFeature;
424 final Expressions exprs; 421 final Expressions exprs;
425 422
426 MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span) 423 MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span)
427 : super(span); 424 : super(span);
428 425
429 String get mediaFeature => _mediaFeature.name; 426 String get mediaFeature => _mediaFeature.name;
430 427
431 MediaExpression clone() { 428 MediaExpression clone() {
432 var clonedExprs = exprs.clone(); 429 var clonedExprs = exprs.clone();
433 return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); 430 return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
434 } 431 }
435 432
436 void visit(VisitorBase visitor) => visitor.visitMediaExpression(this); 433 visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
437 } 434 }
438 435
439 /** 436 /**
440 * MediaQuery grammar: 437 * MediaQuery grammar:
441 * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]* 438 * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]*
442 * | media_expression [ AND S* media_expression ]* 439 * | media_expression [ AND S* media_expression ]*
443 * media_type 440 * media_type
444 * : IDENT 441 * : IDENT
445 * media_expression 442 * media_expression
446 * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* 443 * : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
(...skipping 16 matching lines...) Expand all
463 String get unary => 460 String get unary =>
464 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); 461 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
465 462
466 MediaQuery clone() { 463 MediaQuery clone() {
467 var cloneExpressions = []; 464 var cloneExpressions = [];
468 for (var expr in expressions) { 465 for (var expr in expressions) {
469 cloneExpressions.add(expr.clone()); 466 cloneExpressions.add(expr.clone());
470 } 467 }
471 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); 468 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
472 } 469 }
473 void visit(VisitorBase visitor) => visitor.visitMediaQuery(this); 470 visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
474 } 471 }
475 472
476 class MediaDirective extends Directive { 473 class MediaDirective extends Directive {
477 final List<MediaQuery> mediaQueries; 474 final List<MediaQuery> mediaQueries;
478 final List<RuleSet> rulesets; 475 final List<RuleSet> rulesets;
479 476
480 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); 477 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
481 478
482 MediaDirective clone() { 479 MediaDirective clone() {
483 var cloneQueries = []; 480 var cloneQueries = [];
484 for (var mediaQuery in mediaQueries) { 481 for (var mediaQuery in mediaQueries) {
485 cloneQueries.add(mediaQuery.clone()); 482 cloneQueries.add(mediaQuery.clone());
486 } 483 }
487 var cloneRulesets = []; 484 var cloneRulesets = [];
488 for (var ruleset in rulesets) { 485 for (var ruleset in rulesets) {
489 cloneRulesets.add(ruleset.clone()); 486 cloneRulesets.add(ruleset.clone());
490 } 487 }
491 return new MediaDirective(cloneQueries, cloneRulesets, span); 488 return new MediaDirective(cloneQueries, cloneRulesets, span);
492 } 489 }
493 490
494 void visit(VisitorBase visitor) => visitor.visitMediaDirective(this); 491 visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
495 } 492 }
496 493
497 class HostDirective extends Directive { 494 class HostDirective extends Directive {
498 final List<RuleSet> rulesets; 495 final List<RuleSet> rulesets;
499 496
500 HostDirective(this.rulesets, Span span) : super(span); 497 HostDirective(this.rulesets, Span span) : super(span);
501 498
502 HostDirective clone() { 499 HostDirective clone() {
503 var cloneRulesets = []; 500 var cloneRulesets = [];
504 for (var ruleset in rulesets) { 501 for (var ruleset in rulesets) {
505 cloneRulesets.add(ruleset.clone()); 502 cloneRulesets.add(ruleset.clone());
506 } 503 }
507 return new HostDirective(cloneRulesets, span); 504 return new HostDirective(cloneRulesets, span);
508 } 505 }
509 506
510 void visit(VisitorBase visitor) => visitor.visitHostDirective(this); 507 visit(VisitorBase visitor) => visitor.visitHostDirective(this);
511 } 508 }
512 509
513 class PageDirective extends Directive { 510 class PageDirective extends Directive {
514 final String _ident; 511 final String _ident;
515 final String _pseudoPage; 512 final String _pseudoPage;
516 final List<DeclarationGroup> _declsMargin; 513 final List<DeclarationGroup> _declsMargin;
517 514
518 PageDirective(this._ident, this._pseudoPage, this._declsMargin, 515 PageDirective(this._ident, this._pseudoPage, this._declsMargin,
519 Span span) : super(span); 516 Span span) : super(span);
520 517
521 PageDirective clone() { 518 PageDirective clone() {
522 var cloneDeclsMargin = []; 519 var cloneDeclsMargin = [];
523 for (var declMargin in _declsMargin) { 520 for (var declMargin in _declsMargin) {
524 cloneDeclsMargin.add(declMargin.clone()); 521 cloneDeclsMargin.add(declMargin.clone());
525 } 522 }
526 return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); 523 return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
527 } 524 }
528 525
529 void visit(VisitorBase visitor) => visitor.visitPageDirective(this); 526 visit(VisitorBase visitor) => visitor.visitPageDirective(this);
530 527
531 bool get hasIdent => _ident != null && _ident.length > 0; 528 bool get hasIdent => _ident != null && _ident.length > 0;
532 bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0; 529 bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
533 } 530 }
534 531
535 class CharsetDirective extends Directive { 532 class CharsetDirective extends Directive {
536 final String charEncoding; 533 final String charEncoding;
537 534
538 CharsetDirective(this.charEncoding, Span span) : super(span); 535 CharsetDirective(this.charEncoding, Span span) : super(span);
539 CharsetDirective clone() => new CharsetDirective(charEncoding, span); 536 CharsetDirective clone() => new CharsetDirective(charEncoding, span);
540 void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); 537 visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
541 } 538 }
542 539
543 class KeyFrameDirective extends Directive { 540 class KeyFrameDirective extends Directive {
544 /* 541 /*
545 * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. 542 * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-.
546 */ 543 */
547 final int _keyframeName; 544 final int _keyframeName;
548 final name; 545 final name;
549 final List<KeyFrameBlock> _blocks; 546 final List<KeyFrameBlock> _blocks;
550 547
(...skipping 15 matching lines...) Expand all
566 } 563 }
567 } 564 }
568 565
569 KeyFrameDirective clone() { 566 KeyFrameDirective clone() {
570 var cloneBlocks = []; 567 var cloneBlocks = [];
571 for (var block in _blocks) { 568 for (var block in _blocks) {
572 cloneBlocks.add(block.clone()); 569 cloneBlocks.add(block.clone());
573 } 570 }
574 return new KeyFrameDirective(_keyframeName, cloneBlocks, span); 571 return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
575 } 572 }
576 void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); 573 visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
577 } 574 }
578 575
579 class KeyFrameBlock extends Expression { 576 class KeyFrameBlock extends Expression {
580 final Expressions _blockSelectors; 577 final Expressions _blockSelectors;
581 final DeclarationGroup _declarations; 578 final DeclarationGroup _declarations;
582 579
583 KeyFrameBlock(this._blockSelectors, this._declarations, Span span) 580 KeyFrameBlock(this._blockSelectors, this._declarations, Span span)
584 : super(span); 581 : super(span);
585 582
586 KeyFrameBlock clone() => 583 KeyFrameBlock clone() =>
587 new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); 584 new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
588 void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); 585 visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
589 } 586 }
590 587
591 class FontFaceDirective extends Directive { 588 class FontFaceDirective extends Directive {
592 final DeclarationGroup _declarations; 589 final DeclarationGroup _declarations;
593 590
594 FontFaceDirective(this._declarations, Span span) : super(span); 591 FontFaceDirective(this._declarations, Span span) : super(span);
595 592
596 FontFaceDirective clone() => 593 FontFaceDirective clone() =>
597 new FontFaceDirective(_declarations.clone(), span); 594 new FontFaceDirective(_declarations.clone(), span);
598 void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); 595 visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
599 } 596 }
600 597
601 class StyletDirective extends Directive { 598 class StyletDirective extends Directive {
602 final String dartClassName; 599 final String dartClassName;
603 final List<RuleSet> rulesets; 600 final List<RuleSet> rulesets;
604 601
605 StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span); 602 StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span);
606 603
607 bool get isBuiltIn => false; 604 bool get isBuiltIn => false;
608 bool get isExtension => true; 605 bool get isExtension => true;
609 606
610 StyletDirective clone() { 607 StyletDirective clone() {
611 var cloneRulesets = []; 608 var cloneRulesets = [];
612 for (var ruleset in rulesets) { 609 for (var ruleset in rulesets) {
613 cloneRulesets.add(ruleset.clone()); 610 cloneRulesets.add(ruleset.clone());
614 } 611 }
615 return new StyletDirective(dartClassName, cloneRulesets, span); 612 return new StyletDirective(dartClassName, cloneRulesets, span);
616 } 613 }
617 614
618 void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); 615 visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
619 } 616 }
620 617
621 class NamespaceDirective extends Directive { 618 class NamespaceDirective extends Directive {
622 /** Namespace prefix. */ 619 /** Namespace prefix. */
623 final String _prefix; 620 final String _prefix;
624 621
625 /** URI associated with this namespace. */ 622 /** URI associated with this namespace. */
626 final String _uri; 623 final String _uri;
627 624
628 NamespaceDirective(this._prefix, this._uri, Span span) : super(span); 625 NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
629 626
630 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); 627 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
631 628
632 void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); 629 visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
633 630
634 String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; 631 String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
635 } 632 }
636 633
637 /** To support Less syntax @name: expression */ 634 /** To support Less syntax @name: expression */
638 class VarDefinitionDirective extends Directive { 635 class VarDefinitionDirective extends Directive {
639 final VarDefinition def; 636 final VarDefinition def;
640 637
641 VarDefinitionDirective(this.def, Span span) : super(span); 638 VarDefinitionDirective(this.def, Span span) : super(span);
642 639
643 VarDefinitionDirective clone() => 640 VarDefinitionDirective clone() =>
644 new VarDefinitionDirective(def.clone(), span); 641 new VarDefinitionDirective(def.clone(), span);
645 642
646 void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); 643 visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
647 } 644 }
648 645
649 class MixinDefinition extends Directive { 646 class MixinDefinition extends Directive {
650 final String name; 647 final String name;
651 final List definedArgs; 648 final List definedArgs;
652 final bool varArgs; 649 final bool varArgs;
653 650
654 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span) 651 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span)
655 : super(span); 652 : super(span);
656 653
657 MixinDefinition clone() { 654 MixinDefinition clone() {
658 var cloneDefinedArgs = []; 655 var cloneDefinedArgs = [];
659 for (var definedArg in definedArgs) { 656 for (var definedArg in definedArgs) {
660 cloneDefinedArgs.add(definedArg.clone()); 657 cloneDefinedArgs.add(definedArg.clone());
661 } 658 }
662 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); 659 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
663 } 660 }
664 661
665 void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); 662 visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
666 } 663 }
667 664
668 /** Support a Sass @mixin. See http://sass-lang.com for description. */ 665 /** Support a Sass @mixin. See http://sass-lang.com for description. */
669 class MixinRulesetDirective extends MixinDefinition { 666 class MixinRulesetDirective extends MixinDefinition {
670 final List<RuleSet> rulesets; 667 final List<RuleSet> rulesets;
671 668
672 MixinRulesetDirective(String name, List<VarDefinitionDirective> args, 669 MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
673 bool varArgs, this.rulesets, Span span) : 670 bool varArgs, this.rulesets, Span span) :
674 super(name, args, varArgs, span); 671 super(name, args, varArgs, span);
675 672
676 MixinRulesetDirective clone() { 673 MixinRulesetDirective clone() {
677 var clonedArgs = []; 674 var clonedArgs = [];
678 for (var arg in definedArgs) { 675 for (var arg in definedArgs) {
679 clonedArgs.add(arg.clone()); 676 clonedArgs.add(arg.clone());
680 } 677 }
681 var clonedRulesets = []; 678 var clonedRulesets = [];
682 for (var ruleset in rulesets) { 679 for (var ruleset in rulesets) {
683 clonedRulesets.add(ruleset.clone()); 680 clonedRulesets.add(ruleset.clone());
684 } 681 }
685 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, 682 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
686 span); 683 span);
687 } 684 }
688 685
689 void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); 686 visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
690 } 687 }
691 688
692 class MixinDeclarationDirective extends MixinDefinition { 689 class MixinDeclarationDirective extends MixinDefinition {
693 final DeclarationGroup declarations; 690 final DeclarationGroup declarations;
694 691
695 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args, 692 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
696 bool varArgs, this.declarations, Span span) : 693 bool varArgs, this.declarations, Span span) :
697 super(name, args, varArgs, span); 694 super(name, args, varArgs, span);
698 695
699 MixinDeclarationDirective clone() { 696 MixinDeclarationDirective clone() {
700 var clonedArgs = []; 697 var clonedArgs = [];
701 for (var arg in definedArgs) { 698 for (var arg in definedArgs) {
702 clonedArgs.add(arg.clone()); 699 clonedArgs.add(arg.clone());
703 } 700 }
704 return new MixinDeclarationDirective(name, clonedArgs, varArgs, 701 return new MixinDeclarationDirective(name, clonedArgs, varArgs,
705 declarations.clone(), span); 702 declarations.clone(), span);
706 } 703 }
707 704
708 void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this ); 705 visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
709 } 706 }
710 707
711 /** To support consuming a SASS mixin @include. */ 708 /** To support consuming a SASS mixin @include. */
712 class IncludeDirective extends Directive { 709 class IncludeDirective extends Directive {
713 final String name; 710 final String name;
714 final List<List<TreeNode>> args; 711 final List<List<TreeNode>> args;
715 712
716 IncludeDirective(this.name, this.args, Span span) : super(span); 713 IncludeDirective(this.name, this.args, Span span) : super(span);
717 714
718 IncludeDirective clone() { 715 IncludeDirective clone() {
719 var cloneArgs = []; 716 var cloneArgs = [];
720 for (var arg in args) { 717 for (var arg in args) {
721 for (var term in arg) { 718 for (var term in arg) {
722 cloneArgs.add(term.clone()); 719 cloneArgs.add(term.clone());
723 } 720 }
724 } 721 }
725 return new IncludeDirective(name, cloneArgs, span); 722 return new IncludeDirective(name, cloneArgs, span);
726 } 723 }
727 724
728 void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); 725 visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
729 } 726 }
730 727
731 /** To support SASS @content. */ 728 /** To support SASS @content. */
732 class ContentDirective extends Directive { 729 class ContentDirective extends Directive {
733 ContentDirective(Span span) : super(span); 730 ContentDirective(Span span) : super(span);
734 731
735 void visit(VisitorBase visitor) => visitor.visitContentDirective(this); 732 visit(VisitorBase visitor) => visitor.visitContentDirective(this);
736 } 733 }
737 734
738 class Declaration extends TreeNode { 735 class Declaration extends TreeNode {
739 final Identifier _property; 736 final Identifier _property;
740 final Expression _expression; 737 final Expression _expression;
741 /** Style exposed to Dart. */ 738 /** Style exposed to Dart. */
742 dynamic dartStyle; 739 dynamic dartStyle;
743 final bool important; 740 final bool important;
744 741
745 /** 742 /**
(...skipping 12 matching lines...) Expand all
758 755
759 String get property => isIE7 ? '*${_property.name}' : _property.name; 756 String get property => isIE7 ? '*${_property.name}' : _property.name;
760 Expression get expression => _expression; 757 Expression get expression => _expression;
761 758
762 bool get hasDartStyle => dartStyle != null; 759 bool get hasDartStyle => dartStyle != null;
763 760
764 Declaration clone() => 761 Declaration clone() =>
765 new Declaration(_property.clone(), _expression.clone(), dartStyle, span, 762 new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
766 important: important); 763 important: important);
767 764
768 void visit(VisitorBase visitor) => visitor.visitDeclaration(this); 765 visit(VisitorBase visitor) => visitor.visitDeclaration(this);
769 } 766 }
770 767
771 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and 768 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
772 // dynamic when in a declaration. Currently, Less syntax 769 // dynamic when in a declaration. Currently, Less syntax
773 // '@foo: expression' and 'var-foo: expression' in a declaration 770 // '@foo: expression' and 'var-foo: expression' in a declaration
774 // are statically resolved. Better solution, if @foo or var-foo 771 // are statically resolved. Better solution, if @foo or var-foo
775 // are top-level are then statically resolved and var-foo in a 772 // are top-level are then statically resolved and var-foo in a
776 // declaration group (surrounded by a selector) would be dynamic. 773 // declaration group (surrounded by a selector) would be dynamic.
777 class VarDefinition extends Declaration { 774 class VarDefinition extends Declaration {
778 bool badUsage = false; 775 bool badUsage = false;
779 776
780 VarDefinition(Identifier definedName, Expression expr, Span span) 777 VarDefinition(Identifier definedName, Expression expr, Span span)
781 : super(definedName, expr, null, span); 778 : super(definedName, expr, null, span);
782 779
783 String get definedName => _property.name; 780 String get definedName => _property.name;
784 781
785 VarDefinition clone() => 782 VarDefinition clone() =>
786 new VarDefinition(_property.clone(), 783 new VarDefinition(_property.clone(),
787 expression != null ? expression.clone() : null, span); 784 expression != null ? expression.clone() : null, span);
788 785
789 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); 786 visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
790 } 787 }
791 788
792 /** 789 /**
793 * Node for usage of @include mixin[(args,...)] found in a declaration group 790 * Node for usage of @include mixin[(args,...)] found in a declaration group
794 * instead of at a ruleset (toplevel) e.g., 791 * instead of at a ruleset (toplevel) e.g.,
795 * div { 792 * div {
796 * @include mixin1; 793 * @include mixin1;
797 * } 794 * }
798 */ 795 */
799 class IncludeMixinAtDeclaration extends Declaration { 796 class IncludeMixinAtDeclaration extends Declaration {
800 final IncludeDirective include; 797 final IncludeDirective include;
801 798
802 IncludeMixinAtDeclaration(this.include, Span span) 799 IncludeMixinAtDeclaration(this.include, Span span)
803 : super(null, null, null, span); 800 : super(null, null, null, span);
804 801
805 IncludeMixinAtDeclaration clone() => 802 IncludeMixinAtDeclaration clone() =>
806 new IncludeMixinAtDeclaration(include.clone(), span); 803 new IncludeMixinAtDeclaration(include.clone(), span);
807 804
808 void visit(VisitorBase visitor) => 805 visit(VisitorBase visitor) =>
809 visitor.visitIncludeMixinAtDeclaration(this); 806 visitor.visitIncludeMixinAtDeclaration(this);
810 } 807 }
811 808
812 class ExtendDeclaration extends Declaration { 809 class ExtendDeclaration extends Declaration {
813 final List<TreeNode> selectors; 810 final List<TreeNode> selectors;
814 811
815 ExtendDeclaration(this.selectors, Span span) : 812 ExtendDeclaration(this.selectors, Span span) :
816 super(null, null, null, span); 813 super(null, null, null, span);
817 814
818 ExtendDeclaration clone() { 815 ExtendDeclaration clone() {
819 var newSelector = selectors.map((s) => s.clone()).toList(); 816 var newSelector = selectors.map((s) => s.clone()).toList();
820 return new ExtendDeclaration(newSelector, span); 817 return new ExtendDeclaration(newSelector, span);
821 } 818 }
822 819
823 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); 820 visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
824 } 821 }
825 822
826 class DeclarationGroup extends TreeNode { 823 class DeclarationGroup extends TreeNode {
827 /** Can be either Declaration or RuleSet (if nested selector). */ 824 /** Can be either Declaration or RuleSet (if nested selector). */
828 final List declarations; 825 final List declarations;
829 826
830 DeclarationGroup(this.declarations, Span span) : super(span); 827 DeclarationGroup(this.declarations, Span span) : super(span);
831 828
832 DeclarationGroup clone() { 829 DeclarationGroup clone() {
833 var clonedDecls = declarations.map((d) => d.clone()).toList(); 830 var clonedDecls = declarations.map((d) => d.clone()).toList();
834 return new DeclarationGroup(clonedDecls, span); 831 return new DeclarationGroup(clonedDecls, span);
835 } 832 }
836 833
837 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); 834 visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
838 } 835 }
839 836
840 class MarginGroup extends DeclarationGroup { 837 class MarginGroup extends DeclarationGroup {
841 final int margin_sym; // TokenType for for @margin sym. 838 final int margin_sym; // TokenType for for @margin sym.
842 839
843 MarginGroup(this.margin_sym, List<Declaration> decls, Span span) 840 MarginGroup(this.margin_sym, List<Declaration> decls, Span span)
844 : super(decls, span); 841 : super(decls, span);
845 MarginGroup clone() => 842 MarginGroup clone() =>
846 new MarginGroup(margin_sym, super.clone() as dynamic, span); 843 new MarginGroup(margin_sym, super.clone() as dynamic, span);
847 void visit(VisitorBase visitor) => visitor.visitMarginGroup(this); 844 visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
848 } 845 }
849 846
850 class VarUsage extends Expression { 847 class VarUsage extends Expression {
851 final String name; 848 final String name;
852 final List<Expression> defaultValues; 849 final List<Expression> defaultValues;
853 850
854 VarUsage(this.name, this.defaultValues, Span span) : super(span); 851 VarUsage(this.name, this.defaultValues, Span span) : super(span);
855 852
856 VarUsage clone() { 853 VarUsage clone() {
857 var clonedValues = []; 854 var clonedValues = [];
858 for (var expr in defaultValues) { 855 for (var expr in defaultValues) {
859 clonedValues.add(expr.clone()); 856 clonedValues.add(expr.clone());
860 } 857 }
861 return new VarUsage(name, clonedValues, span); 858 return new VarUsage(name, clonedValues, span);
862 } 859 }
863 860
864 void visit(VisitorBase visitor) => visitor.visitVarUsage(this); 861 visit(VisitorBase visitor) => visitor.visitVarUsage(this);
865 } 862 }
866 863
867 class OperatorSlash extends Expression { 864 class OperatorSlash extends Expression {
868 OperatorSlash(Span span) : super(span); 865 OperatorSlash(Span span) : super(span);
869 OperatorSlash clone() => new OperatorSlash(span); 866 OperatorSlash clone() => new OperatorSlash(span);
870 void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); 867 visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
871 } 868 }
872 869
873 class OperatorComma extends Expression { 870 class OperatorComma extends Expression {
874 OperatorComma(Span span) : super(span); 871 OperatorComma(Span span) : super(span);
875 OperatorComma clone() => new OperatorComma(span); 872 OperatorComma clone() => new OperatorComma(span);
876 void visit(VisitorBase visitor) => visitor.visitOperatorComma(this); 873 visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
877 } 874 }
878 875
879 class OperatorPlus extends Expression { 876 class OperatorPlus extends Expression {
880 OperatorPlus(Span span) : super(span); 877 OperatorPlus(Span span) : super(span);
881 OperatorPlus clone() => new OperatorPlus(span); 878 OperatorPlus clone() => new OperatorPlus(span);
882 void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); 879 visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
883 } 880 }
884 881
885 class OperatorMinus extends Expression { 882 class OperatorMinus extends Expression {
886 OperatorMinus(Span span) : super(span); 883 OperatorMinus(Span span) : super(span);
887 OperatorMinus clone() => new OperatorMinus(span); 884 OperatorMinus clone() => new OperatorMinus(span);
888 void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); 885 visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
889 } 886 }
890 887
891 class UnicodeRangeTerm extends Expression { 888 class UnicodeRangeTerm extends Expression {
892 final String first; 889 final String first;
893 final String second; 890 final String second;
894 891
895 UnicodeRangeTerm(this.first, this.second, Span span) : super(span); 892 UnicodeRangeTerm(this.first, this.second, Span span) : super(span);
896 893
897 bool get hasSecond => second != null; 894 bool get hasSecond => second != null;
898 895
899 UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span); 896 UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
900 897
901 void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); 898 visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
902 } 899 }
903 900
904 class LiteralTerm extends Expression { 901 class LiteralTerm extends Expression {
905 // TODO(terry): value and text fields can be made final once all CSS resources 902 // TODO(terry): value and text fields can be made final once all CSS resources
906 // are copied/symlink'd in the build tool and UriVisitor in 903 // are copied/symlink'd in the build tool and UriVisitor in
907 // web_ui is removed. 904 // web_ui is removed.
908 dynamic value; 905 dynamic value;
909 String text; 906 String text;
910 907
911 LiteralTerm(this.value, this.text, Span span) : super(span); 908 LiteralTerm(this.value, this.text, Span span) : super(span);
912 909
913 LiteralTerm clone() => new LiteralTerm(value, text, span); 910 LiteralTerm clone() => new LiteralTerm(value, text, span);
914 911
915 void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); 912 visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
916 } 913 }
917 914
918 class NumberTerm extends LiteralTerm { 915 class NumberTerm extends LiteralTerm {
919 NumberTerm(value, String t, Span span) : super(value, t, span); 916 NumberTerm(value, String t, Span span) : super(value, t, span);
920 NumberTerm clone() => new NumberTerm(value, text, span); 917 NumberTerm clone() => new NumberTerm(value, text, span);
921 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); 918 visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
922 } 919 }
923 920
924 class UnitTerm extends LiteralTerm { 921 class UnitTerm extends LiteralTerm {
925 final int unit; 922 final int unit;
926 923
927 UnitTerm(value, String t, Span span, this.unit) : super(value, t, span); 924 UnitTerm(value, String t, Span span, this.unit) : super(value, t, span);
928 925
929 UnitTerm clone() => new UnitTerm(value, text, span, unit); 926 UnitTerm clone() => new UnitTerm(value, text, span, unit);
930 927
931 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); 928 visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
932 929
933 String unitToString() => TokenKind.unitToString(unit); 930 String unitToString() => TokenKind.unitToString(unit);
934 931
935 String toString() => '$text${unitToString()}'; 932 String toString() => '$text${unitToString()}';
936 } 933 }
937 934
938 class LengthTerm extends UnitTerm { 935 class LengthTerm extends UnitTerm {
939 LengthTerm(value, String t, Span span, 936 LengthTerm(value, String t, Span span,
940 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 937 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
941 assert(this.unit == TokenKind.UNIT_LENGTH_PX || 938 assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
942 this.unit == TokenKind.UNIT_LENGTH_CM || 939 this.unit == TokenKind.UNIT_LENGTH_CM ||
943 this.unit == TokenKind.UNIT_LENGTH_MM || 940 this.unit == TokenKind.UNIT_LENGTH_MM ||
944 this.unit == TokenKind.UNIT_LENGTH_IN || 941 this.unit == TokenKind.UNIT_LENGTH_IN ||
945 this.unit == TokenKind.UNIT_LENGTH_PT || 942 this.unit == TokenKind.UNIT_LENGTH_PT ||
946 this.unit == TokenKind.UNIT_LENGTH_PC); 943 this.unit == TokenKind.UNIT_LENGTH_PC);
947 } 944 }
948 LengthTerm clone() => new LengthTerm(value, text, span, unit); 945 LengthTerm clone() => new LengthTerm(value, text, span, unit);
949 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); 946 visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
950 } 947 }
951 948
952 class PercentageTerm extends LiteralTerm { 949 class PercentageTerm extends LiteralTerm {
953 PercentageTerm(value, String t, Span span) : super(value, t, span); 950 PercentageTerm(value, String t, Span span) : super(value, t, span);
954 PercentageTerm clone() => new PercentageTerm(value, text, span); 951 PercentageTerm clone() => new PercentageTerm(value, text, span);
955 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); 952 visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
956 } 953 }
957 954
958 class EmTerm extends LiteralTerm { 955 class EmTerm extends LiteralTerm {
959 EmTerm(value, String t, Span span) : super(value, t, span); 956 EmTerm(value, String t, Span span) : super(value, t, span);
960 EmTerm clone() => new EmTerm(value, text, span); 957 EmTerm clone() => new EmTerm(value, text, span);
961 void visit(VisitorBase visitor) => visitor.visitEmTerm(this); 958 visit(VisitorBase visitor) => visitor.visitEmTerm(this);
962 } 959 }
963 960
964 class ExTerm extends LiteralTerm { 961 class ExTerm extends LiteralTerm {
965 ExTerm(value, String t, Span span) : super(value, t, span); 962 ExTerm(value, String t, Span span) : super(value, t, span);
966 ExTerm clone() => new ExTerm(value, text, span); 963 ExTerm clone() => new ExTerm(value, text, span);
967 void visit(VisitorBase visitor) => visitor.visitExTerm(this); 964 visit(VisitorBase visitor) => visitor.visitExTerm(this);
968 } 965 }
969 966
970 class AngleTerm extends UnitTerm { 967 class AngleTerm extends UnitTerm {
971 AngleTerm(var value, String t, Span span, 968 AngleTerm(var value, String t, Span span,
972 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 969 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
973 assert(this.unit == TokenKind.UNIT_ANGLE_DEG || 970 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
974 this.unit == TokenKind.UNIT_ANGLE_RAD || 971 this.unit == TokenKind.UNIT_ANGLE_RAD ||
975 this.unit == TokenKind.UNIT_ANGLE_GRAD || 972 this.unit == TokenKind.UNIT_ANGLE_GRAD ||
976 this.unit == TokenKind.UNIT_ANGLE_TURN); 973 this.unit == TokenKind.UNIT_ANGLE_TURN);
977 } 974 }
978 975
979 AngleTerm clone() => new AngleTerm(value, text, span, unit); 976 AngleTerm clone() => new AngleTerm(value, text, span, unit);
980 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); 977 visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
981 } 978 }
982 979
983 class TimeTerm extends UnitTerm { 980 class TimeTerm extends UnitTerm {
984 TimeTerm(var value, String t, Span span, 981 TimeTerm(var value, String t, Span span,
985 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 982 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
986 assert(this.unit == TokenKind.UNIT_ANGLE_DEG || 983 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
987 this.unit == TokenKind.UNIT_TIME_MS || 984 this.unit == TokenKind.UNIT_TIME_MS ||
988 this.unit == TokenKind.UNIT_TIME_S); 985 this.unit == TokenKind.UNIT_TIME_S);
989 } 986 }
990 987
991 TimeTerm clone() => new TimeTerm(value, text, span, unit); 988 TimeTerm clone() => new TimeTerm(value, text, span, unit);
992 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); 989 visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
993 } 990 }
994 991
995 class FreqTerm extends UnitTerm { 992 class FreqTerm extends UnitTerm {
996 FreqTerm(var value, String t, Span span, 993 FreqTerm(var value, String t, Span span,
997 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 994 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
998 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); 995 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
999 } 996 }
1000 997
1001 FreqTerm clone() => new FreqTerm(value, text, span, unit); 998 FreqTerm clone() => new FreqTerm(value, text, span, unit);
1002 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); 999 visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
1003 } 1000 }
1004 1001
1005 class FractionTerm extends LiteralTerm { 1002 class FractionTerm extends LiteralTerm {
1006 FractionTerm(var value, String t, Span span) : super(value, t, span); 1003 FractionTerm(var value, String t, Span span) : super(value, t, span);
1007 1004
1008 FractionTerm clone() => new FractionTerm(value, text, span); 1005 FractionTerm clone() => new FractionTerm(value, text, span);
1009 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); 1006 visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
1010 } 1007 }
1011 1008
1012 class UriTerm extends LiteralTerm { 1009 class UriTerm extends LiteralTerm {
1013 UriTerm(String value, Span span) : super(value, value, span); 1010 UriTerm(String value, Span span) : super(value, value, span);
1014 1011
1015 UriTerm clone() => new UriTerm(value, span); 1012 UriTerm clone() => new UriTerm(value, span);
1016 void visit(VisitorBase visitor) => visitor.visitUriTerm(this); 1013 visit(VisitorBase visitor) => visitor.visitUriTerm(this);
1017 } 1014 }
1018 1015
1019 class ResolutionTerm extends UnitTerm { 1016 class ResolutionTerm extends UnitTerm {
1020 ResolutionTerm(var value, String t, Span span, 1017 ResolutionTerm(var value, String t, Span span,
1021 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1018 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1022 assert(unit == TokenKind.UNIT_RESOLUTION_DPI || 1019 assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
1023 unit == TokenKind.UNIT_RESOLUTION_DPCM || 1020 unit == TokenKind.UNIT_RESOLUTION_DPCM ||
1024 unit == TokenKind.UNIT_RESOLUTION_DPPX); 1021 unit == TokenKind.UNIT_RESOLUTION_DPPX);
1025 } 1022 }
1026 1023
1027 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); 1024 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
1028 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); 1025 visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
1029 } 1026 }
1030 1027
1031 class ChTerm extends UnitTerm { 1028 class ChTerm extends UnitTerm {
1032 ChTerm(var value, String t, Span span, 1029 ChTerm(var value, String t, Span span,
1033 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1030 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1034 assert(unit == TokenKind.UNIT_CH); 1031 assert(unit == TokenKind.UNIT_CH);
1035 } 1032 }
1036 1033
1037 ChTerm clone() => new ChTerm(value, text, span, unit); 1034 ChTerm clone() => new ChTerm(value, text, span, unit);
1038 void visit(VisitorBase visitor) => visitor.visitChTerm(this); 1035 visit(VisitorBase visitor) => visitor.visitChTerm(this);
1039 } 1036 }
1040 1037
1041 class RemTerm extends UnitTerm { 1038 class RemTerm extends UnitTerm {
1042 RemTerm(var value, String t, Span span, 1039 RemTerm(var value, String t, Span span,
1043 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1040 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1044 assert(unit == TokenKind.UNIT_REM); 1041 assert(unit == TokenKind.UNIT_REM);
1045 } 1042 }
1046 1043
1047 RemTerm clone() => new RemTerm(value, text, span, unit); 1044 RemTerm clone() => new RemTerm(value, text, span, unit);
1048 void visit(VisitorBase visitor) => visitor.visitRemTerm(this); 1045 visit(VisitorBase visitor) => visitor.visitRemTerm(this);
1049 } 1046 }
1050 1047
1051 class ViewportTerm extends UnitTerm { 1048 class ViewportTerm extends UnitTerm {
1052 ViewportTerm(var value, String t, Span span, 1049 ViewportTerm(var value, String t, Span span,
1053 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1050 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1054 assert(unit == TokenKind.UNIT_VIEWPORT_VW || 1051 assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
1055 unit == TokenKind.UNIT_VIEWPORT_VH || 1052 unit == TokenKind.UNIT_VIEWPORT_VH ||
1056 unit == TokenKind.UNIT_VIEWPORT_VMIN || 1053 unit == TokenKind.UNIT_VIEWPORT_VMIN ||
1057 unit == TokenKind.UNIT_VIEWPORT_VMAX); 1054 unit == TokenKind.UNIT_VIEWPORT_VMAX);
1058 } 1055 }
1059 1056
1060 ViewportTerm clone() => new ViewportTerm(value, text, span, unit); 1057 ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
1061 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); 1058 visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
1062 } 1059 }
1063 1060
1064 /** Type to signal a bad hex value for HexColorTerm.value. */ 1061 /** Type to signal a bad hex value for HexColorTerm.value. */
1065 class BAD_HEX_VALUE { } 1062 class BAD_HEX_VALUE { }
1066 1063
1067 class HexColorTerm extends LiteralTerm { 1064 class HexColorTerm extends LiteralTerm {
1068 HexColorTerm(var value, String t, Span span) : super(value, t, span); 1065 HexColorTerm(var value, String t, Span span) : super(value, t, span);
1069 1066
1070 HexColorTerm clone() => new HexColorTerm(value, text, span); 1067 HexColorTerm clone() => new HexColorTerm(value, text, span);
1071 void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); 1068 visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
1072 } 1069 }
1073 1070
1074 class FunctionTerm extends LiteralTerm { 1071 class FunctionTerm extends LiteralTerm {
1075 final Expressions _params; 1072 final Expressions _params;
1076 1073
1077 FunctionTerm(var value, String t, this._params, Span span) 1074 FunctionTerm(var value, String t, this._params, Span span)
1078 : super(value, t, span); 1075 : super(value, t, span);
1079 1076
1080 FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); 1077 FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
1081 void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); 1078 visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
1082 } 1079 }
1083 1080
1084 /** 1081 /**
1085 * A "\9" was encountered at the end of the expression and before a semi-colon. 1082 * A "\9" was encountered at the end of the expression and before a semi-colon.
1086 * This is an IE trick to ignore a property or value except by IE 8 and older 1083 * This is an IE trick to ignore a property or value except by IE 8 and older
1087 * browsers. 1084 * browsers.
1088 */ 1085 */
1089 class IE8Term extends LiteralTerm { 1086 class IE8Term extends LiteralTerm {
1090 IE8Term(Span span) : super('\\9', '\\9', span); 1087 IE8Term(Span span) : super('\\9', '\\9', span);
1091 IE8Term clone() => new IE8Term(span); 1088 IE8Term clone() => new IE8Term(span);
1092 void visit(VisitorBase visitor) => visitor.visitIE8Term(this); 1089 visit(VisitorBase visitor) => visitor.visitIE8Term(this);
1093 } 1090 }
1094 1091
1095 class GroupTerm extends Expression { 1092 class GroupTerm extends Expression {
1096 final List<LiteralTerm> _terms; 1093 final List<LiteralTerm> _terms;
1097 1094
1098 GroupTerm(Span span) : _terms = [], super(span); 1095 GroupTerm(Span span) : _terms = [], super(span);
1099 1096
1100 void add(LiteralTerm term) { 1097 void add(LiteralTerm term) {
1101 _terms.add(term); 1098 _terms.add(term);
1102 } 1099 }
1103 1100
1104 GroupTerm clone() => new GroupTerm(span); 1101 GroupTerm clone() => new GroupTerm(span);
1105 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); 1102 visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
1106 } 1103 }
1107 1104
1108 class ItemTerm extends NumberTerm { 1105 class ItemTerm extends NumberTerm {
1109 ItemTerm(var value, String t, Span span) : super(value, t, span); 1106 ItemTerm(var value, String t, Span span) : super(value, t, span);
1110 1107
1111 ItemTerm clone() => new ItemTerm(value, text, span); 1108 ItemTerm clone() => new ItemTerm(value, text, span);
1112 void visit(VisitorBase visitor) => visitor.visitItemTerm(this); 1109 visit(VisitorBase visitor) => visitor.visitItemTerm(this);
1113 } 1110 }
1114 1111
1115 class Expressions extends Expression { 1112 class Expressions extends Expression {
1116 final List<Expression> expressions = []; 1113 final List<Expression> expressions = [];
1117 1114
1118 Expressions(Span span): super(span); 1115 Expressions(Span span): super(span);
1119 1116
1120 void add(Expression expression) { 1117 void add(Expression expression) {
1121 expressions.add(expression); 1118 expressions.add(expression);
1122 } 1119 }
1123 1120
1124 Expressions clone() { 1121 Expressions clone() {
1125 var clonedExprs = new Expressions(span); 1122 var clonedExprs = new Expressions(span);
1126 for (var expr in expressions) { 1123 for (var expr in expressions) {
1127 clonedExprs.add(expr.clone()); 1124 clonedExprs.add(expr.clone());
1128 } 1125 }
1129 return clonedExprs; 1126 return clonedExprs;
1130 } 1127 }
1131 void visit(VisitorBase visitor) => visitor.visitExpressions(this); 1128 visit(VisitorBase visitor) => visitor.visitExpressions(this);
1132 } 1129 }
1133 1130
1134 class BinaryExpression extends Expression { 1131 class BinaryExpression extends Expression {
1135 final Token op; 1132 final Token op;
1136 final Expression x; 1133 final Expression x;
1137 final Expression y; 1134 final Expression y;
1138 1135
1139 BinaryExpression(this.op, this.x, this.y, Span span): super(span); 1136 BinaryExpression(this.op, this.x, this.y, Span span): super(span);
1140 1137
1141 BinaryExpression clone() => 1138 BinaryExpression clone() =>
1142 new BinaryExpression(op, x.clone(), y.clone(), span); 1139 new BinaryExpression(op, x.clone(), y.clone(), span);
1143 void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); 1140 visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
1144 } 1141 }
1145 1142
1146 class UnaryExpression extends Expression { 1143 class UnaryExpression extends Expression {
1147 final Token op; 1144 final Token op;
1148 final Expression self; 1145 final Expression self;
1149 1146
1150 UnaryExpression(this.op, this.self, Span span): super(span); 1147 UnaryExpression(this.op, this.self, Span span): super(span);
1151 1148
1152 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); 1149 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
1153 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); 1150 visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
1154 } 1151 }
1155 1152
1156 abstract class DartStyleExpression extends TreeNode { 1153 abstract class DartStyleExpression extends TreeNode {
1157 static const int unknownType = 0; 1154 static const int unknownType = 0;
1158 static const int fontStyle = 1; 1155 static const int fontStyle = 1;
1159 static const int marginStyle = 2; 1156 static const int marginStyle = 2;
1160 static const int borderStyle = 3; 1157 static const int borderStyle = 3;
1161 static const int paddingStyle = 4; 1158 static const int paddingStyle = 4;
1162 static const int heightStyle = 5; 1159 static const int heightStyle = 5;
1163 static const int widthStyle = 6; 1160 static const int widthStyle = 6;
(...skipping 14 matching lines...) Expand all
1178 bool get isFont => _styleType == fontStyle; 1175 bool get isFont => _styleType == fontStyle;
1179 bool get isMargin => _styleType == marginStyle; 1176 bool get isMargin => _styleType == marginStyle;
1180 bool get isBorder => _styleType == borderStyle; 1177 bool get isBorder => _styleType == borderStyle;
1181 bool get isPadding => _styleType == paddingStyle; 1178 bool get isPadding => _styleType == paddingStyle;
1182 bool get isHeight => _styleType == heightStyle; 1179 bool get isHeight => _styleType == heightStyle;
1183 bool get isWidth => _styleType == widthStyle; 1180 bool get isWidth => _styleType == widthStyle;
1184 bool get isBoxExpression => isMargin || isBorder || isPadding; 1181 bool get isBoxExpression => isMargin || isBorder || isPadding;
1185 1182
1186 bool isSame(DartStyleExpression other) => this._styleType == other._styleType; 1183 bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
1187 1184
1188 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); 1185 visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
1189 } 1186 }
1190 1187
1191 class FontExpression extends DartStyleExpression { 1188 class FontExpression extends DartStyleExpression {
1192 final Font font; 1189 final Font font;
1193 1190
1194 // font-style font-variant font-weight font-size/line-height font-family 1191 // font-style font-variant font-weight font-size/line-height font-family
1195 // TODO(terry): Only px/pt for now need to handle all possible units to 1192 // TODO(terry): Only px/pt for now need to handle all possible units to
1196 // support calc expressions on units. 1193 // support calc expressions on units.
1197 FontExpression(Span span, {dynamic size, List<String> family, 1194 FontExpression(Span span, {dynamic size, List<String> family,
1198 int weight, String style, String variant, LineHeight lineHeight}) : 1195 int weight, String style, String variant, LineHeight lineHeight}) :
(...skipping 19 matching lines...) Expand all
1218 1215
1219 FontExpression._merge(FontExpression x, FontExpression y, Span span) 1216 FontExpression._merge(FontExpression x, FontExpression y, Span span)
1220 : super(DartStyleExpression.fontStyle, span), 1217 : super(DartStyleExpression.fontStyle, span),
1221 font = new Font.merge(x.font, y.font); 1218 font = new Font.merge(x.font, y.font);
1222 1219
1223 FontExpression clone() => 1220 FontExpression clone() =>
1224 new FontExpression(span, size: font.size, family: font.family, 1221 new FontExpression(span, size: font.size, family: font.family,
1225 weight: font.weight, style: font.style, variant: font.variant, 1222 weight: font.weight, style: font.style, variant: font.variant,
1226 lineHeight: font.lineHeight); 1223 lineHeight: font.lineHeight);
1227 1224
1228 void visit(VisitorBase visitor) => visitor.visitFontExpression(this); 1225 visit(VisitorBase visitor) => visitor.visitFontExpression(this);
1229 } 1226 }
1230 1227
1231 abstract class BoxExpression extends DartStyleExpression { 1228 abstract class BoxExpression extends DartStyleExpression {
1232 final BoxEdge box; 1229 final BoxEdge box;
1233 1230
1234 BoxExpression(int styleType, Span span, this.box) 1231 BoxExpression(int styleType, Span span, this.box)
1235 : super(styleType, span); 1232 : super(styleType, span);
1236 1233
1237 /* 1234 /*
1238 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, 1235 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
1239 * e.g., FontExpression, etc.) will merge if the two expressions are of the 1236 * e.g., FontExpression, etc.) will merge if the two expressions are of the
1240 * same property name (implies same exact type e.g, FontExpression). 1237 * same property name (implies same exact type e.g, FontExpression).
1241 */ 1238 */
1242 merged(BoxExpression newDartExpr); 1239 merged(BoxExpression newDartExpr);
1243 1240
1244 void visit(VisitorBase visitor) => visitor.visitBoxExpression(this); 1241 visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
1245 1242
1246 String get formattedBoxEdge { 1243 String get formattedBoxEdge {
1247 if (box.top == box.left && box.top == box.bottom && 1244 if (box.top == box.left && box.top == box.bottom &&
1248 box.top== box.right) { 1245 box.top== box.right) {
1249 return '.uniform(${box.top})'; 1246 return '.uniform(${box.top})';
1250 } else { 1247 } else {
1251 var left = box.left == null ? 0 : box.left; 1248 var left = box.left == null ? 0 : box.left;
1252 var top = box.top == null ? 0 : box.top; 1249 var top = box.top == null ? 0 : box.top;
1253 var right = box.right == null ? 0 : box.right; 1250 var right = box.right == null ? 0 : box.right;
1254 var bottom = box.bottom == null ? 0 : box.bottom; 1251 var bottom = box.bottom == null ? 0 : box.bottom;
(...skipping 27 matching lines...) Expand all
1282 return new MarginExpression._merge(x, y, y.span); 1279 return new MarginExpression._merge(x, y, y.span);
1283 } 1280 }
1284 1281
1285 MarginExpression._merge(MarginExpression x, MarginExpression y, Span span) 1282 MarginExpression._merge(MarginExpression x, MarginExpression y, Span span)
1286 : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); 1283 : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
1287 1284
1288 MarginExpression clone() => 1285 MarginExpression clone() =>
1289 new MarginExpression(span, top: box.top, right: box.right, 1286 new MarginExpression(span, top: box.top, right: box.right,
1290 bottom: box.bottom, left: box.left); 1287 bottom: box.bottom, left: box.left);
1291 1288
1292 void visit(VisitorBase visitor) => visitor.visitMarginExpression(this); 1289 visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
1293 } 1290 }
1294 1291
1295 class BorderExpression extends BoxExpression { 1292 class BorderExpression extends BoxExpression {
1296 /** Border expression ripped apart. */ 1293 /** Border expression ripped apart. */
1297 BorderExpression(Span span, {num top, num right, num bottom, num left}) 1294 BorderExpression(Span span, {num top, num right, num bottom, num left})
1298 : super(DartStyleExpression.borderStyle, span, 1295 : super(DartStyleExpression.borderStyle, span,
1299 new BoxEdge(left, top, right, bottom)); 1296 new BoxEdge(left, top, right, bottom));
1300 1297
1301 BorderExpression.boxEdge(Span span, BoxEdge box) 1298 BorderExpression.boxEdge(Span span, BoxEdge box)
1302 : super(DartStyleExpression.borderStyle, span, box); 1299 : super(DartStyleExpression.borderStyle, span, box);
(...skipping 15 matching lines...) Expand all
1318 1315
1319 BorderExpression._merge(BorderExpression x, BorderExpression y, 1316 BorderExpression._merge(BorderExpression x, BorderExpression y,
1320 Span span) 1317 Span span)
1321 : super(DartStyleExpression.borderStyle, span, 1318 : super(DartStyleExpression.borderStyle, span,
1322 new BoxEdge.merge(x.box, y.box)); 1319 new BoxEdge.merge(x.box, y.box));
1323 1320
1324 BorderExpression clone() => 1321 BorderExpression clone() =>
1325 new BorderExpression(span, top: box.top, right: box.right, 1322 new BorderExpression(span, top: box.top, right: box.right,
1326 bottom: box.bottom, left: box.left); 1323 bottom: box.bottom, left: box.left);
1327 1324
1328 void visit(VisitorBase visitor) => visitor.visitBorderExpression(this); 1325 visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
1329 } 1326 }
1330 1327
1331 class HeightExpression extends DartStyleExpression { 1328 class HeightExpression extends DartStyleExpression {
1332 final height; 1329 final height;
1333 1330
1334 HeightExpression(Span span, this.height) 1331 HeightExpression(Span span, this.height)
1335 : super(DartStyleExpression.heightStyle, span); 1332 : super(DartStyleExpression.heightStyle, span);
1336 1333
1337 merged(HeightExpression newHeightExpr) { 1334 merged(HeightExpression newHeightExpr) {
1338 if (this.isHeight && newHeightExpr.isHeight) { 1335 if (this.isHeight && newHeightExpr.isHeight) {
1339 return newHeightExpr; 1336 return newHeightExpr;
1340 } 1337 }
1341 1338
1342 return null; 1339 return null;
1343 } 1340 }
1344 1341
1345 HeightExpression clone() => new HeightExpression(span, height); 1342 HeightExpression clone() => new HeightExpression(span, height);
1346 void visit(VisitorBase visitor) => visitor.visitHeightExpression(this); 1343 visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
1347 } 1344 }
1348 1345
1349 class WidthExpression extends DartStyleExpression { 1346 class WidthExpression extends DartStyleExpression {
1350 final width; 1347 final width;
1351 1348
1352 WidthExpression(Span span, this.width) 1349 WidthExpression(Span span, this.width)
1353 : super(DartStyleExpression.widthStyle, span); 1350 : super(DartStyleExpression.widthStyle, span);
1354 1351
1355 merged(WidthExpression newWidthExpr) { 1352 merged(WidthExpression newWidthExpr) {
1356 if (this.isWidth && newWidthExpr.isWidth) { 1353 if (this.isWidth && newWidthExpr.isWidth) {
1357 return newWidthExpr; 1354 return newWidthExpr;
1358 } 1355 }
1359 1356
1360 return null; 1357 return null;
1361 } 1358 }
1362 1359
1363 WidthExpression clone() => new WidthExpression(span, width); 1360 WidthExpression clone() => new WidthExpression(span, width);
1364 void visit(VisitorBase visitor) => visitor.visitWidthExpression(this); 1361 visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
1365 } 1362 }
1366 1363
1367 class PaddingExpression extends BoxExpression { 1364 class PaddingExpression extends BoxExpression {
1368 /** Padding expression ripped apart. */ 1365 /** Padding expression ripped apart. */
1369 PaddingExpression(Span span, {num top, num right, num bottom, num left}) 1366 PaddingExpression(Span span, {num top, num right, num bottom, num left})
1370 : super(DartStyleExpression.paddingStyle, span, 1367 : super(DartStyleExpression.paddingStyle, span,
1371 new BoxEdge(left, top, right, bottom)); 1368 new BoxEdge(left, top, right, bottom));
1372 1369
1373 PaddingExpression.boxEdge(Span span, BoxEdge box) 1370 PaddingExpression.boxEdge(Span span, BoxEdge box)
1374 : super(DartStyleExpression.paddingStyle, span, box); 1371 : super(DartStyleExpression.paddingStyle, span, box);
(...skipping 13 matching lines...) Expand all
1388 return new PaddingExpression._merge(x, y, y.span); 1385 return new PaddingExpression._merge(x, y, y.span);
1389 } 1386 }
1390 1387
1391 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) 1388 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span)
1392 : super(DartStyleExpression.paddingStyle, span, 1389 : super(DartStyleExpression.paddingStyle, span,
1393 new BoxEdge.merge(x.box, y.box)); 1390 new BoxEdge.merge(x.box, y.box));
1394 1391
1395 PaddingExpression clone() => 1392 PaddingExpression clone() =>
1396 new PaddingExpression(span, top: box.top, right: box.right, 1393 new PaddingExpression(span, top: box.top, right: box.right,
1397 bottom: box.bottom, left: box.left); 1394 bottom: box.bottom, left: box.left);
1398 void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); 1395 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
1399 } 1396 }
OLDNEW
« no previous file with comments | « pkg/csslib/lib/src/tokenkind.dart ('k') | pkg/csslib/lib/visitor.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698