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

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

Issue 23819036: Support for @mixin, @include and @extend (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: All changes ready to commit Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « pkg/csslib/lib/src/tokenkind.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);
17
16 visit(VisitorBase visitor) => visitor.visitIdentifier(this); 18 visit(VisitorBase visitor) => visitor.visitIdentifier(this);
17 19
18 String toString() => name; 20 String toString() => name;
19 } 21 }
20 22
21 class Wildcard extends TreeNode { 23 class Wildcard extends TreeNode {
22 Wildcard(Span span): super(span); 24 Wildcard(Span span): super(span);
25 Wildcard clone() => new Wildcard(span);
23 visit(VisitorBase visitor) => visitor.visitWildcard(this); 26 visit(VisitorBase visitor) => visitor.visitWildcard(this);
24 } 27 }
25 28
26 class ThisOperator extends TreeNode { 29 class ThisOperator extends TreeNode {
27 ThisOperator(Span span): super(span); 30 ThisOperator(Span span): super(span);
31 ThisOperator clone() => new ThisOperator(span);
28 visit(VisitorBase visitor) => visitor.visitThisOperator(this); 32 visit(VisitorBase visitor) => visitor.visitThisOperator(this);
29 } 33 }
30 34
31 class Negation extends TreeNode { 35 class Negation extends TreeNode {
32 Negation(Span span): super(span); 36 Negation(Span span): super(span);
37 Negation clone() => new Negation(span);
33 visit(VisitorBase visitor) => visitor.visitNegation(this); 38 visit(VisitorBase visitor) => visitor.visitNegation(this);
34 } 39 }
35 40
36 // /* .... */ 41 // /* .... */
37 class CssComment extends TreeNode { 42 class CssComment extends TreeNode {
38 final String comment; 43 final String comment;
39 44
40 CssComment(this.comment, Span span): super(span); 45 CssComment(this.comment, Span span): super(span);
46 CssComment clone() => new CssComment(comment, span);
41 visit(VisitorBase visitor) => visitor.visitCssComment(this); 47 visit(VisitorBase visitor) => visitor.visitCssComment(this);
42 } 48 }
43 49
44 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->). 50 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
45 class CommentDefinition extends CssComment { 51 class CommentDefinition extends CssComment {
46 CommentDefinition(String comment, Span span): super(comment, span); 52 CommentDefinition(String comment, Span span): super(comment, span);
53 CommentDefinition clone() => new CommentDefinition(comment, span);
47 visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); 54 visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
48 } 55 }
49 56
50 class SelectorGroup extends TreeNode { 57 class SelectorGroup extends TreeNode {
51 List<Selector> _selectors; 58 List<Selector> _selectors;
52 59
53 SelectorGroup(this._selectors, Span span): super(span); 60 SelectorGroup(this._selectors, Span span): super(span);
54 61
55 List<Selector> get selectors => _selectors; 62 List<Selector> get selectors => _selectors;
56 63
64 SelectorGroup clone() => new SelectorGroup(_selectors, span);
65
57 visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); 66 visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
58 } 67 }
59 68
60 class Selector extends TreeNode { 69 class Selector extends TreeNode {
61 final List<SimpleSelectorSequence> _simpleSelectorSequences; 70 final List<SimpleSelectorSequence> _simpleSelectorSequences;
62 71
63 Selector(this._simpleSelectorSequences, Span span) : super(span); 72 Selector(this._simpleSelectorSequences, Span span) : super(span);
64 73
65 List<SimpleSelectorSequence> get simpleSelectorSequences => 74 List<SimpleSelectorSequence> get simpleSelectorSequences =>
66 _simpleSelectorSequences; 75 _simpleSelectorSequences;
67 76
68 add(SimpleSelectorSequence seq) => _simpleSelectorSequences.add(seq); 77 add(SimpleSelectorSequence seq) => _simpleSelectorSequences.add(seq);
69 78
70 int get length => _simpleSelectorSequences.length; 79 int get length => _simpleSelectorSequences.length;
71 80
81 Selector clone() {
82 var simpleSequences = [];
83 for (var simpleSeq in simpleSelectorSequences) {
84 simpleSequences.add(simpleSeq.clone());
85 }
86 return new Selector(simpleSequences, span);
87 }
88
72 visit(VisitorBase visitor) => visitor.visitSelector(this); 89 visit(VisitorBase visitor) => visitor.visitSelector(this);
73 } 90 }
74 91
75 class SimpleSelectorSequence extends TreeNode { 92 class SimpleSelectorSequence extends TreeNode {
76 /** +, >, ~, NONE */ 93 /** +, >, ~, NONE */
77 final int _combinator; 94 int combinator;
78 final SimpleSelector _selector; 95 final SimpleSelector _selector;
79 96
80 SimpleSelectorSequence(this._selector, Span span, 97 SimpleSelectorSequence(this._selector, Span span,
81 [int combinator = TokenKind.COMBINATOR_NONE]) 98 [int combinator = TokenKind.COMBINATOR_NONE])
82 : _combinator = combinator, super(span); 99 : combinator = combinator, super(span);
83 100
84 get simpleSelector => _selector; 101 get simpleSelector => _selector;
85 102
86 bool get isCombinatorNone => _combinator == TokenKind.COMBINATOR_NONE; 103 bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
87 bool get isCombinatorPlus => _combinator == TokenKind.COMBINATOR_PLUS; 104 bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
88 bool get isCombinatorGreater => _combinator == TokenKind.COMBINATOR_GREATER; 105 bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER;
89 bool get isCombinatorTilde => _combinator == TokenKind.COMBINATOR_TILDE; 106 bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE;
90 bool get isCombinatorDescendant => 107 bool get isCombinatorDescendant =>
91 _combinator == TokenKind.COMBINATOR_DESCENDANT; 108 combinator == TokenKind.COMBINATOR_DESCENDANT;
92 109
93 String get _combinatorToString => 110 String get _combinatorToString =>
94 isCombinatorDescendant ? ' ' : 111 isCombinatorDescendant ? ' ' :
95 isCombinatorPlus ? ' + ' : 112 isCombinatorPlus ? ' + ' :
96 isCombinatorGreater ? ' > ' : 113 isCombinatorGreater ? ' > ' :
97 isCombinatorTilde ? ' ~ ' : ''; 114 isCombinatorTilde ? ' ~ ' : '';
98 115
116 SimpleSelectorSequence clone() =>
117 new SimpleSelectorSequence(_selector, span, combinator);
118
99 visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); 119 visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
100 } 120 }
101 121
102 /* All other selectors (element, #id, .class, attribute, pseudo, negation, 122 /* All other selectors (element, #id, .class, attribute, pseudo, negation,
103 * namespace, *) are derived from this selector. 123 * namespace, *) are derived from this selector.
104 */ 124 */
105 class SimpleSelector extends TreeNode { 125 class SimpleSelector extends TreeNode {
106 final _name; 126 final _name;
107 127
108 SimpleSelector(this._name, Span span) : super(span); 128 SimpleSelector(this._name, Span span) : super(span);
109 129
110 // Name can be an Identifier or WildCard we'll return either the name or '*'. 130 // Name can be an Identifier or WildCard we'll return either the name or '*'.
111 String get name => isWildcard ? '*' : isThis ? '&' : _name.name; 131 String get name => isWildcard ? '*' : isThis ? '&' : _name.name;
112 132
113 bool get isWildcard => _name is Wildcard; 133 bool get isWildcard => _name is Wildcard;
114 134
115 bool get isThis => _name is ThisOperator; 135 bool get isThis => _name is ThisOperator;
116 136
137 SimpleSelector clone() => new SimpleSelector(_name, span);
138
117 visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); 139 visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
118 } 140 }
119 141
120 // element name 142 // element name
121 class ElementSelector extends SimpleSelector { 143 class ElementSelector extends SimpleSelector {
122 ElementSelector(name, Span span) : super(name, span); 144 ElementSelector(name, Span span) : super(name, span);
123 visit(VisitorBase visitor) => visitor.visitElementSelector(this); 145 visit(VisitorBase visitor) => visitor.visitElementSelector(this);
146
147 String toString() => name;
124 } 148 }
125 149
126 // namespace|element 150 // namespace|element
127 class NamespaceSelector extends SimpleSelector { 151 class NamespaceSelector extends SimpleSelector {
128 final _namespace; // null, Wildcard or Identifier 152 final _namespace; // null, Wildcard or Identifier
129 153
130 NamespaceSelector(this._namespace, var name, Span span) : super(name, span); 154 NamespaceSelector(this._namespace, var name, Span span) : super(name, span);
131 155
132 String get namespace => 156 String get namespace =>
133 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name; 157 _namespace is Wildcard ? '*' : _namespace == null ? '' : _namespace.name;
134 158
135 bool get isNamespaceWildcard => _namespace is Wildcard; 159 bool get isNamespaceWildcard => _namespace is Wildcard;
136 160
137 SimpleSelector get nameAsSimpleSelector => _name; 161 SimpleSelector get nameAsSimpleSelector => _name;
138 162
163 NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span);
164
139 visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); 165 visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
166
167 String toString() => "$namespace|${nameAsSimpleSelector.name}";
140 } 168 }
141 169
142 // [attr op value] 170 // [attr op value]
143 class AttributeSelector extends SimpleSelector { 171 class AttributeSelector extends SimpleSelector {
144 final int _op; 172 final int _op;
145 final _value; 173 final _value;
146 174
147 AttributeSelector(Identifier name, this._op, this._value, 175 AttributeSelector(Identifier name, this._op, this._value,
148 Span span) : super(name, span); 176 Span span) : super(name, span);
149 177
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 if (_value is Identifier) { 217 if (_value is Identifier) {
190 return _value.name; 218 return _value.name;
191 } else { 219 } else {
192 return '"${_value}"'; 220 return '"${_value}"';
193 } 221 }
194 } else { 222 } else {
195 return ''; 223 return '';
196 } 224 }
197 } 225 }
198 226
227 AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span);
228
199 visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); 229 visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
230
231 String toString() => "[$name${matchOperator()}${valueToString()}]";
200 } 232 }
201 233
202 // #id 234 // #id
203 class IdSelector extends SimpleSelector { 235 class IdSelector extends SimpleSelector {
204 IdSelector(Identifier name, Span span) : super(name, span); 236 IdSelector(Identifier name, Span span) : super(name, span);
237 IdSelector clone() => new IdSelector(_name, span);
205 visit(VisitorBase visitor) => visitor.visitIdSelector(this); 238 visit(VisitorBase visitor) => visitor.visitIdSelector(this);
239
240 String toString() => "#$_name";
206 } 241 }
207 242
208 // .class 243 // .class
209 class ClassSelector extends SimpleSelector { 244 class ClassSelector extends SimpleSelector {
210 ClassSelector(Identifier name, Span span) : super(name, span); 245 ClassSelector(Identifier name, Span span) : super(name, span);
246 ClassSelector clone() => new ClassSelector(_name, span);
211 visit(VisitorBase visitor) => visitor.visitClassSelector(this); 247 visit(VisitorBase visitor) => visitor.visitClassSelector(this);
248
249 String toString() => ".$_name";
212 } 250 }
213 251
214 // :pseudoClass 252 // :pseudoClass
215 class PseudoClassSelector extends SimpleSelector { 253 class PseudoClassSelector extends SimpleSelector {
216 PseudoClassSelector(Identifier name, Span span) : super(name, span); 254 PseudoClassSelector(Identifier name, Span span) : super(name, span);
217 visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); 255 visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
256
257 String toString() => ":$name";
218 } 258 }
219 259
220 // ::pseudoElement 260 // ::pseudoElement
221 class PseudoElementSelector extends SimpleSelector { 261 class PseudoElementSelector extends SimpleSelector {
222 PseudoElementSelector(Identifier name, Span span) : super(name, span); 262 PseudoElementSelector(Identifier name, Span span) : super(name, span);
223 visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); 263 visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
264
265 String toString() => "::$name";
224 } 266 }
225 267
226 // :pseudoClassFunction(expression) 268 // :pseudoClassFunction(expression)
227 class PseudoClassFunctionSelector extends PseudoClassSelector { 269 class PseudoClassFunctionSelector extends PseudoClassSelector {
228 SelectorExpression expression; 270 SelectorExpression expression;
229 271
230 PseudoClassFunctionSelector(Identifier name, this.expression, Span span) 272 PseudoClassFunctionSelector(Identifier name, this.expression, Span span)
231 : super(name, span); 273 : super(name, span);
274 PseudoClassFunctionSelector clone() =>
275 new PseudoClassFunctionSelector(_name, expression, span);
232 visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); 276 visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
233 } 277 }
234 278
235 // ::pseudoElementFunction(expression) 279 // ::pseudoElementFunction(expression)
236 class PseudoElementFunctionSelector extends PseudoElementSelector { 280 class PseudoElementFunctionSelector extends PseudoElementSelector {
237 SelectorExpression expression; 281 SelectorExpression expression;
238 282
239 PseudoElementFunctionSelector(Identifier name, this.expression, Span span) 283 PseudoElementFunctionSelector(Identifier name, this.expression, Span span)
240 : super(name, span); 284 : super(name, span);
285 PseudoElementFunctionSelector clone() =>
286 new PseudoElementFunctionSelector(_name, expression, span);
241 visit(VisitorBase visitor) => 287 visit(VisitorBase visitor) =>
242 visitor.visitPseudoElementFunctionSelector(this); 288 visitor.visitPseudoElementFunctionSelector(this);
243 } 289 }
244 290
245 class SelectorExpression extends TreeNode { 291 class SelectorExpression extends TreeNode {
246 final List<Expression> _expressions = []; 292 final List<Expression> _expressions = [];
247 293
248 SelectorExpression(Span span): super(span); 294 SelectorExpression(Span span): super(span);
249 295
250 add(Expression expression) { 296 add(Expression expression) {
251 _expressions.add(expression); 297 _expressions.add(expression);
252 } 298 }
253 299
254 List<Expression> get expressions => _expressions; 300 List<Expression> get expressions => _expressions;
255 301
302 SelectorExpression clone() {
303 var selectorExpr = new SelectorExpression(span);
304 for (var expr in _expressions) {
305 selectorExpr.add(expr.clone());
306 }
307 return selectorExpr;
308 }
309
256 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); 310 visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
257 } 311 }
258 312
259 // :NOT(negation_arg) 313 // :NOT(negation_arg)
260 class NegationSelector extends SimpleSelector { 314 class NegationSelector extends SimpleSelector {
261 SimpleSelector negationArg; 315 SimpleSelector negationArg;
262 316
263 NegationSelector(this.negationArg, Span span) 317 NegationSelector(this.negationArg, Span span)
264 : super(new Negation(span), span); 318 : super(new Negation(span), span);
265 319
320 NegationSelector clone() => new NegationSelector(negationArg, span);
321
266 visit(VisitorBase visitor) => visitor.visitNegationSelector(this); 322 visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
267 } 323 }
268 324
325 class NoOp extends TreeNode {
326 NoOp() : super(null);
327
328 NoOp clone() => new NoOp();
329
330 visit(VisitorBase visitor) => visitor.visitNoOp(this);
331 }
332
269 class StyleSheet extends TreeNode { 333 class StyleSheet extends TreeNode {
270 /** 334 /**
271 * Contains charset, ruleset, directives (media, page, etc.), and selectors. 335 * Contains charset, ruleset, directives (media, page, etc.), and selectors.
272 */ 336 */
273 final topLevels; 337 final topLevels;
274 338
275 StyleSheet(this.topLevels, Span span) : super(span) { 339 StyleSheet(this.topLevels, Span span) : super(span) {
276 for (final node in topLevels) { 340 for (final node in topLevels) {
277 assert(node is TopLevelProduction || node is Directive); 341 assert(node is TopLevelProduction || node is Directive);
278 } 342 }
279 } 343 }
280 344
281 /** Selectors only in this tree. */ 345 /** Selectors only in this tree. */
282 StyleSheet.selector(this.topLevels, Span span) : super(span); 346 StyleSheet.selector(this.topLevels, Span span) : super(span);
283 347
348 StyleSheet clone() {
349 var clonedTopLevels = [];
350 clonedTopLevels.add(topLevels.clone());
351 return new StyleSheet(clonedTopLevels, span);
352 }
353
284 visit(VisitorBase visitor) => visitor.visitStyleSheet(this); 354 visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
285 } 355 }
286 356
287 class TopLevelProduction extends TreeNode { 357 class TopLevelProduction extends TreeNode {
288 TopLevelProduction(Span span) : super(span); 358 TopLevelProduction(Span span) : super(span);
359 TopLevelProduction clone() => new TopLevelProduction(span);
289 visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); 360 visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
290 } 361 }
291 362
292 class RuleSet extends TopLevelProduction { 363 class RuleSet extends TopLevelProduction {
293 final SelectorGroup _selectorGroup; 364 final SelectorGroup _selectorGroup;
294 final DeclarationGroup _declarationGroup; 365 final DeclarationGroup _declarationGroup;
295 366
296 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span); 367 RuleSet(this._selectorGroup, this._declarationGroup, Span span) : super(span);
297 368
298 SelectorGroup get selectorGroup => _selectorGroup; 369 SelectorGroup get selectorGroup => _selectorGroup;
299 DeclarationGroup get declarationGroup => _declarationGroup; 370 DeclarationGroup get declarationGroup => _declarationGroup;
300 371
372 RuleSet clone() {
373 var cloneSelectorGroup = _selectorGroup.clone();
374 var cloneDeclarationGroup = _declarationGroup.clone();
375 return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span);
376 }
377
301 visit(VisitorBase visitor) => visitor.visitRuleSet(this); 378 visit(VisitorBase visitor) => visitor.visitRuleSet(this);
302 } 379 }
303 380
304 class Directive extends TreeNode { 381 class Directive extends TreeNode {
305 Directive(Span span) : super(span); 382 Directive(Span span) : super(span);
306 383
307 bool get isBuiltIn => true; // Known CSS directive? 384 bool get isBuiltIn => true; // Known CSS directive?
308 bool get isExtension => false; // SCSS extension? 385 bool get isExtension => false; // SCSS extension?
309 386
387 Directive clone() => new Directive(span);
310 visit(VisitorBase visitor) => visitor.visitDirective(this); 388 visit(VisitorBase visitor) => visitor.visitDirective(this);
311 } 389 }
312 390
313 class ImportDirective extends Directive { 391 class ImportDirective extends Directive {
314 /** import name specified. */ 392 /** import name specified. */
315 final String import; 393 final String import;
316 394
317 /** Any media queries for this import. */ 395 /** Any media queries for this import. */
318 final List<MediaQuery> mediaQueries; 396 final List<MediaQuery> mediaQueries;
319 397
320 ImportDirective(this.import, this.mediaQueries, Span span) : super(span); 398 ImportDirective(this.import, this.mediaQueries, Span span) : super(span);
321 399
400 ImportDirective clone() {
401 var cloneMediaQueries = [];
402 for (var mediaQuery in mediaQueries) {
403 cloneMediaQueries.add(mediaQuery.clone());
404 }
405 return new ImportDirective(import, cloneMediaQueries, span);
406 }
407
322 visit(VisitorBase visitor) => visitor.visitImportDirective(this); 408 visit(VisitorBase visitor) => visitor.visitImportDirective(this);
323 } 409 }
324 410
325 /** 411 /**
326 * MediaExpression grammar: 412 * MediaExpression grammar:
327 * '(' S* media_feature S* [ ':' S* expr ]? ')' S* 413 * '(' S* media_feature S* [ ':' S* expr ]? ')' S*
328 */ 414 */
329 class MediaExpression extends TreeNode { 415 class MediaExpression extends TreeNode {
330 final bool andOperator; 416 final bool andOperator;
331 final Identifier _mediaFeature; 417 final Identifier _mediaFeature;
332 final Expressions exprs; 418 final Expressions exprs;
333 419
334 MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span) 420 MediaExpression(this.andOperator, this._mediaFeature, this.exprs, Span span)
335 : super(span); 421 : super(span);
336 422
337 String get mediaFeature => _mediaFeature.name; 423 String get mediaFeature => _mediaFeature.name;
338 424
425 MediaExpression clone() {
426 var clonedExprs = exprs.clone();
427 return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
428 }
429
339 visit(VisitorBase visitor) => visitor.visitMediaExpression(this); 430 visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
340 } 431 }
341 432
342 /** 433 /**
343 * MediaQuery grammar: 434 * MediaQuery grammar:
344 * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]* 435 * : [ONLY | NOT]? S* media_type S* [ AND S* media_expression ]*
345 * | media_expression [ AND S* media_expression ]* 436 * | media_expression [ AND S* media_expression ]*
346 * media_type 437 * media_type
347 * : IDENT 438 * : IDENT
348 * media_expression 439 * media_expression
(...skipping 10 matching lines...) Expand all
359 MediaQuery(this._mediaUnary, this._mediaType, this.expressions, Span span) 450 MediaQuery(this._mediaUnary, this._mediaType, this.expressions, Span span)
360 : super(span); 451 : super(span);
361 452
362 bool get hasMediaType => _mediaType != null; 453 bool get hasMediaType => _mediaType != null;
363 String get mediaType => _mediaType.name; 454 String get mediaType => _mediaType.name;
364 455
365 bool get hasUnary => _mediaUnary != -1; 456 bool get hasUnary => _mediaUnary != -1;
366 String get unary => 457 String get unary =>
367 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); 458 TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase();
368 459
460 MediaQuery clone() {
461 var cloneExpressions = [];
462 for (var expr in expressions) {
463 cloneExpressions.add(expr.clone());
464 }
465 return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span);
466 }
369 visit(VisitorBase visitor) => visitor.visitMediaQuery(this); 467 visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
370 } 468 }
371 469
372 class MediaDirective extends Directive { 470 class MediaDirective extends Directive {
373 List<MediaQuery> mediaQueries; 471 List<MediaQuery> mediaQueries;
374 List<RuleSet> rulesets; 472 List<RuleSet> rulesets;
375 473
376 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); 474 MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
377 475
476 MediaDirective clone() {
477 var cloneQueries = [];
478 for (var mediaQuery in mediaQueries) {
479 cloneQueries.add(mediaQuery.clone());
480 }
481 var cloneRulesets = [];
482 for (var ruleset in rulesets) {
483 cloneRulesets.add(ruleset.clone());
484 }
485 return new MediaDirective(cloneQueries, cloneRulesets, span);
486 }
378 visit(VisitorBase visitor) => visitor.visitMediaDirective(this); 487 visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
379 } 488 }
380 489
381 class HostDirective extends Directive { 490 class HostDirective extends Directive {
382 List<RuleSet> rulesets; 491 List<RuleSet> rulesets;
383 492
384 HostDirective(this.rulesets, Span span) : super(span); 493 HostDirective(this.rulesets, Span span) : super(span);
385 494
495 HostDirective clone() {
496 var cloneRulesets = [];
497 for (var ruleset in rulesets) {
498 cloneRulesets.add(ruleset.clone());
499 }
500 return new HostDirective(cloneRulesets, span);
501 }
386 visit(VisitorBase visitor) => visitor.visitHostDirective(this); 502 visit(VisitorBase visitor) => visitor.visitHostDirective(this);
387 } 503 }
388 504
389 class PageDirective extends Directive { 505 class PageDirective extends Directive {
390 final String _ident; 506 final String _ident;
391 final String _pseudoPage; 507 final String _pseudoPage;
392 List<DeclarationGroup> _declsMargin; 508 List<DeclarationGroup> _declsMargin;
393 509
394 PageDirective(this._ident, this._pseudoPage, this._declsMargin, 510 PageDirective(this._ident, this._pseudoPage, this._declsMargin,
395 Span span) : super(span); 511 Span span) : super(span);
396 512
513 PageDirective clone() {
514 var cloneDeclsMargin = [];
515 for (var declMargin in _declsMargin) {
516 cloneDeclsMargin.add(declMargin.clone());
517 }
518 return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
519 }
397 visit(VisitorBase visitor) => visitor.visitPageDirective(this); 520 visit(VisitorBase visitor) => visitor.visitPageDirective(this);
398 521
399 bool get hasIdent => _ident != null && _ident.length > 0; 522 bool get hasIdent => _ident != null && _ident.length > 0;
400 bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0; 523 bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
401 } 524 }
402 525
403 class CharsetDirective extends Directive { 526 class CharsetDirective extends Directive {
404 final String charEncoding; 527 final String charEncoding;
405 528
406 CharsetDirective(this.charEncoding, Span span) : super(span); 529 CharsetDirective(this.charEncoding, Span span) : super(span);
530 CharsetDirective clone() => new CharsetDirective(charEncoding, span);
407 visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); 531 visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
408 } 532 }
409 533
410 class KeyFrameDirective extends Directive { 534 class KeyFrameDirective extends Directive {
411 /* 535 /*
412 * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-. 536 * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-.
413 */ 537 */
414 final int _keyframeName; 538 final int _keyframeName;
415 final _name; 539 final _name;
416 final List<KeyFrameBlock> _blocks; 540 final List<KeyFrameBlock> _blocks;
(...skipping 11 matching lines...) Expand all
428 case TokenKind.DIRECTIVE_MS_KEYFRAMES: 552 case TokenKind.DIRECTIVE_MS_KEYFRAMES:
429 return '@keyframes'; 553 return '@keyframes';
430 case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: return '@-webkit-keyframes'; 554 case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES: return '@-webkit-keyframes';
431 case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: return '@-moz-keyframes'; 555 case TokenKind.DIRECTIVE_MOZ_KEYFRAMES: return '@-moz-keyframes';
432 case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes'; 556 case TokenKind.DIRECTIVE_O_KEYFRAMES: return '@-o-keyframes';
433 } 557 }
434 } 558 }
435 559
436 String get name => _name; 560 String get name => _name;
437 561
562 KeyFrameDirective clone() {
563 var cloneBlocks = [];
564 for (var block in _blocks) {
565 cloneBlocks.add(block.clone());
566 }
567 return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
568 }
438 visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); 569 visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
439 } 570 }
440 571
441 class KeyFrameBlock extends Expression { 572 class KeyFrameBlock extends Expression {
442 final Expressions _blockSelectors; 573 final Expressions _blockSelectors;
443 final DeclarationGroup _declarations; 574 final DeclarationGroup _declarations;
444 575
445 KeyFrameBlock(this._blockSelectors, this._declarations, Span span) 576 KeyFrameBlock(this._blockSelectors, this._declarations, Span span)
446 : super(span); 577 : super(span);
447 578
579 KeyFrameBlock clone() =>
580 new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
448 visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); 581 visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
449 } 582 }
450 583
451 class FontFaceDirective extends Directive { 584 class FontFaceDirective extends Directive {
452 final DeclarationGroup _declarations; 585 final DeclarationGroup _declarations;
453 586
454 FontFaceDirective(this._declarations, Span span) : super(span); 587 FontFaceDirective(this._declarations, Span span) : super(span);
455 588
589 FontFaceDirective clone() =>
590 new FontFaceDirective(_declarations.clone(), span);
456 visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); 591 visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
457 } 592 }
458 593
459 class StyletDirective extends Directive { 594 class StyletDirective extends Directive {
460 final String _dartClassName; 595 final String _dartClassName;
461 final List<RuleSet> _rulesets; 596 final List<RuleSet> _rulesets;
462 597
463 StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span); 598 StyletDirective(this._dartClassName, this._rulesets, Span span) : super(span);
464 599
465 bool get isBuiltIn => false; 600 bool get isBuiltIn => false;
466 bool get isExtension => true; 601 bool get isExtension => true;
467 602
468 String get dartClassName => _dartClassName; 603 String get dartClassName => _dartClassName;
469 List<RuleSet> get rulesets => _rulesets; 604 List<RuleSet> get rulesets => _rulesets;
470 605
606 StyletDirective clone() {
607 var cloneRulesets = [];
608 for (var ruleset in _rulesets) {
609 cloneRulesets.add(ruleset.clone());
610 }
611 return new StyletDirective(_dartClassName, cloneRulesets, span);
612 }
471 visit(VisitorBase visitor) => visitor.visitStyletDirective(this); 613 visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
472 } 614 }
473 615
474 class NamespaceDirective extends Directive { 616 class NamespaceDirective extends Directive {
475 /** Namespace prefix. */ 617 /** Namespace prefix. */
476 final String _prefix; 618 final String _prefix;
477 619
478 /** URI associated with this namespace. */ 620 /** URI associated with this namespace. */
479 final String _uri; 621 final String _uri;
480 622
481 NamespaceDirective(this._prefix, this._uri, Span span) : super(span); 623 NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
482 624
625 NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
483 visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); 626 visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
484 627
485 String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; 628 String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
486 } 629 }
487 630
488 /** To support Less syntax @name: expression */ 631 /** To support Less syntax @name: expression */
489 class VarDefinitionDirective extends Directive { 632 class VarDefinitionDirective extends Directive {
490 final VarDefinition def; 633 final VarDefinition def;
491 634
492 VarDefinitionDirective(this.def, Span span) : super(span); 635 VarDefinitionDirective(this.def, Span span) : super(span);
493 636
637 VarDefinitionDirective clone() =>
638 new VarDefinitionDirective(def.clone(), span);
494 visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); 639 visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
495 } 640 }
496 641
642 class MixinDefinition extends Directive {
643 final String name;
644 final List definedArgs;
645 final bool varArgs;
646
647 MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span)
648 : super(span);
649
650 MixinDefinition clone() {
651 var cloneDefinedArgs = [];
652 for (var definedArg in definedArgs) {
653 cloneDefinedArgs.add(definedArg.clone());
654 }
655 return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
656 }
657 visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
658 }
659
660 /** Support a Sass @mixin. See http://sass-lang.com for description. */
661 class MixinRulesetDirective extends MixinDefinition {
662 final List<RuleSet> rulesets;
663
664 MixinRulesetDirective(String name, List<VarDefinitionDirective> args,
665 bool varArgs, this.rulesets, Span span) :
666 super(name, args, varArgs, span);
667
668 MixinRulesetDirective clone() {
669 var clonedArgs = [];
670 for (var arg in definedArgs) {
671 clonedArgs.add(arg.clone());
672 }
673 var clonedRulesets = [];
674 for (var ruleset in rulesets) {
675 clonedRulesets.add(ruleset.clone());
676 }
677 return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
678 span);
679 }
680 visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
681 }
682
683 class MixinDeclarationDirective extends MixinDefinition {
684 final DeclarationGroup declarations;
685
686 MixinDeclarationDirective(String name, List<VarDefinitionDirective> args,
687 bool varArgs, this.declarations, Span span) :
688 super(name, args, varArgs, span);
689 MixinDeclarationDirective clone() {
690 var clonedArgs = [];
691 for (var arg in definedArgs) {
692 clonedArgs.add(arg.clone());
693 }
694 return new MixinDeclarationDirective(name, clonedArgs, varArgs,
695 declarations.clone(), span);
696 }
697 visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
698 }
699
700 /** To support consuming a SASS mixin @include. */
701 class IncludeDirective extends Directive {
702 final String name;
703 final List<List<TreeNode>> args;
704
705 IncludeDirective(this.name, this.args, Span span) : super(span);
706
707 IncludeDirective clone() {
708 var cloneArgs = [];
709 for (var arg in args) {
710 for (var term in arg) {
711 cloneArgs.add(term.clone());
712 }
713 }
714 return new IncludeDirective(name, cloneArgs, span);
715 }
716 visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
717 }
718
719 /** To support SASS @content. */
720 class ContentDirective extends Directive {
721 ContentDirective(Span span) : super(span);
722
723 visit(VisitorBase visitor) => visitor.visitContentDirective(this);
724 }
725
497 class Declaration extends TreeNode { 726 class Declaration extends TreeNode {
498 final Identifier _property; 727 final Identifier _property;
499 final Expression _expression; 728 final Expression _expression;
500 /** Style exposed to Dart. */ 729 /** Style exposed to Dart. */
501 var _dart; 730 var _dart;
502 final bool important; 731 final bool important;
503 732
504 /** 733 /**
505 * IE CSS hacks that can only be read by a particular IE version. 734 * IE CSS hacks that can only be read by a particular IE version.
506 * 7 implies IE 7 or older property (e.g., *background: blue;) 735 * 7 implies IE 7 or older property (e.g., *background: blue;)
(...skipping 10 matching lines...) Expand all
517 746
518 String get property => isIE7 ? '*${_property.name}' : _property.name; 747 String get property => isIE7 ? '*${_property.name}' : _property.name;
519 Expression get expression => _expression; 748 Expression get expression => _expression;
520 749
521 bool get hasDartStyle => _dart != null; 750 bool get hasDartStyle => _dart != null;
522 get dartStyle => _dart; 751 get dartStyle => _dart;
523 set dartStyle(dStyle) { 752 set dartStyle(dStyle) {
524 _dart = dStyle; 753 _dart = dStyle;
525 } 754 }
526 755
756 Declaration clone() =>
757 new Declaration(_property.clone(), _expression.clone(), _dart, span,
758 important: important);
527 visit(VisitorBase visitor) => visitor.visitDeclaration(this); 759 visit(VisitorBase visitor) => visitor.visitDeclaration(this);
528 } 760 }
529 761
530 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and 762 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
531 // dynamic when in a declaration. Currently, Less syntax 763 // dynamic when in a declaration. Currently, Less syntax
532 // '@foo: expression' and 'var-foo: expression' in a declaration 764 // '@foo: expression' and 'var-foo: expression' in a declaration
533 // are statically resolved. Better solution, if @foo or var-foo 765 // are statically resolved. Better solution, if @foo or var-foo
534 // are top-level are then statically resolved and var-foo in a 766 // are top-level are then statically resolved and var-foo in a
535 // declaration group (surrounded by a selector) would be dynamic. 767 // declaration group (surrounded by a selector) would be dynamic.
536 class VarDefinition extends Declaration { 768 class VarDefinition extends Declaration {
769 bool badUsage = false;
770
537 VarDefinition(Identifier definedName, Expression expr, Span span) 771 VarDefinition(Identifier definedName, Expression expr, Span span)
538 : super(definedName, expr, null, span); 772 : super(definedName, expr, null, span);
539 773
540 String get definedName => _property.name; 774 String get definedName => _property.name;
541 775
542 set dartStyle(dStyle) { } 776 set dartStyle(dStyle) { }
543 777
778 VarDefinition clone() =>
779 new VarDefinition(_property.clone(),
780 expression != null ? expression.clone() : null, span);
544 visit(VisitorBase visitor) => visitor.visitVarDefinition(this); 781 visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
545 } 782 }
546 783
784 /**
785 * Node for usage of @include mixin[(args,...)] found in a declaration group
786 * instead of at a ruleset (toplevel) e.g.,
787 * div {
788 * @include mixin1;
789 * }
790 */
791 class IncludeMixinAtDeclaration extends Declaration {
792 final IncludeDirective include;
793
794 IncludeMixinAtDeclaration(this.include, Span span)
795 : super(null, null, null, span);
796
797 IncludeMixinAtDeclaration clone() =>
798 new IncludeMixinAtDeclaration(include.clone(), span);
799 visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
800 }
801
802 class ExtendDeclaration extends Declaration {
803 List<SimpleSelectorSequence> selectors;
804
805 ExtendDeclaration(this.selectors, Span span) :
806 super(null, null, null, span);
807
808 ExtendDeclaration clone() {
809 List<SimpleSelectorSequence> newSelector = [];
810 for (var selectorSeq in selectors) {
811 newSelector.add(selectorSeq.clone());
812 }
813 return new ExtendDeclaration(newSelector, span);
814 }
815
816 visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
817 }
818
547 class DeclarationGroup extends TreeNode { 819 class DeclarationGroup extends TreeNode {
548 /** Can be either Declaration or RuleSet (if nested selector). */ 820 /** Can be either Declaration or RuleSet (if nested selector). */
549 final List _declarations; 821 final List _declarations;
550 822
551 DeclarationGroup(this._declarations, Span span) : super(span); 823 DeclarationGroup(this._declarations, Span span) : super(span);
552 824
553 List get declarations => _declarations; 825 List get declarations => _declarations;
554 826
827 DeclarationGroup clone() {
828 var clonedDecls = [];
829 for (var decl in _declarations) {
830 clonedDecls.add(decl.clone());
831 }
832 return new DeclarationGroup(clonedDecls, span);
833 }
555 visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); 834 visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
556 } 835 }
557 836
558 class MarginGroup extends DeclarationGroup { 837 class MarginGroup extends DeclarationGroup {
559 final int margin_sym; // TokenType for for @margin sym. 838 final int margin_sym; // TokenType for for @margin sym.
560 839
561 MarginGroup(this.margin_sym, List<Declaration> decls, Span span) 840 MarginGroup(this.margin_sym, List<Declaration> decls, Span span)
562 : super(decls, span); 841 : super(decls, span);
842 MarginGroup clone() =>
843 new MarginGroup(margin_sym, super.clone() as dynamic, span);
563 visit(VisitorBase visitor) => visitor.visitMarginGroup(this); 844 visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
564 } 845 }
565 846
566 class VarUsage extends Expression { 847 class VarUsage extends Expression {
567 final String name; 848 final String name;
568 final List<Expression> defaultValues; 849 final List<Expression> defaultValues;
569 850
570 VarUsage(this.name, this.defaultValues, Span span) : super(span); 851 VarUsage(this.name, this.defaultValues, Span span) : super(span);
571 852
853 VarUsage clone() {
854 var clonedValues = [];
855 for (var expr in defaultValues) {
856 clonedValues.addd(expr.clone());
857 }
858 return new VarUsage(name, clonedValues, span);
859 }
572 visit(VisitorBase visitor) => visitor.visitVarUsage(this); 860 visit(VisitorBase visitor) => visitor.visitVarUsage(this);
573 } 861 }
574 862
575 class OperatorSlash extends Expression { 863 class OperatorSlash extends Expression {
576 OperatorSlash(Span span) : super(span); 864 OperatorSlash(Span span) : super(span);
865 OperatorSlash clone() => new OperatorSlash(span);
577 visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); 866 visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
578 } 867 }
579 868
580 class OperatorComma extends Expression { 869 class OperatorComma extends Expression {
581 OperatorComma(Span span) : super(span); 870 OperatorComma(Span span) : super(span);
871 OperatorComma clone() => new OperatorComma(span);
582 visit(VisitorBase visitor) => visitor.visitOperatorComma(this); 872 visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
583 } 873 }
584 874
585 class OperatorPlus extends Expression { 875 class OperatorPlus extends Expression {
586 OperatorPlus(Span span) : super(span); 876 OperatorPlus(Span span) : super(span);
877 OperatorPlus clone() => new OperatorPlus(span);
587 visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); 878 visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
588 } 879 }
589 880
590 class OperatorMinus extends Expression { 881 class OperatorMinus extends Expression {
591 OperatorMinus(Span span) : super(span); 882 OperatorMinus(Span span) : super(span);
883 OperatorMinus clone() => new OperatorMinus(span);
592 visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); 884 visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
593 } 885 }
594 886
595 class UnicodeRangeTerm extends Expression { 887 class UnicodeRangeTerm extends Expression {
596 final String first; 888 final String first;
597 final String second; 889 final String second;
598 890
599 UnicodeRangeTerm(this.first, this.second, Span span) : super(span); 891 UnicodeRangeTerm(this.first, this.second, Span span) : super(span);
600 892
601 bool get hasSecond => second != null; 893 bool get hasSecond => second != null;
602 894
895 UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
896
603 visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); 897 visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
604 } 898 }
605 899
606 class LiteralTerm extends Expression { 900 class LiteralTerm extends Expression {
607 // TODO(terry): value and text fields can be made final once all CSS resources 901 // TODO(terry): value and text fields can be made final once all CSS resources
608 // are copied/symlink'd in the build tool and UriVisitor in 902 // are copied/symlink'd in the build tool and UriVisitor in
609 // web_ui is removed. 903 // web_ui is removed.
610 var value; 904 var value;
611 String text; 905 String text;
612 906
613 LiteralTerm(this.value, this.text, Span span) : super(span); 907 LiteralTerm(this.value, this.text, Span span) : super(span);
614 908
909 LiteralTerm clone() => new LiteralTerm(value, text, span);
910
615 visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); 911 visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
616 } 912 }
617 913
618 class NumberTerm extends LiteralTerm { 914 class NumberTerm extends LiteralTerm {
619 NumberTerm(value, String t, Span span) : super(value, t, span); 915 NumberTerm(value, String t, Span span) : super(value, t, span);
916 NumberTerm clone() => new NumberTerm(value, text, span);
620 visit(VisitorBase visitor) => visitor.visitNumberTerm(this); 917 visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
621 } 918 }
622 919
623 class UnitTerm extends LiteralTerm { 920 class UnitTerm extends LiteralTerm {
624 final int _unit; 921 final int _unit;
625 922
626 UnitTerm(value, String t, Span span, this._unit) : super(value, t, span); 923 UnitTerm(value, String t, Span span, this._unit) : super(value, t, span);
627 924
628 int get unit => _unit; 925 int get unit => _unit;
629 926
927 UnitTerm clone() => new UnitTerm(value, text, span, _unit);
928
630 visit(VisitorBase visitor) => visitor.visitUnitTerm(this); 929 visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
631 930
632 String unitToString() => TokenKind.unitToString(_unit); 931 String unitToString() => TokenKind.unitToString(_unit);
633 932
634 String toString() => '$text${unitToString()}'; 933 String toString() => '$text${unitToString()}';
635 } 934 }
636 935
637 class LengthTerm extends UnitTerm { 936 class LengthTerm extends UnitTerm {
638 LengthTerm(value, String t, Span span, 937 LengthTerm(value, String t, Span span,
639 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 938 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
640 assert(this._unit == TokenKind.UNIT_LENGTH_PX || 939 assert(this._unit == TokenKind.UNIT_LENGTH_PX ||
641 this._unit == TokenKind.UNIT_LENGTH_CM || 940 this._unit == TokenKind.UNIT_LENGTH_CM ||
642 this._unit == TokenKind.UNIT_LENGTH_MM || 941 this._unit == TokenKind.UNIT_LENGTH_MM ||
643 this._unit == TokenKind.UNIT_LENGTH_IN || 942 this._unit == TokenKind.UNIT_LENGTH_IN ||
644 this._unit == TokenKind.UNIT_LENGTH_PT || 943 this._unit == TokenKind.UNIT_LENGTH_PT ||
645 this._unit == TokenKind.UNIT_LENGTH_PC); 944 this._unit == TokenKind.UNIT_LENGTH_PC);
646 } 945 }
647 946 LengthTerm clone() => new LengthTerm(value, text, span, _unit);
648 visit(VisitorBase visitor) => visitor.visitLengthTerm(this); 947 visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
649 } 948 }
650 949
651 class PercentageTerm extends LiteralTerm { 950 class PercentageTerm extends LiteralTerm {
652 PercentageTerm(value, String t, Span span) : super(value, t, span); 951 PercentageTerm(value, String t, Span span) : super(value, t, span);
952 PercentageTerm clone() => new PercentageTerm(value, text, span);
653 visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); 953 visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
654 } 954 }
655 955
656 class EmTerm extends LiteralTerm { 956 class EmTerm extends LiteralTerm {
657 EmTerm(value, String t, Span span) : super(value, t, span); 957 EmTerm(value, String t, Span span) : super(value, t, span);
958 EmTerm clone() => new EmTerm(value, text, span);
658 visit(VisitorBase visitor) => visitor.visitEmTerm(this); 959 visit(VisitorBase visitor) => visitor.visitEmTerm(this);
659 } 960 }
660 961
661 class ExTerm extends LiteralTerm { 962 class ExTerm extends LiteralTerm {
662 ExTerm(value, String t, Span span) : super(value, t, span); 963 ExTerm(value, String t, Span span) : super(value, t, span);
964 ExTerm clone() => new ExTerm(value, text, span);
663 visit(VisitorBase visitor) => visitor.visitExTerm(this); 965 visit(VisitorBase visitor) => visitor.visitExTerm(this);
664 } 966 }
665 967
666 class AngleTerm extends UnitTerm { 968 class AngleTerm extends UnitTerm {
667 AngleTerm(var value, String t, Span span, 969 AngleTerm(var value, String t, Span span,
668 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 970 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
669 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 971 assert(this._unit == TokenKind.UNIT_ANGLE_DEG ||
670 this._unit == TokenKind.UNIT_ANGLE_RAD || 972 this._unit == TokenKind.UNIT_ANGLE_RAD ||
671 this._unit == TokenKind.UNIT_ANGLE_GRAD || 973 this._unit == TokenKind.UNIT_ANGLE_GRAD ||
672 this._unit == TokenKind.UNIT_ANGLE_TURN); 974 this._unit == TokenKind.UNIT_ANGLE_TURN);
673 } 975 }
674 976
977 AngleTerm clone() => new AngleTerm(value, text, span, unit);
675 visit(VisitorBase visitor) => visitor.visitAngleTerm(this); 978 visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
676 } 979 }
677 980
678 class TimeTerm extends UnitTerm { 981 class TimeTerm extends UnitTerm {
679 TimeTerm(var value, String t, Span span, 982 TimeTerm(var value, String t, Span span,
680 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 983 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
681 assert(this._unit == TokenKind.UNIT_ANGLE_DEG || 984 assert(this._unit == TokenKind.UNIT_ANGLE_DEG ||
682 this._unit == TokenKind.UNIT_TIME_MS || 985 this._unit == TokenKind.UNIT_TIME_MS ||
683 this._unit == TokenKind.UNIT_TIME_S); 986 this._unit == TokenKind.UNIT_TIME_S);
684 } 987 }
685 988
989 TimeTerm clone() => new TimeTerm(value, text, span, unit);
686 visit(VisitorBase visitor) => visitor.visitTimeTerm(this); 990 visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
687 } 991 }
688 992
689 class FreqTerm extends UnitTerm { 993 class FreqTerm extends UnitTerm {
690 FreqTerm(var value, String t, Span span, 994 FreqTerm(var value, String t, Span span,
691 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 995 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
692 assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); 996 assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ);
693 } 997 }
694 998
999 FreqTerm clone() => new FreqTerm(value, text, span, unit);
695 visit(VisitorBase visitor) => visitor.visitFreqTerm(this); 1000 visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
696 } 1001 }
697 1002
698 class FractionTerm extends LiteralTerm { 1003 class FractionTerm extends LiteralTerm {
699 FractionTerm(var value, String t, Span span) : super(value, t, span); 1004 FractionTerm(var value, String t, Span span) : super(value, t, span);
700 1005
1006 FractionTerm clone() => new FractionTerm(value, text, span);
701 visit(VisitorBase visitor) => visitor.visitFractionTerm(this); 1007 visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
702 } 1008 }
703 1009
704 class UriTerm extends LiteralTerm { 1010 class UriTerm extends LiteralTerm {
705 UriTerm(String value, Span span) : super(value, value, span); 1011 UriTerm(String value, Span span) : super(value, value, span);
706 1012
1013 UriTerm clone() => new UriTerm(value, span);
707 visit(VisitorBase visitor) => visitor.visitUriTerm(this); 1014 visit(VisitorBase visitor) => visitor.visitUriTerm(this);
708 } 1015 }
709 1016
710 class ResolutionTerm extends UnitTerm { 1017 class ResolutionTerm extends UnitTerm {
711 ResolutionTerm(var value, String t, Span span, 1018 ResolutionTerm(var value, String t, Span span,
712 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1019 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
713 assert(_unit == TokenKind.UNIT_RESOLUTION_DPI || 1020 assert(_unit == TokenKind.UNIT_RESOLUTION_DPI ||
714 _unit == TokenKind.UNIT_RESOLUTION_DPCM || 1021 _unit == TokenKind.UNIT_RESOLUTION_DPCM ||
715 _unit == TokenKind.UNIT_RESOLUTION_DPPX); 1022 _unit == TokenKind.UNIT_RESOLUTION_DPPX);
716 } 1023 }
717 1024
1025 ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
718 visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); 1026 visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
719 } 1027 }
720 1028
721 class ChTerm extends UnitTerm { 1029 class ChTerm extends UnitTerm {
722 ChTerm(var value, String t, Span span, 1030 ChTerm(var value, String t, Span span,
723 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1031 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
724 assert(_unit == TokenKind.UNIT_CH); 1032 assert(_unit == TokenKind.UNIT_CH);
725 } 1033 }
726 1034
1035 ChTerm clone() => new ChTerm(value, text, span, unit);
727 visit(VisitorBase visitor) => visitor.visitChTerm(this); 1036 visit(VisitorBase visitor) => visitor.visitChTerm(this);
728 } 1037 }
729 1038
730 class RemTerm extends UnitTerm { 1039 class RemTerm extends UnitTerm {
731 RemTerm(var value, String t, Span span, 1040 RemTerm(var value, String t, Span span,
732 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1041 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
733 assert(_unit == TokenKind.UNIT_REM); 1042 assert(_unit == TokenKind.UNIT_REM);
734 } 1043 }
735 1044
1045 RemTerm clone() => new RemTerm(value, text, span, unit);
736 visit(VisitorBase visitor) => visitor.visitRemTerm(this); 1046 visit(VisitorBase visitor) => visitor.visitRemTerm(this);
737 } 1047 }
738 1048
739 class ViewportTerm extends UnitTerm { 1049 class ViewportTerm extends UnitTerm {
740 ViewportTerm(var value, String t, Span span, 1050 ViewportTerm(var value, String t, Span span,
741 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) { 1051 [int unit = TokenKind.UNIT_LENGTH_PX]) : super(value, t, span, unit) {
742 assert(_unit == TokenKind.UNIT_VIEWPORT_VW || 1052 assert(_unit == TokenKind.UNIT_VIEWPORT_VW ||
743 _unit == TokenKind.UNIT_VIEWPORT_VH || 1053 _unit == TokenKind.UNIT_VIEWPORT_VH ||
744 _unit == TokenKind.UNIT_VIEWPORT_VMIN || 1054 _unit == TokenKind.UNIT_VIEWPORT_VMIN ||
745 _unit == TokenKind.UNIT_VIEWPORT_VMAX); 1055 _unit == TokenKind.UNIT_VIEWPORT_VMAX);
746 } 1056 }
747 1057
1058 ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
748 visit(VisitorBase visitor) => visitor.visitViewportTerm(this); 1059 visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
749 } 1060 }
750 1061
751 /** Type to signal a bad hex value for HexColorTerm.value. */ 1062 /** Type to signal a bad hex value for HexColorTerm.value. */
752 class BAD_HEX_VALUE { } 1063 class BAD_HEX_VALUE { }
753 1064
754 class HexColorTerm extends LiteralTerm { 1065 class HexColorTerm extends LiteralTerm {
755 HexColorTerm(var value, String t, Span span) : super(value, t, span); 1066 HexColorTerm(var value, String t, Span span) : super(value, t, span);
756 1067
1068 HexColorTerm clone() => new HexColorTerm(value, text, span);
757 visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); 1069 visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
758 } 1070 }
759 1071
760 class FunctionTerm extends LiteralTerm { 1072 class FunctionTerm extends LiteralTerm {
761 final Expressions _params; 1073 final Expressions _params;
762 1074
763 FunctionTerm(var value, String t, this._params, Span span) 1075 FunctionTerm(var value, String t, this._params, Span span)
764 : super(value, t, span); 1076 : super(value, t, span);
765 1077
1078 FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
766 visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); 1079 visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
767 } 1080 }
768 1081
769 /** 1082 /**
770 * A "\9" was encountered at the end of the expression and before a semi-colon. 1083 * A "\9" was encountered at the end of the expression and before a semi-colon.
771 * This is an IE trick to ignore a property or value except by IE 8 and older 1084 * This is an IE trick to ignore a property or value except by IE 8 and older
772 * browsers. 1085 * browsers.
773 */ 1086 */
774 class IE8Term extends LiteralTerm { 1087 class IE8Term extends LiteralTerm {
775 IE8Term(Span span) : super('\\9', '\\9', span); 1088 IE8Term(Span span) : super('\\9', '\\9', span);
1089 IE8Term clone() => new IE8Term(span);
776 visit(VisitorBase visitor) => visitor.visitIE8Term(this); 1090 visit(VisitorBase visitor) => visitor.visitIE8Term(this);
777 } 1091 }
778 1092
779 class GroupTerm extends Expression { 1093 class GroupTerm extends Expression {
780 final List<LiteralTerm> _terms; 1094 final List<LiteralTerm> _terms;
781 1095
782 GroupTerm(Span span) : _terms = [], super(span); 1096 GroupTerm(Span span) : _terms = [], super(span);
783 1097
784 add(LiteralTerm term) { 1098 add(LiteralTerm term) {
785 _terms.add(term); 1099 _terms.add(term);
786 } 1100 }
787 1101
1102 GroupTerm clone() => new GroupTerm(span);
788 visit(VisitorBase visitor) => visitor.visitGroupTerm(this); 1103 visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
789 } 1104 }
790 1105
791 class ItemTerm extends NumberTerm { 1106 class ItemTerm extends NumberTerm {
792 ItemTerm(var value, String t, Span span) : super(value, t, span); 1107 ItemTerm(var value, String t, Span span) : super(value, t, span);
793 1108
1109 ItemTerm clone() => new ItemTerm(value, text, span);
794 visit(VisitorBase visitor) => visitor.visitItemTerm(this); 1110 visit(VisitorBase visitor) => visitor.visitItemTerm(this);
795 } 1111 }
796 1112
797 class Expressions extends Expression { 1113 class Expressions extends Expression {
798 final List<Expression> expressions = []; 1114 final List<Expression> expressions = [];
799 1115
800 Expressions(Span span): super(span); 1116 Expressions(Span span): super(span);
801 1117
802 add(Expression expression) { 1118 add(Expression expression) {
803 expressions.add(expression); 1119 expressions.add(expression);
804 } 1120 }
805 1121
1122 Expressions clone() {
1123 var clonedExprs = new Expressions(span);
1124 for (var expr in expressions) {
1125 clonedExprs.add(expr.clone());
1126 }
1127 return clonedExprs;
1128 }
806 visit(VisitorBase visitor) => visitor.visitExpressions(this); 1129 visit(VisitorBase visitor) => visitor.visitExpressions(this);
807 } 1130 }
808 1131
809 class BinaryExpression extends Expression { 1132 class BinaryExpression extends Expression {
810 final Token op; 1133 final Token op;
811 final Expression x; 1134 final Expression x;
812 final Expression y; 1135 final Expression y;
813 1136
814 BinaryExpression(this.op, this.x, this.y, Span span): super(span); 1137 BinaryExpression(this.op, this.x, this.y, Span span): super(span);
815 1138
1139 BinaryExpression clone() =>
1140 new BinaryExpression(op, x.clone(), y.clone(), span);
816 visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); 1141 visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
817 } 1142 }
818 1143
819 class UnaryExpression extends Expression { 1144 class UnaryExpression extends Expression {
820 final Token op; 1145 final Token op;
821 final Expression self; 1146 final Expression self;
822 1147
823 UnaryExpression(this.op, this.self, Span span): super(span); 1148 UnaryExpression(this.op, this.self, Span span): super(span);
824 1149
1150 UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
825 visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); 1151 visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
826 } 1152 }
827 1153
828 abstract class DartStyleExpression extends TreeNode { 1154 abstract class DartStyleExpression extends TreeNode {
829 static final int unknownType = 0; 1155 static final int unknownType = 0;
830 static final int fontStyle = 1; 1156 static final int fontStyle = 1;
831 static final int marginStyle = 2; 1157 static final int marginStyle = 2;
832 static final int borderStyle = 3; 1158 static final int borderStyle = 3;
833 static final int paddingStyle = 4; 1159 static final int paddingStyle = 4;
834 static final int heightStyle = 5; 1160 static final int heightStyle = 5;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
886 * Merge the two FontExpression and return the result. 1212 * Merge the two FontExpression and return the result.
887 */ 1213 */
888 factory FontExpression.merge(FontExpression x, FontExpression y) { 1214 factory FontExpression.merge(FontExpression x, FontExpression y) {
889 return new FontExpression._merge(x, y, y.span); 1215 return new FontExpression._merge(x, y, y.span);
890 } 1216 }
891 1217
892 FontExpression._merge(FontExpression x, FontExpression y, Span span) 1218 FontExpression._merge(FontExpression x, FontExpression y, Span span)
893 : super(DartStyleExpression.fontStyle, span), 1219 : super(DartStyleExpression.fontStyle, span),
894 font = new Font.merge(x.font, y.font); 1220 font = new Font.merge(x.font, y.font);
895 1221
1222 FontExpression clone() =>
1223 new FontExpression(span, size: font.size, family: font.family,
1224 weight: font.weight, style: font.style, variant: font.variant,
1225 lineHeight: font.lineHeight);
1226
896 visit(VisitorBase visitor) => visitor.visitFontExpression(this); 1227 visit(VisitorBase visitor) => visitor.visitFontExpression(this);
897 } 1228 }
898 1229
899 abstract class BoxExpression extends DartStyleExpression { 1230 abstract class BoxExpression extends DartStyleExpression {
900 final BoxEdge box; 1231 final BoxEdge box;
901 1232
902 BoxExpression(int styleType, Span span, this.box) 1233 BoxExpression(int styleType, Span span, this.box)
903 : super(styleType, span); 1234 : super(styleType, span);
904 1235
905 /* 1236 /*
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 /** 1277 /**
947 * Merge the two MarginExpressions and return the result. 1278 * Merge the two MarginExpressions and return the result.
948 */ 1279 */
949 factory MarginExpression.merge(MarginExpression x, MarginExpression y) { 1280 factory MarginExpression.merge(MarginExpression x, MarginExpression y) {
950 return new MarginExpression._merge(x, y, y.span); 1281 return new MarginExpression._merge(x, y, y.span);
951 } 1282 }
952 1283
953 MarginExpression._merge(MarginExpression x, MarginExpression y, Span span) 1284 MarginExpression._merge(MarginExpression x, MarginExpression y, Span span)
954 : super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); 1285 : super(x._styleType, span, new BoxEdge.merge(x.box, y.box));
955 1286
1287 MarginExpression clone() =>
1288 new MarginExpression(span, top: box.top, right: box.right,
1289 bottom: box.bottom, left: box.left);
1290
956 visit(VisitorBase visitor) => visitor.visitMarginExpression(this); 1291 visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
957 } 1292 }
958 1293
959 class BorderExpression extends BoxExpression { 1294 class BorderExpression extends BoxExpression {
960 /** Border expression ripped apart. */ 1295 /** Border expression ripped apart. */
961 BorderExpression(Span span, {num top, num right, num bottom, num left}) 1296 BorderExpression(Span span, {num top, num right, num bottom, num left})
962 : super(DartStyleExpression.borderStyle, span, 1297 : super(DartStyleExpression.borderStyle, span,
963 new BoxEdge(left, top, right, bottom)); 1298 new BoxEdge(left, top, right, bottom));
964 1299
965 BorderExpression.boxEdge(Span span, BoxEdge box) 1300 BorderExpression.boxEdge(Span span, BoxEdge box)
(...skipping 12 matching lines...) Expand all
978 */ 1313 */
979 factory BorderExpression.merge(BorderExpression x, BorderExpression y) { 1314 factory BorderExpression.merge(BorderExpression x, BorderExpression y) {
980 return new BorderExpression._merge(x, y, y.span); 1315 return new BorderExpression._merge(x, y, y.span);
981 } 1316 }
982 1317
983 BorderExpression._merge(BorderExpression x, BorderExpression y, 1318 BorderExpression._merge(BorderExpression x, BorderExpression y,
984 Span span) 1319 Span span)
985 : super(DartStyleExpression.borderStyle, span, 1320 : super(DartStyleExpression.borderStyle, span,
986 new BoxEdge.merge(x.box, y.box)); 1321 new BoxEdge.merge(x.box, y.box));
987 1322
1323 BorderExpression clone() =>
1324 new BorderExpression(span, top: box.top, right: box.right,
1325 bottom: box.bottom, left: box.left);
1326
988 visit(VisitorBase visitor) => visitor.visitBorderExpression(this); 1327 visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
989 } 1328 }
990 1329
991 class HeightExpression extends DartStyleExpression { 1330 class HeightExpression extends DartStyleExpression {
992 final height; 1331 final height;
993 1332
994 HeightExpression(Span span, this.height) 1333 HeightExpression(Span span, this.height)
995 : super(DartStyleExpression.heightStyle, span); 1334 : super(DartStyleExpression.heightStyle, span);
996 1335
997 merged(HeightExpression newHeightExpr) { 1336 merged(HeightExpression newHeightExpr) {
998 if (this.isHeight && newHeightExpr.isHeight) { 1337 if (this.isHeight && newHeightExpr.isHeight) {
999 return newHeightExpr; 1338 return newHeightExpr;
1000 } 1339 }
1001 1340
1002 return null; 1341 return null;
1003 } 1342 }
1004 1343
1344 HeightExpression clone() => new HeightExpression(span, height);
1005 visit(VisitorBase visitor) => visitor.visitHeightExpression(this); 1345 visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
1006 } 1346 }
1007 1347
1008 class WidthExpression extends DartStyleExpression { 1348 class WidthExpression extends DartStyleExpression {
1009 final width; 1349 final width;
1010 1350
1011 WidthExpression(Span span, this.width) 1351 WidthExpression(Span span, this.width)
1012 : super(DartStyleExpression.widthStyle, span); 1352 : super(DartStyleExpression.widthStyle, span);
1013 1353
1014 merged(WidthExpression newWidthExpr) { 1354 merged(WidthExpression newWidthExpr) {
1015 if (this.isWidth && newWidthExpr.isWidth) { 1355 if (this.isWidth && newWidthExpr.isWidth) {
1016 return newWidthExpr; 1356 return newWidthExpr;
1017 } 1357 }
1018 1358
1019 return null; 1359 return null;
1020 } 1360 }
1021 1361
1362 WidthExpression clone() => new WidthExpression(span, width);
1022 visit(VisitorBase visitor) => visitor.visitWidthExpression(this); 1363 visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
1023 } 1364 }
1024 1365
1025 class PaddingExpression extends BoxExpression { 1366 class PaddingExpression extends BoxExpression {
1026 /** Padding expression ripped apart. */ 1367 /** Padding expression ripped apart. */
1027 PaddingExpression(Span span, {num top, num right, num bottom, num left}) 1368 PaddingExpression(Span span, {num top, num right, num bottom, num left})
1028 : super(DartStyleExpression.paddingStyle, span, 1369 : super(DartStyleExpression.paddingStyle, span,
1029 new BoxEdge(left, top, right, bottom)); 1370 new BoxEdge(left, top, right, bottom));
1030 1371
1031 PaddingExpression.boxEdge(Span span, BoxEdge box) 1372 PaddingExpression.boxEdge(Span span, BoxEdge box)
(...skipping 11 matching lines...) Expand all
1043 * Merge the two PaddingExpression and return the result. 1384 * Merge the two PaddingExpression and return the result.
1044 */ 1385 */
1045 factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) { 1386 factory PaddingExpression.merge(PaddingExpression x, PaddingExpression y) {
1046 return new PaddingExpression._merge(x, y, y.span); 1387 return new PaddingExpression._merge(x, y, y.span);
1047 } 1388 }
1048 1389
1049 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span) 1390 PaddingExpression._merge(PaddingExpression x, PaddingExpression y, Span span)
1050 : super(DartStyleExpression.paddingStyle, span, 1391 : super(DartStyleExpression.paddingStyle, span,
1051 new BoxEdge.merge(x.box, y.box)); 1392 new BoxEdge.merge(x.box, y.box));
1052 1393
1394 PaddingExpression clone() =>
1395 new PaddingExpression(span, top: box.top, right: box.right,
1396 bottom: box.bottom, left: box.left);
1053 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); 1397 visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
1054 } 1398 }
OLDNEW
« no previous file with comments | « pkg/csslib/lib/src/tokenkind.dart ('k') | pkg/csslib/lib/src/tree_base.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698