diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index 81f26bf..b050442 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -17,7 +17,7 @@
   Identifier clone() => Identifier(name, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitIdentifier(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitIdentifier(this);
 
   @override
   String toString() => name;
@@ -28,7 +28,7 @@
   @override
   Wildcard clone() => Wildcard(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitWildcard(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitWildcard(this);
 
   String get name => '*';
 }
@@ -38,7 +38,7 @@
   @override
   ThisOperator clone() => ThisOperator(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitThisOperator(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitThisOperator(this);
 
   String get name => '&';
 }
@@ -48,7 +48,7 @@
   @override
   Negation clone() => Negation(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitNegation(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitNegation(this);
 
   String get name => 'not';
 }
@@ -65,7 +65,7 @@
   @override
   CalcTerm clone() => CalcTerm(value, text, expr.clone(), span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitCalcTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitCalcTerm(this);
 
   @override
   String toString() => '$text($expr)';
@@ -79,7 +79,7 @@
   @override
   CssComment clone() => CssComment(comment, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitCssComment(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitCssComment(this);
 }
 
 // CDO/CDC (Comment Definition Open <!-- and Comment Definition Close -->).
@@ -88,7 +88,7 @@
   @override
   CommentDefinition clone() => CommentDefinition(comment, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
 
 class SelectorGroup extends TreeNode {
@@ -100,7 +100,7 @@
   SelectorGroup clone() => SelectorGroup(selectors, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
 }
 
 class Selector extends TreeNode {
@@ -121,7 +121,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSelector(this);
 }
 
 class SimpleSelectorSequence extends TreeNode {
@@ -161,7 +161,8 @@
       SimpleSelectorSequence(simpleSelector, span, combinator);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+  dynamic visit(VisitorBase visitor) =>
+      visitor.visitSimpleSelectorSequence(this);
 
   @override
   String toString() => simpleSelector.name;
@@ -181,14 +182,14 @@
   bool get isThis => _name is ThisOperator;
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
 }
 
 // element name
 class ElementSelector extends SimpleSelector {
   ElementSelector(name, SourceSpan span) : super(name, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitElementSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitElementSelector(this);
 
   @override
   ElementSelector clone() => ElementSelector(_name, span);
@@ -215,7 +216,7 @@
   NamespaceSelector clone() => NamespaceSelector(_namespace, '', span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
 
   @override
   String toString() => '$namespace|${nameAsSimpleSelector.name}';
@@ -286,7 +287,7 @@
   AttributeSelector clone() => AttributeSelector(_name, _op, value, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
 
   @override
   String toString() => '[$name${matchOperator()}${valueToString()}]';
@@ -298,7 +299,7 @@
   @override
   IdSelector clone() => IdSelector(_name, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitIdSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitIdSelector(this);
 
   @override
   String toString() => '#$_name';
@@ -310,7 +311,7 @@
   @override
   ClassSelector clone() => ClassSelector(_name, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitClassSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitClassSelector(this);
 
   @override
   String toString() => '.$_name';
@@ -320,7 +321,7 @@
 class PseudoClassSelector extends SimpleSelector {
   PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
 
   @override
   PseudoClassSelector clone() => PseudoClassSelector(_name, span);
@@ -338,7 +339,8 @@
       {this.isLegacy = false})
       : super(name, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
+  dynamic visit(VisitorBase visitor) =>
+      visitor.visitPseudoElementSelector(this);
 
   @override
   PseudoElementSelector clone() => PseudoElementSelector(_name, span);
@@ -363,7 +365,7 @@
   SelectorExpression get expression => _argument as SelectorExpression;
 
   @override
-  void visit(VisitorBase visitor) =>
+  dynamic visit(VisitorBase visitor) =>
       visitor.visitPseudoClassFunctionSelector(this);
 }
 
@@ -380,7 +382,7 @@
       PseudoElementFunctionSelector(_name, expression, span);
 
   @override
-  void visit(VisitorBase visitor) =>
+  dynamic visit(VisitorBase visitor) =>
       visitor.visitPseudoElementFunctionSelector(this);
 }
 
@@ -395,7 +397,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
 }
 
 // :NOT(negation_arg)
@@ -409,7 +411,7 @@
   NegationSelector clone() => NegationSelector(negationArg, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
 }
 
 class NoOp extends TreeNode {
@@ -419,7 +421,7 @@
   NoOp clone() => NoOp();
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitNoOp(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitNoOp(this);
 }
 
 class StyleSheet extends TreeNode {
@@ -442,7 +444,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
 }
 
 class TopLevelProduction extends TreeNode {
@@ -450,7 +452,7 @@
   @override
   TopLevelProduction clone() => TopLevelProduction(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
 }
 
 class RuleSet extends TopLevelProduction {
@@ -471,7 +473,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitRuleSet(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitRuleSet(this);
 }
 
 class Directive extends TreeNode {
@@ -483,7 +485,7 @@
   @override
   Directive clone() => Directive(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
 class DocumentDirective extends Directive {
@@ -507,7 +509,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
 }
 
 class SupportsDirective extends Directive {
@@ -528,7 +530,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
 }
 
 abstract class SupportsCondition extends TreeNode {
@@ -552,7 +554,7 @@
       SupportsConditionInParens(condition.clone(), span);
 
   @override
-  void visit(VisitorBase visitor) =>
+  dynamic visit(VisitorBase visitor) =>
       visitor.visitSupportsConditionInParens(this);
 }
 
@@ -565,7 +567,7 @@
   SupportsNegation clone() => SupportsNegation(condition.clone(), span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
 }
 
 class SupportsConjunction extends SupportsCondition {
@@ -583,7 +585,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
 }
 
 class SupportsDisjunction extends SupportsCondition {
@@ -601,7 +603,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
 }
 
 class ViewportDirective extends Directive {
@@ -616,7 +618,7 @@
       ViewportDirective(name, declarations.clone(), span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitViewportDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitViewportDirective(this);
 }
 
 class ImportDirective extends Directive {
@@ -639,7 +641,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitImportDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitImportDirective(this);
 }
 
 /// MediaExpression grammar:
@@ -663,7 +665,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
 }
 
 /// MediaQuery grammar:
@@ -703,7 +705,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
 }
 
 class MediaDirective extends Directive {
@@ -726,7 +728,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
 }
 
 class HostDirective extends Directive {
@@ -744,7 +746,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitHostDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitHostDirective(this);
 }
 
 class PageDirective extends Directive {
@@ -766,7 +768,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitPageDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitPageDirective(this);
 
   bool get hasIdent => _ident != null && _ident.isNotEmpty;
   bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty;
@@ -779,7 +781,7 @@
   @override
   CharsetDirective clone() => CharsetDirective(charEncoding, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
 
 class KeyFrameDirective extends Directive {
@@ -821,7 +823,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
 }
 
 class KeyFrameBlock extends Expression {
@@ -835,7 +837,7 @@
   KeyFrameBlock clone() =>
       KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
 }
 
 class FontFaceDirective extends Directive {
@@ -846,7 +848,7 @@
   @override
   FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
 }
 
 class StyletDirective extends Directive {
@@ -871,7 +873,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
 }
 
 class NamespaceDirective extends Directive {
@@ -887,7 +889,7 @@
   NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
 
   String get prefix => _prefix.isNotEmpty ? '$_prefix ' : '';
 }
@@ -902,7 +904,8 @@
   VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
+  dynamic visit(VisitorBase visitor) =>
+      visitor.visitVarDefinitionDirective(this);
 }
 
 class MixinDefinition extends Directive {
@@ -923,7 +926,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
 }
 
 /// Support a Sass @mixin. See http://sass-lang.com for description.
@@ -949,7 +952,8 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
+  dynamic visit(VisitorBase visitor) =>
+      visitor.visitMixinRulesetDirective(this);
 }
 
 class MixinDeclarationDirective extends MixinDefinition {
@@ -970,7 +974,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) =>
+  dynamic visit(VisitorBase visitor) =>
       visitor.visitMixinDeclarationDirective(this);
 }
 
@@ -991,7 +995,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
 }
 
 /// To support Sass @content.
@@ -999,7 +1003,7 @@
   ContentDirective(SourceSpan span) : super(span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitContentDirective(this);
 }
 
 class Declaration extends TreeNode {
@@ -1035,7 +1039,7 @@
           important: important);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitDeclaration(this);
 }
 
 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
@@ -1057,7 +1061,7 @@
       _property.clone(), expression != null ? expression.clone() : null, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
 }
 
 /// Node for usage of @include mixin[(args,...)] found in a declaration group
@@ -1077,7 +1081,7 @@
       IncludeMixinAtDeclaration(include.clone(), span);
 
   @override
-  void visit(VisitorBase visitor) =>
+  dynamic visit(VisitorBase visitor) =>
       visitor.visitIncludeMixinAtDeclaration(this);
 }
 
@@ -1094,7 +1098,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
 }
 
 class DeclarationGroup extends TreeNode {
@@ -1110,7 +1114,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
 }
 
 class MarginGroup extends DeclarationGroup {
@@ -1122,7 +1126,7 @@
   MarginGroup clone() =>
       MarginGroup(margin_sym, super.clone().declarations, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
 class VarUsage extends Expression {
@@ -1141,7 +1145,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitVarUsage(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitVarUsage(this);
 }
 
 class OperatorSlash extends Expression {
@@ -1149,7 +1153,7 @@
   @override
   OperatorSlash clone() => OperatorSlash(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
@@ -1157,7 +1161,7 @@
   @override
   OperatorComma clone() => OperatorComma(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
@@ -1165,7 +1169,7 @@
   @override
   OperatorPlus clone() => OperatorPlus(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
@@ -1173,7 +1177,7 @@
   @override
   OperatorMinus clone() => OperatorMinus(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
 
 class UnicodeRangeTerm extends Expression {
@@ -1188,7 +1192,7 @@
   UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
 }
 
 class LiteralTerm extends Expression {
@@ -1204,7 +1208,7 @@
   LiteralTerm clone() => LiteralTerm(value, text, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
 }
 
 class NumberTerm extends LiteralTerm {
@@ -1212,7 +1216,7 @@
   @override
   NumberTerm clone() => NumberTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
 
 class UnitTerm extends LiteralTerm {
@@ -1224,7 +1228,7 @@
   UnitTerm clone() => UnitTerm(value, text, span, unit);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
 
   String unitToString() => TokenKind.unitToString(unit);
 
@@ -1246,7 +1250,7 @@
   @override
   LengthTerm clone() => LengthTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
 }
 
 class PercentageTerm extends LiteralTerm {
@@ -1254,7 +1258,7 @@
   @override
   PercentageTerm clone() => PercentageTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
@@ -1262,7 +1266,7 @@
   @override
   EmTerm clone() => EmTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
@@ -1270,7 +1274,7 @@
   @override
   ExTerm clone() => ExTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitExTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
 class AngleTerm extends UnitTerm {
@@ -1286,7 +1290,7 @@
   @override
   AngleTerm clone() => AngleTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
 }
 
 class TimeTerm extends UnitTerm {
@@ -1301,7 +1305,7 @@
   @override
   TimeTerm clone() => TimeTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
 }
 
 class FreqTerm extends UnitTerm {
@@ -1314,7 +1318,7 @@
   @override
   FreqTerm clone() => FreqTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
 }
 
 class FractionTerm extends LiteralTerm {
@@ -1323,7 +1327,7 @@
   @override
   FractionTerm clone() => FractionTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
@@ -1332,7 +1336,7 @@
   @override
   UriTerm clone() => UriTerm(value, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
 class ResolutionTerm extends UnitTerm {
@@ -1347,7 +1351,7 @@
   @override
   ResolutionTerm clone() => ResolutionTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
 }
 
 class ChTerm extends UnitTerm {
@@ -1360,7 +1364,7 @@
   @override
   ChTerm clone() => ChTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitChTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitChTerm(this);
 }
 
 class RemTerm extends UnitTerm {
@@ -1373,7 +1377,7 @@
   @override
   RemTerm clone() => RemTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitRemTerm(this);
 }
 
 class ViewportTerm extends UnitTerm {
@@ -1389,7 +1393,7 @@
   @override
   ViewportTerm clone() => ViewportTerm(value, text, span, unit);
   @override
-  void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
 }
 
 /// Type to signal a bad hex value for HexColorTerm.value.
@@ -1401,7 +1405,7 @@
   @override
   HexColorTerm clone() => HexColorTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
 }
 
 class FunctionTerm extends LiteralTerm {
@@ -1413,7 +1417,7 @@
   @override
   FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
 }
 
 /// A "\9" was encountered at the end of the expression and before a semi-colon.
@@ -1424,7 +1428,7 @@
   @override
   IE8Term clone() => IE8Term(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
 
 class GroupTerm extends Expression {
@@ -1441,7 +1445,7 @@
   @override
   GroupTerm clone() => GroupTerm(span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
 }
 
 class ItemTerm extends NumberTerm {
@@ -1450,7 +1454,7 @@
   @override
   ItemTerm clone() => ItemTerm(value, text, span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitItemTerm(this);
 }
 
 class Expressions extends Expression {
@@ -1472,7 +1476,7 @@
   }
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitExpressions(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitExpressions(this);
 }
 
 class BinaryExpression extends Expression {
@@ -1485,7 +1489,7 @@
   @override
   BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
 }
 
 class UnaryExpression extends Expression {
@@ -1497,7 +1501,7 @@
   @override
   UnaryExpression clone() => UnaryExpression(op, self.clone(), span);
   @override
-  void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
 }
 
 abstract class DartStyleExpression extends TreeNode {
@@ -1531,7 +1535,7 @@
   bool isSame(DartStyleExpression other) => _styleType == other._styleType;
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
 }
 
 class FontExpression extends DartStyleExpression {
@@ -1583,7 +1587,7 @@
       lineHeight: font.lineHeight);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitFontExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitFontExpression(this);
 }
 
 abstract class BoxExpression extends DartStyleExpression {
@@ -1593,7 +1597,7 @@
       : super(styleType, span);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
 
   String get formattedBoxEdge {
     if (box.top == box.left && box.top == box.bottom && box.top == box.right) {
@@ -1643,7 +1647,7 @@
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
 }
 
 class BorderExpression extends BoxExpression {
@@ -1681,7 +1685,7 @@
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   @override
-  void visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
 }
 
 class HeightExpression extends DartStyleExpression {
@@ -1704,7 +1708,7 @@
   @override
   HeightExpression clone() => HeightExpression(span, height);
   @override
-  void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
 }
 
 class WidthExpression extends DartStyleExpression {
@@ -1725,7 +1729,7 @@
   @override
   WidthExpression clone() => WidthExpression(span, width);
   @override
-  void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
 }
 
 class PaddingExpression extends BoxExpression {
@@ -1762,5 +1766,5 @@
   PaddingExpression clone() => PaddingExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
   @override
-  void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
+  dynamic visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
 }
diff --git a/lib/src/tree_base.dart b/lib/src/tree_base.dart
index 6f2f442..eef1849 100644
--- a/lib/src/tree_base.dart
+++ b/lib/src/tree_base.dart
@@ -14,7 +14,7 @@
   TreeNode clone();
 
   /// Classic double-dispatch visitor for implementing passes.
-  void visit(VisitorBase visitor);
+  dynamic visit(VisitorBase visitor);
 
   /// A multiline string showing the node and its children.
   String toDebugString() {
diff --git a/lib/visitor.dart b/lib/visitor.dart
index ceda80c..9fff568 100644
--- a/lib/visitor.dart
+++ b/lib/visitor.dart
@@ -11,107 +11,108 @@
 part 'src/tree_printer.dart';
 
 abstract class VisitorBase {
-  void visitCalcTerm(CalcTerm node);
-  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 visitDocumentDirective(DocumentDirective node);
-  void visitSupportsDirective(SupportsDirective node);
-  void visitSupportsConditionInParens(SupportsConditionInParens node);
-  void visitSupportsNegation(SupportsNegation node);
-  void visitSupportsConjunction(SupportsConjunction node);
-  void visitSupportsDisjunction(SupportsDisjunction node);
-  void visitViewportDirective(ViewportDirective 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);
+  dynamic visitCalcTerm(CalcTerm node);
+  dynamic visitCssComment(CssComment node);
+  dynamic visitCommentDefinition(CommentDefinition node);
+  dynamic visitStyleSheet(StyleSheet node);
+  dynamic visitNoOp(NoOp node);
+  dynamic visitTopLevelProduction(TopLevelProduction node);
+  dynamic visitDirective(Directive node);
+  dynamic visitDocumentDirective(DocumentDirective node);
+  dynamic visitSupportsDirective(SupportsDirective node);
+  dynamic visitSupportsConditionInParens(SupportsConditionInParens node);
+  dynamic visitSupportsNegation(SupportsNegation node);
+  dynamic visitSupportsConjunction(SupportsConjunction node);
+  dynamic visitSupportsDisjunction(SupportsDisjunction node);
+  dynamic visitViewportDirective(ViewportDirective node);
+  dynamic visitMediaExpression(MediaExpression node);
+  dynamic visitMediaQuery(MediaQuery node);
+  dynamic visitMediaDirective(MediaDirective node);
+  dynamic visitHostDirective(HostDirective node);
+  dynamic visitPageDirective(PageDirective node);
+  dynamic visitCharsetDirective(CharsetDirective node);
+  dynamic visitImportDirective(ImportDirective node);
+  dynamic visitKeyFrameDirective(KeyFrameDirective node);
+  dynamic visitKeyFrameBlock(KeyFrameBlock node);
+  dynamic visitFontFaceDirective(FontFaceDirective node);
+  dynamic visitStyletDirective(StyletDirective node);
+  dynamic visitNamespaceDirective(NamespaceDirective node);
+  dynamic visitVarDefinitionDirective(VarDefinitionDirective node);
+  dynamic visitMixinDefinition(MixinDefinition node);
+  dynamic visitMixinRulesetDirective(MixinRulesetDirective node);
+  dynamic visitMixinDeclarationDirective(MixinDeclarationDirective node);
+  dynamic visitIncludeDirective(IncludeDirective node);
+  dynamic 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);
+  dynamic visitRuleSet(RuleSet node);
+  dynamic visitDeclarationGroup(DeclarationGroup node);
+  dynamic visitMarginGroup(MarginGroup node);
+  dynamic visitDeclaration(Declaration node);
+  dynamic visitVarDefinition(VarDefinition node);
+  dynamic visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node);
+  dynamic visitExtendDeclaration(ExtendDeclaration node);
+  dynamic visitSelectorGroup(SelectorGroup node);
+  dynamic visitSelector(Selector node);
+  dynamic visitSimpleSelectorSequence(SimpleSelectorSequence node);
+  dynamic visitSimpleSelector(SimpleSelector node);
+  dynamic visitElementSelector(ElementSelector node);
+  dynamic visitNamespaceSelector(NamespaceSelector node);
+  dynamic visitAttributeSelector(AttributeSelector node);
+  dynamic visitIdSelector(IdSelector node);
+  dynamic visitClassSelector(ClassSelector node);
+  dynamic visitPseudoClassSelector(PseudoClassSelector node);
+  dynamic visitPseudoElementSelector(PseudoElementSelector node);
+  dynamic visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node);
+  dynamic visitPseudoElementFunctionSelector(
+      PseudoElementFunctionSelector node);
+  dynamic visitNegationSelector(NegationSelector node);
+  dynamic 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);
+  dynamic visitUnicodeRangeTerm(UnicodeRangeTerm node);
+  dynamic visitLiteralTerm(LiteralTerm node);
+  dynamic visitHexColorTerm(HexColorTerm node);
+  dynamic visitNumberTerm(NumberTerm node);
+  dynamic visitUnitTerm(UnitTerm node);
+  dynamic visitLengthTerm(LengthTerm node);
+  dynamic visitPercentageTerm(PercentageTerm node);
+  dynamic visitEmTerm(EmTerm node);
+  dynamic visitExTerm(ExTerm node);
+  dynamic visitAngleTerm(AngleTerm node);
+  dynamic visitTimeTerm(TimeTerm node);
+  dynamic visitFreqTerm(FreqTerm node);
+  dynamic visitFractionTerm(FractionTerm node);
+  dynamic visitUriTerm(UriTerm node);
+  dynamic visitResolutionTerm(ResolutionTerm node);
+  dynamic visitChTerm(ChTerm node);
+  dynamic visitRemTerm(RemTerm node);
+  dynamic visitViewportTerm(ViewportTerm node);
+  dynamic visitFunctionTerm(FunctionTerm node);
+  dynamic visitGroupTerm(GroupTerm node);
+  dynamic visitItemTerm(ItemTerm node);
+  dynamic visitIE8Term(IE8Term node);
+  dynamic visitOperatorSlash(OperatorSlash node);
+  dynamic visitOperatorComma(OperatorComma node);
+  dynamic visitOperatorPlus(OperatorPlus node);
+  dynamic visitOperatorMinus(OperatorMinus node);
+  dynamic visitVarUsage(VarUsage node);
 
-  void visitExpressions(Expressions node);
-  void visitBinaryExpression(BinaryExpression node);
-  void visitUnaryExpression(UnaryExpression node);
+  dynamic visitExpressions(Expressions node);
+  dynamic visitBinaryExpression(BinaryExpression node);
+  dynamic visitUnaryExpression(UnaryExpression node);
 
-  void visitIdentifier(Identifier node);
-  void visitWildcard(Wildcard node);
-  void visitThisOperator(ThisOperator node);
-  void visitNegation(Negation node);
+  dynamic visitIdentifier(Identifier node);
+  dynamic visitWildcard(Wildcard node);
+  dynamic visitThisOperator(ThisOperator node);
+  dynamic 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);
+  dynamic visitDartStyleExpression(DartStyleExpression node);
+  dynamic visitFontExpression(FontExpression node);
+  dynamic visitBoxExpression(BoxExpression node);
+  dynamic visitMarginExpression(MarginExpression node);
+  dynamic visitBorderExpression(BorderExpression node);
+  dynamic visitHeightExpression(HeightExpression node);
+  dynamic visitPaddingExpression(PaddingExpression node);
+  dynamic visitWidthExpression(WidthExpression node);
 }
 
 /// Base vistor class for the style sheet AST.
@@ -126,96 +127,96 @@
     }
   }
 
-  void visitTree(StyleSheet tree) => visitStyleSheet(tree);
+  dynamic visitTree(StyleSheet tree) => visitStyleSheet(tree);
 
   @override
-  void visitStyleSheet(StyleSheet ss) {
+  dynamic visitStyleSheet(StyleSheet ss) {
     _visitNodeList(ss.topLevels);
   }
 
   @override
-  void visitNoOp(NoOp node) {}
+  dynamic visitNoOp(NoOp node) {}
 
   @override
-  void visitTopLevelProduction(TopLevelProduction node) {}
+  dynamic visitTopLevelProduction(TopLevelProduction node) {}
 
   @override
-  void visitDirective(Directive node) {}
+  dynamic visitDirective(Directive node) {}
 
   @override
-  void visitCalcTerm(CalcTerm node) {
+  dynamic visitCalcTerm(CalcTerm node) {
     visitLiteralTerm(node);
     visitLiteralTerm(node.expr);
   }
 
   @override
-  void visitCssComment(CssComment node) {}
+  dynamic visitCssComment(CssComment node) {}
 
   @override
-  void visitCommentDefinition(CommentDefinition node) {}
+  dynamic visitCommentDefinition(CommentDefinition node) {}
 
   @override
-  void visitMediaExpression(MediaExpression node) {
+  dynamic visitMediaExpression(MediaExpression node) {
     visitExpressions(node.exprs);
   }
 
   @override
-  void visitMediaQuery(MediaQuery node) {
+  dynamic visitMediaQuery(MediaQuery node) {
     for (var mediaExpr in node.expressions) {
       visitMediaExpression(mediaExpr);
     }
   }
 
   @override
-  void visitDocumentDirective(DocumentDirective node) {
+  dynamic visitDocumentDirective(DocumentDirective node) {
     _visitNodeList(node.functions);
     _visitNodeList(node.groupRuleBody);
   }
 
   @override
-  void visitSupportsDirective(SupportsDirective node) {
+  dynamic visitSupportsDirective(SupportsDirective node) {
     node.condition.visit(this);
     _visitNodeList(node.groupRuleBody);
   }
 
   @override
-  void visitSupportsConditionInParens(SupportsConditionInParens node) {
+  dynamic visitSupportsConditionInParens(SupportsConditionInParens node) {
     node.condition.visit(this);
   }
 
   @override
-  void visitSupportsNegation(SupportsNegation node) {
+  dynamic visitSupportsNegation(SupportsNegation node) {
     node.condition.visit(this);
   }
 
   @override
-  void visitSupportsConjunction(SupportsConjunction node) {
+  dynamic visitSupportsConjunction(SupportsConjunction node) {
     _visitNodeList(node.conditions);
   }
 
   @override
-  void visitSupportsDisjunction(SupportsDisjunction node) {
+  dynamic visitSupportsDisjunction(SupportsDisjunction node) {
     _visitNodeList(node.conditions);
   }
 
   @override
-  void visitViewportDirective(ViewportDirective node) {
+  dynamic visitViewportDirective(ViewportDirective node) {
     node.declarations.visit(this);
   }
 
   @override
-  void visitMediaDirective(MediaDirective node) {
+  dynamic visitMediaDirective(MediaDirective node) {
     _visitNodeList(node.mediaQueries);
     _visitNodeList(node.rules);
   }
 
   @override
-  void visitHostDirective(HostDirective node) {
+  dynamic visitHostDirective(HostDirective node) {
     _visitNodeList(node.rules);
   }
 
   @override
-  void visitPageDirective(PageDirective node) {
+  dynamic visitPageDirective(PageDirective node) {
     for (var declGroup in node._declsMargin) {
       if (declGroup is MarginGroup) {
         visitMarginGroup(declGroup);
@@ -226,60 +227,60 @@
   }
 
   @override
-  void visitCharsetDirective(CharsetDirective node) {}
+  dynamic visitCharsetDirective(CharsetDirective node) {}
 
   @override
-  void visitImportDirective(ImportDirective node) {
+  dynamic visitImportDirective(ImportDirective node) {
     for (var mediaQuery in node.mediaQueries) {
       visitMediaQuery(mediaQuery);
     }
   }
 
   @override
-  void visitKeyFrameDirective(KeyFrameDirective node) {
+  dynamic visitKeyFrameDirective(KeyFrameDirective node) {
     visitIdentifier(node.name);
     _visitNodeList(node._blocks);
   }
 
   @override
-  void visitKeyFrameBlock(KeyFrameBlock node) {
+  dynamic visitKeyFrameBlock(KeyFrameBlock node) {
     visitExpressions(node._blockSelectors);
     visitDeclarationGroup(node._declarations);
   }
 
   @override
-  void visitFontFaceDirective(FontFaceDirective node) {
+  dynamic visitFontFaceDirective(FontFaceDirective node) {
     visitDeclarationGroup(node._declarations);
   }
 
   @override
-  void visitStyletDirective(StyletDirective node) {
+  dynamic visitStyletDirective(StyletDirective node) {
     _visitNodeList(node.rules);
   }
 
   @override
-  void visitNamespaceDirective(NamespaceDirective node) {}
+  dynamic visitNamespaceDirective(NamespaceDirective node) {}
 
   @override
-  void visitVarDefinitionDirective(VarDefinitionDirective node) {
+  dynamic visitVarDefinitionDirective(VarDefinitionDirective node) {
     visitVarDefinition(node.def);
   }
 
   @override
-  void visitMixinRulesetDirective(MixinRulesetDirective node) {
+  dynamic visitMixinRulesetDirective(MixinRulesetDirective node) {
     _visitNodeList(node.rulesets);
   }
 
   @override
-  void visitMixinDefinition(MixinDefinition node) {}
+  dynamic visitMixinDefinition(MixinDefinition node) {}
 
   @override
-  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+  dynamic visitMixinDeclarationDirective(MixinDeclarationDirective node) {
     visitDeclarationGroup(node.declarations);
   }
 
   @override
-  void visitIncludeDirective(IncludeDirective node) {
+  dynamic visitIncludeDirective(IncludeDirective node) {
     for (var index = 0; index < node.args.length; index++) {
       var param = node.args[index];
       _visitNodeList(param);
@@ -287,66 +288,66 @@
   }
 
   @override
-  void visitContentDirective(ContentDirective node) {
+  dynamic visitContentDirective(ContentDirective node) {
     // TODO(terry): TBD
   }
 
   @override
-  void visitRuleSet(RuleSet node) {
+  dynamic visitRuleSet(RuleSet node) {
     visitSelectorGroup(node._selectorGroup);
     visitDeclarationGroup(node._declarationGroup);
   }
 
   @override
-  void visitDeclarationGroup(DeclarationGroup node) {
+  dynamic visitDeclarationGroup(DeclarationGroup node) {
     _visitNodeList(node.declarations);
   }
 
   @override
-  void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
+  dynamic visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
 
   @override
-  void visitDeclaration(Declaration node) {
+  dynamic visitDeclaration(Declaration node) {
     visitIdentifier(node._property);
     if (node._expression != null) node._expression.visit(this);
   }
 
   @override
-  void visitVarDefinition(VarDefinition node) {
+  dynamic visitVarDefinition(VarDefinition node) {
     visitIdentifier(node._property);
     if (node._expression != null) node._expression.visit(this);
   }
 
   @override
-  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
+  dynamic visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
     visitIncludeDirective(node.include);
   }
 
   @override
-  void visitExtendDeclaration(ExtendDeclaration node) {
+  dynamic visitExtendDeclaration(ExtendDeclaration node) {
     _visitNodeList(node.selectors);
   }
 
   @override
-  void visitSelectorGroup(SelectorGroup node) {
+  dynamic visitSelectorGroup(SelectorGroup node) {
     _visitNodeList(node.selectors);
   }
 
   @override
-  void visitSelector(Selector node) {
+  dynamic visitSelector(Selector node) {
     _visitNodeList(node.simpleSelectorSequences);
   }
 
   @override
-  void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
+  dynamic visitSimpleSelectorSequence(SimpleSelectorSequence node) {
     node.simpleSelector.visit(this);
   }
 
   @override
-  void visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
+  dynamic visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
 
   @override
-  void visitNamespaceSelector(NamespaceSelector node) {
+  dynamic visitNamespaceSelector(NamespaceSelector node) {
     if (node._namespace != null) node._namespace.visit(this);
     if (node.nameAsSimpleSelector != null) {
       node.nameAsSimpleSelector.visit(this);
@@ -354,232 +355,234 @@
   }
 
   @override
-  void visitElementSelector(ElementSelector node) => visitSimpleSelector(node);
+  dynamic visitElementSelector(ElementSelector node) =>
+      visitSimpleSelector(node);
 
   @override
-  void visitAttributeSelector(AttributeSelector node) {
+  dynamic visitAttributeSelector(AttributeSelector node) {
     visitSimpleSelector(node);
   }
 
   @override
-  void visitIdSelector(IdSelector node) => visitSimpleSelector(node);
+  dynamic visitIdSelector(IdSelector node) => visitSimpleSelector(node);
 
   @override
-  void visitClassSelector(ClassSelector node) => visitSimpleSelector(node);
+  dynamic visitClassSelector(ClassSelector node) => visitSimpleSelector(node);
 
   @override
-  void visitPseudoClassSelector(PseudoClassSelector node) =>
+  dynamic visitPseudoClassSelector(PseudoClassSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  void visitPseudoElementSelector(PseudoElementSelector node) =>
+  dynamic visitPseudoElementSelector(PseudoElementSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) =>
+  dynamic visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) =>
+  dynamic visitPseudoElementFunctionSelector(
+          PseudoElementFunctionSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  void visitNegationSelector(NegationSelector node) =>
+  dynamic visitNegationSelector(NegationSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  void visitSelectorExpression(SelectorExpression node) {
+  dynamic visitSelectorExpression(SelectorExpression node) {
     _visitNodeList(node.expressions);
   }
 
   @override
-  void visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
+  dynamic visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
 
   @override
-  void visitLiteralTerm(LiteralTerm node) {}
+  dynamic visitLiteralTerm(LiteralTerm node) {}
 
   @override
-  void visitHexColorTerm(HexColorTerm node) {}
+  dynamic visitHexColorTerm(HexColorTerm node) {}
 
   @override
-  void visitNumberTerm(NumberTerm node) {}
+  dynamic visitNumberTerm(NumberTerm node) {}
 
   @override
-  void visitUnitTerm(UnitTerm node) {}
+  dynamic visitUnitTerm(UnitTerm node) {}
 
   @override
-  void visitLengthTerm(LengthTerm node) {
+  dynamic visitLengthTerm(LengthTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitPercentageTerm(PercentageTerm node) {
+  dynamic visitPercentageTerm(PercentageTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  void visitEmTerm(EmTerm node) {
+  dynamic visitEmTerm(EmTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  void visitExTerm(ExTerm node) {
+  dynamic visitExTerm(ExTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  void visitAngleTerm(AngleTerm node) {
+  dynamic visitAngleTerm(AngleTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitTimeTerm(TimeTerm node) {
+  dynamic visitTimeTerm(TimeTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitFreqTerm(FreqTerm node) {
+  dynamic visitFreqTerm(FreqTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitFractionTerm(FractionTerm node) {
+  dynamic visitFractionTerm(FractionTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  void visitUriTerm(UriTerm node) {
+  dynamic visitUriTerm(UriTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  void visitResolutionTerm(ResolutionTerm node) {
+  dynamic visitResolutionTerm(ResolutionTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitChTerm(ChTerm node) {
+  dynamic visitChTerm(ChTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitRemTerm(RemTerm node) {
+  dynamic visitRemTerm(RemTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitViewportTerm(ViewportTerm node) {
+  dynamic visitViewportTerm(ViewportTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  void visitFunctionTerm(FunctionTerm node) {
+  dynamic visitFunctionTerm(FunctionTerm node) {
     visitLiteralTerm(node);
     visitExpressions(node._params);
   }
 
   @override
-  void visitGroupTerm(GroupTerm node) {
+  dynamic visitGroupTerm(GroupTerm node) {
     for (var term in node._terms) {
       term.visit(this);
     }
   }
 
   @override
-  void visitItemTerm(ItemTerm node) {
+  dynamic visitItemTerm(ItemTerm node) {
     visitNumberTerm(node);
   }
 
   @override
-  void visitIE8Term(IE8Term node) {}
+  dynamic visitIE8Term(IE8Term node) {}
 
   @override
-  void visitOperatorSlash(OperatorSlash node) {}
+  dynamic visitOperatorSlash(OperatorSlash node) {}
 
   @override
-  void visitOperatorComma(OperatorComma node) {}
+  dynamic visitOperatorComma(OperatorComma node) {}
 
   @override
-  void visitOperatorPlus(OperatorPlus node) {}
+  dynamic visitOperatorPlus(OperatorPlus node) {}
 
   @override
-  void visitOperatorMinus(OperatorMinus node) {}
+  dynamic visitOperatorMinus(OperatorMinus node) {}
 
   @override
-  void visitVarUsage(VarUsage node) {
+  dynamic visitVarUsage(VarUsage node) {
     _visitNodeList(node.defaultValues);
   }
 
   @override
-  void visitExpressions(Expressions node) {
+  dynamic visitExpressions(Expressions node) {
     _visitNodeList(node.expressions);
   }
 
   @override
-  void visitBinaryExpression(BinaryExpression node) {
+  dynamic visitBinaryExpression(BinaryExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitUnaryExpression(UnaryExpression node) {
+  dynamic visitUnaryExpression(UnaryExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitIdentifier(Identifier node) {}
+  dynamic visitIdentifier(Identifier node) {}
 
   @override
-  void visitWildcard(Wildcard node) {}
+  dynamic visitWildcard(Wildcard node) {}
 
   @override
-  void visitThisOperator(ThisOperator node) {}
+  dynamic visitThisOperator(ThisOperator node) {}
 
   @override
-  void visitNegation(Negation node) {}
+  dynamic visitNegation(Negation node) {}
 
   @override
-  void visitDartStyleExpression(DartStyleExpression node) {}
+  dynamic visitDartStyleExpression(DartStyleExpression node) {}
 
   @override
-  void visitFontExpression(FontExpression node) {
+  dynamic visitFontExpression(FontExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitBoxExpression(BoxExpression node) {
+  dynamic visitBoxExpression(BoxExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitMarginExpression(MarginExpression node) {
+  dynamic visitMarginExpression(MarginExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitBorderExpression(BorderExpression node) {
+  dynamic visitBorderExpression(BorderExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitHeightExpression(HeightExpression node) {
+  dynamic visitHeightExpression(HeightExpression node) {
     // TODO(terry): TB
     throw UnimplementedError();
   }
 
   @override
-  void visitPaddingExpression(PaddingExpression node) {
+  dynamic visitPaddingExpression(PaddingExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  void visitWidthExpression(WidthExpression node) {
+  dynamic visitWidthExpression(WidthExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
