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

Unified 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« 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