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

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

Issue 60983003: pkg/csslib: fixed analysis error, more cleanup (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fixes Created 7 years, 1 month 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
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 void 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 visit(VisitorBase visitor) => visitor.visitWildcard(this); 26 void visit(VisitorBase visitor) => visitor.visitWildcard(this);
27
28 String get name => '*';
27 } 29 }
28 30
29 class ThisOperator extends TreeNode { 31 class ThisOperator extends TreeNode {
30 ThisOperator(Span span): super(span); 32 ThisOperator(Span span): super(span);
31 ThisOperator clone() => new ThisOperator(span); 33 ThisOperator clone() => new ThisOperator(span);
32 visit(VisitorBase visitor) => visitor.visitThisOperator(this); 34 void visit(VisitorBase visitor) => visitor.visitThisOperator(this);
35
36 String get name => '&';
33 } 37 }
34 38
35 class Negation extends TreeNode { 39 class Negation extends TreeNode {
36 Negation(Span span): super(span); 40 Negation(Span span): super(span);
37 Negation clone() => new Negation(span); 41 Negation clone() => new Negation(span);
38 visit(VisitorBase visitor) => visitor.visitNegation(this); 42 void visit(VisitorBase visitor) => visitor.visitNegation(this);
43
44 String get name => 'not';
39 } 45 }
40 46
41 // /* .... */ 47 // /* .... */
42 class CssComment extends TreeNode { 48 class CssComment extends TreeNode {
43 final String comment; 49 final String comment;
44 50
45 CssComment(this.comment, Span span): super(span); 51 CssComment(this.comment, Span span): super(span);
46 CssComment clone() => new CssComment(comment, span); 52 CssComment clone() => new CssComment(comment, span);
47 visit(VisitorBase visitor) => visitor.visitCssComment(this); 53 void visit(VisitorBase visitor) => visitor.visitCssComment(this);
48 } 54 }
49 55
50 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->). 56 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
51 class CommentDefinition extends CssComment { 57 class CommentDefinition extends CssComment {
52 CommentDefinition(String comment, Span span): super(comment, span); 58 CommentDefinition(String comment, Span span): super(comment, span);
53 CommentDefinition clone() => new CommentDefinition(comment, span); 59 CommentDefinition clone() => new CommentDefinition(comment, span);
54 visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); 60 void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
55 } 61 }
56 62
57 class SelectorGroup extends TreeNode { 63 class SelectorGroup extends TreeNode {
58 final List<Selector> selectors; 64 final List<Selector> selectors;
59 65
60 SelectorGroup(this.selectors, Span span): super(span); 66 SelectorGroup(this.selectors, Span span): super(span);
61 67
62 SelectorGroup clone() => new SelectorGroup(selectors, span); 68 SelectorGroup clone() => new SelectorGroup(selectors, span);
63 69
64 void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); 70 void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 String get _combinatorToString => 109 String get _combinatorToString =>
104 isCombinatorDescendant ? ' ' : 110 isCombinatorDescendant ? ' ' :
105 isCombinatorPlus ? ' + ' : 111 isCombinatorPlus ? ' + ' :
106 isCombinatorGreater ? ' > ' : 112 isCombinatorGreater ? ' > ' :
107 isCombinatorTilde ? ' ~ ' : ''; 113 isCombinatorTilde ? ' ~ ' : '';
108 114
109 SimpleSelectorSequence clone() => 115 SimpleSelectorSequence clone() =>
110 new SimpleSelectorSequence(simpleSelector, span, combinator); 116 new SimpleSelectorSequence(simpleSelector, span, combinator);
111 117
112 void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); 118 void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
119
120 String toString() => simpleSelector.name;
113 } 121 }
114 122
115 /* All other selectors (element, #id, .class, attribute, pseudo, negation, 123 /* All other selectors (element, #id, .class, attribute, pseudo, negation,
116 * namespace, *) are derived from this selector. 124 * namespace, *) are derived from this selector.
117 */ 125 */
118 class SimpleSelector extends TreeNode { 126 abstract class SimpleSelector extends TreeNode {
119 final _name; // Wildcard, ThisOperator, Identifier, others? 127 final _name; // Wildcard, ThisOperator, Identifier, Negation, others?
120 128
121 SimpleSelector(this._name, Span span) : super(span); 129 SimpleSelector(this._name, Span span) : super(span);
122 130
123 // Name can be an Identifier or WildCard we'll return either the name or '*'. 131 String get name => _name.name;
124 String get name => isWildcard ? '*' : isThis ? '&' : _name.name;
125 132
126 bool get isWildcard => _name is Wildcard; 133 bool get isWildcard => _name is Wildcard;
127 134
128 bool get isThis => _name is ThisOperator; 135 bool get isThis => _name is ThisOperator;
129 136
130 SimpleSelector clone() => new SimpleSelector(_name, span);
131
132 void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); 137 void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
133 } 138 }
134 139
135 // element name 140 // element name
136 class ElementSelector extends SimpleSelector { 141 class ElementSelector extends SimpleSelector {
137 ElementSelector(name, Span span) : super(name, span); 142 ElementSelector(name, Span span) : super(name, span);
138 visit(VisitorBase visitor) => visitor.visitElementSelector(this); 143 void visit(VisitorBase visitor) => visitor.visitElementSelector(this);
144
145 ElementSelector clone() => new ElementSelector(_name, span);
139 146
140 String toString() => name; 147 String toString() => name;
141 } 148 }
142 149
143 // namespace|element 150 // namespace|element
144 class NamespaceSelector extends SimpleSelector { 151 class NamespaceSelector extends SimpleSelector {
145 final _namespace; // null, Wildcard or Identifier 152 final _namespace; // null, Wildcard or Identifier
146 153
147 NamespaceSelector(this._namespace, var name, Span span) : super(name, span); 154 NamespaceSelector(this._namespace, var name, Span span) : super(name, span);
148 155
149 String get namespace => 156 String get namespace =>
150 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; 157 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name;
151 158
152 bool get isNamespaceWildcard => _namespace is Wildcard; 159 bool get isNamespaceWildcard => _namespace is Wildcard;
153 160
154 SimpleSelector get nameAsSimpleSelector => _name; 161 SimpleSelector get nameAsSimpleSelector => _name;
155 162
156 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); 163 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
157 164
158 visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); 165 void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
159 166
160 String toString() => "$namespace|${nameAsSimpleSelector.name}"; 167 String toString() => "$namespace|${nameAsSimpleSelector.name}";
161 } 168 }
162 169
163 // [attr op value] 170 // [attr op value]
164 class AttributeSelector extends SimpleSelector { 171 class AttributeSelector extends SimpleSelector {
165 final int _op; 172 final int _op;
166 final _value; 173 final _value;
167 174
168 AttributeSelector(Identifier name, this._op, this._value, 175 AttributeSelector(Identifier name, this._op, this._value,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } else { 219 } else {
213 return '"${_value}"'; 220 return '"${_value}"';
214 } 221 }
215 } else { 222 } else {
216 return ''; 223 return '';
217 } 224 }
218 } 225 }
219 226
220 AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); 227 AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
221 228
222 visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); 229 void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
223 230
224 String toString() => "[$name${matchOperator()}${valueToString()}]"; 231 String toString() => "[$name${matchOperator()}${valueToString()}]";
225 } 232 }
226 233
227 // #id 234 // #id
228 class IdSelector extends SimpleSelector { 235 class IdSelector extends SimpleSelector {
229 IdSelector(Identifier name, Span span) : super(name, span); 236 IdSelector(Identifier name, Span span) : super(name, span);
230 IdSelector clone() => new IdSelector(_name, span); 237 IdSelector clone() => new IdSelector(_name, span);
231 visit(VisitorBase visitor) => visitor.visitIdSelector(this); 238 void visit(VisitorBase visitor) => visitor.visitIdSelector(this);
232 239
233 String toString() => "#$_name"; 240 String toString() => "#$_name";
234 } 241 }
235 242
236 // .class 243 // .class
237 class ClassSelector extends SimpleSelector { 244 class ClassSelector extends SimpleSelector {
238 ClassSelector(Identifier name, Span span) : super(name, span); 245 ClassSelector(Identifier name, Span span) : super(name, span);
239 ClassSelector clone() => new ClassSelector(_name, span); 246 ClassSelector clone() => new ClassSelector(_name, span);
240 visit(VisitorBase visitor) => visitor.visitClassSelector(this); 247 void visit(VisitorBase visitor) => visitor.visitClassSelector(this);
241 248
242 String toString() => ".$_name"; 249 String toString() => ".$_name";
243 } 250 }
244 251
245 // :pseudoClass 252 // :pseudoClass
246 class PseudoClassSelector extends SimpleSelector { 253 class PseudoClassSelector extends SimpleSelector {
247 PseudoClassSelector(Identifier name, Span span) : super(name, span); 254 PseudoClassSelector(Identifier name, Span span) : super(name, span);
248 visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); 255 void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
256
257 PseudoClassSelector clone() => new PseudoClassSelector(_name, span);
249 258
250 String toString() => ":$name"; 259 String toString() => ":$name";
251 } 260 }
252 261
253 // ::pseudoElement 262 // ::pseudoElement
254 class PseudoElementSelector extends SimpleSelector { 263 class PseudoElementSelector extends SimpleSelector {
255 PseudoElementSelector(Identifier name, Span span) : super(name, span); 264 PseudoElementSelector(Identifier name, Span span) : super(name, span);
256 visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); 265 void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
266
267 PseudoElementSelector clone() => new PseudoElementSelector(_name, span);
257 268
258 String toString() => "::$name"; 269 String toString() => "::$name";
259 } 270 }
260 271
261 // :pseudoClassFunction(expression) 272 // :pseudoClassFunction(expression)
262 class PseudoClassFunctionSelector extends PseudoClassSelector { 273 class PseudoClassFunctionSelector extends PseudoClassSelector {
263 SelectorExpression expression; 274 final SelectorExpression expression;
264 275
265 PseudoClassFunctionSelector(Identifier name, this.expression, Span span) 276 PseudoClassFunctionSelector(Identifier name, this.expression, Span span)
266 : super(name, span); 277 : super(name, span);
278
267 PseudoClassFunctionSelector clone() => 279 PseudoClassFunctionSelector clone() =>
268 new PseudoClassFunctionSelector(_name, expression, span); 280 new PseudoClassFunctionSelector(_name, expression, span);
269 visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); 281
282 void visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(th is);
270 } 283 }
271 284
272 // ::pseudoElementFunction(expression) 285 // ::pseudoElementFunction(expression)
273 class PseudoElementFunctionSelector extends PseudoElementSelector { 286 class PseudoElementFunctionSelector extends PseudoElementSelector {
274 SelectorExpression expression; 287 final SelectorExpression expression;
275 288
276 PseudoElementFunctionSelector(Identifier name, this.expression, Span span) 289 PseudoElementFunctionSelector(Identifier name, this.expression, Span span)
277 : super(name, span); 290 : super(name, span);
291
278 PseudoElementFunctionSelector clone() => 292 PseudoElementFunctionSelector clone() =>
279 new PseudoElementFunctionSelector(_name, expression, span); 293 new PseudoElementFunctionSelector(_name, expression, span);
280 visit(VisitorBase visitor) => 294
295 void visit(VisitorBase visitor) =>
281 visitor.visitPseudoElementFunctionSelector(this); 296 visitor.visitPseudoElementFunctionSelector(this);
282 } 297 }
283 298
284 class SelectorExpression extends TreeNode { 299 class SelectorExpression extends TreeNode {
285 final List<Expression> _expressions = []; 300 final List<Expression> expressions = [];
286 301
287 SelectorExpression(Span span): super(span); 302 SelectorExpression(Span span): super(span);
288 303
289 add(Expression expression) { 304 void add(Expression expression) {
290 _expressions.add(expression); 305 expressions.add(expression);
291 } 306 }
292 307
293 List<Expression> get expressions => _expressions;
294
295 SelectorExpression clone() { 308 SelectorExpression clone() {
296 var selectorExpr = new SelectorExpression(span); 309 var selectorExpr = new SelectorExpression(span);
297 for (var expr in _expressions) { 310 for (var expr in expressions) {
298 selectorExpr.add(expr.clone()); 311 selectorExpr.add(expr.clone());
299 } 312 }
300 return selectorExpr; 313 return selectorExpr;
301 } 314 }
302 315
303 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); 316 void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
304 } 317 }
305 318
306 // :NOT(negation_arg) 319 // :NOT(negation_arg)
307 class NegationSelector extends SimpleSelector { 320 class NegationSelector extends SimpleSelector {
308 SimpleSelector negationArg; 321 final SimpleSelector negationArg;
309 322
310 NegationSelector(this.negationArg, Span span) 323 NegationSelector(this.negationArg, Span span)
311 : super(new Negation(span), span); 324 : super(new Negation(span), span);
312 325
313 NegationSelector clone() => new NegationSelector(negationArg, span); 326 NegationSelector clone() => new NegationSelector(negationArg, span);
314 327
315 void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); 328 void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
316 } 329 }
317 330
318 class NoOp extends TreeNode { 331 class NoOp extends TreeNode {
319 NoOp() : super(null); 332 NoOp() : super(null);
320 333
321 NoOp clone() => new NoOp(); 334 NoOp clone() => new NoOp();
322 335
323 visit(VisitorBase visitor) => visitor.visitNoOp(this); 336 void visit(VisitorBase visitor) => visitor.visitNoOp(this);
324 } 337 }
325 338
326 class StyleSheet extends TreeNode { 339 class StyleSheet extends TreeNode {
327 /** 340 /**
328 * Contains charset, ruleset, directives (media, page, etc.), and selectors. 341 * Contains charset, ruleset, directives (media, page, etc.), and selectors.
329 */ 342 */
330 final List<TreeNode> topLevels; 343 final List<TreeNode> topLevels;
331 344
332 StyleSheet(this.topLevels, Span span) : super(span) { 345 StyleSheet(this.topLevels, Span span) : super(span) {
333 for (final node in topLevels) { 346 for (final node in topLevels) {
334 assert(node is TopLevelProduction || node is Directive); 347 assert(node is TopLevelProduction || node is Directive);
335 } 348 }
336 } 349 }
337 350
338 /** Selectors only in this tree. */ 351 /** Selectors only in this tree. */
339 StyleSheet.selector(this.topLevels, Span span) : super(span); 352 StyleSheet.selector(this.topLevels, Span span) : super(span);
340 353
341 StyleSheet clone() { 354 StyleSheet clone() {
342 var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); 355 var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
343 return new StyleSheet(clonedTopLevels, span); 356 return new StyleSheet(clonedTopLevels, span);
344 } 357 }
345 358
346 void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); 359 void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
347 } 360 }
348 361
349 class TopLevelProduction extends TreeNode { 362 class TopLevelProduction extends TreeNode {
350 TopLevelProduction(Span span) : super(span); 363 TopLevelProduction(Span span) : super(span);
351 TopLevelProduction clone() => new TopLevelProduction(span); 364 TopLevelProduction clone() => new TopLevelProduction(span);
352 visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); 365 void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
353 } 366 }
354 367
355 class RuleSet extends TopLevelProduction { 368 class RuleSet extends TopLevelProduction {
356 final SelectorGroup _selectorGroup; 369 final SelectorGroup _selectorGroup;
357 final DeclarationGroup _declarationGroup; 370 final DeclarationGroup _declarationGroup;
358 371
359 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span); 372 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span);
360 373
361 SelectorGroup get selectorGroup => _selectorGroup; 374 SelectorGroup get selectorGroup => _selectorGroup;
362 DeclarationGroup get declarationGroup => _declarationGroup; 375 DeclarationGroup get declarationGroup => _declarationGroup;
363 376
364 RuleSet clone() { 377 RuleSet clone() {
365 var cloneSelectorGroup = _selectorGroup.clone(); 378 var cloneSelectorGroup = _selectorGroup.clone();
366 var cloneDeclarationGroup = _declarationGroup.clone(); 379 var cloneDeclarationGroup = _declarationGroup.clone();
367 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); 380 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
368 } 381 }
369 382
370 visit(VisitorBase visitor) => visitor.visitRuleSet(this); 383 void visit(VisitorBase visitor) => visitor.visitRuleSet(this);
371 } 384 }
372 385
373 class Directive extends TreeNode { 386 class Directive extends TreeNode {
374 Directive(Span span) : super(span); 387 Directive(Span span) : super(span);
375 388
376 bool get isBuiltIn => true; // Known CSS directive? 389 bool get isBuiltIn => true; // Known CSS directive?
377 bool get isExtension => false; // SCSS extension? 390 bool get isExtension => false; // SCSS extension?
378 391
379 Directive clone() => new Directive(span); 392 Directive clone() => new Directive(span);
380 void visit(VisitorBase visitor) => visitor.visitDirective(this); 393 void visit(VisitorBase visitor) => visitor.visitDirective(this);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 String get unary => 462 String get unary =>
450 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); 463 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
451 464
452 MediaQuery clone() { 465 MediaQuery clone() {
453 var cloneExpressions = []; 466 var cloneExpressions = [];
454 for (var expr in expressions) { 467 for (var expr in expressions) {
455 cloneExpressions.add(expr.clone()); 468 cloneExpressions.add(expr.clone());
456 } 469 }
457 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); 470 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
458 } 471 }
459 visit(VisitorBase visitor) => visitor.visitMediaQuery(this); 472 void visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
460 } 473 }
461 474
462 class MediaDirective extends Directive { 475 class MediaDirective extends Directive {
463 final List<MediaQuery> mediaQueries; 476 final List<MediaQuery> mediaQueries;
464 final List<RuleSet> rulesets; 477 final List<RuleSet> rulesets;
465 478
466 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); 479 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
467 480
468 MediaDirective clone() { 481 MediaDirective clone() {
469 var cloneQueries = []; 482 var cloneQueries = [];
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 final DeclarationGroup _declarations; 591 final DeclarationGroup _declarations;
579 592
580 FontFaceDirective(this._declarations, Span span) : super(span); 593 FontFaceDirective(this._declarations, Span span) : super(span);
581 594
582 FontFaceDirective clone() => 595 FontFaceDirective clone() =>
583 new FontFaceDirective(_declarations.clone(), span); 596 new FontFaceDirective(_declarations.clone(), span);
584 void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); 597 void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
585 } 598 }
586 599
587 class StyletDirective extends Directive { 600 class StyletDirective extends Directive {
588 final String _dartClassName; 601 final String dartClassName;
589 final List<RuleSet> _rulesets; 602 final List<RuleSet> rulesets;
590 603
591 StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span); 604 StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span);
592 605
593 bool get isBuiltIn => false; 606 bool get isBuiltIn => false;
594 bool get isExtension => true; 607 bool get isExtension => true;
595 608
596 String get dartClassName => _dartClassName;
597 List<RuleSet> get rulesets => _rulesets;
598
599 StyletDirective clone() { 609 StyletDirective clone() {
600 var cloneRulesets = []; 610 var cloneRulesets = [];
601 for (var ruleset in _rulesets) { 611 for (var ruleset in rulesets) {
602 cloneRulesets.add(ruleset.clone()); 612 cloneRulesets.add(ruleset.clone());
603 } 613 }
604 return new StyletDirective(_dartClassName, cloneRulesets, span); 614 return new StyletDirective(dartClassName, cloneRulesets, span);
605 } 615 }
616
606 void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); 617 void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
607 } 618 }
608 619
609 class NamespaceDirective extends Directive { 620 class NamespaceDirective extends Directive {
610 /** Namespace prefix. */ 621 /** Namespace prefix. */
611 final String _prefix; 622 final String _prefix;
612 623
613 /** URI associated with this namespace. */ 624 /** URI associated with this namespace. */
614 final String _uri; 625 final String _uri;
615 626
616 NamespaceDirective(this._prefix, this._uri, Span span) : super(span); 627 NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
617 628
618 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); 629 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
630
619 void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); 631 void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
620 632
621 String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; 633 String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
622 } 634 }
623 635
624 /** To support Less syntax @name: expression */ 636 /** To support Less syntax @name: expression */
625 class VarDefinitionDirective extends Directive { 637 class VarDefinitionDirective extends Directive {
626 final VarDefinition def; 638 final VarDefinition def;
627 639
628 VarDefinitionDirective(this.def, Span span) : super(span); 640 VarDefinitionDirective(this.def, Span span) : super(span);
629 641
630 VarDefinitionDirective clone() => 642 VarDefinitionDirective clone() =>
631 new VarDefinitionDirective(def.clone(), span); 643 new VarDefinitionDirective(def.clone(), span);
644
632 void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); 645 void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
633 } 646 }
634 647
635 class MixinDefinition extends Directive { 648 class MixinDefinition extends Directive {
636 final String name; 649 final String name;
637 final List definedArgs; 650 final List definedArgs;
638 final bool varArgs; 651 final bool varArgs;
639 652
640 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span) 653 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span)
641 : super(span); 654 : super(span);
642 655
643 MixinDefinition clone() { 656 MixinDefinition clone() {
644 var cloneDefinedArgs = []; 657 var cloneDefinedArgs = [];
645 for (var definedArg in definedArgs) { 658 for (var definedArg in definedArgs) {
646 cloneDefinedArgs.add(definedArg.clone()); 659 cloneDefinedArgs.add(definedArg.clone());
647 } 660 }
648 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); 661 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
649 } 662 }
663
650 void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); 664 void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
651 } 665 }
652 666
653 /** Support a Sass @mixin. See http://sass-lang.com for description. */ 667 /** Support a Sass @mixin. See http://sass-lang.com for description. */
654 class MixinRulesetDirective extends MixinDefinition { 668 class MixinRulesetDirective extends MixinDefinition {
655 final List<RuleSet> rulesets; 669 final List<RuleSet> rulesets;
656 670
657 MixinRulesetDirective(String name, List<VarDefinitionDirective> args, 671 MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
658 bool varArgs, this.rulesets, Span span) : 672 bool varArgs, this.rulesets, Span span) :
659 super(name, args, varArgs, span); 673 super(name, args, varArgs, span);
660 674
661 MixinRulesetDirective clone() { 675 MixinRulesetDirective clone() {
662 var clonedArgs = []; 676 var clonedArgs = [];
663 for (var arg in definedArgs) { 677 for (var arg in definedArgs) {
664 clonedArgs.add(arg.clone()); 678 clonedArgs.add(arg.clone());
665 } 679 }
666 var clonedRulesets = []; 680 var clonedRulesets = [];
667 for (var ruleset in rulesets) { 681 for (var ruleset in rulesets) {
668 clonedRulesets.add(ruleset.clone()); 682 clonedRulesets.add(ruleset.clone());
669 } 683 }
670 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, 684 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
671 span); 685 span);
672 } 686 }
687
673 void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); 688 void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
674 } 689 }
675 690
676 class MixinDeclarationDirective extends MixinDefinition { 691 class MixinDeclarationDirective extends MixinDefinition {
677 final DeclarationGroup declarations; 692 final DeclarationGroup declarations;
678 693
679 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args, 694 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
680 bool varArgs, this.declarations, Span span) : 695 bool varArgs, this.declarations, Span span) :
681 super(name, args, varArgs, span); 696 super(name, args, varArgs, span);
697
682 MixinDeclarationDirective clone() { 698 MixinDeclarationDirective clone() {
683 var clonedArgs = []; 699 var clonedArgs = [];
684 for (var arg in definedArgs) { 700 for (var arg in definedArgs) {
685 clonedArgs.add(arg.clone()); 701 clonedArgs.add(arg.clone());
686 } 702 }
687 return new MixinDeclarationDirective(name, clonedArgs, varArgs, 703 return new MixinDeclarationDirective(name, clonedArgs, varArgs,
688 declarations.clone(), span); 704 declarations.clone(), span);
689 } 705 }
706
690 void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this ); 707 void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this );
691 } 708 }
692 709
693 /** To support consuming a SASS mixin @include. */ 710 /** To support consuming a SASS mixin @include. */
694 class IncludeDirective extends Directive { 711 class IncludeDirective extends Directive {
695 final String name; 712 final String name;
696 final List<List<TreeNode>> args; 713 final List<List<TreeNode>> args;
697 714
698 IncludeDirective(this.name, this.args, Span span) : super(span); 715 IncludeDirective(this.name, this.args, Span span) : super(span);
699 716
(...skipping 14 matching lines...) Expand all
714 class ContentDirective extends Directive { 731 class ContentDirective extends Directive {
715 ContentDirective(Span span) : super(span); 732 ContentDirective(Span span) : super(span);
716 733
717 void visit(VisitorBase visitor) => visitor.visitContentDirective(this); 734 void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
718 } 735 }
719 736
720 class Declaration extends TreeNode { 737 class Declaration extends TreeNode {
721 final Identifier _property; 738 final Identifier _property;
722 final Expression _expression; 739 final Expression _expression;
723 /** Style exposed to Dart. */ 740 /** Style exposed to Dart. */
724 dynamic _dart; 741 dynamic dartStyle;
725 final bool important; 742 final bool important;
726 743
727 /** 744 /**
728 * IE CSS hacks that can only be read by a particular IE version. 745 * IE CSS hacks that can only be read by a particular IE version.
729 * 7 implies IE 7 or older property (e.g., *background: blue;) 746 * 7 implies IE 7 or older property (e.g., *background: blue;)
730 * Note: IE 8 or older property (e.g., background: green\9;) is handled 747 * Note: IE 8 or older property (e.g., background: green\9;) is handled
731 * by IE8Term in declaration expression handling. 748 * by IE8Term in declaration expression handling.
732 * Note: IE 6 only property with a leading underscore is a valid IDENT 749 * Note: IE 6 only property with a leading underscore is a valid IDENT
733 * since an ident can start with underscore (e.g., _background: red;) 750 * since an ident can start with underscore (e.g., _background: red;)
734 */ 751 */
735 final bool isIE7; 752 final bool isIE7;
736 753
737 Declaration(this._property, this._expression, this._dart, Span span, 754 Declaration(this._property, this._expression, this.dartStyle, Span span,
738 {important: false, ie7: false}) 755 {important: false, ie7: false})
739 : this.important = important, this.isIE7 = ie7, super(span); 756 : this.important = important, this.isIE7 = ie7, super(span);
740 757
741 String get property => isIE7 ? '*${_property.name}' : _property.name; 758 String get property => isIE7 ? '*${_property.name}' : _property.name;
742 Expression get expression => _expression; 759 Expression get expression => _expression;
743 760
744 bool get hasDartStyle => _dart != null; 761 bool get hasDartStyle => dartStyle != null;
745 get dartStyle => _dart;
746 set dartStyle(dStyle) {
747 _dart = dStyle;
748 }
749 762
750 Declaration clone() => 763 Declaration clone() =>
751 new Declaration(_property.clone(), _expression.clone(), _dart, span, 764 new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
752 important: important); 765 important: important);
753 766
754 void visit(VisitorBase visitor) => visitor.visitDeclaration(this); 767 void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
755 } 768 }
756 769
757 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and 770 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
758 // dynamic when in a declaration. Currently, Less syntax 771 // dynamic when in a declaration. Currently, Less syntax
759 // '@foo: expression' and 'var-foo: expression' in a declaration 772 // '@foo: expression' and 'var-foo: expression' in a declaration
760 // are statically resolved. Better solution, if @foo or var-foo 773 // are statically resolved. Better solution, if @foo or var-foo
761 // are top-level are then statically resolved and var-foo in a 774 // are top-level are then statically resolved and var-foo in a
762 // declaration group (surrounded by a selector) would be dynamic. 775 // declaration group (surrounded by a selector) would be dynamic.
763 class VarDefinition extends Declaration { 776 class VarDefinition extends Declaration {
764 bool badUsage = false; 777 bool badUsage = false;
765 778
766 VarDefinition(Identifier definedName, Expression expr, Span span) 779 VarDefinition(Identifier definedName, Expression expr, Span span)
767 : super(definedName, expr, null, span); 780 : super(definedName, expr, null, span);
768 781
769 String get definedName => _property.name; 782 String get definedName => _property.name;
770 783
771 set dartStyle(dStyle) { }
772
773 VarDefinition clone() => 784 VarDefinition clone() =>
774 new VarDefinition(_property.clone(), 785 new VarDefinition(_property.clone(),
775 expression != null ? expression.clone() : null, span); 786 expression != null ? expression.clone() : null, span);
787
776 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); 788 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
777 } 789 }
778 790
779 /** 791 /**
780 * Node for usage of @include mixin[(args,...)] found in a declaration group 792 * Node for usage of @include mixin[(args,...)] found in a declaration group
781 * instead of at a ruleset (toplevel) e.g., 793 * instead of at a ruleset (toplevel) e.g.,
782 * div { 794 * div {
783 * @include mixin1; 795 * @include mixin1;
784 * } 796 * }
785 */ 797 */
(...skipping 10 matching lines...) Expand all
796 visitor.visitIncludeMixinAtDeclaration(this); 808 visitor.visitIncludeMixinAtDeclaration(this);
797 } 809 }
798 810
799 class ExtendDeclaration extends Declaration { 811 class ExtendDeclaration extends Declaration {
800 List<SimpleSelectorSequence> selectors; 812 List<SimpleSelectorSequence> selectors;
801 813
802 ExtendDeclaration(this.selectors, Span span) : 814 ExtendDeclaration(this.selectors, Span span) :
803 super(null, null, null, span); 815 super(null, null, null, span);
804 816
805 ExtendDeclaration clone() { 817 ExtendDeclaration clone() {
806 List<SimpleSelectorSequence> newSelector = []; 818 var newSelector = selectors.map((s) => s.clone()).toList();
807 for (var selectorSeq in selectors) {
808 newSelector.add(selectorSeq.clone());
809 }
810 return new ExtendDeclaration(newSelector, span); 819 return new ExtendDeclaration(newSelector, span);
811 } 820 }
812 821
813 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); 822 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
814 } 823 }
815 824
816 class DeclarationGroup extends TreeNode { 825 class DeclarationGroup extends TreeNode {
817 /** Can be either Declaration or RuleSet (if nested selector). */ 826 /** Can be either Declaration or RuleSet (if nested selector). */
818 final List _declarations; 827 final List declarations;
819 828
820 DeclarationGroup(this._declarations, Span span) : super(span); 829 DeclarationGroup(this.declarations, Span span) : super(span);
821
822 List get declarations => _declarations;
823 830
824 DeclarationGroup clone() { 831 DeclarationGroup clone() {
825 var clonedDecls = []; 832 var clonedDecls = declarations.map((d) => d.clone()).toList();
826 for (var decl in _declarations) {
827 clonedDecls.add(decl.clone());
828 }
829 return new DeclarationGroup(clonedDecls, span); 833 return new DeclarationGroup(clonedDecls, span);
830 } 834 }
831 835
832 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); 836 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
833 } 837 }
834 838
835 class MarginGroup extends DeclarationGroup { 839 class MarginGroup extends DeclarationGroup {
836 final int margin_sym; // TokenType for for @margin sym. 840 final int margin_sym; // TokenType for for @margin sym.
837 841
838 MarginGroup(this.margin_sym, List<Declaration> decls, Span span) 842 MarginGroup(this.margin_sym, List<Declaration> decls, Span span)
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); 914 void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
911 } 915 }
912 916
913 class NumberTerm extends LiteralTerm { 917 class NumberTerm extends LiteralTerm {
914 NumberTerm(value, String t, Span span) : super(value, t, span); 918 NumberTerm(value, String t, Span span) : super(value, t, span);
915 NumberTerm clone() => new NumberTerm(value, text, span); 919 NumberTerm clone() => new NumberTerm(value, text, span);
916 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); 920 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
917 } 921 }
918 922
919 class UnitTerm extends LiteralTerm { 923 class UnitTerm extends LiteralTerm {
920 final int _unit; 924 final int unit;
921 925
922 UnitTerm(value, String t, Span span, this._unit) : super(value, t, span); 926 UnitTerm(value, String t, Span span, this.unit) : super(value, t, span);
923 927
924 int get unit => _unit; 928 UnitTerm clone() => new UnitTerm(value, text, span, unit);
925
926 UnitTerm clone() => new UnitTerm(value, text, span, _unit);
927 929
928 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); 930 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
929 931
930 String unitToString() => TokenKind.unitToString(_unit); 932 String unitToString() => TokenKind.unitToString(unit);
931 933
932 String toString() => '$text${unitToString()}'; 934 String toString() => '$text${unitToString()}';
933 } 935 }
934 936
935 class LengthTerm extends UnitTerm { 937 class LengthTerm extends UnitTerm {
936 LengthTerm(value, String t, Span span, 938 LengthTerm(value, String t, Span span,
937 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 939 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
938 assert(this._unit == TokenKind.UNIT_LENGTH_PX || 940 assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
939 this._unit == TokenKind.UNIT_LENGTH_CM || 941 this.unit == TokenKind.UNIT_LENGTH_CM ||
940 this._unit == TokenKind.UNIT_LENGTH_MM || 942 this.unit == TokenKind.UNIT_LENGTH_MM ||
941 this._unit == TokenKind.UNIT_LENGTH_IN || 943 this.unit == TokenKind.UNIT_LENGTH_IN ||
942 this._unit == TokenKind.UNIT_LENGTH_PT || 944 this.unit == TokenKind.UNIT_LENGTH_PT ||
943 this._unit == TokenKind.UNIT_LENGTH_PC); 945 this.unit == TokenKind.UNIT_LENGTH_PC);
944 } 946 }
945 LengthTerm clone() => new LengthTerm(value, text, span, _unit); 947 LengthTerm clone() => new LengthTerm(value, text, span, unit);
946 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); 948 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
947 } 949 }
948 950
949 class PercentageTerm extends LiteralTerm { 951 class PercentageTerm extends LiteralTerm {
950 PercentageTerm(value, String t, Span span) : super(value, t, span); 952 PercentageTerm(value, String t, Span span) : super(value, t, span);
951 PercentageTerm clone() => new PercentageTerm(value, text, span); 953 PercentageTerm clone() => new PercentageTerm(value, text, span);
952 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); 954 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
953 } 955 }
954 956
955 class EmTerm extends LiteralTerm { 957 class EmTerm extends LiteralTerm {
956 EmTerm(value, String t, Span span) : super(value, t, span); 958 EmTerm(value, String t, Span span) : super(value, t, span);
957 EmTerm clone() => new EmTerm(value, text, span); 959 EmTerm clone() => new EmTerm(value, text, span);
958 void visit(VisitorBase visitor) => visitor.visitEmTerm(this); 960 void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
959 } 961 }
960 962
961 class ExTerm extends LiteralTerm { 963 class ExTerm extends LiteralTerm {
962 ExTerm(value, String t, Span span) : super(value, t, span); 964 ExTerm(value, String t, Span span) : super(value, t, span);
963 ExTerm clone() => new ExTerm(value, text, span); 965 ExTerm clone() => new ExTerm(value, text, span);
964 void visit(VisitorBase visitor) => visitor.visitExTerm(this); 966 void visit(VisitorBase visitor) => visitor.visitExTerm(this);
965 } 967 }
966 968
967 class AngleTerm extends UnitTerm { 969 class AngleTerm extends UnitTerm {
968 AngleTerm(var value, String t, Span span, 970 AngleTerm(var value, String t, Span span,
969 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 971 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
970 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 972 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
971 this._unit == TokenKind.UNIT_ANGLE_RAD || 973 this.unit == TokenKind.UNIT_ANGLE_RAD ||
972 this._unit == TokenKind.UNIT_ANGLE_GRAD || 974 this.unit == TokenKind.UNIT_ANGLE_GRAD ||
973 this._unit == TokenKind.UNIT_ANGLE_TURN); 975 this.unit == TokenKind.UNIT_ANGLE_TURN);
974 } 976 }
975 977
976 AngleTerm clone() => new AngleTerm(value, text, span, unit); 978 AngleTerm clone() => new AngleTerm(value, text, span, unit);
977 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); 979 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
978 } 980 }
979 981
980 class TimeTerm extends UnitTerm { 982 class TimeTerm extends UnitTerm {
981 TimeTerm(var value, String t, Span span, 983 TimeTerm(var value, String t, Span span,
982 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 984 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
983 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 985 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
984 this._unit == TokenKind.UNIT_TIME_MS || 986 this.unit == TokenKind.UNIT_TIME_MS ||
985 this._unit == TokenKind.UNIT_TIME_S); 987 this.unit == TokenKind.UNIT_TIME_S);
986 } 988 }
987 989
988 TimeTerm clone() => new TimeTerm(value, text, span, unit); 990 TimeTerm clone() => new TimeTerm(value, text, span, unit);
989 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); 991 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
990 } 992 }
991 993
992 class FreqTerm extends UnitTerm { 994 class FreqTerm extends UnitTerm {
993 FreqTerm(var value, String t, Span span, 995 FreqTerm(var value, String t, Span span,
994 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 996 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
995 assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); 997 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
996 } 998 }
997 999
998 FreqTerm clone() => new FreqTerm(value, text, span, unit); 1000 FreqTerm clone() => new FreqTerm(value, text, span, unit);
999 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); 1001 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
1000 } 1002 }
1001 1003
1002 class FractionTerm extends LiteralTerm { 1004 class FractionTerm extends LiteralTerm {
1003 FractionTerm(var value, String t, Span span) : super(value, t, span); 1005 FractionTerm(var value, String t, Span span) : super(value, t, span);
1004 1006
1005 FractionTerm clone() => new FractionTerm(value, text, span); 1007 FractionTerm clone() => new FractionTerm(value, text, span);
1006 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); 1008 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
1007 } 1009 }
1008 1010
1009 class UriTerm extends LiteralTerm { 1011 class UriTerm extends LiteralTerm {
1010 UriTerm(String value, Span span) : super(value, value, span); 1012 UriTerm(String value, Span span) : super(value, value, span);
1011 1013
1012 UriTerm clone() => new UriTerm(value, span); 1014 UriTerm clone() => new UriTerm(value, span);
1013 void visit(VisitorBase visitor) => visitor.visitUriTerm(this); 1015 void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
1014 } 1016 }
1015 1017
1016 class ResolutionTerm extends UnitTerm { 1018 class ResolutionTerm extends UnitTerm {
1017 ResolutionTerm(var value, String t, Span span, 1019 ResolutionTerm(var value, String t, Span span,
1018 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1020 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1019 assert(_unit == TokenKind.UNIT_RESOLUTION_DPI || 1021 assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
1020 _unit == TokenKind.UNIT_RESOLUTION_DPCM || 1022 unit == TokenKind.UNIT_RESOLUTION_DPCM ||
1021 _unit == TokenKind.UNIT_RESOLUTION_DPPX); 1023 unit == TokenKind.UNIT_RESOLUTION_DPPX);
1022 } 1024 }
1023 1025
1024 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); 1026 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
1025 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); 1027 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
1026 } 1028 }
1027 1029
1028 class ChTerm extends UnitTerm { 1030 class ChTerm extends UnitTerm {
1029 ChTerm(var value, String t, Span span, 1031 ChTerm(var value, String t, Span span,
1030 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1032 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1031 assert(_unit == TokenKind.UNIT_CH); 1033 assert(unit == TokenKind.UNIT_CH);
1032 } 1034 }
1033 1035
1034 ChTerm clone() => new ChTerm(value, text, span, unit); 1036 ChTerm clone() => new ChTerm(value, text, span, unit);
1035 void visit(VisitorBase visitor) => visitor.visitChTerm(this); 1037 void visit(VisitorBase visitor) => visitor.visitChTerm(this);
1036 } 1038 }
1037 1039
1038 class RemTerm extends UnitTerm { 1040 class RemTerm extends UnitTerm {
1039 RemTerm(var value, String t, Span span, 1041 RemTerm(var value, String t, Span span,
1040 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1042 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1041 assert(_unit == TokenKind.UNIT_REM); 1043 assert(unit == TokenKind.UNIT_REM);
1042 } 1044 }
1043 1045
1044 RemTerm clone() => new RemTerm(value, text, span, unit); 1046 RemTerm clone() => new RemTerm(value, text, span, unit);
1045 void visit(VisitorBase visitor) => visitor.visitRemTerm(this); 1047 void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
1046 } 1048 }
1047 1049
1048 class ViewportTerm extends UnitTerm { 1050 class ViewportTerm extends UnitTerm {
1049 ViewportTerm(var value, String t, Span span, 1051 ViewportTerm(var value, String t, Span span,
1050 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1052 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1051 assert(_unit == TokenKind.UNIT_VIEWPORT_VW || 1053 assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
1052 _unit == TokenKind.UNIT_VIEWPORT_VH || 1054 unit == TokenKind.UNIT_VIEWPORT_VH ||
1053 _unit == TokenKind.UNIT_VIEWPORT_VMIN || 1055 unit == TokenKind.UNIT_VIEWPORT_VMIN ||
1054 _unit == TokenKind.UNIT_VIEWPORT_VMAX); 1056 unit == TokenKind.UNIT_VIEWPORT_VMAX);
1055 } 1057 }
1056 1058
1057 ViewportTerm clone() => new ViewportTerm(value, text, span, unit); 1059 ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
1058 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); 1060 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
1059 } 1061 }
1060 1062
1061 /** Type to signal a bad hex value for HexColorTerm.value. */ 1063 /** Type to signal a bad hex value for HexColorTerm.value. */
1062 class BAD_HEX_VALUE { } 1064 class BAD_HEX_VALUE { }
1063 1065
1064 class HexColorTerm extends LiteralTerm { 1066 class HexColorTerm extends LiteralTerm {
(...skipping 22 matching lines...) Expand all
1087 IE8Term(Span span) : super('\\9', '\\9', span); 1089 IE8Term(Span span) : super('\\9', '\\9', span);
1088 IE8Term clone() => new IE8Term(span); 1090 IE8Term clone() => new IE8Term(span);
1089 void visit(VisitorBase visitor) => visitor.visitIE8Term(this); 1091 void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
1090 } 1092 }
1091 1093
1092 class GroupTerm extends Expression { 1094 class GroupTerm extends Expression {
1093 final List<LiteralTerm> _terms; 1095 final List<LiteralTerm> _terms;
1094 1096
1095 GroupTerm(Span span) : _terms = [], super(span); 1097 GroupTerm(Span span) : _terms = [], super(span);
1096 1098
1097 add(LiteralTerm term) { 1099 void add(LiteralTerm term) {
1098 _terms.add(term); 1100 _terms.add(term);
1099 } 1101 }
1100 1102
1101 GroupTerm clone() => new GroupTerm(span); 1103 GroupTerm clone() => new GroupTerm(span);
1102 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); 1104 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
1103 } 1105 }
1104 1106
1105 class ItemTerm extends NumberTerm { 1107 class ItemTerm extends NumberTerm {
1106 ItemTerm(var value, String t, Span span) : super(value, t, span); 1108 ItemTerm(var value, String t, Span span) : super(value, t, span);
1107 1109
1108 ItemTerm clone() => new ItemTerm(value, text, span); 1110 ItemTerm clone() => new ItemTerm(value, text, span);
1109 void visit(VisitorBase visitor) => visitor.visitItemTerm(this); 1111 void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
1110 } 1112 }
1111 1113
1112 class Expressions extends Expression { 1114 class Expressions extends Expression {
1113 final List<Expression> expressions = []; 1115 final List<Expression> expressions = [];
1114 1116
1115 Expressions(Span span): super(span); 1117 Expressions(Span span): super(span);
1116 1118
1117 add(Expression expression) { 1119 void add(Expression expression) {
1118 expressions.add(expression); 1120 expressions.add(expression);
1119 } 1121 }
1120 1122
1121 Expressions clone() { 1123 Expressions clone() {
1122 var clonedExprs = new Expressions(span); 1124 var clonedExprs = new Expressions(span);
1123 for (var expr in expressions) { 1125 for (var expr in expressions) {
1124 clonedExprs.add(expr.clone()); 1126 clonedExprs.add(expr.clone());
1125 } 1127 }
1126 return clonedExprs; 1128 return clonedExprs;
1127 } 1129 }
(...skipping 16 matching lines...) Expand all
1144 final Token op; 1146 final Token op;
1145 final Expression self; 1147 final Expression self;
1146 1148
1147 UnaryExpression(this.op, this.self, Span span): super(span); 1149 UnaryExpression(this.op, this.self, Span span): super(span);
1148 1150
1149 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); 1151 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
1150 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); 1152 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
1151 } 1153 }
1152 1154
1153 abstract class DartStyleExpression extends TreeNode { 1155 abstract class DartStyleExpression extends TreeNode {
1154 static final int unknownType = 0; 1156 static const int unknownType = 0;
1155 static final int fontStyle = 1; 1157 static const int fontStyle = 1;
1156 static final int marginStyle = 2; 1158 static const int marginStyle = 2;
1157 static final int borderStyle = 3; 1159 static const int borderStyle = 3;
1158 static final int paddingStyle = 4; 1160 static const int paddingStyle = 4;
1159 static final int heightStyle = 5; 1161 static const int heightStyle = 5;
1160 static final int widthStyle = 6; 1162 static const int widthStyle = 6;
1161 1163
1162 final int _styleType; 1164 final int _styleType;
1163 int priority; 1165 int priority;
1164 1166
1165 DartStyleExpression(this._styleType, Span span) : super(span); 1167 DartStyleExpression(this._styleType, Span span) : super(span);
1166 1168
1167 /* 1169 /*
1168 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, 1170 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
1169 * e.g., FontExpression, etc.) will merge if the two expressions are of the 1171 * e.g., FontExpression, etc.) will merge if the two expressions are of the
1170 * same property name (implies same exact type e.g, FontExpression). 1172 * same property name (implies same exact type e.g, FontExpression).
1171 */ 1173 */
1172 merged(DartStyleExpression newDartExpr); 1174 merged(DartStyleExpression newDartExpr);
1173 1175
1174 bool get isUnknown => _styleType == 0 || _styleType == null; 1176 bool get isUnknown => _styleType == 0 || _styleType == null;
1175 bool get isFont => _styleType == fontStyle; 1177 bool get isFont => _styleType == fontStyle;
1176 bool get isMargin => _styleType == marginStyle; 1178 bool get isMargin => _styleType == marginStyle;
1177 bool get isBorder => _styleType == borderStyle; 1179 bool get isBorder => _styleType == borderStyle;
1178 bool get isPadding => _styleType == paddingStyle; 1180 bool get isPadding => _styleType == paddingStyle;
1179 bool get isHeight => _styleType == heightStyle; 1181 bool get isHeight => _styleType == heightStyle;
1180 bool get isWidth => _styleType == widthStyle; 1182 bool get isWidth => _styleType == widthStyle;
1181 bool get isBoxExpression => isMargin || isBorder || isPadding; 1183 bool get isBoxExpression => isMargin || isBorder || isPadding;
1182 1184
1183 bool isSame(DartStyleExpression other) => this._styleType == other._styleType; 1185 bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
1184 1186
1185 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); 1187 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
1186 } 1188 }
1187 1189
1188 class FontExpression extends DartStyleExpression { 1190 class FontExpression extends DartStyleExpression {
1189 Font font; 1191 final Font font;
1190 1192
1191 // font-style font-variant font-weight font-size/line-height font-family 1193 // font-style font-variant font-weight font-size/line-height font-family
1192 FontExpression(Span span, {dynamic size, List<String>family, 1194 FontExpression(Span span, {dynamic size, List<String>family,
1193 int weight, String style, String variant, LineHeight lineHeight}) 1195 int weight, String style, String variant, LineHeight lineHeight}) :
1194 : super(DartStyleExpression.fontStyle, span) { 1196 font = new Font(size : size is LengthTerm ? size.value : size,
1197 family: family, weight: weight, style: style, variant: variant,
1198 lineHeight: lineHeight),
1199 super(DartStyleExpression.fontStyle, span) {
1195 // 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
1196 // support calc expressions on units. 1201 // support calc expressions on units.
1197 font = new Font(size : size is LengthTerm ? size.value : size,
1198 family: family, weight: weight, style: style, variant: variant,
1199 lineHeight: lineHeight);
1200 } 1202 }
1201 1203
1202 merged(FontExpression newFontExpr) { 1204 merged(FontExpression newFontExpr) {
1203 if (this.isFont && newFontExpr.isFont) { 1205 if (this.isFont && newFontExpr.isFont) {
1204 return new FontExpression.merge(this, newFontExpr); 1206 return new FontExpression.merge(this, newFontExpr);
1205 } 1207 }
1206 1208
1207 return null; 1209 return null;
1208 } 1210 }
1209 1211
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 1336
1335 merged(HeightExpression newHeightExpr) { 1337 merged(HeightExpression newHeightExpr) {
1336 if (this.isHeight && newHeightExpr.isHeight) { 1338 if (this.isHeight && newHeightExpr.isHeight) {
1337 return newHeightExpr; 1339 return newHeightExpr;
1338 } 1340 }
1339 1341
1340 return null; 1342 return null;
1341 } 1343 }
1342 1344
1343 HeightExpression clone() => new HeightExpression(span, height); 1345 HeightExpression clone() => new HeightExpression(span, height);
1344 visit(VisitorBase visitor) => visitor.visitHeightExpression(this); 1346 void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
1345 } 1347 }
1346 1348
1347 class WidthExpression extends DartStyleExpression { 1349 class WidthExpression extends DartStyleExpression {
1348 final width; 1350 final width;
1349 1351
1350 WidthExpression(Span span, this.width) 1352 WidthExpression(Span span, this.width)
1351 : super(DartStyleExpression.widthStyle, span); 1353 : super(DartStyleExpression.widthStyle, span);
1352 1354
1353 merged(WidthExpression newWidthExpr) { 1355 merged(WidthExpression newWidthExpr) {
1354 if (this.isWidth && newWidthExpr.isWidth) { 1356 if (this.isWidth && newWidthExpr.isWidth) {
1355 return newWidthExpr; 1357 return newWidthExpr;
1356 } 1358 }
1357 1359
1358 return null; 1360 return null;
1359 } 1361 }
1360 1362
1361 WidthExpression clone() => new WidthExpression(span, width); 1363 WidthExpression clone() => new WidthExpression(span, width);
1362 visit(VisitorBase visitor) => visitor.visitWidthExpression(this); 1364 void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
1363 } 1365 }
1364 1366
1365 class PaddingExpression extends BoxExpression { 1367 class PaddingExpression extends BoxExpression {
1366 /** Padding expression ripped apart. */ 1368 /** Padding expression ripped apart. */
1367 PaddingExpression(Span span, {num top, num right, num bottom, num left}) 1369 PaddingExpression(Span span, {num top, num right, num bottom, num left})
1368 : super(DartStyleExpression.paddingStyle, span, 1370 : super(DartStyleExpression.paddingStyle, span,
1369 new BoxEdge(left, top, right, bottom)); 1371 new BoxEdge(left, top, right, bottom));
1370 1372
1371 PaddingExpression.boxEdge(Span span, BoxEdge box) 1373 PaddingExpression.boxEdge(Span span, BoxEdge box)
1372 : super(DartStyleExpression.paddingStyle, span, box); 1374 : super(DartStyleExpression.paddingStyle, span, box);
(...skipping 13 matching lines...) Expand all
1386 return new PaddingExpression._merge(x, y, y.span); 1388 return new PaddingExpression._merge(x, y, y.span);
1387 } 1389 }
1388 1390
1389 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) 1391 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span)
1390 : super(DartStyleExpression.paddingStyle, span, 1392 : super(DartStyleExpression.paddingStyle, span,
1391 new BoxEdge.merge(x.box, y.box)); 1393 new BoxEdge.merge(x.box, y.box));
1392 1394
1393 PaddingExpression clone() => 1395 PaddingExpression clone() =>
1394 new PaddingExpression(span, top: box.top, right: box.right, 1396 new PaddingExpression(span, top: box.top, right: box.right,
1395 bottom: box.bottom, left: box.left); 1397 bottom: box.bottom, left: box.left);
1396 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); 1398 void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
1397 } 1399 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698