Index: pkg/csslib/lib/src/tree.dart |
diff --git a/pkg/csslib/lib/src/tree.dart b/pkg/csslib/lib/src/tree.dart |
index e8411d31f8fabb185ab4bc46be89a65d032e4d27..1de595709ad24bc670b239d6d7b7d150fb7b3dc8 100644 |
--- a/pkg/csslib/lib/src/tree.dart |
+++ b/pkg/csslib/lib/src/tree.dart |
@@ -13,6 +13,8 @@ class Identifier extends TreeNode { |
Identifier(this.name, Span span): super(span); |
+ Identifier clone() => new Identifier(name, span); |
+ |
visit(VisitorBase visitor) => visitor.visitIdentifier(this); |
String toString() => name; |
@@ -20,16 +22,19 @@ class Identifier extends TreeNode { |
class Wildcard extends TreeNode { |
Wildcard(Span span): super(span); |
+ Wildcard clone() => new Wildcard(span); |
visit(VisitorBase visitor) => visitor.visitWildcard(this); |
} |
class ThisOperator extends TreeNode { |
ThisOperator(Span span): super(span); |
+ ThisOperator clone() => new ThisOperator(span); |
visit(VisitorBase visitor) => visitor.visitThisOperator(this); |
} |
class Negation extends TreeNode { |
Negation(Span span): super(span); |
+ Negation clone() => new Negation(span); |
visit(VisitorBase visitor) => visitor.visitNegation(this); |
} |
@@ -38,12 +43,14 @@ class CssComment extends TreeNode { |
final String comment; |
CssComment(this.comment, Span span): super(span); |
+ CssComment clone() => new CssComment(comment, span); |
visit(VisitorBase visitor) => visitor.visitCssComment(this); |
} |
// CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->). |
class CommentDefinition extends CssComment { |
CommentDefinition(String comment, Span span): super(comment, span); |
+ CommentDefinition clone() => new CommentDefinition(comment, span); |
visit(VisitorBase visitor) => visitor.visitCommentDefinition(this); |
} |
@@ -54,6 +61,8 @@ class SelectorGroup extends TreeNode { |
List<Selector> get selectors => _selectors; |
+ SelectorGroup clone() => new SelectorGroup(_selectors, span); |
+ |
visit(VisitorBase visitor) => visitor.visitSelectorGroup(this); |
} |
@@ -69,26 +78,34 @@ class Selector extends TreeNode { |
int get length => _simpleSelectorSequences.length; |
+ Selector clone() { |
+ var simpleSequences = []; |
+ for (var simpleSeq in simpleSelectorSequences) { |
+ simpleSequences.add(simpleSeq.clone()); |
+ } |
+ return new Selector(simpleSequences, span); |
+ } |
+ |
visit(VisitorBase visitor) => visitor.visitSelector(this); |
} |
class SimpleSelectorSequence extends TreeNode { |
/** +, >, ~, NONE */ |
- final int _combinator; |
+ int combinator; |
final SimpleSelector _selector; |
SimpleSelectorSequence(this._selector, Span span, |
[int combinator = TokenKind.COMBINATOR_NONE]) |
- : _combinator = combinator, super(span); |
+ : combinator = combinator, super(span); |
get simpleSelector => _selector; |
- bool get isCombinatorNone => _combinator == TokenKind.COMBINATOR_NONE; |
- bool get isCombinatorPlus => _combinator == TokenKind.COMBINATOR_PLUS; |
- bool get isCombinatorGreater => _combinator == TokenKind.COMBINATOR_GREATER; |
- bool get isCombinatorTilde => _combinator == TokenKind.COMBINATOR_TILDE; |
+ bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE; |
+ bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS; |
+ bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER; |
+ bool get isCombinatorTilde => combinator == TokenKind.COMBINATOR_TILDE; |
bool get isCombinatorDescendant => |
- _combinator == TokenKind.COMBINATOR_DESCENDANT; |
+ combinator == TokenKind.COMBINATOR_DESCENDANT; |
String get _combinatorToString => |
isCombinatorDescendant ? ' ' : |
@@ -96,6 +113,9 @@ class SimpleSelectorSequence extends TreeNode { |
isCombinatorGreater ? ' > ' : |
isCombinatorTilde ? ' ~ ' : ''; |
+ SimpleSelectorSequence clone() => |
+ new SimpleSelectorSequence(_selector, span, combinator); |
+ |
visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this); |
} |
@@ -114,6 +134,8 @@ class SimpleSelector extends TreeNode { |
bool get isThis => _name is ThisOperator; |
+ SimpleSelector clone() => new SimpleSelector(_name, span); |
+ |
visit(VisitorBase visitor) => visitor.visitSimpleSelector(this); |
} |
@@ -121,6 +143,8 @@ class SimpleSelector extends TreeNode { |
class ElementSelector extends SimpleSelector { |
ElementSelector(name, Span span) : super(name, span); |
visit(VisitorBase visitor) => visitor.visitElementSelector(this); |
+ |
+ String toString() => name; |
} |
// namespace|element |
@@ -136,7 +160,11 @@ class NamespaceSelector extends SimpleSelector { |
SimpleSelector get nameAsSimpleSelector => _name; |
+ NamespaceSelector clone() => new NamespaceSelector(_namespace, "", span); |
+ |
visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this); |
+ |
+ String toString() => "$namespace|${nameAsSimpleSelector.name}"; |
} |
// [attr op value] |
@@ -196,31 +224,45 @@ class AttributeSelector extends SimpleSelector { |
} |
} |
+ AttributeSelector clone() => new AttributeSelector(_name, _op, _value, span); |
+ |
visit(VisitorBase visitor) => visitor.visitAttributeSelector(this); |
+ |
+ String toString() => "[$name${matchOperator()}${valueToString()}]"; |
} |
// #id |
class IdSelector extends SimpleSelector { |
IdSelector(Identifier name, Span span) : super(name, span); |
+ IdSelector clone() => new IdSelector(_name, span); |
visit(VisitorBase visitor) => visitor.visitIdSelector(this); |
+ |
+ String toString() => "#$_name"; |
} |
// .class |
class ClassSelector extends SimpleSelector { |
ClassSelector(Identifier name, Span span) : super(name, span); |
+ ClassSelector clone() => new ClassSelector(_name, span); |
visit(VisitorBase visitor) => visitor.visitClassSelector(this); |
+ |
+ String toString() => ".$_name"; |
} |
// :pseudoClass |
class PseudoClassSelector extends SimpleSelector { |
PseudoClassSelector(Identifier name, Span span) : super(name, span); |
visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this); |
+ |
+ String toString() => ":$name"; |
} |
// ::pseudoElement |
class PseudoElementSelector extends SimpleSelector { |
PseudoElementSelector(Identifier name, Span span) : super(name, span); |
visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this); |
+ |
+ String toString() => "::$name"; |
} |
// :pseudoClassFunction(expression) |
@@ -229,6 +271,8 @@ class PseudoClassFunctionSelector extends PseudoClassSelector { |
PseudoClassFunctionSelector(Identifier name, this.expression, Span span) |
: super(name, span); |
+ PseudoClassFunctionSelector clone() => |
+ new PseudoClassFunctionSelector(_name, expression, span); |
visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this); |
} |
@@ -238,6 +282,8 @@ class PseudoElementFunctionSelector extends PseudoElementSelector { |
PseudoElementFunctionSelector(Identifier name, this.expression, Span span) |
: super(name, span); |
+ PseudoElementFunctionSelector clone() => |
+ new PseudoElementFunctionSelector(_name, expression, span); |
visit(VisitorBase visitor) => |
visitor.visitPseudoElementFunctionSelector(this); |
} |
@@ -253,6 +299,14 @@ class SelectorExpression extends TreeNode { |
List<Expression> get expressions => _expressions; |
+ SelectorExpression clone() { |
+ var selectorExpr = new SelectorExpression(span); |
+ for (var expr in _expressions) { |
+ selectorExpr.add(expr.clone()); |
+ } |
+ return selectorExpr; |
+ } |
+ |
visit(VisitorBase visitor) => visitor.visitSelectorExpression(this); |
} |
@@ -263,9 +317,19 @@ class NegationSelector extends SimpleSelector { |
NegationSelector(this.negationArg, Span span) |
: super(new Negation(span), span); |
+ NegationSelector clone() => new NegationSelector(negationArg, span); |
+ |
visit(VisitorBase visitor) => visitor.visitNegationSelector(this); |
} |
+class NoOp extends TreeNode { |
+ NoOp() : super(null); |
+ |
+ NoOp clone() => new NoOp(); |
+ |
+ visit(VisitorBase visitor) => visitor.visitNoOp(this); |
+} |
+ |
class StyleSheet extends TreeNode { |
/** |
* Contains charset, ruleset, directives (media, page, etc.), and selectors. |
@@ -281,11 +345,18 @@ class StyleSheet extends TreeNode { |
/** Selectors only in this tree. */ |
StyleSheet.selector(this.topLevels, Span span) : super(span); |
+ StyleSheet clone() { |
+ var clonedTopLevels = []; |
+ clonedTopLevels.add(topLevels.clone()); |
+ return new StyleSheet(clonedTopLevels, span); |
+ } |
+ |
visit(VisitorBase visitor) => visitor.visitStyleSheet(this); |
} |
class TopLevelProduction extends TreeNode { |
TopLevelProduction(Span span) : super(span); |
+ TopLevelProduction clone() => new TopLevelProduction(span); |
visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this); |
} |
@@ -298,6 +369,12 @@ class RuleSet extends TopLevelProduction { |
SelectorGroup get selectorGroup => _selectorGroup; |
DeclarationGroup get declarationGroup => _declarationGroup; |
+ RuleSet clone() { |
+ var cloneSelectorGroup = _selectorGroup.clone(); |
+ var cloneDeclarationGroup = _declarationGroup.clone(); |
+ return new RuleSet(cloneSelectorGroup, cloneDeclarationGroup, span); |
+ } |
+ |
visit(VisitorBase visitor) => visitor.visitRuleSet(this); |
} |
@@ -307,6 +384,7 @@ class Directive extends TreeNode { |
bool get isBuiltIn => true; // Known CSS directive? |
bool get isExtension => false; // SCSS extension? |
+ Directive clone() => new Directive(span); |
visit(VisitorBase visitor) => visitor.visitDirective(this); |
} |
@@ -319,6 +397,14 @@ class ImportDirective extends Directive { |
ImportDirective(this.import, this.mediaQueries, Span span) : super(span); |
+ ImportDirective clone() { |
+ var cloneMediaQueries = []; |
+ for (var mediaQuery in mediaQueries) { |
+ cloneMediaQueries.add(mediaQuery.clone()); |
+ } |
+ return new ImportDirective(import, cloneMediaQueries, span); |
+ } |
+ |
visit(VisitorBase visitor) => visitor.visitImportDirective(this); |
} |
@@ -336,6 +422,11 @@ class MediaExpression extends TreeNode { |
String get mediaFeature => _mediaFeature.name; |
+ MediaExpression clone() { |
+ var clonedExprs = exprs.clone(); |
+ return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span); |
+ } |
+ |
visit(VisitorBase visitor) => visitor.visitMediaExpression(this); |
} |
@@ -366,6 +457,13 @@ class MediaQuery extends TreeNode { |
String get unary => |
TokenKind.idToValue(TokenKind.MEDIA_OPERATORS, _mediaUnary).toUpperCase(); |
+ MediaQuery clone() { |
+ var cloneExpressions = []; |
+ for (var expr in expressions) { |
+ cloneExpressions.add(expr.clone()); |
+ } |
+ return new MediaQuery(_mediaUnary, _mediaType, cloneExpressions, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitMediaQuery(this); |
} |
@@ -375,6 +473,17 @@ class MediaDirective extends Directive { |
MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span); |
+ MediaDirective clone() { |
+ var cloneQueries = []; |
+ for (var mediaQuery in mediaQueries) { |
+ cloneQueries.add(mediaQuery.clone()); |
+ } |
+ var cloneRulesets = []; |
+ for (var ruleset in rulesets) { |
+ cloneRulesets.add(ruleset.clone()); |
+ } |
+ return new MediaDirective(cloneQueries, cloneRulesets, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitMediaDirective(this); |
} |
@@ -383,6 +492,13 @@ class HostDirective extends Directive { |
HostDirective(this.rulesets, Span span) : super(span); |
+ HostDirective clone() { |
+ var cloneRulesets = []; |
+ for (var ruleset in rulesets) { |
+ cloneRulesets.add(ruleset.clone()); |
+ } |
+ return new HostDirective(cloneRulesets, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitHostDirective(this); |
} |
@@ -394,6 +510,13 @@ class PageDirective extends Directive { |
PageDirective(this._ident, this._pseudoPage, this._declsMargin, |
Span span) : super(span); |
+ PageDirective clone() { |
+ var cloneDeclsMargin = []; |
+ for (var declMargin in _declsMargin) { |
+ cloneDeclsMargin.add(declMargin.clone()); |
+ } |
+ return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitPageDirective(this); |
bool get hasIdent => _ident != null && _ident.length > 0; |
@@ -404,6 +527,7 @@ class CharsetDirective extends Directive { |
final String charEncoding; |
CharsetDirective(this.charEncoding, Span span) : super(span); |
+ CharsetDirective clone() => new CharsetDirective(charEncoding, span); |
visit(VisitorBase visitor) => visitor.visitCharsetDirective(this); |
} |
@@ -435,6 +559,13 @@ class KeyFrameDirective extends Directive { |
String get name => _name; |
+ KeyFrameDirective clone() { |
+ var cloneBlocks = []; |
+ for (var block in _blocks) { |
+ cloneBlocks.add(block.clone()); |
+ } |
+ return new KeyFrameDirective(_keyframeName, cloneBlocks, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this); |
} |
@@ -445,6 +576,8 @@ class KeyFrameBlock extends Expression { |
KeyFrameBlock(this._blockSelectors, this._declarations, Span span) |
: super(span); |
+ KeyFrameBlock clone() => |
+ new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span); |
visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this); |
} |
@@ -453,6 +586,8 @@ class FontFaceDirective extends Directive { |
FontFaceDirective(this._declarations, Span span) : super(span); |
+ FontFaceDirective clone() => |
+ new FontFaceDirective(_declarations.clone(), span); |
visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this); |
} |
@@ -468,6 +603,13 @@ class StyletDirective extends Directive { |
String get dartClassName => _dartClassName; |
List<RuleSet> get rulesets => _rulesets; |
+ StyletDirective clone() { |
+ var cloneRulesets = []; |
+ for (var ruleset in _rulesets) { |
+ cloneRulesets.add(ruleset.clone()); |
+ } |
+ return new StyletDirective(_dartClassName, cloneRulesets, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitStyletDirective(this); |
} |
@@ -480,6 +622,7 @@ class NamespaceDirective extends Directive { |
NamespaceDirective(this._prefix, this._uri, Span span) : super(span); |
+ NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span); |
visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this); |
String get prefix => _prefix.length > 0 ? '$_prefix ' : ''; |
@@ -491,9 +634,95 @@ class VarDefinitionDirective extends Directive { |
VarDefinitionDirective(this.def, Span span) : super(span); |
+ VarDefinitionDirective clone() => |
+ new VarDefinitionDirective(def.clone(), span); |
visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this); |
} |
+class MixinDefinition extends Directive { |
+ final String name; |
+ final List definedArgs; |
+ final bool varArgs; |
+ |
+ MixinDefinition(this.name, this.definedArgs, this.varArgs, Span span) |
+ : super(span); |
+ |
+ MixinDefinition clone() { |
+ var cloneDefinedArgs = []; |
+ for (var definedArg in definedArgs) { |
+ cloneDefinedArgs.add(definedArg.clone()); |
+ } |
+ return new MixinDefinition(name, cloneDefinedArgs, varArgs, span); |
+ } |
+ visit(VisitorBase visitor) => visitor.visitMixinDefinition(this); |
+} |
+ |
+/** Support a Sass @mixin. See http://sass-lang.com for description. */ |
+class MixinRulesetDirective extends MixinDefinition { |
+ final List<RuleSet> rulesets; |
+ |
+ MixinRulesetDirective(String name, List<VarDefinitionDirective> args, |
+ bool varArgs, this.rulesets, Span span) : |
+ super(name, args, varArgs, span); |
+ |
+ MixinRulesetDirective clone() { |
+ var clonedArgs = []; |
+ for (var arg in definedArgs) { |
+ clonedArgs.add(arg.clone()); |
+ } |
+ var clonedRulesets = []; |
+ for (var ruleset in rulesets) { |
+ clonedRulesets.add(ruleset.clone()); |
+ } |
+ return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets, |
+ span); |
+ } |
+ visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this); |
+} |
+ |
+class MixinDeclarationDirective extends MixinDefinition { |
+ final DeclarationGroup declarations; |
+ |
+ MixinDeclarationDirective(String name, List<VarDefinitionDirective> args, |
+ bool varArgs, this.declarations, Span span) : |
+ super(name, args, varArgs, span); |
+ MixinDeclarationDirective clone() { |
+ var clonedArgs = []; |
+ for (var arg in definedArgs) { |
+ clonedArgs.add(arg.clone()); |
+ } |
+ return new MixinDeclarationDirective(name, clonedArgs, varArgs, |
+ declarations.clone(), span); |
+ } |
+ visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this); |
+} |
+ |
+/** To support consuming a SASS mixin @include. */ |
+class IncludeDirective extends Directive { |
+ final String name; |
+ final List<List<TreeNode>> args; |
+ |
+ IncludeDirective(this.name, this.args, Span span) : super(span); |
+ |
+ IncludeDirective clone() { |
+ var cloneArgs = []; |
+ for (var arg in args) { |
+ for (var term in arg) { |
+ cloneArgs.add(term.clone()); |
+ } |
+ } |
+ return new IncludeDirective(name, cloneArgs, span); |
+ } |
+ visit(VisitorBase visitor) => visitor.visitIncludeDirective(this); |
+} |
+ |
+/** To support SASS @content. */ |
+class ContentDirective extends Directive { |
+ ContentDirective(Span span) : super(span); |
+ |
+ visit(VisitorBase visitor) => visitor.visitContentDirective(this); |
+} |
+ |
class Declaration extends TreeNode { |
final Identifier _property; |
final Expression _expression; |
@@ -524,6 +753,9 @@ class Declaration extends TreeNode { |
_dart = dStyle; |
} |
+ Declaration clone() => |
+ new Declaration(_property.clone(), _expression.clone(), _dart, span, |
+ important: important); |
visit(VisitorBase visitor) => visitor.visitDeclaration(this); |
} |
@@ -534,6 +766,8 @@ class Declaration extends TreeNode { |
// are top-level are then statically resolved and var-foo in a |
// declaration group (surrounded by a selector) would be dynamic. |
class VarDefinition extends Declaration { |
+ bool badUsage = false; |
+ |
VarDefinition(Identifier definedName, Expression expr, Span span) |
: super(definedName, expr, null, span); |
@@ -541,9 +775,47 @@ class VarDefinition extends Declaration { |
set dartStyle(dStyle) { } |
+ VarDefinition clone() => |
+ new VarDefinition(_property.clone(), |
+ expression != null ? expression.clone() : null, span); |
visit(VisitorBase visitor) => visitor.visitVarDefinition(this); |
} |
+/** |
+ * Node for usage of @include mixin[(args,...)] found in a declaration group |
+ * instead of at a ruleset (toplevel) e.g., |
+ * div { |
+ * @include mixin1; |
+ * } |
+ */ |
+class IncludeMixinAtDeclaration extends Declaration { |
+ final IncludeDirective include; |
+ |
+ IncludeMixinAtDeclaration(this.include, Span span) |
+ : super(null, null, null, span); |
+ |
+ IncludeMixinAtDeclaration clone() => |
+ new IncludeMixinAtDeclaration(include.clone(), span); |
+ visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this); |
+} |
+ |
+class ExtendDeclaration extends Declaration { |
+ List<SimpleSelectorSequence> selectors; |
+ |
+ ExtendDeclaration(this.selectors, Span span) : |
+ super(null, null, null, span); |
+ |
+ ExtendDeclaration clone() { |
+ List<SimpleSelectorSequence> newSelector = []; |
+ for (var selectorSeq in selectors) { |
+ newSelector.add(selectorSeq.clone()); |
+ } |
+ return new ExtendDeclaration(newSelector, span); |
+ } |
+ |
+ visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this); |
+} |
+ |
class DeclarationGroup extends TreeNode { |
/** Can be either Declaration or RuleSet (if nested selector). */ |
final List _declarations; |
@@ -552,6 +824,13 @@ class DeclarationGroup extends TreeNode { |
List get declarations => _declarations; |
+ DeclarationGroup clone() { |
+ var clonedDecls = []; |
+ for (var decl in _declarations) { |
+ clonedDecls.add(decl.clone()); |
+ } |
+ return new DeclarationGroup(clonedDecls, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this); |
} |
@@ -560,6 +839,8 @@ class MarginGroup extends DeclarationGroup { |
MarginGroup(this.margin_sym, List<Declaration> decls, Span span) |
: super(decls, span); |
+ MarginGroup clone() => |
+ new MarginGroup(margin_sym, super.clone() as dynamic, span); |
visit(VisitorBase visitor) => visitor.visitMarginGroup(this); |
} |
@@ -569,26 +850,37 @@ class VarUsage extends Expression { |
VarUsage(this.name, this.defaultValues, Span span) : super(span); |
+ VarUsage clone() { |
+ var clonedValues = []; |
+ for (var expr in defaultValues) { |
+ clonedValues.addd(expr.clone()); |
+ } |
+ return new VarUsage(name, clonedValues, span); |
+ } |
visit(VisitorBase visitor) => visitor.visitVarUsage(this); |
} |
class OperatorSlash extends Expression { |
OperatorSlash(Span span) : super(span); |
+ OperatorSlash clone() => new OperatorSlash(span); |
visit(VisitorBase visitor) => visitor.visitOperatorSlash(this); |
} |
class OperatorComma extends Expression { |
OperatorComma(Span span) : super(span); |
+ OperatorComma clone() => new OperatorComma(span); |
visit(VisitorBase visitor) => visitor.visitOperatorComma(this); |
} |
class OperatorPlus extends Expression { |
OperatorPlus(Span span) : super(span); |
+ OperatorPlus clone() => new OperatorPlus(span); |
visit(VisitorBase visitor) => visitor.visitOperatorPlus(this); |
} |
class OperatorMinus extends Expression { |
OperatorMinus(Span span) : super(span); |
+ OperatorMinus clone() => new OperatorMinus(span); |
visit(VisitorBase visitor) => visitor.visitOperatorMinus(this); |
} |
@@ -600,6 +892,8 @@ class UnicodeRangeTerm extends Expression { |
bool get hasSecond => second != null; |
+ UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span); |
+ |
visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this); |
} |
@@ -612,11 +906,14 @@ class LiteralTerm extends Expression { |
LiteralTerm(this.value, this.text, Span span) : super(span); |
+ LiteralTerm clone() => new LiteralTerm(value, text, span); |
+ |
visit(VisitorBase visitor) => visitor.visitLiteralTerm(this); |
} |
class NumberTerm extends LiteralTerm { |
NumberTerm(value, String t, Span span) : super(value, t, span); |
+ NumberTerm clone() => new NumberTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitNumberTerm(this); |
} |
@@ -627,6 +924,8 @@ class UnitTerm extends LiteralTerm { |
int get unit => _unit; |
+ UnitTerm clone() => new UnitTerm(value, text, span, _unit); |
+ |
visit(VisitorBase visitor) => visitor.visitUnitTerm(this); |
String unitToString() => TokenKind.unitToString(_unit); |
@@ -644,22 +943,25 @@ class LengthTerm extends UnitTerm { |
this._unit == TokenKind.UNIT_LENGTH_PT || |
this._unit == TokenKind.UNIT_LENGTH_PC); |
} |
- |
+ LengthTerm clone() => new LengthTerm(value, text, span, _unit); |
visit(VisitorBase visitor) => visitor.visitLengthTerm(this); |
} |
class PercentageTerm extends LiteralTerm { |
PercentageTerm(value, String t, Span span) : super(value, t, span); |
+ PercentageTerm clone() => new PercentageTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitPercentageTerm(this); |
} |
class EmTerm extends LiteralTerm { |
EmTerm(value, String t, Span span) : super(value, t, span); |
+ EmTerm clone() => new EmTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitEmTerm(this); |
} |
class ExTerm extends LiteralTerm { |
ExTerm(value, String t, Span span) : super(value, t, span); |
+ ExTerm clone() => new ExTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitExTerm(this); |
} |
@@ -672,6 +974,7 @@ class AngleTerm extends UnitTerm { |
this._unit == TokenKind.UNIT_ANGLE_TURN); |
} |
+ AngleTerm clone() => new AngleTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitAngleTerm(this); |
} |
@@ -683,6 +986,7 @@ class TimeTerm extends UnitTerm { |
this._unit == TokenKind.UNIT_TIME_S); |
} |
+ TimeTerm clone() => new TimeTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitTimeTerm(this); |
} |
@@ -692,18 +996,21 @@ class FreqTerm extends UnitTerm { |
assert(_unit == TokenKind.UNIT_FREQ_HZ || _unit == TokenKind.UNIT_FREQ_KHZ); |
} |
+ FreqTerm clone() => new FreqTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitFreqTerm(this); |
} |
class FractionTerm extends LiteralTerm { |
FractionTerm(var value, String t, Span span) : super(value, t, span); |
+ FractionTerm clone() => new FractionTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitFractionTerm(this); |
} |
class UriTerm extends LiteralTerm { |
UriTerm(String value, Span span) : super(value, value, span); |
+ UriTerm clone() => new UriTerm(value, span); |
visit(VisitorBase visitor) => visitor.visitUriTerm(this); |
} |
@@ -715,6 +1022,7 @@ class ResolutionTerm extends UnitTerm { |
_unit == TokenKind.UNIT_RESOLUTION_DPPX); |
} |
+ ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitResolutionTerm(this); |
} |
@@ -724,6 +1032,7 @@ class ChTerm extends UnitTerm { |
assert(_unit == TokenKind.UNIT_CH); |
} |
+ ChTerm clone() => new ChTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitChTerm(this); |
} |
@@ -733,6 +1042,7 @@ class RemTerm extends UnitTerm { |
assert(_unit == TokenKind.UNIT_REM); |
} |
+ RemTerm clone() => new RemTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitRemTerm(this); |
} |
@@ -745,6 +1055,7 @@ class ViewportTerm extends UnitTerm { |
_unit == TokenKind.UNIT_VIEWPORT_VMAX); |
} |
+ ViewportTerm clone() => new ViewportTerm(value, text, span, unit); |
visit(VisitorBase visitor) => visitor.visitViewportTerm(this); |
} |
@@ -754,6 +1065,7 @@ class BAD_HEX_VALUE { } |
class HexColorTerm extends LiteralTerm { |
HexColorTerm(var value, String t, Span span) : super(value, t, span); |
+ HexColorTerm clone() => new HexColorTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitHexColorTerm(this); |
} |
@@ -763,6 +1075,7 @@ class FunctionTerm extends LiteralTerm { |
FunctionTerm(var value, String t, this._params, Span span) |
: super(value, t, span); |
+ FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span); |
visit(VisitorBase visitor) => visitor.visitFunctionTerm(this); |
} |
@@ -773,6 +1086,7 @@ class FunctionTerm extends LiteralTerm { |
*/ |
class IE8Term extends LiteralTerm { |
IE8Term(Span span) : super('\\9', '\\9', span); |
+ IE8Term clone() => new IE8Term(span); |
visit(VisitorBase visitor) => visitor.visitIE8Term(this); |
} |
@@ -785,12 +1099,14 @@ class GroupTerm extends Expression { |
_terms.add(term); |
} |
+ GroupTerm clone() => new GroupTerm(span); |
visit(VisitorBase visitor) => visitor.visitGroupTerm(this); |
} |
class ItemTerm extends NumberTerm { |
ItemTerm(var value, String t, Span span) : super(value, t, span); |
+ ItemTerm clone() => new ItemTerm(value, text, span); |
visit(VisitorBase visitor) => visitor.visitItemTerm(this); |
} |
@@ -803,6 +1119,13 @@ class Expressions extends Expression { |
expressions.add(expression); |
} |
+ Expressions clone() { |
+ var clonedExprs = new Expressions(span); |
+ for (var expr in expressions) { |
+ clonedExprs.add(expr.clone()); |
+ } |
+ return clonedExprs; |
+ } |
visit(VisitorBase visitor) => visitor.visitExpressions(this); |
} |
@@ -813,6 +1136,8 @@ class BinaryExpression extends Expression { |
BinaryExpression(this.op, this.x, this.y, Span span): super(span); |
+ BinaryExpression clone() => |
+ new BinaryExpression(op, x.clone(), y.clone(), span); |
visit(VisitorBase visitor) => visitor.visitBinaryExpression(this); |
} |
@@ -822,6 +1147,7 @@ class UnaryExpression extends Expression { |
UnaryExpression(this.op, this.self, Span span): super(span); |
+ UnaryExpression clone() => new UnaryExpression(op, self.clone(), span); |
visit(VisitorBase visitor) => visitor.visitUnaryExpression(this); |
} |
@@ -893,6 +1219,11 @@ class FontExpression extends DartStyleExpression { |
: super(DartStyleExpression.fontStyle, span), |
font = new Font.merge(x.font, y.font); |
+ FontExpression clone() => |
+ new FontExpression(span, size: font.size, family: font.family, |
+ weight: font.weight, style: font.style, variant: font.variant, |
+ lineHeight: font.lineHeight); |
+ |
visit(VisitorBase visitor) => visitor.visitFontExpression(this); |
} |
@@ -953,6 +1284,10 @@ class MarginExpression extends BoxExpression { |
MarginExpression._merge(MarginExpression x, MarginExpression y, Span span) |
: super(x._styleType, span, new BoxEdge.merge(x.box, y.box)); |
+ MarginExpression clone() => |
+ new MarginExpression(span, top: box.top, right: box.right, |
+ bottom: box.bottom, left: box.left); |
+ |
visit(VisitorBase visitor) => visitor.visitMarginExpression(this); |
} |
@@ -985,6 +1320,10 @@ class BorderExpression extends BoxExpression { |
: super(DartStyleExpression.borderStyle, span, |
new BoxEdge.merge(x.box, y.box)); |
+ BorderExpression clone() => |
+ new BorderExpression(span, top: box.top, right: box.right, |
+ bottom: box.bottom, left: box.left); |
+ |
visit(VisitorBase visitor) => visitor.visitBorderExpression(this); |
} |
@@ -1002,6 +1341,7 @@ class HeightExpression extends DartStyleExpression { |
return null; |
} |
+ HeightExpression clone() => new HeightExpression(span, height); |
visit(VisitorBase visitor) => visitor.visitHeightExpression(this); |
} |
@@ -1019,6 +1359,7 @@ class WidthExpression extends DartStyleExpression { |
return null; |
} |
+ WidthExpression clone() => new WidthExpression(span, width); |
visit(VisitorBase visitor) => visitor.visitWidthExpression(this); |
} |
@@ -1050,5 +1391,8 @@ class PaddingExpression extends BoxExpression { |
: super(DartStyleExpression.paddingStyle, span, |
new BoxEdge.merge(x.box, y.box)); |
+ PaddingExpression clone() => |
+ new PaddingExpression(span, top: box.top, right: box.right, |
+ bottom: box.bottom, left: box.left); |
visit(VisitorBase visitor) => visitor.visitPaddingExpression(this); |
} |