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

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

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

Powered by Google App Engine
This is Rietveld 408576698