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

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: removed extra print 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);
terry 2013/11/07 18:11:22 Why is clone removed? IdSelector, ClassSelector,
kevmoo-old 2013/11/07 18:23:18 Class was made abstract. Subclasses now clone the
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);
terry 2013/11/07 18:11:22 >80
kevmoo-old 2013/11/07 18:23:18 Done.
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<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
700 IncludeDirective clone() { 717 IncludeDirective clone() {
701 var cloneArgs = []; 718 var cloneArgs = args.map((t) => t.clone()).toList();
702 for (var arg in args) {
703 for (var term in arg) {
704 cloneArgs.add(term.clone());
705 }
706 }
707 return new IncludeDirective(name, cloneArgs, span); 719 return new IncludeDirective(name, cloneArgs, span);
708 } 720 }
709 721
710 void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); 722 void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
711 } 723 }
712 724
713 /** To support SASS @content. */ 725 /** To support SASS @content. */
714 class ContentDirective extends Directive { 726 class ContentDirective extends Directive {
715 ContentDirective(Span span) : super(span); 727 ContentDirective(Span span) : super(span);
716 728
717 void visit(VisitorBase visitor) => visitor.visitContentDirective(this); 729 void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
718 } 730 }
719 731
720 class Declaration extends TreeNode { 732 class Declaration extends TreeNode {
721 final Identifier _property; 733 final Identifier _property;
722 final Expression _expression; 734 final Expression _expression;
723 /** Style exposed to Dart. */ 735 /** Style exposed to Dart. */
724 dynamic _dart; 736 dynamic dartStyle;
725 final bool important; 737 final bool important;
726 738
727 /** 739 /**
728 * IE CSS hacks that can only be read by a particular IE version. 740 * 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;) 741 * 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 742 * Note: IE 8 or older property (e.g., background: green\9;) is handled
731 * by IE8Term in declaration expression handling. 743 * by IE8Term in declaration expression handling.
732 * Note: IE 6 only property with a leading underscore is a valid IDENT 744 * 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;) 745 * since an ident can start with underscore (e.g., _background: red;)
734 */ 746 */
735 final bool isIE7; 747 final bool isIE7;
736 748
737 Declaration(this._property, this._expression, this._dart, Span span, 749 Declaration(this._property, this._expression, this.dartStyle, Span span,
738 {important: false, ie7: false}) 750 {important: false, ie7: false})
739 : this.important = important, this.isIE7 = ie7, super(span); 751 : this.important = important, this.isIE7 = ie7, super(span);
740 752
741 String get property => isIE7 ? '*${_property.name}' : _property.name; 753 String get property => isIE7 ? '*${_property.name}' : _property.name;
742 Expression get expression => _expression; 754 Expression get expression => _expression;
743 755
744 bool get hasDartStyle => _dart != null; 756 bool get hasDartStyle => dartStyle != null;
745 get dartStyle => _dart;
746 set dartStyle(dStyle) {
747 _dart = dStyle;
748 }
749 757
750 Declaration clone() => 758 Declaration clone() =>
751 new Declaration(_property.clone(), _expression.clone(), _dart, span, 759 new Declaration(_property.clone(), _expression.clone(), dartStyle, span,
752 important: important); 760 important: important);
753 761
754 void visit(VisitorBase visitor) => visitor.visitDeclaration(this); 762 void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
755 } 763 }
756 764
757 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and 765 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
758 // dynamic when in a declaration. Currently, Less syntax 766 // dynamic when in a declaration. Currently, Less syntax
759 // '@foo: expression' and 'var-foo: expression' in a declaration 767 // '@foo: expression' and 'var-foo: expression' in a declaration
760 // are statically resolved. Better solution, if @foo or var-foo 768 // are statically resolved. Better solution, if @foo or var-foo
761 // are top-level are then statically resolved and var-foo in a 769 // are top-level are then statically resolved and var-foo in a
762 // declaration group (surrounded by a selector) would be dynamic. 770 // declaration group (surrounded by a selector) would be dynamic.
763 class VarDefinition extends Declaration { 771 class VarDefinition extends Declaration {
764 bool badUsage = false; 772 bool badUsage = false;
765 773
766 VarDefinition(Identifier definedName, Expression expr, Span span) 774 VarDefinition(Identifier definedName, Expression expr, Span span)
767 : super(definedName, expr, null, span); 775 : super(definedName, expr, null, span);
768 776
769 String get definedName => _property.name; 777 String get definedName => _property.name;
770 778
771 set dartStyle(dStyle) { }
772
773 VarDefinition clone() => 779 VarDefinition clone() =>
774 new VarDefinition(_property.clone(), 780 new VarDefinition(_property.clone(),
775 expression != null ? expression.clone() : null, span); 781 expression != null ? expression.clone() : null, span);
782
776 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this); 783 void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
777 } 784 }
778 785
779 /** 786 /**
780 * Node for usage of @include mixin[(args,...)] found in a declaration group 787 * Node for usage of @include mixin[(args,...)] found in a declaration group
781 * instead of at a ruleset (toplevel) e.g., 788 * instead of at a ruleset (toplevel) e.g.,
782 * div { 789 * div {
783 * @include mixin1; 790 * @include mixin1;
784 * } 791 * }
785 */ 792 */
(...skipping 10 matching lines...) Expand all
796 visitor.visitIncludeMixinAtDeclaration(this); 803 visitor.visitIncludeMixinAtDeclaration(this);
797 } 804 }
798 805
799 class ExtendDeclaration extends Declaration { 806 class ExtendDeclaration extends Declaration {
800 List<SimpleSelectorSequence> selectors; 807 List<SimpleSelectorSequence> selectors;
801 808
802 ExtendDeclaration(this.selectors, Span span) : 809 ExtendDeclaration(this.selectors, Span span) :
803 super(null, null, null, span); 810 super(null, null, null, span);
804 811
805 ExtendDeclaration clone() { 812 ExtendDeclaration clone() {
806 List<SimpleSelectorSequence> newSelector = []; 813 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); 814 return new ExtendDeclaration(newSelector, span);
811 } 815 }
812 816
813 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); 817 void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
814 } 818 }
815 819
816 class DeclarationGroup extends TreeNode { 820 class DeclarationGroup extends TreeNode {
817 /** Can be either Declaration or RuleSet (if nested selector). */ 821 /** Can be either Declaration or RuleSet (if nested selector). */
818 final List _declarations; 822 final List declarations;
819 823
820 DeclarationGroup(this._declarations, Span span) : super(span); 824 DeclarationGroup(this.declarations, Span span) : super(span);
821
822 List get declarations => _declarations;
823 825
824 DeclarationGroup clone() { 826 DeclarationGroup clone() {
825 var clonedDecls = []; 827 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); 828 return new DeclarationGroup(clonedDecls, span);
830 } 829 }
831 830
832 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); 831 void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
833 } 832 }
834 833
835 class MarginGroup extends DeclarationGroup { 834 class MarginGroup extends DeclarationGroup {
836 final int margin_sym; // TokenType for for @margin sym. 835 final int margin_sym; // TokenType for for @margin sym.
837 836
838 MarginGroup(this.margin_sym, List<Declaration> decls, Span span) 837 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); 909 void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
911 } 910 }
912 911
913 class NumberTerm extends LiteralTerm { 912 class NumberTerm extends LiteralTerm {
914 NumberTerm(value, String t, Span span) : super(value, t, span); 913 NumberTerm(value, String t, Span span) : super(value, t, span);
915 NumberTerm clone() => new NumberTerm(value, text, span); 914 NumberTerm clone() => new NumberTerm(value, text, span);
916 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this); 915 void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
917 } 916 }
918 917
919 class UnitTerm extends LiteralTerm { 918 class UnitTerm extends LiteralTerm {
920 final int _unit; 919 final int unit;
921 920
922 UnitTerm(value, String t, Span span, this._unit) : super(value, t, span); 921 UnitTerm(value, String t, Span span, this.unit) : super(value, t, span);
923 922
924 int get unit => _unit; 923 UnitTerm clone() => new UnitTerm(value, text, span, unit);
925
926 UnitTerm clone() => new UnitTerm(value, text, span, _unit);
927 924
928 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this); 925 void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
929 926
930 String unitToString() => TokenKind.unitToString(_unit); 927 String unitToString() => TokenKind.unitToString(unit);
931 928
932 String toString() => '$text${unitToString()}'; 929 String toString() => '$text${unitToString()}';
933 } 930 }
934 931
935 class LengthTerm extends UnitTerm { 932 class LengthTerm extends UnitTerm {
936 LengthTerm(value, String t, Span span, 933 LengthTerm(value, String t, Span span,
937 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 934 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
938 assert(this._unit == TokenKind.UNIT_LENGTH_PX || 935 assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
939 this._unit == TokenKind.UNIT_LENGTH_CM || 936 this.unit == TokenKind.UNIT_LENGTH_CM ||
940 this._unit == TokenKind.UNIT_LENGTH_MM || 937 this.unit == TokenKind.UNIT_LENGTH_MM ||
941 this._unit == TokenKind.UNIT_LENGTH_IN || 938 this.unit == TokenKind.UNIT_LENGTH_IN ||
942 this._unit == TokenKind.UNIT_LENGTH_PT || 939 this.unit == TokenKind.UNIT_LENGTH_PT ||
943 this._unit == TokenKind.UNIT_LENGTH_PC); 940 this.unit == TokenKind.UNIT_LENGTH_PC);
944 } 941 }
945 LengthTerm clone() => new LengthTerm(value, text, span, _unit); 942 LengthTerm clone() => new LengthTerm(value, text, span, unit);
946 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this); 943 void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
947 } 944 }
948 945
949 class PercentageTerm extends LiteralTerm { 946 class PercentageTerm extends LiteralTerm {
950 PercentageTerm(value, String t, Span span) : super(value, t, span); 947 PercentageTerm(value, String t, Span span) : super(value, t, span);
951 PercentageTerm clone() => new PercentageTerm(value, text, span); 948 PercentageTerm clone() => new PercentageTerm(value, text, span);
952 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); 949 void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
953 } 950 }
954 951
955 class EmTerm extends LiteralTerm { 952 class EmTerm extends LiteralTerm {
956 EmTerm(value, String t, Span span) : super(value, t, span); 953 EmTerm(value, String t, Span span) : super(value, t, span);
957 EmTerm clone() => new EmTerm(value, text, span); 954 EmTerm clone() => new EmTerm(value, text, span);
958 void visit(VisitorBase visitor) => visitor.visitEmTerm(this); 955 void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
959 } 956 }
960 957
961 class ExTerm extends LiteralTerm { 958 class ExTerm extends LiteralTerm {
962 ExTerm(value, String t, Span span) : super(value, t, span); 959 ExTerm(value, String t, Span span) : super(value, t, span);
963 ExTerm clone() => new ExTerm(value, text, span); 960 ExTerm clone() => new ExTerm(value, text, span);
964 void visit(VisitorBase visitor) => visitor.visitExTerm(this); 961 void visit(VisitorBase visitor) => visitor.visitExTerm(this);
965 } 962 }
966 963
967 class AngleTerm extends UnitTerm { 964 class AngleTerm extends UnitTerm {
968 AngleTerm(var value, String t, Span span, 965 AngleTerm(var value, String t, Span span,
969 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 966 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
970 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 967 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
971 this._unit == TokenKind.UNIT_ANGLE_RAD || 968 this.unit == TokenKind.UNIT_ANGLE_RAD ||
972 this._unit == TokenKind.UNIT_ANGLE_GRAD || 969 this.unit == TokenKind.UNIT_ANGLE_GRAD ||
973 this._unit == TokenKind.UNIT_ANGLE_TURN); 970 this.unit == TokenKind.UNIT_ANGLE_TURN);
974 } 971 }
975 972
976 AngleTerm clone() => new AngleTerm(value, text, span, unit); 973 AngleTerm clone() => new AngleTerm(value, text, span, unit);
977 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this); 974 void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
978 } 975 }
979 976
980 class TimeTerm extends UnitTerm { 977 class TimeTerm extends UnitTerm {
981 TimeTerm(var value, String t, Span span, 978 TimeTerm(var value, String t, Span span,
982 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 979 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
983 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 980 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
984 this._unit == TokenKind.UNIT_TIME_MS || 981 this.unit == TokenKind.UNIT_TIME_MS ||
985 this._unit == TokenKind.UNIT_TIME_S); 982 this.unit == TokenKind.UNIT_TIME_S);
986 } 983 }
987 984
988 TimeTerm clone() => new TimeTerm(value, text, span, unit); 985 TimeTerm clone() => new TimeTerm(value, text, span, unit);
989 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this); 986 void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
990 } 987 }
991 988
992 class FreqTerm extends UnitTerm { 989 class FreqTerm extends UnitTerm {
993 FreqTerm(var value, String t, Span span, 990 FreqTerm(var value, String t, Span span,
994 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 991 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
995 assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); 992 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
996 } 993 }
997 994
998 FreqTerm clone() => new FreqTerm(value, text, span, unit); 995 FreqTerm clone() => new FreqTerm(value, text, span, unit);
999 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this); 996 void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
1000 } 997 }
1001 998
1002 class FractionTerm extends LiteralTerm { 999 class FractionTerm extends LiteralTerm {
1003 FractionTerm(var value, String t, Span span) : super(value, t, span); 1000 FractionTerm(var value, String t, Span span) : super(value, t, span);
1004 1001
1005 FractionTerm clone() => new FractionTerm(value, text, span); 1002 FractionTerm clone() => new FractionTerm(value, text, span);
1006 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this); 1003 void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
1007 } 1004 }
1008 1005
1009 class UriTerm extends LiteralTerm { 1006 class UriTerm extends LiteralTerm {
1010 UriTerm(String value, Span span) : super(value, value, span); 1007 UriTerm(String value, Span span) : super(value, value, span);
1011 1008
1012 UriTerm clone() => new UriTerm(value, span); 1009 UriTerm clone() => new UriTerm(value, span);
1013 void visit(VisitorBase visitor) => visitor.visitUriTerm(this); 1010 void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
1014 } 1011 }
1015 1012
1016 class ResolutionTerm extends UnitTerm { 1013 class ResolutionTerm extends UnitTerm {
1017 ResolutionTerm(var value, String t, Span span, 1014 ResolutionTerm(var value, String t, Span span,
1018 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1015 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1019 assert(_unit == TokenKind.UNIT_RESOLUTION_DPI || 1016 assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
1020 _unit == TokenKind.UNIT_RESOLUTION_DPCM || 1017 unit == TokenKind.UNIT_RESOLUTION_DPCM ||
1021 _unit == TokenKind.UNIT_RESOLUTION_DPPX); 1018 unit == TokenKind.UNIT_RESOLUTION_DPPX);
1022 } 1019 }
1023 1020
1024 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); 1021 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
1025 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); 1022 void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
1026 } 1023 }
1027 1024
1028 class ChTerm extends UnitTerm { 1025 class ChTerm extends UnitTerm {
1029 ChTerm(var value, String t, Span span, 1026 ChTerm(var value, String t, Span span,
1030 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1027 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1031 assert(_unit == TokenKind.UNIT_CH); 1028 assert(unit == TokenKind.UNIT_CH);
1032 } 1029 }
1033 1030
1034 ChTerm clone() => new ChTerm(value, text, span, unit); 1031 ChTerm clone() => new ChTerm(value, text, span, unit);
1035 void visit(VisitorBase visitor) => visitor.visitChTerm(this); 1032 void visit(VisitorBase visitor) => visitor.visitChTerm(this);
1036 } 1033 }
1037 1034
1038 class RemTerm extends UnitTerm { 1035 class RemTerm extends UnitTerm {
1039 RemTerm(var value, String t, Span span, 1036 RemTerm(var value, String t, Span span,
1040 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1037 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1041 assert(_unit == TokenKind.UNIT_REM); 1038 assert(unit == TokenKind.UNIT_REM);
1042 } 1039 }
1043 1040
1044 RemTerm clone() => new RemTerm(value, text, span, unit); 1041 RemTerm clone() => new RemTerm(value, text, span, unit);
1045 void visit(VisitorBase visitor) => visitor.visitRemTerm(this); 1042 void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
1046 } 1043 }
1047 1044
1048 class ViewportTerm extends UnitTerm { 1045 class ViewportTerm extends UnitTerm {
1049 ViewportTerm(var value, String t, Span span, 1046 ViewportTerm(var value, String t, Span span,
1050 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1047 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
1051 assert(_unit == TokenKind.UNIT_VIEWPORT_VW || 1048 assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
1052 _unit == TokenKind.UNIT_VIEWPORT_VH || 1049 unit == TokenKind.UNIT_VIEWPORT_VH ||
1053 _unit == TokenKind.UNIT_VIEWPORT_VMIN || 1050 unit == TokenKind.UNIT_VIEWPORT_VMIN ||
1054 _unit == TokenKind.UNIT_VIEWPORT_VMAX); 1051 unit == TokenKind.UNIT_VIEWPORT_VMAX);
1055 } 1052 }
1056 1053
1057 ViewportTerm clone() => new ViewportTerm(value, text, span, unit); 1054 ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
1058 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this); 1055 void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
1059 } 1056 }
1060 1057
1061 /** Type to signal a bad hex value for HexColorTerm.value. */ 1058 /** Type to signal a bad hex value for HexColorTerm.value. */
1062 class BAD_HEX_VALUE { } 1059 class BAD_HEX_VALUE { }
1063 1060
1064 class HexColorTerm extends LiteralTerm { 1061 class HexColorTerm extends LiteralTerm {
(...skipping 22 matching lines...) Expand all
1087 IE8Term(Span span) : super('\\9', '\\9', span); 1084 IE8Term(Span span) : super('\\9', '\\9', span);
1088 IE8Term clone() => new IE8Term(span); 1085 IE8Term clone() => new IE8Term(span);
1089 void visit(VisitorBase visitor) => visitor.visitIE8Term(this); 1086 void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
1090 } 1087 }
1091 1088
1092 class GroupTerm extends Expression { 1089 class GroupTerm extends Expression {
1093 final List<LiteralTerm> _terms; 1090 final List<LiteralTerm> _terms;
1094 1091
1095 GroupTerm(Span span) : _terms = [], super(span); 1092 GroupTerm(Span span) : _terms = [], super(span);
1096 1093
1097 add(LiteralTerm term) { 1094 void add(LiteralTerm term) {
1098 _terms.add(term); 1095 _terms.add(term);
1099 } 1096 }
1100 1097
1101 GroupTerm clone() => new GroupTerm(span); 1098 GroupTerm clone() => new GroupTerm(span);
1102 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this); 1099 void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
1103 } 1100 }
1104 1101
1105 class ItemTerm extends NumberTerm { 1102 class ItemTerm extends NumberTerm {
1106 ItemTerm(var value, String t, Span span) : super(value, t, span); 1103 ItemTerm(var value, String t, Span span) : super(value, t, span);
1107 1104
1108 ItemTerm clone() => new ItemTerm(value, text, span); 1105 ItemTerm clone() => new ItemTerm(value, text, span);
1109 void visit(VisitorBase visitor) => visitor.visitItemTerm(this); 1106 void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
1110 } 1107 }
1111 1108
1112 class Expressions extends Expression { 1109 class Expressions extends Expression {
1113 final List<Expression> expressions = []; 1110 final List<Expression> expressions = [];
1114 1111
1115 Expressions(Span span): super(span); 1112 Expressions(Span span): super(span);
1116 1113
1117 add(Expression expression) { 1114 void add(Expression expression) {
1118 expressions.add(expression); 1115 expressions.add(expression);
1119 } 1116 }
1120 1117
1121 Expressions clone() { 1118 Expressions clone() {
1122 var clonedExprs = new Expressions(span); 1119 var clonedExprs = new Expressions(span);
1123 for (var expr in expressions) { 1120 for (var expr in expressions) {
1124 clonedExprs.add(expr.clone()); 1121 clonedExprs.add(expr.clone());
1125 } 1122 }
1126 return clonedExprs; 1123 return clonedExprs;
1127 } 1124 }
(...skipping 16 matching lines...) Expand all
1144 final Token op; 1141 final Token op;
1145 final Expression self; 1142 final Expression self;
1146 1143
1147 UnaryExpression(this.op, this.self, Span span): super(span); 1144 UnaryExpression(this.op, this.self, Span span): super(span);
1148 1145
1149 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); 1146 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
1150 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); 1147 void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
1151 } 1148 }
1152 1149
1153 abstract class DartStyleExpression extends TreeNode { 1150 abstract class DartStyleExpression extends TreeNode {
1154 static final int unknownType = 0; 1151 static const int unknownType = 0;
1155 static final int fontStyle = 1; 1152 static const int fontStyle = 1;
1156 static final int marginStyle = 2; 1153 static const int marginStyle = 2;
1157 static final int borderStyle = 3; 1154 static const int borderStyle = 3;
1158 static final int paddingStyle = 4; 1155 static const int paddingStyle = 4;
1159 static final int heightStyle = 5; 1156 static const int heightStyle = 5;
1160 static final int widthStyle = 6; 1157 static const int widthStyle = 6;
1161 1158
1162 final int _styleType; 1159 final int _styleType;
1163 int priority; 1160 int priority;
1164 1161
1165 DartStyleExpression(this._styleType, Span span) : super(span); 1162 DartStyleExpression(this._styleType, Span span) : super(span);
1166 1163
1167 /* 1164 /*
1168 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression, 1165 * Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
1169 * e.g., FontExpression, etc.) will merge if the two expressions are of the 1166 * e.g., FontExpression, etc.) will merge if the two expressions are of the
1170 * same property name (implies same exact type e.g, FontExpression). 1167 * same property name (implies same exact type e.g, FontExpression).
1171 */ 1168 */
1172 merged(DartStyleExpression newDartExpr); 1169 merged(DartStyleExpression newDartExpr);
1173 1170
1174 bool get isUnknown => _styleType == 0 || _styleType == null; 1171 bool get isUnknown => _styleType == 0 || _styleType == null;
1175 bool get isFont => _styleType == fontStyle; 1172 bool get isFont => _styleType == fontStyle;
1176 bool get isMargin => _styleType == marginStyle; 1173 bool get isMargin => _styleType == marginStyle;
1177 bool get isBorder => _styleType == borderStyle; 1174 bool get isBorder => _styleType == borderStyle;
1178 bool get isPadding => _styleType == paddingStyle; 1175 bool get isPadding => _styleType == paddingStyle;
1179 bool get isHeight => _styleType == heightStyle; 1176 bool get isHeight => _styleType == heightStyle;
1180 bool get isWidth => _styleType == widthStyle; 1177 bool get isWidth => _styleType == widthStyle;
1181 bool get isBoxExpression => isMargin || isBorder || isPadding; 1178 bool get isBoxExpression => isMargin || isBorder || isPadding;
1182 1179
1183 bool isSame(DartStyleExpression other) => this._styleType == other._styleType; 1180 bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
1184 1181
1185 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); 1182 void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
1186 } 1183 }
1187 1184
1188 class FontExpression extends DartStyleExpression { 1185 class FontExpression extends DartStyleExpression {
1189 Font font; 1186 final Font font;
1190 1187
1191 // font-style font-variant font-weight font-size/line-height font-family 1188 // font-style font-variant font-weight font-size/line-height font-family
1192 FontExpression(Span span, {dynamic size, List<String>family, 1189 FontExpression(Span span, {dynamic size, List<String>family,
1193 int weight, String style, String variant, LineHeight lineHeight}) 1190 int weight, String style, String variant, LineHeight lineHeight}) :
1194 : super(DartStyleExpression.fontStyle, span) { 1191 font = new Font(size : size is LengthTerm ? size.value : size,
1192 family: family, weight: weight, style: style, variant: variant,
1193 lineHeight: lineHeight),
1194 super(DartStyleExpression.fontStyle, span) {
1195 // TODO(terry): Only px/pt for now need to handle all possible units to 1195 // TODO(terry): Only px/pt for now need to handle all possible units to
1196 // support calc expressions on units. 1196 // 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 } 1197 }
1201 1198
1202 merged(FontExpression newFontExpr) { 1199 merged(FontExpression newFontExpr) {
1203 if (this.isFont && newFontExpr.isFont) { 1200 if (this.isFont && newFontExpr.isFont) {
1204 return new FontExpression.merge(this, newFontExpr); 1201 return new FontExpression.merge(this, newFontExpr);
1205 } 1202 }
1206 1203
1207 return null; 1204 return null;
1208 } 1205 }
1209 1206
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 1331
1335 merged(HeightExpression newHeightExpr) { 1332 merged(HeightExpression newHeightExpr) {
1336 if (this.isHeight && newHeightExpr.isHeight) { 1333 if (this.isHeight && newHeightExpr.isHeight) {
1337 return newHeightExpr; 1334 return newHeightExpr;
1338 } 1335 }
1339 1336
1340 return null; 1337 return null;
1341 } 1338 }
1342 1339
1343 HeightExpression clone() => new HeightExpression(span, height); 1340 HeightExpression clone() => new HeightExpression(span, height);
1344 visit(VisitorBase visitor) => visitor.visitHeightExpression(this); 1341 void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
1345 } 1342 }
1346 1343
1347 class WidthExpression extends DartStyleExpression { 1344 class WidthExpression extends DartStyleExpression {
1348 final width; 1345 final width;
1349 1346
1350 WidthExpression(Span span, this.width) 1347 WidthExpression(Span span, this.width)
1351 : super(DartStyleExpression.widthStyle, span); 1348 : super(DartStyleExpression.widthStyle, span);
1352 1349
1353 merged(WidthExpression newWidthExpr) { 1350 merged(WidthExpression newWidthExpr) {
1354 if (this.isWidth && newWidthExpr.isWidth) { 1351 if (this.isWidth && newWidthExpr.isWidth) {
1355 return newWidthExpr; 1352 return newWidthExpr;
1356 } 1353 }
1357 1354
1358 return null; 1355 return null;
1359 } 1356 }
1360 1357
1361 WidthExpression clone() => new WidthExpression(span, width); 1358 WidthExpression clone() => new WidthExpression(span, width);
1362 visit(VisitorBase visitor) => visitor.visitWidthExpression(this); 1359 void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
1363 } 1360 }
1364 1361
1365 class PaddingExpression extends BoxExpression { 1362 class PaddingExpression extends BoxExpression {
1366 /** Padding expression ripped apart. */ 1363 /** Padding expression ripped apart. */
1367 PaddingExpression(Span span, {num top, num right, num bottom, num left}) 1364 PaddingExpression(Span span, {num top, num right, num bottom, num left})
1368 : super(DartStyleExpression.paddingStyle, span, 1365 : super(DartStyleExpression.paddingStyle, span,
1369 new BoxEdge(left, top, right, bottom)); 1366 new BoxEdge(left, top, right, bottom));
1370 1367
1371 PaddingExpression.boxEdge(Span span, BoxEdge box) 1368 PaddingExpression.boxEdge(Span span, BoxEdge box)
1372 : super(DartStyleExpression.paddingStyle, span, box); 1369 : super(DartStyleExpression.paddingStyle, span, box);
(...skipping 13 matching lines...) Expand all
1386 return new PaddingExpression._merge(x, y, y.span); 1383 return new PaddingExpression._merge(x, y, y.span);
1387 } 1384 }
1388 1385
1389 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) 1386 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span)
1390 : super(DartStyleExpression.paddingStyle, span, 1387 : super(DartStyleExpression.paddingStyle, span,
1391 new BoxEdge.merge(x.box, y.box)); 1388 new BoxEdge.merge(x.box, y.box));
1392 1389
1393 PaddingExpression clone() => 1390 PaddingExpression clone() =>
1394 new PaddingExpression(span, top: box.top, right: box.right, 1391 new PaddingExpression(span, top: box.top, right: box.right,
1395 bottom: box.bottom, left: box.left); 1392 bottom: box.bottom, left: box.left);
1396 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); 1393 void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
1397 } 1394 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698