Index: mojo/public/dart/third_party/csslib/lib/visitor.dart |
diff --git a/mojo/public/dart/third_party/csslib/lib/visitor.dart b/mojo/public/dart/third_party/csslib/lib/visitor.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fa0f8d2bba3f39f1910dfa8704fac6df2f1cf251 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/csslib/lib/visitor.dart |
@@ -0,0 +1,455 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library csslib.visitor; |
+ |
+import 'package:source_span/source_span.dart'; |
+import 'parser.dart'; |
+ |
+part 'src/css_printer.dart'; |
+part 'src/tree.dart'; |
+part 'src/tree_base.dart'; |
+part 'src/tree_printer.dart'; |
+ |
+abstract class VisitorBase { |
+ void visitCssComment(CssComment node); |
+ void visitCommentDefinition(CommentDefinition node); |
+ void visitStyleSheet(StyleSheet node); |
+ void visitNoOp(NoOp node); |
+ void visitTopLevelProduction(TopLevelProduction node); |
+ void visitDirective(Directive node); |
+ void visitMediaExpression(MediaExpression node); |
+ void visitMediaQuery(MediaQuery node); |
+ void visitMediaDirective(MediaDirective node); |
+ void visitHostDirective(HostDirective node); |
+ void visitPageDirective(PageDirective node); |
+ void visitCharsetDirective(CharsetDirective node); |
+ void visitImportDirective(ImportDirective node); |
+ void visitKeyFrameDirective(KeyFrameDirective node); |
+ void visitKeyFrameBlock(KeyFrameBlock node); |
+ void visitFontFaceDirective(FontFaceDirective node); |
+ void visitStyletDirective(StyletDirective node); |
+ void visitNamespaceDirective(NamespaceDirective node); |
+ void visitVarDefinitionDirective(VarDefinitionDirective node); |
+ void visitMixinDefinition(MixinDefinition node); |
+ void visitMixinRulesetDirective(MixinRulesetDirective node); |
+ void visitMixinDeclarationDirective(MixinDeclarationDirective node); |
+ void visitIncludeDirective(IncludeDirective node); |
+ void visitContentDirective(ContentDirective node); |
+ |
+ void visitRuleSet(RuleSet node); |
+ void visitDeclarationGroup(DeclarationGroup node); |
+ void visitMarginGroup(MarginGroup node); |
+ void visitDeclaration(Declaration node); |
+ void visitVarDefinition(VarDefinition node); |
+ void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node); |
+ void visitExtendDeclaration(ExtendDeclaration node); |
+ void visitSelectorGroup(SelectorGroup node); |
+ void visitSelector(Selector node); |
+ void visitSimpleSelectorSequence(SimpleSelectorSequence node); |
+ void visitSimpleSelector(SimpleSelector node); |
+ void visitElementSelector(ElementSelector node); |
+ void visitNamespaceSelector(NamespaceSelector node); |
+ void visitAttributeSelector(AttributeSelector node); |
+ void visitIdSelector(IdSelector node); |
+ void visitClassSelector(ClassSelector node); |
+ void visitPseudoClassSelector(PseudoClassSelector node); |
+ void visitPseudoElementSelector(PseudoElementSelector node); |
+ void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node); |
+ void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node); |
+ void visitNegationSelector(NegationSelector node); |
+ void visitSelectorExpression(SelectorExpression node); |
+ |
+ void visitUnicodeRangeTerm(UnicodeRangeTerm node); |
+ void visitLiteralTerm(LiteralTerm node); |
+ void visitHexColorTerm(HexColorTerm node); |
+ void visitNumberTerm(NumberTerm node); |
+ void visitUnitTerm(UnitTerm node); |
+ void visitLengthTerm(LengthTerm node); |
+ void visitPercentageTerm(PercentageTerm node); |
+ void visitEmTerm(EmTerm node); |
+ void visitExTerm(ExTerm node); |
+ void visitAngleTerm(AngleTerm node); |
+ void visitTimeTerm(TimeTerm node); |
+ void visitFreqTerm(FreqTerm node); |
+ void visitFractionTerm(FractionTerm node); |
+ void visitUriTerm(UriTerm node); |
+ void visitResolutionTerm(ResolutionTerm node); |
+ void visitChTerm(ChTerm node); |
+ void visitRemTerm(RemTerm node); |
+ void visitViewportTerm(ViewportTerm node); |
+ void visitFunctionTerm(FunctionTerm node); |
+ void visitGroupTerm(GroupTerm node); |
+ void visitItemTerm(ItemTerm node); |
+ void visitIE8Term(IE8Term node); |
+ void visitOperatorSlash(OperatorSlash node); |
+ void visitOperatorComma(OperatorComma node); |
+ void visitOperatorPlus(OperatorPlus node); |
+ void visitOperatorMinus(OperatorMinus node); |
+ void visitVarUsage(VarUsage node); |
+ |
+ void visitExpressions(Expressions node); |
+ void visitBinaryExpression(BinaryExpression node); |
+ void visitUnaryExpression(UnaryExpression node); |
+ |
+ void visitIdentifier(Identifier node); |
+ void visitWildcard(Wildcard node); |
+ void visitThisOperator(ThisOperator node); |
+ void visitNegation(Negation node); |
+ |
+ void visitDartStyleExpression(DartStyleExpression node); |
+ void visitFontExpression(FontExpression node); |
+ void visitBoxExpression(BoxExpression node); |
+ void visitMarginExpression(MarginExpression node); |
+ void visitBorderExpression(BorderExpression node); |
+ void visitHeightExpression(HeightExpression node); |
+ void visitPaddingExpression(PaddingExpression node); |
+ void visitWidthExpression(WidthExpression node); |
+} |
+ |
+/** Base vistor class for the style sheet AST. */ |
+class Visitor implements VisitorBase { |
+ /** Helper function to walk a list of nodes. */ |
+ void _visitNodeList(List<TreeNode> list) { |
+ // Don't use iterable otherwise the list can't grow while using Visitor. |
+ // It certainly can't have items deleted before the index being iterated |
+ // but items could be added after the index. |
+ for (var index = 0; index < list.length; index++) { |
+ list[index].visit(this); |
+ } |
+ } |
+ |
+ void visitTree(StyleSheet tree) => visitStyleSheet(tree); |
+ |
+ void visitStyleSheet(StyleSheet ss) { |
+ _visitNodeList(ss.topLevels); |
+ } |
+ |
+ void visitNoOp(NoOp node) {} |
+ |
+ void visitTopLevelProduction(TopLevelProduction node) {} |
+ |
+ void visitDirective(Directive node) {} |
+ |
+ void visitCssComment(CssComment node) {} |
+ |
+ void visitCommentDefinition(CommentDefinition node) {} |
+ |
+ void visitMediaExpression(MediaExpression node) { |
+ visitExpressions(node.exprs); |
+ } |
+ |
+ void visitMediaQuery(MediaQuery node) { |
+ for (var mediaExpr in node.expressions) { |
+ visitMediaExpression(mediaExpr); |
+ } |
+ } |
+ |
+ void visitMediaDirective(MediaDirective node) { |
+ for (var mediaQuery in node.mediaQueries) { |
+ visitMediaQuery(mediaQuery); |
+ } |
+ for (var ruleset in node.rulesets) { |
+ visitRuleSet(ruleset); |
+ } |
+ } |
+ |
+ void visitHostDirective(HostDirective node) { |
+ for (var ruleset in node.rulesets) { |
+ visitRuleSet(ruleset); |
+ } |
+ } |
+ |
+ void visitPageDirective(PageDirective node) { |
+ for (var declGroup in node._declsMargin) { |
+ if (declGroup is MarginGroup) { |
+ visitMarginGroup(declGroup); |
+ } else { |
+ visitDeclarationGroup(declGroup); |
+ } |
+ } |
+ } |
+ |
+ void visitCharsetDirective(CharsetDirective node) {} |
+ |
+ void visitImportDirective(ImportDirective node) { |
+ for (var mediaQuery in node.mediaQueries) { |
+ visitMediaQuery(mediaQuery); |
+ } |
+ } |
+ |
+ void visitKeyFrameDirective(KeyFrameDirective node) { |
+ visitIdentifier(node.name); |
+ _visitNodeList(node._blocks); |
+ } |
+ |
+ void visitKeyFrameBlock(KeyFrameBlock node) { |
+ visitExpressions(node._blockSelectors); |
+ visitDeclarationGroup(node._declarations); |
+ } |
+ |
+ void visitFontFaceDirective(FontFaceDirective node) { |
+ visitDeclarationGroup(node._declarations); |
+ } |
+ |
+ void visitStyletDirective(StyletDirective node) { |
+ _visitNodeList(node.rulesets); |
+ } |
+ |
+ void visitNamespaceDirective(NamespaceDirective node) {} |
+ |
+ void visitVarDefinitionDirective(VarDefinitionDirective node) { |
+ visitVarDefinition(node.def); |
+ } |
+ |
+ void visitMixinRulesetDirective(MixinRulesetDirective node) { |
+ _visitNodeList(node.rulesets); |
+ } |
+ |
+ void visitMixinDefinition(MixinDefinition node) {} |
+ |
+ void visitMixinDeclarationDirective(MixinDeclarationDirective node) { |
+ visitDeclarationGroup(node.declarations); |
+ } |
+ |
+ void visitIncludeDirective(IncludeDirective node) { |
+ for (var index = 0; index < node.args.length; index++) { |
+ var param = node.args[index]; |
+ _visitNodeList(param); |
+ } |
+ } |
+ |
+ void visitContentDirective(ContentDirective node) { |
+ // TODO(terry): TBD |
+ } |
+ |
+ void visitRuleSet(RuleSet node) { |
+ visitSelectorGroup(node._selectorGroup); |
+ visitDeclarationGroup(node._declarationGroup); |
+ } |
+ |
+ void visitDeclarationGroup(DeclarationGroup node) { |
+ _visitNodeList(node.declarations); |
+ } |
+ |
+ void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node); |
+ |
+ void visitDeclaration(Declaration node) { |
+ visitIdentifier(node._property); |
+ if (node._expression != null) node._expression.visit(this); |
+ } |
+ |
+ void visitVarDefinition(VarDefinition node) { |
+ visitIdentifier(node._property); |
+ if (node._expression != null) node._expression.visit(this); |
+ } |
+ |
+ void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) { |
+ visitIncludeDirective(node.include); |
+ } |
+ |
+ void visitExtendDeclaration(ExtendDeclaration node) { |
+ _visitNodeList(node.selectors); |
+ } |
+ |
+ void visitSelectorGroup(SelectorGroup node) { |
+ _visitNodeList(node.selectors); |
+ } |
+ |
+ void visitSelector(Selector node) { |
+ _visitNodeList(node.simpleSelectorSequences); |
+ } |
+ |
+ void visitSimpleSelectorSequence(SimpleSelectorSequence node) { |
+ node.simpleSelector.visit(this); |
+ } |
+ |
+ void visitSimpleSelector(SimpleSelector node) => node._name.visit(this); |
+ |
+ void visitNamespaceSelector(NamespaceSelector node) { |
+ if (node._namespace != null) node._namespace.visit(this); |
+ if (node.nameAsSimpleSelector != null) { |
+ node.nameAsSimpleSelector.visit(this); |
+ } |
+ } |
+ |
+ void visitElementSelector(ElementSelector node) => visitSimpleSelector(node); |
+ |
+ void visitAttributeSelector(AttributeSelector node) { |
+ visitSimpleSelector(node); |
+ } |
+ |
+ void visitIdSelector(IdSelector node) => visitSimpleSelector(node); |
+ |
+ void visitClassSelector(ClassSelector node) => visitSimpleSelector(node); |
+ |
+ void visitPseudoClassSelector(PseudoClassSelector node) => |
+ visitSimpleSelector(node); |
+ |
+ void visitPseudoElementSelector(PseudoElementSelector node) => |
+ visitSimpleSelector(node); |
+ |
+ void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) => |
+ visitSimpleSelector(node); |
+ |
+ void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) => |
+ visitSimpleSelector(node); |
+ |
+ void visitNegationSelector(NegationSelector node) => |
+ visitSimpleSelector(node); |
+ |
+ void visitSelectorExpression(SelectorExpression node) { |
+ _visitNodeList(node.expressions); |
+ } |
+ |
+ void visitUnicodeRangeTerm(UnicodeRangeTerm node) {} |
+ |
+ void visitLiteralTerm(LiteralTerm node) {} |
+ |
+ void visitHexColorTerm(HexColorTerm node) {} |
+ |
+ void visitNumberTerm(NumberTerm node) {} |
+ |
+ void visitUnitTerm(UnitTerm node) {} |
+ |
+ void visitLengthTerm(LengthTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitPercentageTerm(PercentageTerm node) { |
+ visitLiteralTerm(node); |
+ } |
+ |
+ void visitEmTerm(EmTerm node) { |
+ visitLiteralTerm(node); |
+ } |
+ |
+ void visitExTerm(ExTerm node) { |
+ visitLiteralTerm(node); |
+ } |
+ |
+ void visitAngleTerm(AngleTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitTimeTerm(TimeTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitFreqTerm(FreqTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitFractionTerm(FractionTerm node) { |
+ visitLiteralTerm(node); |
+ } |
+ |
+ void visitUriTerm(UriTerm node) { |
+ visitLiteralTerm(node); |
+ } |
+ |
+ void visitResolutionTerm(ResolutionTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitChTerm(ChTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitRemTerm(RemTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitViewportTerm(ViewportTerm node) { |
+ visitUnitTerm(node); |
+ } |
+ |
+ void visitFunctionTerm(FunctionTerm node) { |
+ visitLiteralTerm(node); |
+ visitExpressions(node._params); |
+ } |
+ |
+ void visitGroupTerm(GroupTerm node) { |
+ for (var term in node._terms) { |
+ term.visit(this); |
+ } |
+ } |
+ |
+ void visitItemTerm(ItemTerm node) { |
+ visitNumberTerm(node); |
+ } |
+ |
+ void visitIE8Term(IE8Term node) {} |
+ |
+ void visitOperatorSlash(OperatorSlash node) {} |
+ |
+ void visitOperatorComma(OperatorComma node) {} |
+ |
+ void visitOperatorPlus(OperatorPlus node) {} |
+ |
+ void visitOperatorMinus(OperatorMinus node) {} |
+ |
+ void visitVarUsage(VarUsage node) { |
+ _visitNodeList(node.defaultValues); |
+ } |
+ |
+ void visitExpressions(Expressions node) { |
+ _visitNodeList(node.expressions); |
+ } |
+ |
+ void visitBinaryExpression(BinaryExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitUnaryExpression(UnaryExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitIdentifier(Identifier node) {} |
+ |
+ void visitWildcard(Wildcard node) {} |
+ |
+ void visitThisOperator(ThisOperator node) {} |
+ |
+ void visitNegation(Negation node) {} |
+ |
+ void visitDartStyleExpression(DartStyleExpression node) {} |
+ |
+ void visitFontExpression(FontExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitBoxExpression(BoxExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitMarginExpression(MarginExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitBorderExpression(BorderExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitHeightExpression(HeightExpression node) { |
+ // TODO(terry): TB |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitPaddingExpression(PaddingExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+ |
+ void visitWidthExpression(WidthExpression node) { |
+ // TODO(terry): TBD |
+ throw UnimplementedError; |
+ } |
+} |