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

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

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

Powered by Google App Engine
This is Rietveld 408576698