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

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: rebase 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) =>
283 visitor.visitPseudoClassFunctionSelector(this);
270 } 284 }
271 285
272 // ::pseudoElementFunction(expression) 286 // ::pseudoElementFunction(expression)
273 class PseudoElementFunctionSelector extends PseudoElementSelector { 287 class PseudoElementFunctionSelector extends PseudoElementSelector {
274 SelectorExpression expression; 288 final SelectorExpression expression;
275 289
276 PseudoElementFunctionSelector(Identifier name, this.expression, Span span) 290 PseudoElementFunctionSelector(Identifier name, this.expression, Span span)
277 : super(name, span); 291 : super(name, span);
292
278 PseudoElementFunctionSelector clone() => 293 PseudoElementFunctionSelector clone() =>
279 new PseudoElementFunctionSelector(_name, expression, span); 294 new PseudoElementFunctionSelector(_name, expression, span);
280 visit(VisitorBase visitor) => 295
296 void visit(VisitorBase visitor) =>
281 visitor.visitPseudoElementFunctionSelector(this); 297 visitor.visitPseudoElementFunctionSelector(this);
282 } 298 }
283 299
284 class SelectorExpression extends TreeNode { 300 class SelectorExpression extends TreeNode {
285 final List<Expression> _expressions = []; 301 final List<Expression> expressions = [];
286 302
287 SelectorExpression(Span span): super(span); 303 SelectorExpression(Span span): super(span);
288 304
289 add(Expression expression) { 305 void add(Expression expression) {
290 _expressions.add(expression); 306 expressions.add(expression);
291 } 307 }
292 308
293 List<Expression> get expressions => _expressions;
294
295 SelectorExpression clone() { 309 SelectorExpression clone() {
296 var selectorExpr = new SelectorExpression(span); 310 var selectorExpr = new SelectorExpression(span);
297 for (var expr in _expressions) { 311 for (var expr in expressions) {
298 selectorExpr.add(expr.clone()); 312 selectorExpr.add(expr.clone());
299 } 313 }
300 return selectorExpr; 314 return selectorExpr;
301 } 315 }
302 316
303 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); 317 void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
304 } 318 }
305 319
306 // :NOT(negation_arg) 320 // :NOT(negation_arg)
307 class NegationSelector extends SimpleSelector { 321 class NegationSelector extends SimpleSelector {
308 SimpleSelector negationArg; 322 final SimpleSelector negationArg;
309 323
310 NegationSelector(this.negationArg, Span span) 324 NegationSelector(this.negationArg, Span span)
311 : super(new Negation(span), span); 325 : super(new Negation(span), span);
312 326
313 NegationSelector clone() => new NegationSelector(negationArg, span); 327 NegationSelector clone() => new NegationSelector(negationArg, span);
314 328
315 void visit(VisitorBase visitor) => visitor.visitNegationSelector(this); 329 void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
316 } 330 }
317 331
318 class NoOp extends TreeNode { 332 class NoOp extends TreeNode {
319 NoOp() : super(null); 333 NoOp() : super(null);
320 334
321 NoOp clone() => new NoOp(); 335 NoOp clone() => new NoOp();
322 336
323 visit(VisitorBase visitor) => visitor.visitNoOp(this); 337 void visit(VisitorBase visitor) => visitor.visitNoOp(this);
324 } 338 }
325 339
326 class StyleSheet extends TreeNode { 340 class StyleSheet extends TreeNode {
327 /** 341 /**
328 * Contains charset, ruleset, directives (media, page, etc.), and selectors. 342 * Contains charset, ruleset, directives (media, page, etc.), and selectors.
329 */ 343 */
330 final List<TreeNode> topLevels; 344 final List<TreeNode> topLevels;
331 345
332 StyleSheet(this.topLevels, Span span) : super(span) { 346 StyleSheet(this.topLevels, Span span) : super(span) {
333 for (final node in topLevels) { 347 for (final node in topLevels) {
334 assert(node is TopLevelProduction || node is Directive); 348 assert(node is TopLevelProduction || node is Directive);
335 } 349 }
336 } 350 }
337 351
338 /** Selectors only in this tree. */ 352 /** Selectors only in this tree. */
339 StyleSheet.selector(this.topLevels, Span span) : super(span); 353 StyleSheet.selector(this.topLevels, Span span) : super(span);
340 354
341 StyleSheet clone() { 355 StyleSheet clone() {
342 var clonedTopLevels = topLevels.map((e) => e.clone()).toList(); 356 var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
343 return new StyleSheet(clonedTopLevels, span); 357 return new StyleSheet(clonedTopLevels, span);
344 } 358 }
345 359
346 void visit(VisitorBase visitor) => visitor.visitStyleSheet(this); 360 void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
347 } 361 }
348 362
349 class TopLevelProduction extends TreeNode { 363 class TopLevelProduction extends TreeNode {
350 TopLevelProduction(Span span) : super(span); 364 TopLevelProduction(Span span) : super(span);
351 TopLevelProduction clone() => new TopLevelProduction(span); 365 TopLevelProduction clone() => new TopLevelProduction(span);
352 visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); 366 void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
353 } 367 }
354 368
355 class RuleSet extends TopLevelProduction { 369 class RuleSet extends TopLevelProduction {
356 final SelectorGroup _selectorGroup; 370 final SelectorGroup _selectorGroup;
357 final DeclarationGroup _declarationGroup; 371 final DeclarationGroup _declarationGroup;
358 372
359 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span); 373 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span);
360 374
361 SelectorGroup get selectorGroup => _selectorGroup; 375 SelectorGroup get selectorGroup => _selectorGroup;
362 DeclarationGroup get declarationGroup => _declarationGroup; 376 DeclarationGroup get declarationGroup => _declarationGroup;
363 377
364 RuleSet clone() { 378 RuleSet clone() {
365 var cloneSelectorGroup = _selectorGroup.clone(); 379 var cloneSelectorGroup = _selectorGroup.clone();
366 var cloneDeclarationGroup = _declarationGroup.clone(); 380 var cloneDeclarationGroup = _declarationGroup.clone();
367 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); 381 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
368 } 382 }
369 383
370 visit(VisitorBase visitor) => visitor.visitRuleSet(this); 384 void visit(VisitorBase visitor) => visitor.visitRuleSet(this);
371 } 385 }
372 386
373 class Directive extends TreeNode { 387 class Directive extends TreeNode {
374 Directive(Span span) : super(span); 388 Directive(Span span) : super(span);
375 389
376 bool get isBuiltIn => true; // Known CSS directive? 390 bool get isBuiltIn => true; // Known CSS directive?
377 bool get isExtension => false; // SCSS extension? 391 bool get isExtension => false; // SCSS extension?
378 392
379 Directive clone() => new Directive(span); 393 Directive clone() => new Directive(span);
380 void visit(VisitorBase visitor) => visitor.visitDirective(this); 394 void visit(VisitorBase visitor) => visitor.visitDirective(this);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 String get unary => 463 String get unary =>
450 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); 464 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
451 465
452 MediaQuery clone() { 466 MediaQuery clone() {
453 var cloneExpressions = []; 467 var cloneExpressions = [];
454 for (var expr in expressions) { 468 for (var expr in expressions) {
455 cloneExpressions.add(expr.clone()); 469 cloneExpressions.add(expr.clone());
456 } 470 }
457 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); 471 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
458 } 472 }
459 visit(VisitorBase visitor) => visitor.visitMediaQuery(this); 473 void visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
460 } 474 }
461 475
462 class MediaDirective extends Directive { 476 class MediaDirective extends Directive {
463 final List<MediaQuery> mediaQueries; 477 final List<MediaQuery> mediaQueries;
464 final List<RuleSet> rulesets; 478 final List<RuleSet> rulesets;
465 479
466 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); 480 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
467 481
468 MediaDirective clone() { 482 MediaDirective clone() {
469 var cloneQueries = []; 483 var cloneQueries = [];
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 final DeclarationGroup _declarations; 592 final DeclarationGroup _declarations;
579 593
580 FontFaceDirective(this._declarations, Span span) : super(span); 594 FontFaceDirective(this._declarations, Span span) : super(span);
581 595
582 FontFaceDirective clone() => 596 FontFaceDirective clone() =>
583 new FontFaceDirective(_declarations.clone(), span); 597 new FontFaceDirective(_declarations.clone(), span);
584 void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); 598 void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
585 } 599 }
586 600
587 class StyletDirective extends Directive { 601 class StyletDirective extends Directive {
588 final String _dartClassName; 602 final String dartClassName;
589 final List<RuleSet> _rulesets; 603 final List<RuleSet> rulesets;
590 604
591 StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span); 605 StyletDirective(this.dartClassName, this.rulesets, Span span) : super(span);
592 606
593 bool get isBuiltIn => false; 607 bool get isBuiltIn => false;
594 bool get isExtension => true; 608 bool get isExtension => true;
595 609
596 String get dartClassName => _dartClassName;
597 List<RuleSet> get rulesets => _rulesets;
598
599 StyletDirective clone() { 610 StyletDirective clone() {
600 var cloneRulesets = []; 611 var cloneRulesets = [];
601 for (var ruleset in _rulesets) { 612 for (var ruleset in rulesets) {
602 cloneRulesets.add(ruleset.clone()); 613 cloneRulesets.add(ruleset.clone());
603 } 614 }
604 return new StyletDirective(_dartClassName, cloneRulesets, span); 615 return new StyletDirective(dartClassName, cloneRulesets, span);
605 } 616 }
617
606 void visit(VisitorBase visitor) => visitor.visitStyletDirective(this); 618 void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
607 } 619 }
608 620
609 class NamespaceDirective extends Directive { 621 class NamespaceDirective extends Directive {
610 /** Namespace prefix. */ 622 /** Namespace prefix. */
611 final String _prefix; 623 final String _prefix;
612 624
613 /** URI associated with this namespace. */ 625 /** URI associated with this namespace. */
614 final String _uri; 626 final String _uri;
615 627
616 NamespaceDirective(this._prefix, this._uri, Span span) : super(span); 628 NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
617 629
618 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); 630 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
631
619 void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); 632 void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
620 633
621 String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; 634 String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
622 } 635 }
623 636
624 /** To support Less syntax @name: expression */ 637 /** To support Less syntax @name: expression */
625 class VarDefinitionDirective extends Directive { 638 class VarDefinitionDirective extends Directive {
626 final VarDefinition def; 639 final VarDefinition def;
627 640
628 VarDefinitionDirective(this.def, Span span) : super(span); 641 VarDefinitionDirective(this.def, Span span) : super(span);
629 642
630 VarDefinitionDirective clone() => 643 VarDefinitionDirective clone() =>
631 new VarDefinitionDirective(def.clone(), span); 644 new VarDefinitionDirective(def.clone(), span);
645
632 void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); 646 void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
633 } 647 }
634 648
635 class MixinDefinition extends Directive { 649 class MixinDefinition extends Directive {
636 final String name; 650 final String name;
637 final List definedArgs; 651 final List definedArgs;
638 final bool varArgs; 652 final bool varArgs;
639 653
640 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span) 654 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span)
641 : super(span); 655 : super(span);
642 656
643 MixinDefinition clone() { 657 MixinDefinition clone() {
644 var cloneDefinedArgs = []; 658 var cloneDefinedArgs = [];
645 for (var definedArg in definedArgs) { 659 for (var definedArg in definedArgs) {
646 cloneDefinedArgs.add(definedArg.clone()); 660 cloneDefinedArgs.add(definedArg.clone());
647 } 661 }
648 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); 662 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
649 } 663 }
664
650 void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); 665 void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
651 } 666 }
652 667
653 /** Support a Sass @mixin. See http://sass-lang.com for description. */ 668 /** Support a Sass @mixin. See http://sass-lang.com for description. */
654 class MixinRulesetDirective extends MixinDefinition { 669 class MixinRulesetDirective extends MixinDefinition {
655 final List<RuleSet> rulesets; 670 final List<RuleSet> rulesets;
656 671
657 MixinRulesetDirective(String name, List<VarDefinitionDirective> args, 672 MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
658 bool varArgs, this.rulesets, Span span) : 673 bool varArgs, this.rulesets, Span span) :
659 super(name, args, varArgs, span); 674 super(name, args, varArgs, span);
660 675
661 MixinRulesetDirective clone() { 676 MixinRulesetDirective clone() {
662 var clonedArgs = []; 677 var clonedArgs = [];
663 for (var arg in definedArgs) { 678 for (var arg in definedArgs) {
664 clonedArgs.add(arg.clone()); 679 clonedArgs.add(arg.clone());
665 } 680 }
666 var clonedRulesets = []; 681 var clonedRulesets = [];
667 for (var ruleset in rulesets) { 682 for (var ruleset in rulesets) {
668 clonedRulesets.add(ruleset.clone()); 683 clonedRulesets.add(ruleset.clone());
669 } 684 }
670 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, 685 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
671 span); 686 span);
672 } 687 }
688
673 void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); 689 void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
674 } 690 }
675 691
676 class MixinDeclarationDirective extends MixinDefinition { 692 class MixinDeclarationDirective extends MixinDefinition {
677 final DeclarationGroup declarations; 693 final DeclarationGroup declarations;
678 694
679 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args, 695 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
680 bool varArgs, this.declarations, Span span) : 696 bool varArgs, this.declarations, Span span) :
681 super(name, args, varArgs, span); 697 super(name, args, varArgs, span);
698
682 MixinDeclarationDirective clone() { 699 MixinDeclarationDirective clone() {
683 var clonedArgs = []; 700 var clonedArgs = [];
684 for (var arg in definedArgs) { 701 for (var arg in definedArgs) {
685 clonedArgs.add(arg.clone()); 702 clonedArgs.add(arg.clone());
686 } 703 }
687 return new MixinDeclarationDirective(name, clonedArgs, varArgs, 704 return new MixinDeclarationDirective(name, clonedArgs, varArgs,
688 declarations.clone(), span); 705 declarations.clone(), span);
689 } 706 }
707
690 void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this ); 708 void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this );
691 } 709 }
692 710
693 /** To support consuming a SASS mixin @include. */ 711 /** To support consuming a SASS mixin @include. */
694 class IncludeDirective extends Directive { 712 class IncludeDirective extends Directive {
695 final String name; 713 final String name;
696 final List<List<TreeNode>> args; 714 final List<List<TreeNode>> args;
697 715
698 IncludeDirective(this.name, this.args, Span span) : super(span); 716 IncludeDirective(this.name, this.args, Span span) : super(span);
699 717
(...skipping 14 matching lines...) Expand all
714 class ContentDirective extends Directive { 732 class ContentDirective extends Directive {
715 ContentDirective(Span span) : super(span); 733 ContentDirective(Span span) : super(span);
716 734
717 void visit(VisitorBase visitor) => visitor.visitContentDirective(this); 735 void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
718 } 736 }
719 737
720 class Declaration extends TreeNode { 738 class Declaration extends TreeNode {
721 final Identifier _property; 739 final Identifier _property;
722 final Expression _expression; 740 final Expression _expression;
723 /** Style exposed to Dart. */ 741 /** Style exposed to Dart. */
724 dynamic _dart; 742 dynamic dartStyle;
725 final bool important; 743 final bool important;
726 744
727 /** 745 /**
728 * IE CSS hacks that can only be read by a particular IE version. 746 * 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;) 747 * 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 748 * Note: IE 8 or older property (e.g., background: green\9;) is handled
731 * by IE8Term in declaration expression handling. 749 * by IE8Term in declaration expression handling.
732 * Note: IE 6 only property with a leading underscore is a valid IDENT 750 * 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;) 751 * since an ident can start with underscore (e.g., _background: red;)
734 */ 752 */
735 final bool isIE7; 753 final bool isIE7;
736 754
737 Declaration(this._property, this._expression, this._dart, Span span, 755 Declaration(this._property, this._expression, this.dartStyle, Span span,
738 {important: false, ie7: false}) 756 {important: false, ie7: false})
739 : this.important = important, this.isIE7 = ie7, super(span); 757 : this.important = important, this.isIE7 = ie7, super(span);
740 758
741 String get property => isIE7 ? '*${_property.name}' : _property.name; 759 String get property => isIE7 ? '*${_property.name}' : _property.name;
742 Expression get expression => _expression; 760 Expression get expression => _expression;
743 761
744 bool get hasDartStyle => _dart != null; 762 bool get hasDartStyle => dartStyle != null;
745 get dartStyle => _dart;
746 set dartStyle(dStyle) {
747 _dart = dStyle;
748 }
749 763
750 Declaration clone() => 764 Declaration clone() =>
751 new Declaration(_property.clone(), _expression.clone(), _dart, span, 765 new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
752 important: important); 766 important: important);
753 767
754 void visit(VisitorBase visitor) => visitor.visitDeclaration(this); 768 void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
755 } 769 }
756 770
757 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and 771 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
758 // dynamic when in a declaration. Currently, Less syntax 772 // dynamic when in a declaration. Currently, Less syntax
759 // '@foo: expression' and 'var-foo: expression' in a declaration 773 // '@foo: expression' and 'var-foo: expression' in a declaration
760 // are statically resolved. Better solution, if @foo or var-foo 774 // are statically resolved. Better solution, if @foo or var-foo
761 // are top-level are then statically resolved and var-foo in a 775 // are top-level are then statically resolved and var-foo in a
762 // declaration group (surrounded by a selector) would be dynamic. 776 // declaration group (surrounded by a selector) would be dynamic.
763 class VarDefinition extends Declaration { 777 class VarDefinition extends Declaration {
764 bool badUsage = false; 778 bool badUsage = false;
765 779
766 VarDefinition(Identifier definedName, Expression expr, Span span) 780 VarDefinition(Identifier definedName, Expression expr, Span span)
767 : super(definedName, expr, null, span); 781 : super(definedName, expr, null, span);
768 782
769 String get definedName => _property.name; 783 String get definedName => _property.name;
770 784
771 set dartStyle(dStyle) { }
772
773 VarDefinition clone() => 785 VarDefinition clone() =>
774 new VarDefinition(_property.clone(), 786 new VarDefinition(_property.clone(),
775 expression != null ? expression.clone() : null, span); 787 expression != null ? expression.clone() : null, span);
788
776 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); 789 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
777 } 790 }
778 791
779 /** 792 /**
780 * Node for usage of @include mixin[(args,...)] found in a declaration group 793 * Node for usage of @include mixin[(args,...)] found in a declaration group
781 * instead of at a ruleset (toplevel) e.g., 794 * instead of at a ruleset (toplevel) e.g.,
782 * div { 795 * div {
783 * @include mixin1; 796 * @include mixin1;
784 * } 797 * }
785 */ 798 */
(...skipping 10 matching lines...) Expand all
796 visitor.visitIncludeMixinAtDeclaration(this); 809 visitor.visitIncludeMixinAtDeclaration(this);
797 } 810 }
798 811
799 class ExtendDeclaration extends Declaration { 812 class ExtendDeclaration extends Declaration {
800 List<SimpleSelectorSequence> selectors; 813 List<SimpleSelectorSequence> selectors;
801 814
802 ExtendDeclaration(this.selectors, Span span) : 815 ExtendDeclaration(this.selectors, Span span) :
803 super(null, null, null, span); 816 super(null, null, null, span);
804 817
805 ExtendDeclaration clone() { 818 ExtendDeclaration clone() {
806 List<SimpleSelectorSequence> newSelector = []; 819 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); 820 return new ExtendDeclaration(newSelector, span);
811 } 821 }
812 822
813 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); 823 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
814 } 824 }
815 825
816 class DeclarationGroup extends TreeNode { 826 class DeclarationGroup extends TreeNode {
817 /** Can be either Declaration or RuleSet (if nested selector). */ 827 /** Can be either Declaration or RuleSet (if nested selector). */
818 final List _declarations; 828 final List declarations;
819 829
820 DeclarationGroup(this._declarations, Span span) : super(span); 830 DeclarationGroup(this.declarations, Span span) : super(span);
821
822 List get declarations => _declarations;
823 831
824 DeclarationGroup clone() { 832 DeclarationGroup clone() {
825 var clonedDecls = []; 833 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); 834 return new DeclarationGroup(clonedDecls, span);
830 } 835 }
831 836
832 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); 837 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
833 } 838 }
834 839
835 class MarginGroup extends DeclarationGroup { 840 class MarginGroup extends DeclarationGroup {
836 final int margin_sym; // TokenType for for @margin sym. 841 final int margin_sym; // TokenType for for @margin sym.
837 842
838 MarginGroup(this.margin_sym, List<Declaration> decls, Span span) 843 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); 915 void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
911 } 916 }
912 917
913 class NumberTerm extends LiteralTerm { 918 class NumberTerm extends LiteralTerm {
914 NumberTerm(value, String t, Span span) : super(value, t, span); 919 NumberTerm(value, String t, Span span) : super(value, t, span);
915 NumberTerm clone() => new NumberTerm(value, text, span); 920 NumberTerm clone() => new NumberTerm(value, text, span);
916 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); 921 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
917 } 922 }
918 923
919 class UnitTerm extends LiteralTerm { 924 class UnitTerm extends LiteralTerm {
920 final int _unit; 925 final int unit;
921 926
922 UnitTerm(value, String t, Span span, this._unit) : super(value, t, span); 927 UnitTerm(value, String t, Span span, this.unit) : super(value, t, span);
923 928
924 int get unit => _unit; 929 UnitTerm clone() => new UnitTerm(value, text, span, unit);
925
926 UnitTerm clone() => new UnitTerm(value, text, span, _unit);
927 930
928 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); 931 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
929 932
930 String unitToString() => TokenKind.unitToString(_unit); 933 String unitToString() => TokenKind.unitToString(unit);
931 934
932 String toString() => '$text${unitToString()}'; 935 String toString() => '$text${unitToString()}';
933 } 936 }
934 937
935 class LengthTerm extends UnitTerm { 938 class LengthTerm extends UnitTerm {
936 LengthTerm(value, String t, Span span, 939 LengthTerm(value, String t, Span span,
937 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 940 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
938 assert(this._unit == TokenKind.UNIT_LENGTH_PX || 941 assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
939 this._unit == TokenKind.UNIT_LENGTH_CM || 942 this.unit == TokenKind.UNIT_LENGTH_CM ||
940 this._unit == TokenKind.UNIT_LENGTH_MM || 943 this.unit == TokenKind.UNIT_LENGTH_MM ||
941 this._unit == TokenKind.UNIT_LENGTH_IN || 944 this.unit == TokenKind.UNIT_LENGTH_IN ||
942 this._unit == TokenKind.UNIT_LENGTH_PT || 945 this.unit == TokenKind.UNIT_LENGTH_PT ||
943 this._unit == TokenKind.UNIT_LENGTH_PC); 946 this.unit == TokenKind.UNIT_LENGTH_PC);
944 } 947 }
945 LengthTerm clone() => new LengthTerm(value, text, span, _unit); 948 LengthTerm clone() => new LengthTerm(value, text, span, unit);
946 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); 949 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
947 } 950 }
948 951
949 class PercentageTerm extends LiteralTerm { 952 class PercentageTerm extends LiteralTerm {
950 PercentageTerm(value, String t, Span span) : super(value, t, span); 953 PercentageTerm(value, String t, Span span) : super(value, t, span);
951 PercentageTerm clone() => new PercentageTerm(value, text, span); 954 PercentageTerm clone() => new PercentageTerm(value, text, span);
952 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); 955 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
953 } 956 }
954 957
955 class EmTerm extends LiteralTerm { 958 class EmTerm extends LiteralTerm {
956 EmTerm(value, String t, Span span) : super(value, t, span); 959 EmTerm(value, String t, Span span) : super(value, t, span);
957 EmTerm clone() => new EmTerm(value, text, span); 960 EmTerm clone() => new EmTerm(value, text, span);
958 void visit(VisitorBase visitor) => visitor.visitEmTerm(this); 961 void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
959 } 962 }
960 963
961 class ExTerm extends LiteralTerm { 964 class ExTerm extends LiteralTerm {
962 ExTerm(value, String t, Span span) : super(value, t, span); 965 ExTerm(value, String t, Span span) : super(value, t, span);
963 ExTerm clone() => new ExTerm(value, text, span); 966 ExTerm clone() => new ExTerm(value, text, span);
964 void visit(VisitorBase visitor) => visitor.visitExTerm(this); 967 void visit(VisitorBase visitor) => visitor.visitExTerm(this);
965 } 968 }
966 969
967 class AngleTerm extends UnitTerm { 970 class AngleTerm extends UnitTerm {
968 AngleTerm(var value, String t, Span span, 971 AngleTerm(var value, String t, Span span,
969 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 972 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
970 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 973 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
971 this._unit == TokenKind.UNIT_ANGLE_RAD || 974 this.unit == TokenKind.UNIT_ANGLE_RAD ||
972 this._unit == TokenKind.UNIT_ANGLE_GRAD || 975 this.unit == TokenKind.UNIT_ANGLE_GRAD ||
973 this._unit == TokenKind.UNIT_ANGLE_TURN); 976 this.unit == TokenKind.UNIT_ANGLE_TURN);
974 } 977 }
975 978
976 AngleTerm clone() => new AngleTerm(value, text, span, unit); 979 AngleTerm clone() => new AngleTerm(value, text, span, unit);
977 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); 980 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
978 } 981 }
979 982
980 class TimeTerm extends UnitTerm { 983 class TimeTerm extends UnitTerm {
981 TimeTerm(var value, String t, Span span, 984 TimeTerm(var value, String t, Span span,
982 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 985 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
983 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 986 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
984 this._unit == TokenKind.UNIT_TIME_MS || 987 this.unit == TokenKind.UNIT_TIME_MS ||
985 this._unit == TokenKind.UNIT_TIME_S); 988 this.unit == TokenKind.UNIT_TIME_S);
986 } 989 }
987 990
988 TimeTerm clone() => new TimeTerm(value, text, span, unit); 991 TimeTerm clone() => new TimeTerm(value, text, span, unit);
989 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); 992 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
990 } 993 }
991 994
992 class FreqTerm extends UnitTerm { 995 class FreqTerm extends UnitTerm {
993 FreqTerm(var value, String t, Span span, 996 FreqTerm(var value, String t, Span span,
994 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 997 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
995 assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); 998 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
996 } 999 }
997 1000
998 FreqTerm clone() => new FreqTerm(value, text, span, unit); 1001 FreqTerm clone() => new FreqTerm(value, text, span, unit);
999 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); 1002 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
1000 } 1003 }
1001 1004
1002 class FractionTerm extends LiteralTerm { 1005 class FractionTerm extends LiteralTerm {
1003 FractionTerm(var value, String t, Span span) : super(value, t, span); 1006 FractionTerm(var value, String t, Span span) : super(value, t, span);
1004 1007
1005 FractionTerm clone() => new FractionTerm(value, text, span); 1008 FractionTerm clone() => new FractionTerm(value, text, span);
1006 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); 1009 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
1007 } 1010 }
1008 1011
1009 class UriTerm extends LiteralTerm { 1012 class UriTerm extends LiteralTerm {
1010 UriTerm(String value, Span span) : super(value, value, span); 1013 UriTerm(String value, Span span) : super(value, value, span);
1011 1014
1012 UriTerm clone() => new UriTerm(value, span); 1015 UriTerm clone() => new UriTerm(value, span);
1013 void visit(VisitorBase visitor) => visitor.visitUriTerm(this); 1016 void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
1014 } 1017 }
1015 1018
1016 class ResolutionTerm extends UnitTerm { 1019 class ResolutionTerm extends UnitTerm {
1017 ResolutionTerm(var value, String t, Span span, 1020 ResolutionTerm(var value, String t, Span span,
1018 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1021 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1019 assert(_unit == TokenKind.UNIT_RESOLUTION_DPI || 1022 assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
1020 _unit == TokenKind.UNIT_RESOLUTION_DPCM || 1023 unit == TokenKind.UNIT_RESOLUTION_DPCM ||
1021 _unit == TokenKind.UNIT_RESOLUTION_DPPX); 1024 unit == TokenKind.UNIT_RESOLUTION_DPPX);
1022 } 1025 }
1023 1026
1024 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); 1027 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
1025 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); 1028 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
1026 } 1029 }
1027 1030
1028 class ChTerm extends UnitTerm { 1031 class ChTerm extends UnitTerm {
1029 ChTerm(var value, String t, Span span, 1032 ChTerm(var value, String t, Span span,
1030 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1033 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1031 assert(_unit == TokenKind.UNIT_CH); 1034 assert(unit == TokenKind.UNIT_CH);
1032 } 1035 }
1033 1036
1034 ChTerm clone() => new ChTerm(value, text, span, unit); 1037 ChTerm clone() => new ChTerm(value, text, span, unit);
1035 void visit(VisitorBase visitor) => visitor.visitChTerm(this); 1038 void visit(VisitorBase visitor) => visitor.visitChTerm(this);
1036 } 1039 }
1037 1040
1038 class RemTerm extends UnitTerm { 1041 class RemTerm extends UnitTerm {
1039 RemTerm(var value, String t, Span span, 1042 RemTerm(var value, String t, Span span,
1040 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1043 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1041 assert(_unit == TokenKind.UNIT_REM); 1044 assert(unit == TokenKind.UNIT_REM);
1042 } 1045 }
1043 1046
1044 RemTerm clone() => new RemTerm(value, text, span, unit); 1047 RemTerm clone() => new RemTerm(value, text, span, unit);
1045 void visit(VisitorBase visitor) => visitor.visitRemTerm(this); 1048 void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
1046 } 1049 }
1047 1050
1048 class ViewportTerm extends UnitTerm { 1051 class ViewportTerm extends UnitTerm {
1049 ViewportTerm(var value, String t, Span span, 1052 ViewportTerm(var value, String t, Span span,
1050 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1053 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1051 assert(_unit == TokenKind.UNIT_VIEWPORT_VW || 1054 assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
1052 _unit == TokenKind.UNIT_VIEWPORT_VH || 1055 unit == TokenKind.UNIT_VIEWPORT_VH ||
1053 _unit == TokenKind.UNIT_VIEWPORT_VMIN || 1056 unit == TokenKind.UNIT_VIEWPORT_VMIN ||
1054 _unit == TokenKind.UNIT_VIEWPORT_VMAX); 1057 unit == TokenKind.UNIT_VIEWPORT_VMAX);
1055 } 1058 }
1056 1059
1057 ViewportTerm clone() => new ViewportTerm(value, text, span, unit); 1060 ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
1058 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); 1061 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
1059 } 1062 }
1060 1063
1061 /** Type to signal a bad hex value for HexColorTerm.value. */ 1064 /** Type to signal a bad hex value for HexColorTerm.value. */
1062 class BAD_HEX_VALUE { } 1065 class BAD_HEX_VALUE { }
1063 1066
1064 class HexColorTerm extends LiteralTerm { 1067 class HexColorTerm extends LiteralTerm {
(...skipping 22 matching lines...) Expand all
1087 IE8Term(Span span) : super('\\9', '\\9', span); 1090 IE8Term(Span span) : super('\\9', '\\9', span);
1088 IE8Term clone() => new IE8Term(span); 1091 IE8Term clone() => new IE8Term(span);
1089 void visit(VisitorBase visitor) => visitor.visitIE8Term(this); 1092 void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
1090 } 1093 }
1091 1094
1092 class GroupTerm extends Expression { 1095 class GroupTerm extends Expression {
1093 final List<LiteralTerm> _terms; 1096 final List<LiteralTerm> _terms;
1094 1097
1095 GroupTerm(Span span) : _terms = [], super(span); 1098 GroupTerm(Span span) : _terms = [], super(span);
1096 1099
1097 add(LiteralTerm term) { 1100 void add(LiteralTerm term) {
1098 _terms.add(term); 1101 _terms.add(term);
1099 } 1102 }
1100 1103
1101 GroupTerm clone() => new GroupTerm(span); 1104 GroupTerm clone() => new GroupTerm(span);
1102 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); 1105 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
1103 } 1106 }
1104 1107
1105 class ItemTerm extends NumberTerm { 1108 class ItemTerm extends NumberTerm {
1106 ItemTerm(var value, String t, Span span) : super(value, t, span); 1109 ItemTerm(var value, String t, Span span) : super(value, t, span);
1107 1110
1108 ItemTerm clone() => new ItemTerm(value, text, span); 1111 ItemTerm clone() => new ItemTerm(value, text, span);
1109 void visit(VisitorBase visitor) => visitor.visitItemTerm(this); 1112 void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
1110 } 1113 }
1111 1114
1112 class Expressions extends Expression { 1115 class Expressions extends Expression {
1113 final List<Expression> expressions = []; 1116 final List<Expression> expressions = [];
1114 1117
1115 Expressions(Span span): super(span); 1118 Expressions(Span span): super(span);
1116 1119
1117 add(Expression expression) { 1120 void add(Expression expression) {
1118 expressions.add(expression); 1121 expressions.add(expression);
1119 } 1122 }
1120 1123
1121 Expressions clone() { 1124 Expressions clone() {
1122 var clonedExprs = new Expressions(span); 1125 var clonedExprs = new Expressions(span);
1123 for (var expr in expressions) { 1126 for (var expr in expressions) {
1124 clonedExprs.add(expr.clone()); 1127 clonedExprs.add(expr.clone());
1125 } 1128 }
1126 return clonedExprs; 1129 return clonedExprs;
1127 } 1130 }
(...skipping 16 matching lines...) Expand all
1144 final Token op; 1147 final Token op;
1145 final Expression self; 1148 final Expression self;
1146 1149
1147 UnaryExpression(this.op, this.self, Span span): super(span); 1150 UnaryExpression(this.op, this.self, Span span): super(span);
1148 1151
1149 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); 1152 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
1150 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); 1153 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
1151 } 1154 }
1152 1155
1153 abstract class DartStyleExpression extends TreeNode { 1156 abstract class DartStyleExpression extends TreeNode {
1154 static final int unknownType = 0; 1157 static const int unknownType = 0;
1155 static final int fontStyle = 1; 1158 static const int fontStyle = 1;
1156 static final int marginStyle = 2; 1159 static const int marginStyle = 2;
1157 static final int borderStyle = 3; 1160 static const int borderStyle = 3;
1158 static final int paddingStyle = 4; 1161 static const int paddingStyle = 4;
1159 static final int heightStyle = 5; 1162 static const int heightStyle = 5;
1160 static final int widthStyle = 6; 1163 static const int widthStyle = 6;
1161 1164
1162 final int _styleType; 1165 final int _styleType;
1163 int priority; 1166 int priority;
1164 1167
1165 DartStyleExpression(this._styleType, Span span) : super(span); 1168 DartStyleExpression(this._styleType, Span span) : super(span);
1166 1169
1167 /* 1170 /*
1168 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, 1171 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
1169 * e.g., FontExpression, etc.) will merge if the two expressions are of the 1172 * e.g., FontExpression, etc.) will merge if the two expressions are of the
1170 * same property name (implies same exact type e.g, FontExpression). 1173 * same property name (implies same exact type e.g, FontExpression).
1171 */ 1174 */
1172 merged(DartStyleExpression newDartExpr); 1175 merged(DartStyleExpression newDartExpr);
1173 1176
1174 bool get isUnknown => _styleType == 0 || _styleType == null; 1177 bool get isUnknown => _styleType == 0 || _styleType == null;
1175 bool get isFont => _styleType == fontStyle; 1178 bool get isFont => _styleType == fontStyle;
1176 bool get isMargin => _styleType == marginStyle; 1179 bool get isMargin => _styleType == marginStyle;
1177 bool get isBorder => _styleType == borderStyle; 1180 bool get isBorder => _styleType == borderStyle;
1178 bool get isPadding => _styleType == paddingStyle; 1181 bool get isPadding => _styleType == paddingStyle;
1179 bool get isHeight => _styleType == heightStyle; 1182 bool get isHeight => _styleType == heightStyle;
1180 bool get isWidth => _styleType == widthStyle; 1183 bool get isWidth => _styleType == widthStyle;
1181 bool get isBoxExpression => isMargin || isBorder || isPadding; 1184 bool get isBoxExpression => isMargin || isBorder || isPadding;
1182 1185
1183 bool isSame(DartStyleExpression other) => this._styleType == other._styleType; 1186 bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
1184 1187
1185 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); 1188 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
1186 } 1189 }
1187 1190
1188 class FontExpression extends DartStyleExpression { 1191 class FontExpression extends DartStyleExpression {
1189 Font font; 1192 final Font font;
1190 1193
1191 // font-style font-variant font-weight font-size/line-height font-family 1194 // font-style font-variant font-weight font-size/line-height font-family
1192 FontExpression(Span span, {dynamic size, List<String>family, 1195 FontExpression(Span span, {dynamic size, List<String>family,
1193 int weight, String style, String variant, LineHeight lineHeight}) 1196 int weight, String style, String variant, LineHeight lineHeight}) :
1194 : super(DartStyleExpression.fontStyle, span) { 1197 font = new Font(size : size is LengthTerm ? size.value : size,
1198 family: family, weight: weight, style: style, variant: variant,
1199 lineHeight: lineHeight),
1200 super(DartStyleExpression.fontStyle, span) {
1195 // TODO(terry): Only px/pt for now need to handle all possible units to 1201 // TODO(terry): Only px/pt for now need to handle all possible units to
1196 // support calc expressions on units. 1202 // support calc expressions on units.
terry 2013/11/20 14:07:25 Add TODO above constructor and get rid of body.
kevmoo-old 2013/11/20 19:13:11 Done.
1197 font = new Font(size : size is LengthTerm ? size.value : size,
1198 family: family, weight: weight, style: style, variant: variant,
1199 lineHeight: lineHeight);
1200 } 1203 }
1201 1204
1202 merged(FontExpression newFontExpr) { 1205 merged(FontExpression newFontExpr) {
1203 if (this.isFont && newFontExpr.isFont) { 1206 if (this.isFont && newFontExpr.isFont) {
1204 return new FontExpression.merge(this, newFontExpr); 1207 return new FontExpression.merge(this, newFontExpr);
1205 } 1208 }
1206 1209
1207 return null; 1210 return null;
1208 } 1211 }
1209 1212
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 1337
1335 merged(HeightExpression newHeightExpr) { 1338 merged(HeightExpression newHeightExpr) {
1336 if (this.isHeight && newHeightExpr.isHeight) { 1339 if (this.isHeight && newHeightExpr.isHeight) {
1337 return newHeightExpr; 1340 return newHeightExpr;
1338 } 1341 }
1339 1342
1340 return null; 1343 return null;
1341 } 1344 }
1342 1345
1343 HeightExpression clone() => new HeightExpression(span, height); 1346 HeightExpression clone() => new HeightExpression(span, height);
1344 visit(VisitorBase visitor) => visitor.visitHeightExpression(this); 1347 void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
1345 } 1348 }
1346 1349
1347 class WidthExpression extends DartStyleExpression { 1350 class WidthExpression extends DartStyleExpression {
1348 final width; 1351 final width;
1349 1352
1350 WidthExpression(Span span, this.width) 1353 WidthExpression(Span span, this.width)
1351 : super(DartStyleExpression.widthStyle, span); 1354 : super(DartStyleExpression.widthStyle, span);
1352 1355
1353 merged(WidthExpression newWidthExpr) { 1356 merged(WidthExpression newWidthExpr) {
1354 if (this.isWidth && newWidthExpr.isWidth) { 1357 if (this.isWidth && newWidthExpr.isWidth) {
1355 return newWidthExpr; 1358 return newWidthExpr;
1356 } 1359 }
1357 1360
1358 return null; 1361 return null;
1359 } 1362 }
1360 1363
1361 WidthExpression clone() => new WidthExpression(span, width); 1364 WidthExpression clone() => new WidthExpression(span, width);
1362 visit(VisitorBase visitor) => visitor.visitWidthExpression(this); 1365 void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
1363 } 1366 }
1364 1367
1365 class PaddingExpression extends BoxExpression { 1368 class PaddingExpression extends BoxExpression {
1366 /** Padding expression ripped apart. */ 1369 /** Padding expression ripped apart. */
1367 PaddingExpression(Span span, {num top, num right, num bottom, num left}) 1370 PaddingExpression(Span span, {num top, num right, num bottom, num left})
1368 : super(DartStyleExpression.paddingStyle, span, 1371 : super(DartStyleExpression.paddingStyle, span,
1369 new BoxEdge(left, top, right, bottom)); 1372 new BoxEdge(left, top, right, bottom));
1370 1373
1371 PaddingExpression.boxEdge(Span span, BoxEdge box) 1374 PaddingExpression.boxEdge(Span span, BoxEdge box)
1372 : super(DartStyleExpression.paddingStyle, span, box); 1375 : super(DartStyleExpression.paddingStyle, span, box);
(...skipping 13 matching lines...) Expand all
1386 return new PaddingExpression._merge(x, y, y.span); 1389 return new PaddingExpression._merge(x, y, y.span);
1387 } 1390 }
1388 1391
1389 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) 1392 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span)
1390 : super(DartStyleExpression.paddingStyle, span, 1393 : super(DartStyleExpression.paddingStyle, span,
1391 new BoxEdge.merge(x.box, y.box)); 1394 new BoxEdge.merge(x.box, y.box));
1392 1395
1393 PaddingExpression clone() => 1396 PaddingExpression clone() =>
1394 new PaddingExpression(span, top: box.top, right: box.right, 1397 new PaddingExpression(span, top: box.top, right: box.right,
1395 bottom: box.bottom, left: box.left); 1398 bottom: box.bottom, left: box.left);
1396 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); 1399 void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
1397 } 1400 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698