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

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

Issue 998843003: pkg/csslib: formatting (Closed) Base URL: https://github.com/dart-lang/csslib@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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, SourceSpan span): super(span); 14 Identifier(this.name, SourceSpan span) : super(span);
15 15
16 Identifier clone() => new Identifier(name, span); 16 Identifier clone() => new Identifier(name, span);
17 17
18 visit(VisitorBase visitor) => visitor.visitIdentifier(this); 18 visit(VisitorBase visitor) => visitor.visitIdentifier(this);
19 19
20 String toString() => name; 20 String toString() => name;
21 } 21 }
22 22
23 class Wildcard extends TreeNode { 23 class Wildcard extends TreeNode {
24 Wildcard(SourceSpan span): super(span); 24 Wildcard(SourceSpan span) : super(span);
25 Wildcard clone() => new Wildcard(span); 25 Wildcard clone() => new Wildcard(span);
26 visit(VisitorBase visitor) => visitor.visitWildcard(this); 26 visit(VisitorBase visitor) => visitor.visitWildcard(this);
27 27
28 String get name => '*'; 28 String get name => '*';
29 } 29 }
30 30
31 class ThisOperator extends TreeNode { 31 class ThisOperator extends TreeNode {
32 ThisOperator(SourceSpan span): super(span); 32 ThisOperator(SourceSpan span) : super(span);
33 ThisOperator clone() => new ThisOperator(span); 33 ThisOperator clone() => new ThisOperator(span);
34 visit(VisitorBase visitor) => visitor.visitThisOperator(this); 34 visit(VisitorBase visitor) => visitor.visitThisOperator(this);
35 35
36 String get name => '&'; 36 String get name => '&';
37 } 37 }
38 38
39 class Negation extends TreeNode { 39 class Negation extends TreeNode {
40 Negation(SourceSpan span): super(span); 40 Negation(SourceSpan span) : super(span);
41 Negation clone() => new Negation(span); 41 Negation clone() => new Negation(span);
42 visit(VisitorBase visitor) => visitor.visitNegation(this); 42 visit(VisitorBase visitor) => visitor.visitNegation(this);
43 43
44 String get name => 'not'; 44 String get name => 'not';
45 } 45 }
46 46
47 // /* .... */ 47 // /* .... */
48 class CssComment extends TreeNode { 48 class CssComment extends TreeNode {
49 final String comment; 49 final String comment;
50 50
51 CssComment(this.comment, SourceSpan span): super(span); 51 CssComment(this.comment, SourceSpan span) : super(span);
52 CssComment clone() => new CssComment(comment, span); 52 CssComment clone() => new CssComment(comment, span);
53 visit(VisitorBase visitor) => visitor.visitCssComment(this); 53 visit(VisitorBase visitor) => visitor.visitCssComment(this);
54 } 54 }
55 55
56 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->). 56 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
57 class CommentDefinition extends CssComment { 57 class CommentDefinition extends CssComment {
58 CommentDefinition(String comment, SourceSpan span): super(comment, span); 58 CommentDefinition(String comment, SourceSpan span) : super(comment, span);
59 CommentDefinition clone() => new CommentDefinition(comment, span); 59 CommentDefinition clone() => new CommentDefinition(comment, span);
60 visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); 60 visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
61 } 61 }
62 62
63 class SelectorGroup extends TreeNode { 63 class SelectorGroup extends TreeNode {
64 final List<Selector> selectors; 64 final List<Selector> selectors;
65 65
66 SelectorGroup(this.selectors, SourceSpan span): super(span); 66 SelectorGroup(this.selectors, SourceSpan span) : super(span);
67 67
68 SelectorGroup clone() => new SelectorGroup(selectors, span); 68 SelectorGroup clone() => new SelectorGroup(selectors, span);
69 69
70 visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); 70 visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
71 } 71 }
72 72
73 class Selector extends TreeNode { 73 class Selector extends TreeNode {
74 final List<SimpleSelectorSequence> simpleSelectorSequences; 74 final List<SimpleSelectorSequence> simpleSelectorSequences;
75 75
76 Selector(this.simpleSelectorSequences, SourceSpan span) : super(span); 76 Selector(this.simpleSelectorSequences, SourceSpan span) : super(span);
77 77
78 void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq); 78 void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq);
79 79
80 int get length => simpleSelectorSequences.length; 80 int get length => simpleSelectorSequences.length;
81 81
82 Selector clone() { 82 Selector clone() {
83 var simpleSequences = simpleSelectorSequences 83 var simpleSequences =
84 .map((ss) => ss.clone()) 84 simpleSelectorSequences.map((ss) => ss.clone()).toList();
85 .toList();
86 85
87 return new Selector(simpleSequences, span); 86 return new Selector(simpleSequences, span);
88 } 87 }
89 88
90 visit(VisitorBase visitor) => visitor.visitSelector(this); 89 visit(VisitorBase visitor) => visitor.visitSelector(this);
91 } 90 }
92 91
93 class SimpleSelectorSequence extends TreeNode { 92 class SimpleSelectorSequence extends TreeNode {
94 /** +, >, ~, NONE */ 93 /** +, >, ~, NONE */
95 int combinator; 94 int combinator;
96 final SimpleSelector simpleSelector; 95 final SimpleSelector simpleSelector;
97 96
98 SimpleSelectorSequence(this.simpleSelector, SourceSpan span, 97 SimpleSelectorSequence(this.simpleSelector, SourceSpan span,
99 [int combinator = TokenKind.COMBINATOR_NONE]) 98 [int combinator = TokenKind.COMBINATOR_NONE])
100 : combinator = combinator, super(span); 99 : combinator = combinator,
100 super(span);
101 101
102 bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; 102 bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
103 bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; 103 bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
104 bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER; 104 bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER;
105 bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE; 105 bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE;
106 bool get isCombinatorDescendant => 106 bool get isCombinatorDescendant =>
107 combinator == TokenKind.COMBINATOR_DESCENDANT; 107 combinator == TokenKind.COMBINATOR_DESCENDANT;
108 108
109 String get _combinatorToString => 109 String get _combinatorToString => isCombinatorDescendant
110 isCombinatorDescendant ? ' ' : 110 ? ' '
111 isCombinatorPlus ? ' + ' : 111 : isCombinatorPlus
112 isCombinatorGreater ? ' > ' : 112 ? ' + '
113 isCombinatorTilde ? ' ~ ' : ''; 113 : isCombinatorGreater ? ' > ' : isCombinatorTilde ? ' ~ ' : '';
114 114
115 SimpleSelectorSequence clone() => 115 SimpleSelectorSequence clone() =>
116 new SimpleSelectorSequence(simpleSelector, span, combinator); 116 new SimpleSelectorSequence(simpleSelector, span, combinator);
117 117
118 visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); 118 visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
119 119
120 String toString() => simpleSelector.name; 120 String toString() => simpleSelector.name;
121 } 121 }
122 122
123 /* All other selectors (element, #id, .class, attribute, pseudo, negation, 123 /* All other selectors (element, #id, .class, attribute, pseudo, negation,
(...skipping 18 matching lines...) Expand all
142 ElementSelector(name, SourceSpan span) : super(name, span); 142 ElementSelector(name, SourceSpan span) : super(name, span);
143 visit(VisitorBase visitor) => visitor.visitElementSelector(this); 143 visit(VisitorBase visitor) => visitor.visitElementSelector(this);
144 144
145 ElementSelector clone() => new ElementSelector(_name, span); 145 ElementSelector clone() => new ElementSelector(_name, span);
146 146
147 String toString() => name; 147 String toString() => name;
148 } 148 }
149 149
150 // namespace|element 150 // namespace|element
151 class NamespaceSelector extends SimpleSelector { 151 class NamespaceSelector extends SimpleSelector {
152 final _namespace; // null, Wildcard or Identifier 152 final _namespace; // null, Wildcard or Identifier
153 153
154 NamespaceSelector(this._namespace, var name, SourceSpan span) 154 NamespaceSelector(this._namespace, var name, SourceSpan span)
155 : super(name, span); 155 : super(name, span);
156 156
157 String get namespace => 157 String get namespace =>
158 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; 158 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name;
159 159
160 bool get isNamespaceWildcard => _namespace is Wildcard; 160 bool get isNamespaceWildcard => _namespace is Wildcard;
161 161
162 SimpleSelector get nameAsSimpleSelector => _name; 162 SimpleSelector get nameAsSimpleSelector => _name;
163 163
164 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); 164 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
165 165
166 visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); 166 visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
167 167
168 String toString() => "$namespace|${nameAsSimpleSelector.name}"; 168 String toString() => "$namespace|${nameAsSimpleSelector.name}";
169 } 169 }
170 170
171 // [attr op value] 171 // [attr op value]
172 class AttributeSelector extends SimpleSelector { 172 class AttributeSelector extends SimpleSelector {
173 final int _op; 173 final int _op;
174 final _value; 174 final _value;
175 175
176 AttributeSelector(Identifier name, this._op, this._value, 176 AttributeSelector(Identifier name, this._op, this._value, SourceSpan span)
177 SourceSpan span) : super(name, span); 177 : super(name, span);
178 178
179 int get operatorKind => _op; 179 int get operatorKind => _op;
180 180
181 get value => _value; 181 get value => _value;
182 182
183 String matchOperator() { 183 String matchOperator() {
184 switch (_op) { 184 switch (_op) {
185 case TokenKind.EQUALS: 185 case TokenKind.EQUALS:
186 return '='; 186 return '=';
187 case TokenKind.INCLUDES: 187 case TokenKind.INCLUDES:
188 return '~='; 188 return '~=';
189 case TokenKind.DASH_MATCH: 189 case TokenKind.DASH_MATCH:
190 return '|='; 190 return '|=';
191 case TokenKind.PREFIX_MATCH: 191 case TokenKind.PREFIX_MATCH:
192 return '^='; 192 return '^=';
193 case TokenKind.SUFFIX_MATCH: 193 case TokenKind.SUFFIX_MATCH:
194 return '\$='; 194 return '\$=';
195 case TokenKind.SUBSTRING_MATCH: 195 case TokenKind.SUBSTRING_MATCH:
196 return '*='; 196 return '*=';
197 case TokenKind.NO_MATCH: 197 case TokenKind.NO_MATCH:
198 return ''; 198 return '';
199 } 199 }
200 } 200 }
201 201
202 // Return the TokenKind for operator used by visitAttributeSelector. 202 // Return the TokenKind for operator used by visitAttributeSelector.
203 String matchOperatorAsTokenString() { 203 String matchOperatorAsTokenString() {
204 switch (_op) { 204 switch (_op) {
205 case TokenKind.EQUALS: 205 case TokenKind.EQUALS:
206 return 'EQUALS'; 206 return 'EQUALS';
207 case TokenKind.INCLUDES: 207 case TokenKind.INCLUDES:
208 return 'INCLUDES'; 208 return 'INCLUDES';
209 case TokenKind.DASH_MATCH: 209 case TokenKind.DASH_MATCH:
210 return 'DASH_MATCH'; 210 return 'DASH_MATCH';
211 case TokenKind.PREFIX_MATCH: 211 case TokenKind.PREFIX_MATCH:
212 return 'PREFIX_MATCH'; 212 return 'PREFIX_MATCH';
213 case TokenKind.SUFFIX_MATCH: 213 case TokenKind.SUFFIX_MATCH:
214 return 'SUFFIX_MATCH'; 214 return 'SUFFIX_MATCH';
215 case TokenKind.SUBSTRING_MATCH: 215 case TokenKind.SUBSTRING_MATCH:
216 return 'SUBSTRING_MATCH'; 216 return 'SUBSTRING_MATCH';
217 } 217 }
218 } 218 }
219 219
220 String valueToString() { 220 String valueToString() {
221 if (_value != null) { 221 if (_value != null) {
222 if (_value is Identifier) { 222 if (_value is Identifier) {
223 return _value.name; 223 return _value.name;
224 } else { 224 } else {
225 return '"${_value}"'; 225 return '"${_value}"';
226 } 226 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 // :pseudoClassFunction(expression) 277 // :pseudoClassFunction(expression)
278 class PseudoClassFunctionSelector extends PseudoClassSelector { 278 class PseudoClassFunctionSelector extends PseudoClassSelector {
279 final SelectorExpression expression; 279 final SelectorExpression expression;
280 280
281 PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span) 281 PseudoClassFunctionSelector(Identifier name, this.expression, SourceSpan span)
282 : super(name, span); 282 : super(name, span);
283 283
284 PseudoClassFunctionSelector clone() => 284 PseudoClassFunctionSelector clone() =>
285 new PseudoClassFunctionSelector(_name, expression, span); 285 new PseudoClassFunctionSelector(_name, expression, span);
286 286
287 visit(VisitorBase visitor) => 287 visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
288 visitor.visitPseudoClassFunctionSelector(this);
289 } 288 }
290 289
291 // ::pseudoElementFunction(expression) 290 // ::pseudoElementFunction(expression)
292 class PseudoElementFunctionSelector extends PseudoElementSelector { 291 class PseudoElementFunctionSelector extends PseudoElementSelector {
293 final SelectorExpression expression; 292 final SelectorExpression expression;
294 293
295 PseudoElementFunctionSelector(Identifier name, this.expression, 294 PseudoElementFunctionSelector(
296 SourceSpan span) 295 Identifier name, this.expression, SourceSpan span)
297 : super(name, span); 296 : super(name, span);
298 297
299 PseudoElementFunctionSelector clone() => 298 PseudoElementFunctionSelector clone() =>
300 new PseudoElementFunctionSelector(_name, expression, span); 299 new PseudoElementFunctionSelector(_name, expression, span);
301 300
302 visit(VisitorBase visitor) => 301 visit(VisitorBase visitor) =>
303 visitor.visitPseudoElementFunctionSelector(this); 302 visitor.visitPseudoElementFunctionSelector(this);
304 } 303 }
305 304
306 class SelectorExpression extends TreeNode { 305 class SelectorExpression extends TreeNode {
307 final List<Expression> expressions; 306 final List<Expression> expressions;
308 307
309 SelectorExpression(this.expressions, SourceSpan span): super(span); 308 SelectorExpression(this.expressions, SourceSpan span) : super(span);
310 309
311 SelectorExpression clone() { 310 SelectorExpression clone() {
312 return new SelectorExpression( 311 return new SelectorExpression(
313 expressions.map((e) => e.clone()).toList(), span); 312 expressions.map((e) => e.clone()).toList(), span);
314 } 313 }
315 314
316 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); 315 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
317 } 316 }
318 317
319 // :NOT(negation_arg) 318 // :NOT(negation_arg)
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 var cloneDeclarationGroup = _declarationGroup.clone(); 379 var cloneDeclarationGroup = _declarationGroup.clone();
381 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); 380 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
382 } 381 }
383 382
384 visit(VisitorBase visitor) => visitor.visitRuleSet(this); 383 visit(VisitorBase visitor) => visitor.visitRuleSet(this);
385 } 384 }
386 385
387 class Directive extends TreeNode { 386 class Directive extends TreeNode {
388 Directive(SourceSpan span) : super(span); 387 Directive(SourceSpan span) : super(span);
389 388
390 bool get isBuiltIn => true; // Known CSS directive? 389 bool get isBuiltIn => true; // Known CSS directive?
391 bool get isExtension => false; // SCSS extension? 390 bool get isExtension => false; // SCSS extension?
392 391
393 Directive clone() => new Directive(span); 392 Directive clone() => new Directive(span);
394 visit(VisitorBase visitor) => visitor.visitDirective(this); 393 visit(VisitorBase visitor) => visitor.visitDirective(this);
395 } 394 }
396 395
397 class ImportDirective extends Directive { 396 class ImportDirective extends Directive {
398 /** import name specified. */ 397 /** import name specified. */
399 final String import; 398 final String import;
400 399
401 /** Any media queries for this import. */ 400 /** Any media queries for this import. */
(...skipping 15 matching lines...) Expand all
417 416
418 /** 417 /**
419 * MediaExpression grammar: 418 * MediaExpression grammar:
420 * '(' S* media_feature S* [ ':' S* expr ]? ')' S* 419 * '(' S* media_feature S* [ ':' S* expr ]? ')' S*
421 */ 420 */
422 class MediaExpression extends TreeNode { 421 class MediaExpression extends TreeNode {
423 final bool andOperator; 422 final bool andOperator;
424 final Identifier _mediaFeature; 423 final Identifier _mediaFeature;
425 final Expressions exprs; 424 final Expressions exprs;
426 425
427 MediaExpression(this.andOperator, this._mediaFeature, this.exprs, 426 MediaExpression(
428 SourceSpan span) 427 this.andOperator, this._mediaFeature, this.exprs, SourceSpan span)
429 : super(span); 428 : super(span);
430 429
431 String get mediaFeature => _mediaFeature.name; 430 String get mediaFeature => _mediaFeature.name;
432 431
433 MediaExpression clone() { 432 MediaExpression clone() {
434 var clonedExprs = exprs.clone(); 433 var clonedExprs = exprs.clone();
435 return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); 434 return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
436 } 435 }
437 436
438 visit(VisitorBase visitor) => visitor.visitMediaExpression(this); 437 visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
439 } 438 }
440 439
441 /** 440 /**
442 * MediaQuery grammar: 441 * MediaQuery grammar:
443 * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]* 442 * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]*
444 * | media_expression [ AND S* media_expression ]* 443 * | media_expression [ AND S* media_expression ]*
445 * media_type 444 * media_type
446 * : IDENT 445 * : IDENT
447 * media_expression 446 * media_expression
448 * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* 447 * : '(' S* media_feature S* [ ':' S* expr ]? ')' S*
449 * media_feature 448 * media_feature
450 * : IDENT 449 * : IDENT
451 */ 450 */
452 class MediaQuery extends TreeNode { 451 class MediaQuery extends TreeNode {
453 /** not, only or no operator. */ 452 /** not, only or no operator. */
454 final int _mediaUnary; 453 final int _mediaUnary;
455 final Identifier _mediaType; 454 final Identifier _mediaType;
456 final List<MediaExpression> expressions; 455 final List<MediaExpression> expressions;
457 456
458 MediaQuery(this._mediaUnary, this._mediaType, this.expressions, 457 MediaQuery(
459 SourceSpan span) 458 this._mediaUnary, this._mediaType, this.expressions, SourceSpan span)
460 : super(span); 459 : super(span);
461 460
462 bool get hasMediaType => _mediaType != null; 461 bool get hasMediaType => _mediaType != null;
463 String get mediaType => _mediaType.name; 462 String get mediaType => _mediaType.name;
464 463
465 bool get hasUnary => _mediaUnary != -1; 464 bool get hasUnary => _mediaUnary != -1;
466 String get unary => 465 String get unary =>
467 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); 466 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
468 467
469 MediaQuery clone() { 468 MediaQuery clone() {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 } 511 }
513 512
514 visit(VisitorBase visitor) => visitor.visitHostDirective(this); 513 visit(VisitorBase visitor) => visitor.visitHostDirective(this);
515 } 514 }
516 515
517 class PageDirective extends Directive { 516 class PageDirective extends Directive {
518 final String _ident; 517 final String _ident;
519 final String _pseudoPage; 518 final String _pseudoPage;
520 final List<DeclarationGroup> _declsMargin; 519 final List<DeclarationGroup> _declsMargin;
521 520
522 PageDirective(this._ident, this._pseudoPage, this._declsMargin, 521 PageDirective(
523 SourceSpan span) : super(span); 522 this._ident, this._pseudoPage, this._declsMargin, SourceSpan span)
523 : super(span);
524 524
525 PageDirective clone() { 525 PageDirective clone() {
526 var cloneDeclsMargin = []; 526 var cloneDeclsMargin = [];
527 for (var declMargin in _declsMargin) { 527 for (var declMargin in _declsMargin) {
528 cloneDeclsMargin.add(declMargin.clone()); 528 cloneDeclsMargin.add(declMargin.clone());
529 } 529 }
530 return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); 530 return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
531 } 531 }
532 532
533 visit(VisitorBase visitor) => visitor.visitPageDirective(this); 533 visit(VisitorBase visitor) => visitor.visitPageDirective(this);
(...skipping 12 matching lines...) Expand all
546 546
547 class KeyFrameDirective extends Directive { 547 class KeyFrameDirective extends Directive {
548 /* 548 /*
549 * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. 549 * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-.
550 */ 550 */
551 final int _keyframeName; 551 final int _keyframeName;
552 final name; 552 final name;
553 final List<KeyFrameBlock> _blocks; 553 final List<KeyFrameBlock> _blocks;
554 554
555 KeyFrameDirective(this._keyframeName, this.name, SourceSpan span) 555 KeyFrameDirective(this._keyframeName, this.name, SourceSpan span)
556 : _blocks = [], super(span); 556 : _blocks = [],
557 super(span);
557 558
558 add(KeyFrameBlock block) { 559 add(KeyFrameBlock block) {
559 _blocks.add(block); 560 _blocks.add(block);
560 } 561 }
561 562
562 String get keyFrameName { 563 String get keyFrameName {
563 switch (_keyframeName) { 564 switch (_keyframeName) {
564 case TokenKind.DIRECTIVE_KEYFRAMES: 565 case TokenKind.DIRECTIVE_KEYFRAMES:
565 case TokenKind.DIRECTIVE_MS_KEYFRAMES: 566 case TokenKind.DIRECTIVE_MS_KEYFRAMES:
566 return '@keyframes'; 567 return '@keyframes';
567 case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: return '@-webkit-keyframes'; 568 case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES:
568 case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: return '@-moz-keyframes'; 569 return '@-webkit-keyframes';
569 case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes'; 570 case TokenKind.DIRECTIVE_MOZ_KEYFRAMES:
571 return '@-moz-keyframes';
572 case TokenKind.DIRECTIVE_O_KEYFRAMES:
573 return '@-o-keyframes';
570 } 574 }
571 } 575 }
572 576
573 KeyFrameDirective clone() { 577 KeyFrameDirective clone() {
574 var cloneBlocks = []; 578 var cloneBlocks = [];
575 for (var block in _blocks) { 579 for (var block in _blocks) {
576 cloneBlocks.add(block.clone()); 580 cloneBlocks.add(block.clone());
577 } 581 }
578 return new KeyFrameDirective(_keyframeName, cloneBlocks, span); 582 return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
579 } 583 }
(...skipping 20 matching lines...) Expand all
600 FontFaceDirective clone() => 604 FontFaceDirective clone() =>
601 new FontFaceDirective(_declarations.clone(), span); 605 new FontFaceDirective(_declarations.clone(), span);
602 visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); 606 visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
603 } 607 }
604 608
605 class StyletDirective extends Directive { 609 class StyletDirective extends Directive {
606 final String dartClassName; 610 final String dartClassName;
607 final List<RuleSet> rulesets; 611 final List<RuleSet> rulesets;
608 612
609 StyletDirective(this.dartClassName, this.rulesets, SourceSpan span) 613 StyletDirective(this.dartClassName, this.rulesets, SourceSpan span)
610 : super(span); 614 : super(span);
611 615
612 bool get isBuiltIn => false; 616 bool get isBuiltIn => false;
613 bool get isExtension => true; 617 bool get isExtension => true;
614 618
615 StyletDirective clone() { 619 StyletDirective clone() {
616 var cloneRulesets = []; 620 var cloneRulesets = [];
617 for (var ruleset in rulesets) { 621 for (var ruleset in rulesets) {
618 cloneRulesets.add(ruleset.clone()); 622 cloneRulesets.add(ruleset.clone());
619 } 623 }
620 return new StyletDirective(dartClassName, cloneRulesets, span); 624 return new StyletDirective(dartClassName, cloneRulesets, span);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 } 672 }
669 673
670 visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); 674 visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
671 } 675 }
672 676
673 /** Support a Sass @mixin. See http://sass-lang.com for description. */ 677 /** Support a Sass @mixin. See http://sass-lang.com for description. */
674 class MixinRulesetDirective extends MixinDefinition { 678 class MixinRulesetDirective extends MixinDefinition {
675 final List<RuleSet> rulesets; 679 final List<RuleSet> rulesets;
676 680
677 MixinRulesetDirective(String name, List<VarDefinitionDirective> args, 681 MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
678 bool varArgs, this.rulesets, SourceSpan span) : 682 bool varArgs, this.rulesets, SourceSpan span)
679 super(name, args, varArgs, span); 683 : super(name, args, varArgs, span);
680 684
681 MixinRulesetDirective clone() { 685 MixinRulesetDirective clone() {
682 var clonedArgs = []; 686 var clonedArgs = [];
683 for (var arg in definedArgs) { 687 for (var arg in definedArgs) {
684 clonedArgs.add(arg.clone()); 688 clonedArgs.add(arg.clone());
685 } 689 }
686 var clonedRulesets = []; 690 var clonedRulesets = [];
687 for (var ruleset in rulesets) { 691 for (var ruleset in rulesets) {
688 clonedRulesets.add(ruleset.clone()); 692 clonedRulesets.add(ruleset.clone());
689 } 693 }
690 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, 694 return new MixinRulesetDirective(
691 span); 695 name, clonedArgs, varArgs, clonedRulesets, span);
692 } 696 }
693 697
694 visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); 698 visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
695 } 699 }
696 700
697 class MixinDeclarationDirective extends MixinDefinition { 701 class MixinDeclarationDirective extends MixinDefinition {
698 final DeclarationGroup declarations; 702 final DeclarationGroup declarations;
699 703
700 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args, 704 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
701 bool varArgs, this.declarations, SourceSpan span) : 705 bool varArgs, this.declarations, SourceSpan span)
702 super(name, args, varArgs, span); 706 : super(name, args, varArgs, span);
703 707
704 MixinDeclarationDirective clone() { 708 MixinDeclarationDirective clone() {
705 var clonedArgs = []; 709 var clonedArgs = [];
706 for (var arg in definedArgs) { 710 for (var arg in definedArgs) {
707 clonedArgs.add(arg.clone()); 711 clonedArgs.add(arg.clone());
708 } 712 }
709 return new MixinDeclarationDirective(name, clonedArgs, varArgs, 713 return new MixinDeclarationDirective(
710 declarations.clone(), span); 714 name, clonedArgs, varArgs, declarations.clone(), span);
711 } 715 }
712 716
713 visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); 717 visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
714 } 718 }
715 719
716 /** To support consuming a SASS mixin @include. */ 720 /** To support consuming a SASS mixin @include. */
717 class IncludeDirective extends Directive { 721 class IncludeDirective extends Directive {
718 final String name; 722 final String name;
719 final List<List<TreeNode>> args; 723 final List<List<TreeNode>> args;
720 724
(...skipping 30 matching lines...) Expand all
751 * IE CSS hacks that can only be read by a particular IE version. 755 * IE CSS hacks that can only be read by a particular IE version.
752 * 7 implies IE 7 or older property (e.g., *background: blue;) 756 * 7 implies IE 7 or older property (e.g., *background: blue;)
753 * Note: IE 8 or older property (e.g., background: green\9;) is handled 757 * Note: IE 8 or older property (e.g., background: green\9;) is handled
754 * by IE8Term in declaration expression handling. 758 * by IE8Term in declaration expression handling.
755 * Note: IE 6 only property with a leading underscore is a valid IDENT 759 * Note: IE 6 only property with a leading underscore is a valid IDENT
756 * since an ident can start with underscore (e.g., _background: red;) 760 * since an ident can start with underscore (e.g., _background: red;)
757 */ 761 */
758 final bool isIE7; 762 final bool isIE7;
759 763
760 Declaration(this._property, this._expression, this.dartStyle, SourceSpan span, 764 Declaration(this._property, this._expression, this.dartStyle, SourceSpan span,
761 {important: false, ie7: false}) 765 {important: false, ie7: false})
762 : this.important = important, this.isIE7 = ie7, super(span); 766 : this.important = important,
767 this.isIE7 = ie7,
768 super(span);
763 769
764 String get property => isIE7 ? '*${_property.name}' : _property.name; 770 String get property => isIE7 ? '*${_property.name}' : _property.name;
765 Expression get expression => _expression; 771 Expression get expression => _expression;
766 772
767 bool get hasDartStyle => dartStyle != null; 773 bool get hasDartStyle => dartStyle != null;
768 774
769 Declaration clone() => 775 Declaration clone() => new Declaration(
770 new Declaration(_property.clone(), _expression.clone(), dartStyle, span, 776 _property.clone(), _expression.clone(), dartStyle, span,
771 important: important); 777 important: important);
772 778
773 visit(VisitorBase visitor) => visitor.visitDeclaration(this); 779 visit(VisitorBase visitor) => visitor.visitDeclaration(this);
774 } 780 }
775 781
776 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and 782 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
777 // dynamic when in a declaration. Currently, Less syntax 783 // dynamic when in a declaration. Currently, Less syntax
778 // '@foo: expression' and 'var-foo: expression' in a declaration 784 // '@foo: expression' and 'var-foo: expression' in a declaration
779 // are statically resolved. Better solution, if @foo or var-foo 785 // are statically resolved. Better solution, if @foo or var-foo
780 // are top-level are then statically resolved and var-foo in a 786 // are top-level are then statically resolved and var-foo in a
781 // declaration group (surrounded by a selector) would be dynamic. 787 // declaration group (surrounded by a selector) would be dynamic.
782 class VarDefinition extends Declaration { 788 class VarDefinition extends Declaration {
783 bool badUsage = false; 789 bool badUsage = false;
784 790
785 VarDefinition(Identifier definedName, Expression expr, SourceSpan span) 791 VarDefinition(Identifier definedName, Expression expr, SourceSpan span)
786 : super(definedName, expr, null, span); 792 : super(definedName, expr, null, span);
787 793
788 String get definedName => _property.name; 794 String get definedName => _property.name;
789 795
790 VarDefinition clone() => 796 VarDefinition clone() => new VarDefinition(
791 new VarDefinition(_property.clone(), 797 _property.clone(), expression != null ? expression.clone() : null, span);
792 expression != null ? expression.clone() : null, span);
793 798
794 visit(VisitorBase visitor) => visitor.visitVarDefinition(this); 799 visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
795 } 800 }
796 801
797 /** 802 /**
798 * Node for usage of @include mixin[(args,...)] found in a declaration group 803 * Node for usage of @include mixin[(args,...)] found in a declaration group
799 * instead of at a ruleset (toplevel) e.g., 804 * instead of at a ruleset (toplevel) e.g.,
800 * div { 805 * div {
801 * @include mixin1; 806 * @include mixin1;
802 * } 807 * }
803 */ 808 */
804 class IncludeMixinAtDeclaration extends Declaration { 809 class IncludeMixinAtDeclaration extends Declaration {
805 final IncludeDirective include; 810 final IncludeDirective include;
806 811
807 IncludeMixinAtDeclaration(this.include, SourceSpan span) 812 IncludeMixinAtDeclaration(this.include, SourceSpan span)
808 : super(null, null, null, span); 813 : super(null, null, null, span);
809 814
810 IncludeMixinAtDeclaration clone() => 815 IncludeMixinAtDeclaration clone() =>
811 new IncludeMixinAtDeclaration(include.clone(), span); 816 new IncludeMixinAtDeclaration(include.clone(), span);
812 817
813 visit(VisitorBase visitor) => 818 visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
814 visitor.visitIncludeMixinAtDeclaration(this);
815 } 819 }
816 820
817 class ExtendDeclaration extends Declaration { 821 class ExtendDeclaration extends Declaration {
818 final List<TreeNode> selectors; 822 final List<TreeNode> selectors;
819 823
820 ExtendDeclaration(this.selectors, SourceSpan span) : 824 ExtendDeclaration(this.selectors, SourceSpan span)
821 super(null, null, null, span); 825 : super(null, null, null, span);
822 826
823 ExtendDeclaration clone() { 827 ExtendDeclaration clone() {
824 var newSelector = selectors.map((s) => s.clone()).toList(); 828 var newSelector = selectors.map((s) => s.clone()).toList();
825 return new ExtendDeclaration(newSelector, span); 829 return new ExtendDeclaration(newSelector, span);
826 } 830 }
827 831
828 visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); 832 visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
829 } 833 }
830 834
831 class DeclarationGroup extends TreeNode { 835 class DeclarationGroup extends TreeNode {
832 /** Can be either Declaration or RuleSet (if nested selector). */ 836 /** Can be either Declaration or RuleSet (if nested selector). */
833 final List declarations; 837 final List declarations;
834 838
835 DeclarationGroup(this.declarations, SourceSpan span) : super(span); 839 DeclarationGroup(this.declarations, SourceSpan span) : super(span);
836 840
837 DeclarationGroup clone() { 841 DeclarationGroup clone() {
838 var clonedDecls = declarations.map((d) => d.clone()).toList(); 842 var clonedDecls = declarations.map((d) => d.clone()).toList();
839 return new DeclarationGroup(clonedDecls, span); 843 return new DeclarationGroup(clonedDecls, span);
840 } 844 }
841 845
842 visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); 846 visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
843 } 847 }
844 848
845 class MarginGroup extends DeclarationGroup { 849 class MarginGroup extends DeclarationGroup {
846 final int margin_sym; // TokenType for for @margin sym. 850 final int margin_sym; // TokenType for for @margin sym.
847 851
848 MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span) 852 MarginGroup(this.margin_sym, List<Declaration> decls, SourceSpan span)
849 : super(decls, span); 853 : super(decls, span);
850 MarginGroup clone() => 854 MarginGroup clone() =>
851 new MarginGroup(margin_sym, super.clone() as dynamic, span); 855 new MarginGroup(margin_sym, super.clone() as dynamic, span);
852 visit(VisitorBase visitor) => visitor.visitMarginGroup(this); 856 visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
853 } 857 }
854 858
855 class VarUsage extends Expression { 859 class VarUsage extends Expression {
856 final String name; 860 final String name;
857 final List<Expression> defaultValues; 861 final List<Expression> defaultValues;
858 862
859 VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span); 863 VarUsage(this.name, this.defaultValues, SourceSpan span) : super(span);
860 864
861 VarUsage clone() { 865 VarUsage clone() {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 939
936 visit(VisitorBase visitor) => visitor.visitUnitTerm(this); 940 visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
937 941
938 String unitToString() => TokenKind.unitToString(unit); 942 String unitToString() => TokenKind.unitToString(unit);
939 943
940 String toString() => '$text${unitToString()}'; 944 String toString() => '$text${unitToString()}';
941 } 945 }
942 946
943 class LengthTerm extends UnitTerm { 947 class LengthTerm extends UnitTerm {
944 LengthTerm(value, String t, SourceSpan span, 948 LengthTerm(value, String t, SourceSpan span,
945 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 949 [int unit = TokenKind.UNIT_LENGTH_PX])
950 : super(value, t, span, unit) {
946 assert(this.unit == TokenKind.UNIT_LENGTH_PX || 951 assert(this.unit == TokenKind.UNIT_LENGTH_PX ||
947 this.unit == TokenKind.UNIT_LENGTH_CM || 952 this.unit == TokenKind.UNIT_LENGTH_CM ||
948 this.unit == TokenKind.UNIT_LENGTH_MM || 953 this.unit == TokenKind.UNIT_LENGTH_MM ||
949 this.unit == TokenKind.UNIT_LENGTH_IN || 954 this.unit == TokenKind.UNIT_LENGTH_IN ||
950 this.unit == TokenKind.UNIT_LENGTH_PT || 955 this.unit == TokenKind.UNIT_LENGTH_PT ||
951 this.unit == TokenKind.UNIT_LENGTH_PC); 956 this.unit == TokenKind.UNIT_LENGTH_PC);
952 } 957 }
953 LengthTerm clone() => new LengthTerm(value, text, span, unit); 958 LengthTerm clone() => new LengthTerm(value, text, span, unit);
954 visit(VisitorBase visitor) => visitor.visitLengthTerm(this); 959 visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
955 } 960 }
(...skipping 11 matching lines...) Expand all
967 } 972 }
968 973
969 class ExTerm extends LiteralTerm { 974 class ExTerm extends LiteralTerm {
970 ExTerm(value, String t, SourceSpan span) : super(value, t, span); 975 ExTerm(value, String t, SourceSpan span) : super(value, t, span);
971 ExTerm clone() => new ExTerm(value, text, span); 976 ExTerm clone() => new ExTerm(value, text, span);
972 visit(VisitorBase visitor) => visitor.visitExTerm(this); 977 visit(VisitorBase visitor) => visitor.visitExTerm(this);
973 } 978 }
974 979
975 class AngleTerm extends UnitTerm { 980 class AngleTerm extends UnitTerm {
976 AngleTerm(var value, String t, SourceSpan span, 981 AngleTerm(var value, String t, SourceSpan span,
977 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 982 [int unit = TokenKind.UNIT_LENGTH_PX])
983 : super(value, t, span, unit) {
978 assert(this.unit == TokenKind.UNIT_ANGLE_DEG || 984 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
979 this.unit == TokenKind.UNIT_ANGLE_RAD || 985 this.unit == TokenKind.UNIT_ANGLE_RAD ||
980 this.unit == TokenKind.UNIT_ANGLE_GRAD || 986 this.unit == TokenKind.UNIT_ANGLE_GRAD ||
981 this.unit == TokenKind.UNIT_ANGLE_TURN); 987 this.unit == TokenKind.UNIT_ANGLE_TURN);
982 } 988 }
983 989
984 AngleTerm clone() => new AngleTerm(value, text, span, unit); 990 AngleTerm clone() => new AngleTerm(value, text, span, unit);
985 visit(VisitorBase visitor) => visitor.visitAngleTerm(this); 991 visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
986 } 992 }
987 993
988 class TimeTerm extends UnitTerm { 994 class TimeTerm extends UnitTerm {
989 TimeTerm(var value, String t, SourceSpan span, 995 TimeTerm(var value, String t, SourceSpan span,
990 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 996 [int unit = TokenKind.UNIT_LENGTH_PX])
997 : super(value, t, span, unit) {
991 assert(this.unit == TokenKind.UNIT_ANGLE_DEG || 998 assert(this.unit == TokenKind.UNIT_ANGLE_DEG ||
992 this.unit == TokenKind.UNIT_TIME_MS || 999 this.unit == TokenKind.UNIT_TIME_MS ||
993 this.unit == TokenKind.UNIT_TIME_S); 1000 this.unit == TokenKind.UNIT_TIME_S);
994 } 1001 }
995 1002
996 TimeTerm clone() => new TimeTerm(value, text, span, unit); 1003 TimeTerm clone() => new TimeTerm(value, text, span, unit);
997 visit(VisitorBase visitor) => visitor.visitTimeTerm(this); 1004 visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
998 } 1005 }
999 1006
1000 class FreqTerm extends UnitTerm { 1007 class FreqTerm extends UnitTerm {
1001 FreqTerm(var value, String t, SourceSpan span, 1008 FreqTerm(var value, String t, SourceSpan span,
1002 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1009 [int unit = TokenKind.UNIT_LENGTH_PX])
1010 : super(value, t, span, unit) {
1003 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ); 1011 assert(unit == TokenKind.UNIT_FREQ_HZ || unit == TokenKind.UNIT_FREQ_KHZ);
1004 } 1012 }
1005 1013
1006 FreqTerm clone() => new FreqTerm(value, text, span, unit); 1014 FreqTerm clone() => new FreqTerm(value, text, span, unit);
1007 visit(VisitorBase visitor) => visitor.visitFreqTerm(this); 1015 visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
1008 } 1016 }
1009 1017
1010 class FractionTerm extends LiteralTerm { 1018 class FractionTerm extends LiteralTerm {
1011 FractionTerm(var value, String t, SourceSpan span) : super(value, t, span); 1019 FractionTerm(var value, String t, SourceSpan span) : super(value, t, span);
1012 1020
1013 FractionTerm clone() => new FractionTerm(value, text, span); 1021 FractionTerm clone() => new FractionTerm(value, text, span);
1014 visit(VisitorBase visitor) => visitor.visitFractionTerm(this); 1022 visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
1015 } 1023 }
1016 1024
1017 class UriTerm extends LiteralTerm { 1025 class UriTerm extends LiteralTerm {
1018 UriTerm(String value, SourceSpan span) : super(value, value, span); 1026 UriTerm(String value, SourceSpan span) : super(value, value, span);
1019 1027
1020 UriTerm clone() => new UriTerm(value, span); 1028 UriTerm clone() => new UriTerm(value, span);
1021 visit(VisitorBase visitor) => visitor.visitUriTerm(this); 1029 visit(VisitorBase visitor) => visitor.visitUriTerm(this);
1022 } 1030 }
1023 1031
1024 class ResolutionTerm extends UnitTerm { 1032 class ResolutionTerm extends UnitTerm {
1025 ResolutionTerm(var value, String t, SourceSpan span, 1033 ResolutionTerm(var value, String t, SourceSpan span,
1026 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1034 [int unit = TokenKind.UNIT_LENGTH_PX])
1035 : super(value, t, span, unit) {
1027 assert(unit == TokenKind.UNIT_RESOLUTION_DPI || 1036 assert(unit == TokenKind.UNIT_RESOLUTION_DPI ||
1028 unit == TokenKind.UNIT_RESOLUTION_DPCM || 1037 unit == TokenKind.UNIT_RESOLUTION_DPCM ||
1029 unit == TokenKind.UNIT_RESOLUTION_DPPX); 1038 unit == TokenKind.UNIT_RESOLUTION_DPPX);
1030 } 1039 }
1031 1040
1032 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); 1041 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
1033 visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); 1042 visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
1034 } 1043 }
1035 1044
1036 class ChTerm extends UnitTerm { 1045 class ChTerm extends UnitTerm {
1037 ChTerm(var value, String t, SourceSpan span, 1046 ChTerm(var value, String t, SourceSpan span,
1038 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1047 [int unit = TokenKind.UNIT_LENGTH_PX])
1048 : super(value, t, span, unit) {
1039 assert(unit == TokenKind.UNIT_CH); 1049 assert(unit == TokenKind.UNIT_CH);
1040 } 1050 }
1041 1051
1042 ChTerm clone() => new ChTerm(value, text, span, unit); 1052 ChTerm clone() => new ChTerm(value, text, span, unit);
1043 visit(VisitorBase visitor) => visitor.visitChTerm(this); 1053 visit(VisitorBase visitor) => visitor.visitChTerm(this);
1044 } 1054 }
1045 1055
1046 class RemTerm extends UnitTerm { 1056 class RemTerm extends UnitTerm {
1047 RemTerm(var value, String t, SourceSpan span, 1057 RemTerm(var value, String t, SourceSpan span,
1048 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1058 [int unit = TokenKind.UNIT_LENGTH_PX])
1059 : super(value, t, span, unit) {
1049 assert(unit == TokenKind.UNIT_REM); 1060 assert(unit == TokenKind.UNIT_REM);
1050 } 1061 }
1051 1062
1052 RemTerm clone() => new RemTerm(value, text, span, unit); 1063 RemTerm clone() => new RemTerm(value, text, span, unit);
1053 visit(VisitorBase visitor) => visitor.visitRemTerm(this); 1064 visit(VisitorBase visitor) => visitor.visitRemTerm(this);
1054 } 1065 }
1055 1066
1056 class ViewportTerm extends UnitTerm { 1067 class ViewportTerm extends UnitTerm {
1057 ViewportTerm(var value, String t, SourceSpan span, 1068 ViewportTerm(var value, String t, SourceSpan span,
1058 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1069 [int unit = TokenKind.UNIT_LENGTH_PX])
1070 : super(value, t, span, unit) {
1059 assert(unit == TokenKind.UNIT_VIEWPORT_VW || 1071 assert(unit == TokenKind.UNIT_VIEWPORT_VW ||
1060 unit == TokenKind.UNIT_VIEWPORT_VH || 1072 unit == TokenKind.UNIT_VIEWPORT_VH ||
1061 unit == TokenKind.UNIT_VIEWPORT_VMIN || 1073 unit == TokenKind.UNIT_VIEWPORT_VMIN ||
1062 unit == TokenKind.UNIT_VIEWPORT_VMAX); 1074 unit == TokenKind.UNIT_VIEWPORT_VMAX);
1063 } 1075 }
1064 1076
1065 ViewportTerm clone() => new ViewportTerm(value, text, span, unit); 1077 ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
1066 visit(VisitorBase visitor) => visitor.visitViewportTerm(this); 1078 visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
1067 } 1079 }
1068 1080
1069 /** Type to signal a bad hex value for HexColorTerm.value. */ 1081 /** Type to signal a bad hex value for HexColorTerm.value. */
1070 class BAD_HEX_VALUE { } 1082 class BAD_HEX_VALUE {}
1071 1083
1072 class HexColorTerm extends LiteralTerm { 1084 class HexColorTerm extends LiteralTerm {
1073 HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span); 1085 HexColorTerm(var value, String t, SourceSpan span) : super(value, t, span);
1074 1086
1075 HexColorTerm clone() => new HexColorTerm(value, text, span); 1087 HexColorTerm clone() => new HexColorTerm(value, text, span);
1076 visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); 1088 visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
1077 } 1089 }
1078 1090
1079 class FunctionTerm extends LiteralTerm { 1091 class FunctionTerm extends LiteralTerm {
1080 final Expressions _params; 1092 final Expressions _params;
(...skipping 12 matching lines...) Expand all
1093 */ 1105 */
1094 class IE8Term extends LiteralTerm { 1106 class IE8Term extends LiteralTerm {
1095 IE8Term(SourceSpan span) : super('\\9', '\\9', span); 1107 IE8Term(SourceSpan span) : super('\\9', '\\9', span);
1096 IE8Term clone() => new IE8Term(span); 1108 IE8Term clone() => new IE8Term(span);
1097 visit(VisitorBase visitor) => visitor.visitIE8Term(this); 1109 visit(VisitorBase visitor) => visitor.visitIE8Term(this);
1098 } 1110 }
1099 1111
1100 class GroupTerm extends Expression { 1112 class GroupTerm extends Expression {
1101 final List<LiteralTerm> _terms; 1113 final List<LiteralTerm> _terms;
1102 1114
1103 GroupTerm(SourceSpan span) : _terms = [], super(span); 1115 GroupTerm(SourceSpan span)
1116 : _terms = [],
1117 super(span);
1104 1118
1105 void add(LiteralTerm term) { 1119 void add(LiteralTerm term) {
1106 _terms.add(term); 1120 _terms.add(term);
1107 } 1121 }
1108 1122
1109 GroupTerm clone() => new GroupTerm(span); 1123 GroupTerm clone() => new GroupTerm(span);
1110 visit(VisitorBase visitor) => visitor.visitGroupTerm(this); 1124 visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
1111 } 1125 }
1112 1126
1113 class ItemTerm extends NumberTerm { 1127 class ItemTerm extends NumberTerm {
1114 ItemTerm(var value, String t, SourceSpan span) : super(value, t, span); 1128 ItemTerm(var value, String t, SourceSpan span) : super(value, t, span);
1115 1129
1116 ItemTerm clone() => new ItemTerm(value, text, span); 1130 ItemTerm clone() => new ItemTerm(value, text, span);
1117 visit(VisitorBase visitor) => visitor.visitItemTerm(this); 1131 visit(VisitorBase visitor) => visitor.visitItemTerm(this);
1118 } 1132 }
1119 1133
1120 class Expressions extends Expression { 1134 class Expressions extends Expression {
1121 final List<Expression> expressions = []; 1135 final List<Expression> expressions = [];
1122 1136
1123 Expressions(SourceSpan span): super(span); 1137 Expressions(SourceSpan span) : super(span);
1124 1138
1125 void add(Expression expression) { 1139 void add(Expression expression) {
1126 expressions.add(expression); 1140 expressions.add(expression);
1127 } 1141 }
1128 1142
1129 Expressions clone() { 1143 Expressions clone() {
1130 var clonedExprs = new Expressions(span); 1144 var clonedExprs = new Expressions(span);
1131 for (var expr in expressions) { 1145 for (var expr in expressions) {
1132 clonedExprs.add(expr.clone()); 1146 clonedExprs.add(expr.clone());
1133 } 1147 }
1134 return clonedExprs; 1148 return clonedExprs;
1135 } 1149 }
1136 visit(VisitorBase visitor) => visitor.visitExpressions(this); 1150 visit(VisitorBase visitor) => visitor.visitExpressions(this);
1137 } 1151 }
1138 1152
1139 class BinaryExpression extends Expression { 1153 class BinaryExpression extends Expression {
1140 final Token op; 1154 final Token op;
1141 final Expression x; 1155 final Expression x;
1142 final Expression y; 1156 final Expression y;
1143 1157
1144 BinaryExpression(this.op, this.x, this.y, SourceSpan span): super(span); 1158 BinaryExpression(this.op, this.x, this.y, SourceSpan span) : super(span);
1145 1159
1146 BinaryExpression clone() => 1160 BinaryExpression clone() =>
1147 new BinaryExpression(op, x.clone(), y.clone(), span); 1161 new BinaryExpression(op, x.clone(), y.clone(), span);
1148 visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); 1162 visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
1149 } 1163 }
1150 1164
1151 class UnaryExpression extends Expression { 1165 class UnaryExpression extends Expression {
1152 final Token op; 1166 final Token op;
1153 final Expression self; 1167 final Expression self;
1154 1168
1155 UnaryExpression(this.op, this.self, SourceSpan span): super(span); 1169 UnaryExpression(this.op, this.self, SourceSpan span) : super(span);
1156 1170
1157 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); 1171 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
1158 visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); 1172 visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
1159 } 1173 }
1160 1174
1161 abstract class DartStyleExpression extends TreeNode { 1175 abstract class DartStyleExpression extends TreeNode {
1162 static const int unknownType = 0; 1176 static const int unknownType = 0;
1163 static const int fontStyle = 1; 1177 static const int fontStyle = 1;
1164 static const int marginStyle = 2; 1178 static const int marginStyle = 2;
1165 static const int borderStyle = 3; 1179 static const int borderStyle = 3;
(...skipping 27 matching lines...) Expand all
1193 visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this); 1207 visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
1194 } 1208 }
1195 1209
1196 class FontExpression extends DartStyleExpression { 1210 class FontExpression extends DartStyleExpression {
1197 final Font font; 1211 final Font font;
1198 1212
1199 // font-style font-variant font-weight font-size/line-height font-family 1213 // font-style font-variant font-weight font-size/line-height font-family
1200 // TODO(terry): Only px/pt for now need to handle all possible units to 1214 // TODO(terry): Only px/pt for now need to handle all possible units to
1201 // support calc expressions on units. 1215 // support calc expressions on units.
1202 FontExpression(SourceSpan span, {dynamic size, List<String> family, 1216 FontExpression(SourceSpan span, {dynamic size, List<String> family,
1203 int weight, String style, String variant, LineHeight lineHeight}) : 1217 int weight, String style, String variant, LineHeight lineHeight})
1204 font = new Font(size : size is LengthTerm ? size.value : size, 1218 : font = new Font(
1205 family: family, weight: weight, style: style, variant: variant, 1219 size: size is LengthTerm ? size.value : size,
1206 lineHeight: lineHeight), 1220 family: family,
1221 weight: weight,
1222 style: style,
1223 variant: variant,
1224 lineHeight: lineHeight),
1207 super(DartStyleExpression.fontStyle, span); 1225 super(DartStyleExpression.fontStyle, span);
1208 1226
1209 FontExpression merged(DartStyleExpression newFontExpr) { 1227 FontExpression merged(DartStyleExpression newFontExpr) {
1210 if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) { 1228 if (newFontExpr is FontExpression && this.isFont && newFontExpr.isFont) {
1211 return new FontExpression.merge(this, newFontExpr); 1229 return new FontExpression.merge(this, newFontExpr);
1212 } 1230 }
1213 return null; 1231 return null;
1214 } 1232 }
1215 1233
1216 /** 1234 /**
1217 * Merge the two FontExpression and return the result. 1235 * Merge the two FontExpression and return the result.
1218 */ 1236 */
1219 factory FontExpression.merge(FontExpression x, FontExpression y) { 1237 factory FontExpression.merge(FontExpression x, FontExpression y) {
1220 return new FontExpression._merge(x, y, y.span); 1238 return new FontExpression._merge(x, y, y.span);
1221 } 1239 }
1222 1240
1223 FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span) 1241 FontExpression._merge(FontExpression x, FontExpression y, SourceSpan span)
1224 : font = new Font.merge(x.font, y.font), 1242 : font = new Font.merge(x.font, y.font),
1225 super(DartStyleExpression.fontStyle, span); 1243 super(DartStyleExpression.fontStyle, span);
1226 1244
1227 FontExpression clone() => 1245 FontExpression clone() => new FontExpression(span,
1228 new FontExpression(span, size: font.size, family: font.family, 1246 size: font.size,
1229 weight: font.weight, style: font.style, variant: font.variant, 1247 family: font.family,
1230 lineHeight: font.lineHeight); 1248 weight: font.weight,
1249 style: font.style,
1250 variant: font.variant,
1251 lineHeight: font.lineHeight);
1231 1252
1232 visit(VisitorBase visitor) => visitor.visitFontExpression(this); 1253 visit(VisitorBase visitor) => visitor.visitFontExpression(this);
1233 } 1254 }
1234 1255
1235 abstract class BoxExpression extends DartStyleExpression { 1256 abstract class BoxExpression extends DartStyleExpression {
1236 final BoxEdge box; 1257 final BoxEdge box;
1237 1258
1238 BoxExpression(int styleType, SourceSpan span, this.box) 1259 BoxExpression(int styleType, SourceSpan span, this.box)
1239 : super(styleType, span); 1260 : super(styleType, span);
1240 1261
1241 visit(VisitorBase visitor) => visitor.visitBoxExpression(this); 1262 visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
1242 1263
1243 String get formattedBoxEdge { 1264 String get formattedBoxEdge {
1244 if (box.top == box.left && box.top == box.bottom && 1265 if (box.top == box.left && box.top == box.bottom && box.top == box.right) {
1245 box.top== box.right) {
1246 return '.uniform(${box.top})'; 1266 return '.uniform(${box.top})';
1247 } else { 1267 } else {
1248 var left = box.left == null ? 0 : box.left; 1268 var left = box.left == null ? 0 : box.left;
1249 var top = box.top == null ? 0 : box.top; 1269 var top = box.top == null ? 0 : box.top;
1250 var right = box.right == null ? 0 : box.right; 1270 var right = box.right == null ? 0 : box.right;
1251 var bottom = box.bottom == null ? 0 : box.bottom; 1271 var bottom = box.bottom == null ? 0 : box.bottom;
1252 return '.clockwiseFromTop($top,$right,$bottom,$left)'; 1272 return '.clockwiseFromTop($top,$right,$bottom,$left)';
1253 } 1273 }
1254 } 1274 }
1255 } 1275 }
1256 1276
1257 class MarginExpression extends BoxExpression { 1277 class MarginExpression extends BoxExpression {
1258 // TODO(terry): Does auto for margin need to be exposed to Dart UI framework? 1278 // TODO(terry): Does auto for margin need to be exposed to Dart UI framework?
1259 /** Margin expression ripped apart. */ 1279 /** Margin expression ripped apart. */
1260 MarginExpression(SourceSpan span, {num top, num right, num bottom, num left}) 1280 MarginExpression(SourceSpan span, {num top, num right, num bottom, num left})
1261 : super(DartStyleExpression.marginStyle, span, 1281 : super(DartStyleExpression.marginStyle, span,
1262 new BoxEdge(left, top, right, bottom)); 1282 new BoxEdge(left, top, right, bottom));
1263 1283
1264 MarginExpression.boxEdge(SourceSpan span, BoxEdge box) 1284 MarginExpression.boxEdge(SourceSpan span, BoxEdge box)
1265 : super(DartStyleExpression.marginStyle, span, box); 1285 : super(DartStyleExpression.marginStyle, span, box);
1266 1286
1267 merged(DartStyleExpression newMarginExpr) { 1287 merged(DartStyleExpression newMarginExpr) {
1268 if (newMarginExpr is MarginExpression && this.isMargin && 1288 if (newMarginExpr is MarginExpression &&
1289 this.isMargin &&
1269 newMarginExpr.isMargin) { 1290 newMarginExpr.isMargin) {
1270 return new MarginExpression.merge(this, newMarginExpr); 1291 return new MarginExpression.merge(this, newMarginExpr);
1271 } 1292 }
1272 1293
1273 return null; 1294 return null;
1274 } 1295 }
1275 1296
1276 /** 1297 /**
1277 * Merge the two MarginExpressions and return the result. 1298 * Merge the two MarginExpressions and return the result.
1278 */ 1299 */
1279 factory MarginExpression.merge(MarginExpression x, MarginExpression y) { 1300 factory MarginExpression.merge(MarginExpression x, MarginExpression y) {
1280 return new MarginExpression._merge(x, y, y.span); 1301 return new MarginExpression._merge(x, y, y.span);
1281 } 1302 }
1282 1303
1283 MarginExpression._merge(MarginExpression x, MarginExpression y, 1304 MarginExpression._merge(
1284 SourceSpan span) 1305 MarginExpression x, MarginExpression y, SourceSpan span)
1285 : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); 1306 : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
1286 1307
1287 MarginExpression clone() => 1308 MarginExpression clone() => new MarginExpression(span,
1288 new MarginExpression(span, top: box.top, right: box.right, 1309 top: box.top, right: box.right, bottom: box.bottom, left: box.left);
1289 bottom: box.bottom, left: box.left);
1290 1310
1291 visit(VisitorBase visitor) => visitor.visitMarginExpression(this); 1311 visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
1292 } 1312 }
1293 1313
1294 class BorderExpression extends BoxExpression { 1314 class BorderExpression extends BoxExpression {
1295 /** Border expression ripped apart. */ 1315 /** Border expression ripped apart. */
1296 BorderExpression(SourceSpan span, {num top, num right, num bottom, num left}) 1316 BorderExpression(SourceSpan span, {num top, num right, num bottom, num left})
1297 : super(DartStyleExpression.borderStyle, span, 1317 : super(DartStyleExpression.borderStyle, span,
1298 new BoxEdge(left, top, right, bottom)); 1318 new BoxEdge(left, top, right, bottom));
1299 1319
1300 BorderExpression.boxEdge(SourceSpan span, BoxEdge box) 1320 BorderExpression.boxEdge(SourceSpan span, BoxEdge box)
1301 : super(DartStyleExpression.borderStyle, span, box); 1321 : super(DartStyleExpression.borderStyle, span, box);
1302 1322
1303 merged(DartStyleExpression newBorderExpr) { 1323 merged(DartStyleExpression newBorderExpr) {
1304 if (newBorderExpr is BorderExpression && this.isBorder && newBorderExpr.isBo rder) { 1324 if (newBorderExpr is BorderExpression &&
1325 this.isBorder &&
1326 newBorderExpr.isBorder) {
1305 return new BorderExpression.merge(this, newBorderExpr); 1327 return new BorderExpression.merge(this, newBorderExpr);
1306 } 1328 }
1307 1329
1308 return null; 1330 return null;
1309 } 1331 }
1310 1332
1311 /** 1333 /**
1312 * Merge the two BorderExpression and return the result. 1334 * Merge the two BorderExpression and return the result.
1313 */ 1335 */
1314 factory BorderExpression.merge(BorderExpression x, BorderExpression y) { 1336 factory BorderExpression.merge(BorderExpression x, BorderExpression y) {
1315 return new BorderExpression._merge(x, y, y.span); 1337 return new BorderExpression._merge(x, y, y.span);
1316 } 1338 }
1317 1339
1318 BorderExpression._merge(BorderExpression x, BorderExpression y, 1340 BorderExpression._merge(
1319 SourceSpan span) 1341 BorderExpression x, BorderExpression y, SourceSpan span)
1320 : super(DartStyleExpression.borderStyle, span, 1342 : super(DartStyleExpression.borderStyle, span,
1321 new BoxEdge.merge(x.box, y.box)); 1343 new BoxEdge.merge(x.box, y.box));
1322 1344
1323 BorderExpression clone() => 1345 BorderExpression clone() => new BorderExpression(span,
1324 new BorderExpression(span, top: box.top, right: box.right, 1346 top: box.top, right: box.right, bottom: box.bottom, left: box.left);
1325 bottom: box.bottom, left: box.left);
1326 1347
1327 visit(VisitorBase visitor) => visitor.visitBorderExpression(this); 1348 visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
1328 } 1349 }
1329 1350
1330 class HeightExpression extends DartStyleExpression { 1351 class HeightExpression extends DartStyleExpression {
1331 final height; 1352 final height;
1332 1353
1333 HeightExpression(SourceSpan span, this.height) 1354 HeightExpression(SourceSpan span, this.height)
1334 : super(DartStyleExpression.heightStyle, span); 1355 : super(DartStyleExpression.heightStyle, span);
1335 1356
1336 merged(DartStyleExpression newHeightExpr) { 1357 merged(DartStyleExpression newHeightExpr) {
1337 if (newHeightExpr is DartStyleExpression && this.isHeight && newHeightExpr.i sHeight) { 1358 if (newHeightExpr is DartStyleExpression &&
1359 this.isHeight &&
1360 newHeightExpr.isHeight) {
1338 return newHeightExpr; 1361 return newHeightExpr;
1339 } 1362 }
1340 1363
1341 return null; 1364 return null;
1342 } 1365 }
1343 1366
1344 HeightExpression clone() => new HeightExpression(span, height); 1367 HeightExpression clone() => new HeightExpression(span, height);
1345 visit(VisitorBase visitor) => visitor.visitHeightExpression(this); 1368 visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
1346 } 1369 }
1347 1370
1348 class WidthExpression extends DartStyleExpression { 1371 class WidthExpression extends DartStyleExpression {
1349 final width; 1372 final width;
1350 1373
1351 WidthExpression(SourceSpan span, this.width) 1374 WidthExpression(SourceSpan span, this.width)
1352 : super(DartStyleExpression.widthStyle, span); 1375 : super(DartStyleExpression.widthStyle, span);
1353 1376
1354 merged(DartStyleExpression newWidthExpr) { 1377 merged(DartStyleExpression newWidthExpr) {
1355 if (newWidthExpr is WidthExpression && this.isWidth && 1378 if (newWidthExpr is WidthExpression &&
1379 this.isWidth &&
1356 newWidthExpr.isWidth) { 1380 newWidthExpr.isWidth) {
1357 return newWidthExpr; 1381 return newWidthExpr;
1358 } 1382 }
1359 1383
1360 return null; 1384 return null;
1361 } 1385 }
1362 1386
1363 WidthExpression clone() => new WidthExpression(span, width); 1387 WidthExpression clone() => new WidthExpression(span, width);
1364 visit(VisitorBase visitor) => visitor.visitWidthExpression(this); 1388 visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
1365 } 1389 }
1366 1390
1367 class PaddingExpression extends BoxExpression { 1391 class PaddingExpression extends BoxExpression {
1368 /** Padding expression ripped apart. */ 1392 /** Padding expression ripped apart. */
1369 PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left}) 1393 PaddingExpression(SourceSpan span, {num top, num right, num bottom, num left})
1370 : super(DartStyleExpression.paddingStyle, span, 1394 : super(DartStyleExpression.paddingStyle, span,
1371 new BoxEdge(left, top, right, bottom)); 1395 new BoxEdge(left, top, right, bottom));
1372 1396
1373 PaddingExpression.boxEdge(SourceSpan span, BoxEdge box) 1397 PaddingExpression.boxEdge(SourceSpan span, BoxEdge box)
1374 : super(DartStyleExpression.paddingStyle, span, box); 1398 : super(DartStyleExpression.paddingStyle, span, box);
1375 1399
1376 merged(DartStyleExpression newPaddingExpr) { 1400 merged(DartStyleExpression newPaddingExpr) {
1377 if (newPaddingExpr is PaddingExpression && this.isPadding && 1401 if (newPaddingExpr is PaddingExpression &&
1402 this.isPadding &&
1378 newPaddingExpr.isPadding) { 1403 newPaddingExpr.isPadding) {
1379 return new PaddingExpression.merge(this, newPaddingExpr); 1404 return new PaddingExpression.merge(this, newPaddingExpr);
1380 } 1405 }
1381 1406
1382 return null; 1407 return null;
1383 } 1408 }
1384 1409
1385 /** 1410 /**
1386 * Merge the two PaddingExpression and return the result. 1411 * Merge the two PaddingExpression and return the result.
1387 */ 1412 */
1388 factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) { 1413 factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) {
1389 return new PaddingExpression._merge(x, y, y.span); 1414 return new PaddingExpression._merge(x, y, y.span);
1390 } 1415 }
1391 1416
1392 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, 1417 PaddingExpression._merge(
1393 SourceSpan span) 1418 PaddingExpression x, PaddingExpression y, SourceSpan span)
1394 : super(DartStyleExpression.paddingStyle, span, 1419 : super(DartStyleExpression.paddingStyle, span,
1395 new BoxEdge.merge(x.box, y.box)); 1420 new BoxEdge.merge(x.box, y.box));
1396 1421
1397 PaddingExpression clone() => 1422 PaddingExpression clone() => new PaddingExpression(span,
1398 new PaddingExpression(span, top: box.top, right: box.right, 1423 top: box.top, right: box.right, bottom: box.bottom, left: box.left);
1399 bottom: box.bottom, left: box.left);
1400 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); 1424 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
1401 } 1425 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698