diff --git a/analysis_options.yaml b/analysis_options.yaml
index b8036fa..9d14291 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,10 +1,5 @@
 include: package:pedantic/analysis_options.yaml
 
-analyzer:
-  errors:
-    always_declare_return_types: ignore # 318
-    omit_local_variable_types: ignore # 48
-
 linter:
   rules:
   - prefer_equal_for_default_values
diff --git a/lib/parser.dart b/lib/parser.dart
index e9402ab..1f3d185 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -2552,7 +2552,7 @@
   ///
   /// We'll just parse everything after the 'progid:' look for the left paren
   /// then parse to the right paren ignoring everything in between.
-  processIEFilter(FileSpan startAfterProgidColon) {
+  dynamic processIEFilter(FileSpan startAfterProgidColon) {
     // Support non-functional filters (i.e. filter: FlipH)
     var kind = _peek();
     if (kind == TokenKind.SEMICOLON || kind == TokenKind.RBRACE) {
diff --git a/lib/src/analyzer.dart b/lib/src/analyzer.dart
index 0b121ad..e9fd7c9 100644
--- a/lib/src/analyzer.dart
+++ b/lib/src/analyzer.dart
@@ -409,7 +409,7 @@
   _MediaRulesReplacer(this._ruleSet, this._newRules);
 
   @override
-  visitMediaDirective(MediaDirective node) {
+  void visitMediaDirective(MediaDirective node) {
     var index = node.rules.indexOf(_ruleSet);
     if (index != -1) {
       node.rules.insertAll(index + 1, _newRules);
@@ -521,7 +521,7 @@
   _TopLevelIncludeReplacer(this._include, this._newRules);
 
   @override
-  visitStyleSheet(StyleSheet node) {
+  void visitStyleSheet(StyleSheet node) {
     var index = node.topLevels.indexOf(_include);
     if (index != -1) {
       node.topLevels.insertAll(index + 1, _newRules);
diff --git a/lib/src/polyfill.dart b/lib/src/polyfill.dart
index fa1a22a..2582bae 100644
--- a/lib/src/polyfill.dart
+++ b/lib/src/polyfill.dart
@@ -66,7 +66,7 @@
   }
 
   @override
-  visitVarDefinition(VarDefinition node) {
+  void visitVarDefinition(VarDefinition node) {
     // Replace with latest variable definition.
     varDefs[node.definedName] = node;
     super.visitVarDefinition(node);
@@ -96,7 +96,7 @@
   }
 
   @override
-  visitVarDefinition(VarDefinition node) {
+  void visitVarDefinition(VarDefinition node) {
     // Replace with latest variable definition.
     currVarDefinition = node;
 
@@ -198,7 +198,8 @@
     return result;
   }
 
-  _resolveVarUsage(List<Expression> expressions, int index, VarDefinition def) {
+  void _resolveVarUsage(
+      List<Expression> expressions, int index, VarDefinition def) {
     var defExpressions = (def.expression as Expressions).expressions;
     expressions.replaceRange(index, index + 1, defExpressions);
   }
diff --git a/lib/src/token_kind.dart b/lib/src/token_kind.dart
index b0b60eb..492800e 100644
--- a/lib/src/token_kind.dart
+++ b/lib/src/token_kind.dart
@@ -569,7 +569,7 @@
   }
 
   static String decimalToHex(int number, [int minDigits = 1]) {
-    final String _HEX_DIGITS = '0123456789abcdef';
+    final _HEX_DIGITS = '0123456789abcdef';
 
     var result = <String>[];
 
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index 4aca2c9..81f26bf 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -17,7 +17,7 @@
   Identifier clone() => Identifier(name, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitIdentifier(this);
+  void visit(VisitorBase visitor) => visitor.visitIdentifier(this);
 
   @override
   String toString() => name;
@@ -28,7 +28,7 @@
   @override
   Wildcard clone() => Wildcard(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitWildcard(this);
+  void visit(VisitorBase visitor) => visitor.visitWildcard(this);
 
   String get name => '*';
 }
@@ -38,7 +38,7 @@
   @override
   ThisOperator clone() => ThisOperator(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitThisOperator(this);
+  void visit(VisitorBase visitor) => visitor.visitThisOperator(this);
 
   String get name => '&';
 }
@@ -48,7 +48,7 @@
   @override
   Negation clone() => Negation(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitNegation(this);
+  void visit(VisitorBase visitor) => visitor.visitNegation(this);
 
   String get name => 'not';
 }
@@ -65,7 +65,7 @@
   @override
   CalcTerm clone() => CalcTerm(value, text, expr.clone(), span);
   @override
-  visit(VisitorBase visitor) => visitor.visitCalcTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitCalcTerm(this);
 
   @override
   String toString() => '$text($expr)';
@@ -79,7 +79,7 @@
   @override
   CssComment clone() => CssComment(comment, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitCssComment(this);
+  void 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
-  visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
+  void visit(VisitorBase visitor) => visitor.visitCommentDefinition(this);
 }
 
 class SelectorGroup extends TreeNode {
@@ -100,7 +100,7 @@
   SelectorGroup clone() => SelectorGroup(selectors, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
 }
 
 class Selector extends TreeNode {
@@ -121,7 +121,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitSelector(this);
 }
 
 class SimpleSelectorSequence extends TreeNode {
@@ -161,7 +161,7 @@
       SimpleSelectorSequence(simpleSelector, span, combinator);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+  void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
 
   @override
   String toString() => simpleSelector.name;
@@ -181,14 +181,14 @@
   bool get isThis => _name is ThisOperator;
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
 }
 
 // element name
 class ElementSelector extends SimpleSelector {
   ElementSelector(name, SourceSpan span) : super(name, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitElementSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitElementSelector(this);
 
   @override
   ElementSelector clone() => ElementSelector(_name, span);
@@ -215,7 +215,7 @@
   NamespaceSelector clone() => NamespaceSelector(_namespace, '', span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitNamespaceSelector(this);
 
   @override
   String toString() => '$namespace|${nameAsSimpleSelector.name}';
@@ -224,15 +224,13 @@
 // [attr op value]
 class AttributeSelector extends SimpleSelector {
   final int _op;
-  final _value;
+  final dynamic value;
 
-  AttributeSelector(Identifier name, this._op, this._value, SourceSpan span)
+  AttributeSelector(Identifier name, this._op, this.value, SourceSpan span)
       : super(name, span);
 
   int get operatorKind => _op;
 
-  get value => _value;
-
   String matchOperator() {
     switch (_op) {
       case TokenKind.EQUALS:
@@ -273,11 +271,11 @@
   }
 
   String valueToString() {
-    if (_value != null) {
-      if (_value is Identifier) {
-        return _value.name;
+    if (value != null) {
+      if (value is Identifier) {
+        return value.name;
       } else {
-        return '"${_value}"';
+        return '"$value"';
       }
     } else {
       return '';
@@ -285,10 +283,10 @@
   }
 
   @override
-  AttributeSelector clone() => AttributeSelector(_name, _op, _value, span);
+  AttributeSelector clone() => AttributeSelector(_name, _op, value, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitAttributeSelector(this);
 
   @override
   String toString() => '[$name${matchOperator()}${valueToString()}]';
@@ -300,7 +298,7 @@
   @override
   IdSelector clone() => IdSelector(_name, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitIdSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitIdSelector(this);
 
   @override
   String toString() => '#$_name';
@@ -312,7 +310,7 @@
   @override
   ClassSelector clone() => ClassSelector(_name, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitClassSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitClassSelector(this);
 
   @override
   String toString() => '.$_name';
@@ -322,7 +320,7 @@
 class PseudoClassSelector extends SimpleSelector {
   PseudoClassSelector(Identifier name, SourceSpan span) : super(name, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitPseudoClassSelector(this);
 
   @override
   PseudoClassSelector clone() => PseudoClassSelector(_name, span);
@@ -340,7 +338,7 @@
       {this.isLegacy = false})
       : super(name, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitPseudoElementSelector(this);
 
   @override
   PseudoElementSelector clone() => PseudoElementSelector(_name, span);
@@ -365,7 +363,8 @@
   SelectorExpression get expression => _argument as SelectorExpression;
 
   @override
-  visit(VisitorBase visitor) => visitor.visitPseudoClassFunctionSelector(this);
+  void visit(VisitorBase visitor) =>
+      visitor.visitPseudoClassFunctionSelector(this);
 }
 
 // ::pseudoElementFunction(expression)
@@ -381,7 +380,7 @@
       PseudoElementFunctionSelector(_name, expression, span);
 
   @override
-  visit(VisitorBase visitor) =>
+  void visit(VisitorBase visitor) =>
       visitor.visitPseudoElementFunctionSelector(this);
 }
 
@@ -396,7 +395,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitSelectorExpression(this);
 }
 
 // :NOT(negation_arg)
@@ -410,7 +409,7 @@
   NegationSelector clone() => NegationSelector(negationArg, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
 }
 
 class NoOp extends TreeNode {
@@ -420,7 +419,7 @@
   NoOp clone() => NoOp();
 
   @override
-  visit(VisitorBase visitor) => visitor.visitNoOp(this);
+  void visit(VisitorBase visitor) => visitor.visitNoOp(this);
 }
 
 class StyleSheet extends TreeNode {
@@ -443,7 +442,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
+  void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
 }
 
 class TopLevelProduction extends TreeNode {
@@ -451,7 +450,7 @@
   @override
   TopLevelProduction clone() => TopLevelProduction(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
+  void visit(VisitorBase visitor) => visitor.visitTopLevelProduction(this);
 }
 
 class RuleSet extends TopLevelProduction {
@@ -472,7 +471,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitRuleSet(this);
+  void visit(VisitorBase visitor) => visitor.visitRuleSet(this);
 }
 
 class Directive extends TreeNode {
@@ -484,7 +483,7 @@
   @override
   Directive clone() => Directive(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
 class DocumentDirective extends Directive {
@@ -508,7 +507,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitDocumentDirective(this);
 }
 
 class SupportsDirective extends Directive {
@@ -529,7 +528,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitSupportsDirective(this);
 }
 
 abstract class SupportsCondition extends TreeNode {
@@ -553,7 +552,8 @@
       SupportsConditionInParens(condition.clone(), span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSupportsConditionInParens(this);
+  void visit(VisitorBase visitor) =>
+      visitor.visitSupportsConditionInParens(this);
 }
 
 class SupportsNegation extends SupportsCondition {
@@ -565,7 +565,7 @@
   SupportsNegation clone() => SupportsNegation(condition.clone(), span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
+  void visit(VisitorBase visitor) => visitor.visitSupportsNegation(this);
 }
 
 class SupportsConjunction extends SupportsCondition {
@@ -583,7 +583,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
+  void visit(VisitorBase visitor) => visitor.visitSupportsConjunction(this);
 }
 
 class SupportsDisjunction extends SupportsCondition {
@@ -601,7 +601,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
+  void visit(VisitorBase visitor) => visitor.visitSupportsDisjunction(this);
 }
 
 class ViewportDirective extends Directive {
@@ -616,7 +616,7 @@
       ViewportDirective(name, declarations.clone(), span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitViewportDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitViewportDirective(this);
 }
 
 class ImportDirective extends Directive {
@@ -639,7 +639,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitImportDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitImportDirective(this);
 }
 
 /// MediaExpression grammar:
@@ -663,7 +663,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
 }
 
 /// MediaQuery grammar:
@@ -703,7 +703,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
+  void visit(VisitorBase visitor) => visitor.visitMediaQuery(this);
 }
 
 class MediaDirective extends Directive {
@@ -726,7 +726,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
 }
 
 class HostDirective extends Directive {
@@ -744,7 +744,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitHostDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitHostDirective(this);
 }
 
 class PageDirective extends Directive {
@@ -766,7 +766,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitPageDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitPageDirective(this);
 
   bool get hasIdent => _ident != null && _ident.isNotEmpty;
   bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.isNotEmpty;
@@ -779,7 +779,7 @@
   @override
   CharsetDirective clone() => CharsetDirective(charEncoding, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
 
 class KeyFrameDirective extends Directive {
@@ -792,7 +792,7 @@
       : _blocks = [],
         super(span);
 
-  add(KeyFrameBlock block) {
+  void add(KeyFrameBlock block) {
     _blocks.add(block);
   }
 
@@ -821,7 +821,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
 }
 
 class KeyFrameBlock extends Expression {
@@ -835,7 +835,7 @@
   KeyFrameBlock clone() =>
       KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
   @override
-  visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
+  void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
 }
 
 class FontFaceDirective extends Directive {
@@ -846,7 +846,7 @@
   @override
   FontFaceDirective clone() => FontFaceDirective(_declarations.clone(), span);
   @override
-  visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
 }
 
 class StyletDirective extends Directive {
@@ -871,7 +871,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
 }
 
 class NamespaceDirective extends Directive {
@@ -887,7 +887,7 @@
   NamespaceDirective clone() => NamespaceDirective(_prefix, _uri, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
 
   String get prefix => _prefix.isNotEmpty ? '$_prefix ' : '';
 }
@@ -902,7 +902,7 @@
   VarDefinitionDirective clone() => VarDefinitionDirective(def.clone(), span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
 }
 
 class MixinDefinition extends Directive {
@@ -923,7 +923,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
+  void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
 }
 
 /// Support a Sass @mixin. See http://sass-lang.com for description.
@@ -949,7 +949,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
 }
 
 class MixinDeclarationDirective extends MixinDefinition {
@@ -970,7 +970,8 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
+  void visit(VisitorBase visitor) =>
+      visitor.visitMixinDeclarationDirective(this);
 }
 
 /// To support consuming a Sass mixin @include.
@@ -990,7 +991,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
 }
 
 /// To support Sass @content.
@@ -998,7 +999,7 @@
   ContentDirective(SourceSpan span) : super(span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitContentDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
 }
 
 class Declaration extends TreeNode {
@@ -1034,7 +1035,7 @@
           important: important);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitDeclaration(this);
+  void visit(VisitorBase visitor) => visitor.visitDeclaration(this);
 }
 
 // TODO(terry): Consider 2 kinds of VarDefinitions static at top-level and
@@ -1056,7 +1057,7 @@
       _property.clone(), expression != null ? expression.clone() : null, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
+  void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
 }
 
 /// Node for usage of @include mixin[(args,...)] found in a declaration group
@@ -1076,7 +1077,8 @@
       IncludeMixinAtDeclaration(include.clone(), span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
+  void visit(VisitorBase visitor) =>
+      visitor.visitIncludeMixinAtDeclaration(this);
 }
 
 class ExtendDeclaration extends Declaration {
@@ -1092,7 +1094,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
+  void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
 }
 
 class DeclarationGroup extends TreeNode {
@@ -1108,7 +1110,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
 }
 
 class MarginGroup extends DeclarationGroup {
@@ -1120,7 +1122,7 @@
   MarginGroup clone() =>
       MarginGroup(margin_sym, super.clone().declarations, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
 class VarUsage extends Expression {
@@ -1139,7 +1141,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitVarUsage(this);
+  void visit(VisitorBase visitor) => visitor.visitVarUsage(this);
 }
 
 class OperatorSlash extends Expression {
@@ -1147,7 +1149,7 @@
   @override
   OperatorSlash clone() => OperatorSlash(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
@@ -1155,7 +1157,7 @@
   @override
   OperatorComma clone() => OperatorComma(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
@@ -1163,7 +1165,7 @@
   @override
   OperatorPlus clone() => OperatorPlus(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
@@ -1171,7 +1173,7 @@
   @override
   OperatorMinus clone() => OperatorMinus(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
 
 class UnicodeRangeTerm extends Expression {
@@ -1186,7 +1188,7 @@
   UnicodeRangeTerm clone() => UnicodeRangeTerm(first, second, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
 }
 
 class LiteralTerm extends Expression {
@@ -1202,7 +1204,7 @@
   LiteralTerm clone() => LiteralTerm(value, text, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
 }
 
 class NumberTerm extends LiteralTerm {
@@ -1210,7 +1212,7 @@
   @override
   NumberTerm clone() => NumberTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
 
 class UnitTerm extends LiteralTerm {
@@ -1222,7 +1224,7 @@
   UnitTerm clone() => UnitTerm(value, text, span, unit);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
 
   String unitToString() => TokenKind.unitToString(unit);
 
@@ -1244,7 +1246,7 @@
   @override
   LengthTerm clone() => LengthTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
 }
 
 class PercentageTerm extends LiteralTerm {
@@ -1252,7 +1254,7 @@
   @override
   PercentageTerm clone() => PercentageTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
@@ -1260,7 +1262,7 @@
   @override
   EmTerm clone() => EmTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitEmTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
@@ -1268,7 +1270,7 @@
   @override
   ExTerm clone() => ExTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitExTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
 class AngleTerm extends UnitTerm {
@@ -1284,7 +1286,7 @@
   @override
   AngleTerm clone() => AngleTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
 }
 
 class TimeTerm extends UnitTerm {
@@ -1299,7 +1301,7 @@
   @override
   TimeTerm clone() => TimeTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
 }
 
 class FreqTerm extends UnitTerm {
@@ -1312,7 +1314,7 @@
   @override
   FreqTerm clone() => FreqTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
 }
 
 class FractionTerm extends LiteralTerm {
@@ -1321,7 +1323,7 @@
   @override
   FractionTerm clone() => FractionTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
@@ -1330,7 +1332,7 @@
   @override
   UriTerm clone() => UriTerm(value, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitUriTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
 class ResolutionTerm extends UnitTerm {
@@ -1345,7 +1347,7 @@
   @override
   ResolutionTerm clone() => ResolutionTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
 }
 
 class ChTerm extends UnitTerm {
@@ -1358,7 +1360,7 @@
   @override
   ChTerm clone() => ChTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitChTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitChTerm(this);
 }
 
 class RemTerm extends UnitTerm {
@@ -1371,7 +1373,7 @@
   @override
   RemTerm clone() => RemTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitRemTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
 }
 
 class ViewportTerm extends UnitTerm {
@@ -1387,7 +1389,7 @@
   @override
   ViewportTerm clone() => ViewportTerm(value, text, span, unit);
   @override
-  visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
 }
 
 /// Type to signal a bad hex value for HexColorTerm.value.
@@ -1399,7 +1401,7 @@
   @override
   HexColorTerm clone() => HexColorTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
 }
 
 class FunctionTerm extends LiteralTerm {
@@ -1411,7 +1413,7 @@
   @override
   FunctionTerm clone() => FunctionTerm(value, text, _params.clone(), span);
   @override
-  visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
 }
 
 /// A "\9" was encountered at the end of the expression and before a semi-colon.
@@ -1422,7 +1424,7 @@
   @override
   IE8Term clone() => IE8Term(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitIE8Term(this);
+  void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
 
 class GroupTerm extends Expression {
@@ -1439,7 +1441,7 @@
   @override
   GroupTerm clone() => GroupTerm(span);
   @override
-  visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
 }
 
 class ItemTerm extends NumberTerm {
@@ -1448,7 +1450,7 @@
   @override
   ItemTerm clone() => ItemTerm(value, text, span);
   @override
-  visit(VisitorBase visitor) => visitor.visitItemTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
 }
 
 class Expressions extends Expression {
@@ -1470,7 +1472,7 @@
   }
 
   @override
-  visit(VisitorBase visitor) => visitor.visitExpressions(this);
+  void visit(VisitorBase visitor) => visitor.visitExpressions(this);
 }
 
 class BinaryExpression extends Expression {
@@ -1483,7 +1485,7 @@
   @override
   BinaryExpression clone() => BinaryExpression(op, x.clone(), y.clone(), span);
   @override
-  visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
 }
 
 class UnaryExpression extends Expression {
@@ -1495,7 +1497,7 @@
   @override
   UnaryExpression clone() => UnaryExpression(op, self.clone(), span);
   @override
-  visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
 }
 
 abstract class DartStyleExpression extends TreeNode {
@@ -1515,7 +1517,7 @@
   // Merges give 2 DartStyleExpression (or derived from DartStyleExpression,
   // e.g., FontExpression, etc.) will merge if the two expressions are of the
   // same property name (implies same exact type e.g, FontExpression).
-  merged(DartStyleExpression newDartExpr);
+  DartStyleExpression merged(DartStyleExpression newDartExpr);
 
   bool get isUnknown => _styleType == 0 || _styleType == null;
   bool get isFont => _styleType == fontStyle;
@@ -1529,7 +1531,7 @@
   bool isSame(DartStyleExpression other) => _styleType == other._styleType;
 
   @override
-  visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
 }
 
 class FontExpression extends DartStyleExpression {
@@ -1581,7 +1583,7 @@
       lineHeight: font.lineHeight);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitFontExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitFontExpression(this);
 }
 
 abstract class BoxExpression extends DartStyleExpression {
@@ -1591,7 +1593,7 @@
       : super(styleType, span);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBoxExpression(this);
 
   String get formattedBoxEdge {
     if (box.top == box.left && box.top == box.bottom && box.top == box.right) {
@@ -1617,7 +1619,7 @@
       : super(DartStyleExpression.marginStyle, span, box);
 
   @override
-  merged(DartStyleExpression newMarginExpr) {
+  MarginExpression merged(DartStyleExpression newMarginExpr) {
     if (newMarginExpr is MarginExpression &&
         isMargin &&
         newMarginExpr.isMargin) {
@@ -1641,7 +1643,7 @@
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
 }
 
 class BorderExpression extends BoxExpression {
@@ -1654,7 +1656,7 @@
       : super(DartStyleExpression.borderStyle, span, box);
 
   @override
-  merged(DartStyleExpression newBorderExpr) {
+  BorderExpression merged(DartStyleExpression newBorderExpr) {
     if (newBorderExpr is BorderExpression &&
         isBorder &&
         newBorderExpr.isBorder) {
@@ -1679,7 +1681,7 @@
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
 
   @override
-  visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
 }
 
 class HeightExpression extends DartStyleExpression {
@@ -1689,7 +1691,7 @@
       : super(DartStyleExpression.heightStyle, span);
 
   @override
-  merged(DartStyleExpression newHeightExpr) {
+  HeightExpression merged(DartStyleExpression newHeightExpr) {
     if (newHeightExpr is DartStyleExpression &&
         isHeight &&
         newHeightExpr.isHeight) {
@@ -1702,7 +1704,7 @@
   @override
   HeightExpression clone() => HeightExpression(span, height);
   @override
-  visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitHeightExpression(this);
 }
 
 class WidthExpression extends DartStyleExpression {
@@ -1712,7 +1714,7 @@
       : super(DartStyleExpression.widthStyle, span);
 
   @override
-  merged(DartStyleExpression newWidthExpr) {
+  WidthExpression merged(DartStyleExpression newWidthExpr) {
     if (newWidthExpr is WidthExpression && isWidth && newWidthExpr.isWidth) {
       return newWidthExpr;
     }
@@ -1723,7 +1725,7 @@
   @override
   WidthExpression clone() => WidthExpression(span, width);
   @override
-  visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitWidthExpression(this);
 }
 
 class PaddingExpression extends BoxExpression {
@@ -1736,7 +1738,7 @@
       : super(DartStyleExpression.paddingStyle, span, box);
 
   @override
-  merged(DartStyleExpression newPaddingExpr) {
+  PaddingExpression merged(DartStyleExpression newPaddingExpr) {
     if (newPaddingExpr is PaddingExpression &&
         isPadding &&
         newPaddingExpr.isPadding) {
@@ -1760,5 +1762,5 @@
   PaddingExpression clone() => PaddingExpression(span,
       top: box.top, right: box.right, bottom: box.bottom, left: box.left);
   @override
-  visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitPaddingExpression(this);
 }
diff --git a/lib/src/tree_base.dart b/lib/src/tree_base.dart
index ef157cd..6f2f442 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.
-  visit(VisitorBase visitor);
+  void visit(VisitorBase visitor);
 
   /// A multiline string showing the node and its children.
   String toDebugString() {
diff --git a/lib/src/validate.dart b/lib/src/validate.dart
index fe18e05..4d255e2 100644
--- a/lib/src/validate.dart
+++ b/lib/src/validate.dart
@@ -50,7 +50,7 @@
 
   // Validate the @{css expression} only .class and #elementId are valid inside
   // of @{...}.
-  static template(List<Selector> selectors) {
+  static void template(List<Selector> selectors) {
     var found = false; // signal if a selector is matched.
     var matches = 0; // < 0 IdSelectors, > 0 ClassSelector
 
diff --git a/lib/visitor.dart b/lib/visitor.dart
index 2ccd8ff..ceda80c 100644
--- a/lib/visitor.dart
+++ b/lib/visitor.dart
@@ -11,107 +11,107 @@
 part 'src/tree_printer.dart';
 
 abstract class VisitorBase {
-  visitCalcTerm(CalcTerm node);
-  visitCssComment(CssComment node);
-  visitCommentDefinition(CommentDefinition node);
-  visitStyleSheet(StyleSheet node);
-  visitNoOp(NoOp node);
-  visitTopLevelProduction(TopLevelProduction node);
-  visitDirective(Directive node);
-  visitDocumentDirective(DocumentDirective node);
-  visitSupportsDirective(SupportsDirective node);
-  visitSupportsConditionInParens(SupportsConditionInParens node);
-  visitSupportsNegation(SupportsNegation node);
-  visitSupportsConjunction(SupportsConjunction node);
-  visitSupportsDisjunction(SupportsDisjunction node);
-  visitViewportDirective(ViewportDirective node);
-  visitMediaExpression(MediaExpression node);
-  visitMediaQuery(MediaQuery node);
-  visitMediaDirective(MediaDirective node);
-  visitHostDirective(HostDirective node);
-  visitPageDirective(PageDirective node);
-  visitCharsetDirective(CharsetDirective node);
-  visitImportDirective(ImportDirective node);
-  visitKeyFrameDirective(KeyFrameDirective node);
-  visitKeyFrameBlock(KeyFrameBlock node);
-  visitFontFaceDirective(FontFaceDirective node);
-  visitStyletDirective(StyletDirective node);
-  visitNamespaceDirective(NamespaceDirective node);
-  visitVarDefinitionDirective(VarDefinitionDirective node);
-  visitMixinDefinition(MixinDefinition node);
-  visitMixinRulesetDirective(MixinRulesetDirective node);
-  visitMixinDeclarationDirective(MixinDeclarationDirective node);
-  visitIncludeDirective(IncludeDirective node);
-  visitContentDirective(ContentDirective node);
+  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);
 
-  visitRuleSet(RuleSet node);
-  visitDeclarationGroup(DeclarationGroup node);
-  visitMarginGroup(MarginGroup node);
-  visitDeclaration(Declaration node);
-  visitVarDefinition(VarDefinition node);
-  visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node);
-  visitExtendDeclaration(ExtendDeclaration node);
-  visitSelectorGroup(SelectorGroup node);
-  visitSelector(Selector node);
-  visitSimpleSelectorSequence(SimpleSelectorSequence node);
-  visitSimpleSelector(SimpleSelector node);
-  visitElementSelector(ElementSelector node);
-  visitNamespaceSelector(NamespaceSelector node);
-  visitAttributeSelector(AttributeSelector node);
-  visitIdSelector(IdSelector node);
-  visitClassSelector(ClassSelector node);
-  visitPseudoClassSelector(PseudoClassSelector node);
-  visitPseudoElementSelector(PseudoElementSelector node);
-  visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node);
-  visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node);
-  visitNegationSelector(NegationSelector node);
-  visitSelectorExpression(SelectorExpression 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);
 
-  visitUnicodeRangeTerm(UnicodeRangeTerm node);
-  visitLiteralTerm(LiteralTerm node);
-  visitHexColorTerm(HexColorTerm node);
-  visitNumberTerm(NumberTerm node);
-  visitUnitTerm(UnitTerm node);
-  visitLengthTerm(LengthTerm node);
-  visitPercentageTerm(PercentageTerm node);
-  visitEmTerm(EmTerm node);
-  visitExTerm(ExTerm node);
-  visitAngleTerm(AngleTerm node);
-  visitTimeTerm(TimeTerm node);
-  visitFreqTerm(FreqTerm node);
-  visitFractionTerm(FractionTerm node);
-  visitUriTerm(UriTerm node);
-  visitResolutionTerm(ResolutionTerm node);
-  visitChTerm(ChTerm node);
-  visitRemTerm(RemTerm node);
-  visitViewportTerm(ViewportTerm node);
-  visitFunctionTerm(FunctionTerm node);
-  visitGroupTerm(GroupTerm node);
-  visitItemTerm(ItemTerm node);
-  visitIE8Term(IE8Term node);
-  visitOperatorSlash(OperatorSlash node);
-  visitOperatorComma(OperatorComma node);
-  visitOperatorPlus(OperatorPlus node);
-  visitOperatorMinus(OperatorMinus node);
-  visitVarUsage(VarUsage 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);
 
-  visitExpressions(Expressions node);
-  visitBinaryExpression(BinaryExpression node);
-  visitUnaryExpression(UnaryExpression node);
+  void visitExpressions(Expressions node);
+  void visitBinaryExpression(BinaryExpression node);
+  void visitUnaryExpression(UnaryExpression node);
 
-  visitIdentifier(Identifier node);
-  visitWildcard(Wildcard node);
-  visitThisOperator(ThisOperator node);
-  visitNegation(Negation node);
+  void visitIdentifier(Identifier node);
+  void visitWildcard(Wildcard node);
+  void visitThisOperator(ThisOperator node);
+  void visitNegation(Negation node);
 
-  visitDartStyleExpression(DartStyleExpression node);
-  visitFontExpression(FontExpression node);
-  visitBoxExpression(BoxExpression node);
-  visitMarginExpression(MarginExpression node);
-  visitBorderExpression(BorderExpression node);
-  visitHeightExpression(HeightExpression node);
-  visitPaddingExpression(PaddingExpression node);
-  visitWidthExpression(WidthExpression 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.
@@ -126,96 +126,96 @@
     }
   }
 
-  visitTree(StyleSheet tree) => visitStyleSheet(tree);
+  void visitTree(StyleSheet tree) => visitStyleSheet(tree);
 
   @override
-  visitStyleSheet(StyleSheet ss) {
+  void visitStyleSheet(StyleSheet ss) {
     _visitNodeList(ss.topLevels);
   }
 
   @override
-  visitNoOp(NoOp node) {}
+  void visitNoOp(NoOp node) {}
 
   @override
-  visitTopLevelProduction(TopLevelProduction node) {}
+  void visitTopLevelProduction(TopLevelProduction node) {}
 
   @override
-  visitDirective(Directive node) {}
+  void visitDirective(Directive node) {}
 
   @override
-  visitCalcTerm(CalcTerm node) {
+  void visitCalcTerm(CalcTerm node) {
     visitLiteralTerm(node);
     visitLiteralTerm(node.expr);
   }
 
   @override
-  visitCssComment(CssComment node) {}
+  void visitCssComment(CssComment node) {}
 
   @override
-  visitCommentDefinition(CommentDefinition node) {}
+  void visitCommentDefinition(CommentDefinition node) {}
 
   @override
-  visitMediaExpression(MediaExpression node) {
+  void visitMediaExpression(MediaExpression node) {
     visitExpressions(node.exprs);
   }
 
   @override
-  visitMediaQuery(MediaQuery node) {
+  void visitMediaQuery(MediaQuery node) {
     for (var mediaExpr in node.expressions) {
       visitMediaExpression(mediaExpr);
     }
   }
 
   @override
-  visitDocumentDirective(DocumentDirective node) {
+  void visitDocumentDirective(DocumentDirective node) {
     _visitNodeList(node.functions);
     _visitNodeList(node.groupRuleBody);
   }
 
   @override
-  visitSupportsDirective(SupportsDirective node) {
+  void visitSupportsDirective(SupportsDirective node) {
     node.condition.visit(this);
     _visitNodeList(node.groupRuleBody);
   }
 
   @override
-  visitSupportsConditionInParens(SupportsConditionInParens node) {
+  void visitSupportsConditionInParens(SupportsConditionInParens node) {
     node.condition.visit(this);
   }
 
   @override
-  visitSupportsNegation(SupportsNegation node) {
+  void visitSupportsNegation(SupportsNegation node) {
     node.condition.visit(this);
   }
 
   @override
-  visitSupportsConjunction(SupportsConjunction node) {
+  void visitSupportsConjunction(SupportsConjunction node) {
     _visitNodeList(node.conditions);
   }
 
   @override
-  visitSupportsDisjunction(SupportsDisjunction node) {
+  void visitSupportsDisjunction(SupportsDisjunction node) {
     _visitNodeList(node.conditions);
   }
 
   @override
-  visitViewportDirective(ViewportDirective node) {
+  void visitViewportDirective(ViewportDirective node) {
     node.declarations.visit(this);
   }
 
   @override
-  visitMediaDirective(MediaDirective node) {
+  void visitMediaDirective(MediaDirective node) {
     _visitNodeList(node.mediaQueries);
     _visitNodeList(node.rules);
   }
 
   @override
-  visitHostDirective(HostDirective node) {
+  void visitHostDirective(HostDirective node) {
     _visitNodeList(node.rules);
   }
 
   @override
-  visitPageDirective(PageDirective node) {
+  void visitPageDirective(PageDirective node) {
     for (var declGroup in node._declsMargin) {
       if (declGroup is MarginGroup) {
         visitMarginGroup(declGroup);
@@ -226,60 +226,60 @@
   }
 
   @override
-  visitCharsetDirective(CharsetDirective node) {}
+  void visitCharsetDirective(CharsetDirective node) {}
 
   @override
-  visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     for (var mediaQuery in node.mediaQueries) {
       visitMediaQuery(mediaQuery);
     }
   }
 
   @override
-  visitKeyFrameDirective(KeyFrameDirective node) {
+  void visitKeyFrameDirective(KeyFrameDirective node) {
     visitIdentifier(node.name);
     _visitNodeList(node._blocks);
   }
 
   @override
-  visitKeyFrameBlock(KeyFrameBlock node) {
+  void visitKeyFrameBlock(KeyFrameBlock node) {
     visitExpressions(node._blockSelectors);
     visitDeclarationGroup(node._declarations);
   }
 
   @override
-  visitFontFaceDirective(FontFaceDirective node) {
+  void visitFontFaceDirective(FontFaceDirective node) {
     visitDeclarationGroup(node._declarations);
   }
 
   @override
-  visitStyletDirective(StyletDirective node) {
+  void visitStyletDirective(StyletDirective node) {
     _visitNodeList(node.rules);
   }
 
   @override
-  visitNamespaceDirective(NamespaceDirective node) {}
+  void visitNamespaceDirective(NamespaceDirective node) {}
 
   @override
-  visitVarDefinitionDirective(VarDefinitionDirective node) {
+  void visitVarDefinitionDirective(VarDefinitionDirective node) {
     visitVarDefinition(node.def);
   }
 
   @override
-  visitMixinRulesetDirective(MixinRulesetDirective node) {
+  void visitMixinRulesetDirective(MixinRulesetDirective node) {
     _visitNodeList(node.rulesets);
   }
 
   @override
-  visitMixinDefinition(MixinDefinition node) {}
+  void visitMixinDefinition(MixinDefinition node) {}
 
   @override
-  visitMixinDeclarationDirective(MixinDeclarationDirective node) {
+  void visitMixinDeclarationDirective(MixinDeclarationDirective node) {
     visitDeclarationGroup(node.declarations);
   }
 
   @override
-  visitIncludeDirective(IncludeDirective node) {
+  void visitIncludeDirective(IncludeDirective node) {
     for (var index = 0; index < node.args.length; index++) {
       var param = node.args[index];
       _visitNodeList(param);
@@ -287,66 +287,66 @@
   }
 
   @override
-  visitContentDirective(ContentDirective node) {
+  void visitContentDirective(ContentDirective node) {
     // TODO(terry): TBD
   }
 
   @override
-  visitRuleSet(RuleSet node) {
+  void visitRuleSet(RuleSet node) {
     visitSelectorGroup(node._selectorGroup);
     visitDeclarationGroup(node._declarationGroup);
   }
 
   @override
-  visitDeclarationGroup(DeclarationGroup node) {
+  void visitDeclarationGroup(DeclarationGroup node) {
     _visitNodeList(node.declarations);
   }
 
   @override
-  visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
+  void visitMarginGroup(MarginGroup node) => visitDeclarationGroup(node);
 
   @override
-  visitDeclaration(Declaration node) {
+  void visitDeclaration(Declaration node) {
     visitIdentifier(node._property);
     if (node._expression != null) node._expression.visit(this);
   }
 
   @override
-  visitVarDefinition(VarDefinition node) {
+  void visitVarDefinition(VarDefinition node) {
     visitIdentifier(node._property);
     if (node._expression != null) node._expression.visit(this);
   }
 
   @override
-  visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
+  void visitIncludeMixinAtDeclaration(IncludeMixinAtDeclaration node) {
     visitIncludeDirective(node.include);
   }
 
   @override
-  visitExtendDeclaration(ExtendDeclaration node) {
+  void visitExtendDeclaration(ExtendDeclaration node) {
     _visitNodeList(node.selectors);
   }
 
   @override
-  visitSelectorGroup(SelectorGroup node) {
+  void visitSelectorGroup(SelectorGroup node) {
     _visitNodeList(node.selectors);
   }
 
   @override
-  visitSelector(Selector node) {
+  void visitSelector(Selector node) {
     _visitNodeList(node.simpleSelectorSequences);
   }
 
   @override
-  visitSimpleSelectorSequence(SimpleSelectorSequence node) {
+  void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
     node.simpleSelector.visit(this);
   }
 
   @override
-  visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
+  void visitSimpleSelector(SimpleSelector node) => node._name.visit(this);
 
   @override
-  visitNamespaceSelector(NamespaceSelector node) {
+  void visitNamespaceSelector(NamespaceSelector node) {
     if (node._namespace != null) node._namespace.visit(this);
     if (node.nameAsSimpleSelector != null) {
       node.nameAsSimpleSelector.visit(this);
@@ -354,231 +354,232 @@
   }
 
   @override
-  visitElementSelector(ElementSelector node) => visitSimpleSelector(node);
+  void visitElementSelector(ElementSelector node) => visitSimpleSelector(node);
 
   @override
-  visitAttributeSelector(AttributeSelector node) {
+  void visitAttributeSelector(AttributeSelector node) {
     visitSimpleSelector(node);
   }
 
   @override
-  visitIdSelector(IdSelector node) => visitSimpleSelector(node);
+  void visitIdSelector(IdSelector node) => visitSimpleSelector(node);
 
   @override
-  visitClassSelector(ClassSelector node) => visitSimpleSelector(node);
+  void visitClassSelector(ClassSelector node) => visitSimpleSelector(node);
 
   @override
-  visitPseudoClassSelector(PseudoClassSelector node) =>
+  void visitPseudoClassSelector(PseudoClassSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  visitPseudoElementSelector(PseudoElementSelector node) =>
+  void visitPseudoElementSelector(PseudoElementSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) =>
+  void visitPseudoClassFunctionSelector(PseudoClassFunctionSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) =>
+  void visitPseudoElementFunctionSelector(PseudoElementFunctionSelector node) =>
       visitSimpleSelector(node);
 
   @override
-  visitNegationSelector(NegationSelector node) => visitSimpleSelector(node);
+  void visitNegationSelector(NegationSelector node) =>
+      visitSimpleSelector(node);
 
   @override
-  visitSelectorExpression(SelectorExpression node) {
+  void visitSelectorExpression(SelectorExpression node) {
     _visitNodeList(node.expressions);
   }
 
   @override
-  visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
+  void visitUnicodeRangeTerm(UnicodeRangeTerm node) {}
 
   @override
-  visitLiteralTerm(LiteralTerm node) {}
+  void visitLiteralTerm(LiteralTerm node) {}
 
   @override
-  visitHexColorTerm(HexColorTerm node) {}
+  void visitHexColorTerm(HexColorTerm node) {}
 
   @override
-  visitNumberTerm(NumberTerm node) {}
+  void visitNumberTerm(NumberTerm node) {}
 
   @override
-  visitUnitTerm(UnitTerm node) {}
+  void visitUnitTerm(UnitTerm node) {}
 
   @override
-  visitLengthTerm(LengthTerm node) {
+  void visitLengthTerm(LengthTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitPercentageTerm(PercentageTerm node) {
+  void visitPercentageTerm(PercentageTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  visitEmTerm(EmTerm node) {
+  void visitEmTerm(EmTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  visitExTerm(ExTerm node) {
+  void visitExTerm(ExTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  visitAngleTerm(AngleTerm node) {
+  void visitAngleTerm(AngleTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitTimeTerm(TimeTerm node) {
+  void visitTimeTerm(TimeTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitFreqTerm(FreqTerm node) {
+  void visitFreqTerm(FreqTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitFractionTerm(FractionTerm node) {
+  void visitFractionTerm(FractionTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  visitUriTerm(UriTerm node) {
+  void visitUriTerm(UriTerm node) {
     visitLiteralTerm(node);
   }
 
   @override
-  visitResolutionTerm(ResolutionTerm node) {
+  void visitResolutionTerm(ResolutionTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitChTerm(ChTerm node) {
+  void visitChTerm(ChTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitRemTerm(RemTerm node) {
+  void visitRemTerm(RemTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitViewportTerm(ViewportTerm node) {
+  void visitViewportTerm(ViewportTerm node) {
     visitUnitTerm(node);
   }
 
   @override
-  visitFunctionTerm(FunctionTerm node) {
+  void visitFunctionTerm(FunctionTerm node) {
     visitLiteralTerm(node);
     visitExpressions(node._params);
   }
 
   @override
-  visitGroupTerm(GroupTerm node) {
+  void visitGroupTerm(GroupTerm node) {
     for (var term in node._terms) {
       term.visit(this);
     }
   }
 
   @override
-  visitItemTerm(ItemTerm node) {
+  void visitItemTerm(ItemTerm node) {
     visitNumberTerm(node);
   }
 
   @override
-  visitIE8Term(IE8Term node) {}
+  void visitIE8Term(IE8Term node) {}
 
   @override
-  visitOperatorSlash(OperatorSlash node) {}
+  void visitOperatorSlash(OperatorSlash node) {}
 
   @override
-  visitOperatorComma(OperatorComma node) {}
+  void visitOperatorComma(OperatorComma node) {}
 
   @override
-  visitOperatorPlus(OperatorPlus node) {}
+  void visitOperatorPlus(OperatorPlus node) {}
 
   @override
-  visitOperatorMinus(OperatorMinus node) {}
+  void visitOperatorMinus(OperatorMinus node) {}
 
   @override
-  visitVarUsage(VarUsage node) {
+  void visitVarUsage(VarUsage node) {
     _visitNodeList(node.defaultValues);
   }
 
   @override
-  visitExpressions(Expressions node) {
+  void visitExpressions(Expressions node) {
     _visitNodeList(node.expressions);
   }
 
   @override
-  visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitUnaryExpression(UnaryExpression node) {
+  void visitUnaryExpression(UnaryExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitIdentifier(Identifier node) {}
+  void visitIdentifier(Identifier node) {}
 
   @override
-  visitWildcard(Wildcard node) {}
+  void visitWildcard(Wildcard node) {}
 
   @override
-  visitThisOperator(ThisOperator node) {}
+  void visitThisOperator(ThisOperator node) {}
 
   @override
-  visitNegation(Negation node) {}
+  void visitNegation(Negation node) {}
 
   @override
-  visitDartStyleExpression(DartStyleExpression node) {}
+  void visitDartStyleExpression(DartStyleExpression node) {}
 
   @override
-  visitFontExpression(FontExpression node) {
+  void visitFontExpression(FontExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitBoxExpression(BoxExpression node) {
+  void visitBoxExpression(BoxExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitMarginExpression(MarginExpression node) {
+  void visitMarginExpression(MarginExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitBorderExpression(BorderExpression node) {
+  void visitBorderExpression(BorderExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitHeightExpression(HeightExpression node) {
+  void visitHeightExpression(HeightExpression node) {
     // TODO(terry): TB
     throw UnimplementedError();
   }
 
   @override
-  visitPaddingExpression(PaddingExpression node) {
+  void visitPaddingExpression(PaddingExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
 
   @override
-  visitWidthExpression(WidthExpression node) {
+  void visitWidthExpression(WidthExpression node) {
     // TODO(terry): TBD
     throw UnimplementedError();
   }
diff --git a/pubspec.yaml b/pubspec.yaml
index ae2288d..207348d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,8 +1,7 @@
 name: csslib
-version: 0.16.1
+version: 0.16.2-dev
 
 description: A library for parsing CSS.
-author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/csslib
 
 environment:
diff --git a/test/big_1_test.dart b/test/big_1_test.dart
index 5df5b45..0001777 100644
--- a/test/big_1_test.dart
+++ b/test/big_1_test.dart
@@ -8,7 +8,7 @@
 import 'package:test/test.dart';
 import 'testing.dart';
 
-compilePolyfillAndValidate(String input, String generated) {
+void compilePolyfillAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index d943b08..709aa7b 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -20,7 +20,7 @@
 
 void testSimpleTerms() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 @ import url("test.css");
 .foo {
   background-color: #191919;
@@ -34,7 +34,7 @@
   length: 1.2in;
   -web-stuff: -10Px;
 }''';
-  final String generated = r'''
+  final generated = r'''
 @import "test.css";
 .foo {
   background-color: #191919;
@@ -55,11 +55,11 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated);
 
-  final String input2 = r'''
+  final input2 = r'''
 * {
   border-color: green;
 }''';
-  final String generated2 = r'''
+  final generated2 = r'''
 * {
   border-color: #008000;
 }''';
@@ -86,7 +86,7 @@
 /// no quotes.  Hex values with # and letters, and functions (rgba, url, etc.)
 void testDeclarations() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 .more {
   color: white;
   color: black;
@@ -100,7 +100,7 @@
   color: rgba(10,20,255);  <!-- test CDO/CDC  -->
   color: #123aef;   /* hex # part integer and part identifier */
 }''';
-  final String generated = r'''
+  final generated = r'''
 .more {
   color: #fff;
   color: #000;
@@ -124,7 +124,7 @@
 
 void testIdentifiers() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 #da {
   height: 100px;
 }
@@ -133,7 +133,7 @@
   color: #ff00cc;
 }
 ''';
-  final String generated = r'''
+  final generated = r'''
 #da {
   height: 100px;
 }
@@ -151,7 +151,7 @@
 
 void testComposites() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 .xyzzy {
   border: 10px 80px 90px 100px;
   width: 99%;
@@ -161,7 +161,7 @@
     -webkit-transform: translate3d(0, 0, 0) scale(1.0);
   }
 }''';
-  final String generated = r'''
+  final generated = r'''
 .xyzzy {
   border: 10px 80px 90px 100px;
   width: 99%;
@@ -180,7 +180,7 @@
 
 void testUnits() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 #id-1 {
   transition: color 0.4s;
   animation-duration: 500ms;
@@ -218,7 +218,7 @@
 }
 ''';
 
-  final String generated = r'''
+  final generated = r'''
 #id-1 {
   transition: color 0.4s;
   animation-duration: 500ms;
@@ -264,7 +264,7 @@
 
 void testUnicode() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 .toggle:after {
   content: '✔';
   line-height: 43px;
@@ -274,7 +274,7 @@
 }
 ''';
 
-  final String generated = r'''
+  final generated = r'''
 .toggle:after {
   content: '✔';
   line-height: 43px;
@@ -292,7 +292,7 @@
 
 void testNewerCss() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 @media screen,print {
   .foobar_screen {
     width: 10px;
@@ -310,7 +310,7 @@
 @charset "ISO-8859-1";
 @charset 'ASCII';''';
 
-  final String generated = r'''
+  final generated = r'''
 @media screen, print {
 .foobar_screen {
   width: 10px;
@@ -683,13 +683,13 @@
 void testFontFace() {
   var errors = <Message>[];
 
-  final String input = '''
+  final input = '''
 @font-face {
   font-family: BBCBengali;
   src: url(fonts/BBCBengali.ttf) format("opentype");
   unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
 }''';
-  final String generated = '''@font-face  {
+  final generated = '''@font-face  {
   font-family: BBCBengali;
   src: url("fonts/BBCBengali.ttf") format("opentype");
   unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
@@ -700,13 +700,13 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated);
 
-  final String input1 = '''
+  final input1 = '''
 @font-face {
   font-family: Gentium;
   src: url(http://example.com/fonts/Gentium.ttf);
   src: url(http://example.com/fonts/Gentium.ttf);
 }''';
-  final String generated1 = '''@font-face  {
+  final generated1 = '''@font-face  {
   font-family: Gentium;
   src: url("http://example.com/fonts/Gentium.ttf");
   src: url("http://example.com/fonts/Gentium.ttf");
@@ -718,13 +718,13 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated1);
 
-  final String input2 = '''
+  final input2 = '''
 @font-face {
 src: url(ideal-sans-serif.woff) format("woff"),
      url(basic-sans-serif.ttf) format("opentype"),
      local(Gentium Bold);
 }''';
-  final String generated2 = '@font-face  {\n'
+  final generated2 = '@font-face  {\n'
       '  src: url("ideal-sans-serif.woff") '
       'format("woff"), url("basic-sans-serif.ttf") '
       'format("opentype"), local(Gentium Bold);\n}';
@@ -735,14 +735,14 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated2);
 
-  final String input3 = '''@font-face {
+  final input3 = '''@font-face {
   font-family: MyGentium Text Ornaments;
   src: local(Gentium Bold),   /* full font name */
        local(Gentium-Bold),   /* Postscript name */
        url(GentiumBold.ttf);  /* otherwise, download it */
   font-weight: bold;
 }''';
-  final String generated3 = '''@font-face  {
+  final generated3 = '''@font-face  {
   font-family: MyGentium Text Ornaments;
   src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
   font-weight: bold;
@@ -754,13 +754,13 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated3);
 
-  final String input4 = '''
+  final input4 = '''
 @font-face {
   font-family: STIXGeneral;
   src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf);
   unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
 }''';
-  final String generated4 = '''@font-face  {
+  final generated4 = '''@font-face  {
   font-family: STIXGeneral;
   src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf");
   unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
@@ -774,7 +774,7 @@
 
 void testCssFile() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 @import 'simple.css'
 @import "test.css" print
 @import url(test.css) screen, print
@@ -809,7 +809,7 @@
 }
 ''';
 
-  final String generated = '@import "simple.css"; '
+  final generated = '@import "simple.css"; '
       '@import "test.css" print; '
       '@import "test.css" screen, print; '
       '@import "http://google.com/maps/maps.css";\n'
@@ -847,7 +847,7 @@
   var errors = <Message>[];
 
   // Check !import compactly emitted.
-  final String input = r'''
+  final input = r'''
 div {
   color: green !important;
   background: red blue green;
@@ -876,8 +876,7 @@
   color: rgba(0, 0, 0, 0.2);
 }
 ''';
-  final String generated =
-      'div{color:green!important;background:red blue green}'
+  final generated = 'div{color:green!important;background:red blue green}'
       '.foo p[bar]{color:blue}'
       '@page{@top-left{color:red}}'
       '@page:first{}'
@@ -893,8 +892,8 @@
   expect(compactOuptut(stylesheet), generated);
 
   // Check namespace directive compactly emitted.
-  final String input2 = '@namespace a url(http://www.example.org/a);';
-  final String generated2 = '@namespace a url(http://www.example.org/a);';
+  final input2 = '@namespace a url(http://www.example.org/a);';
+  final generated2 = '@namespace a url(http://www.example.org/a);';
 
   var stylesheet2 = parseCss(input2, errors: errors..clear());
 
@@ -906,7 +905,7 @@
 void testNotSelectors() {
   var errors = <Message>[];
 
-  final String input = r'''
+  final input = r'''
 .details:not(.open-details) x-element,
 .details:not(.open-details) .summary {
   overflow: hidden;
@@ -951,7 +950,7 @@
 
 *:not(:not([disabled])) { color: blue; }
 ''';
-  final String generated = r'''
+  final generated = r'''
 .details:not(.open-details) x-element, .details:not(.open-details) .summary {
   overflow: hidden;
 }
@@ -995,11 +994,11 @@
 
 void testIE() {
   var errors = <Message>[];
-  final String input = '.test {\n'
+  final input = '.test {\n'
       '  filter: progid:DXImageTransform.Microsoft.gradient'
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
       '}';
-  final String generated = '.test {\n'
+  final generated = '.test {\n'
       '  filter: progid:DXImageTransform.Microsoft.gradient'
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
       '}';
@@ -1010,13 +1009,13 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated);
 
-  final String input2 = '.test {\n'
+  final input2 = '.test {\n'
       '  filter: progid:DXImageTransform.Microsoft.gradient'
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
       '        progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n'
       '}';
 
-  final String generated2 = '.test {\n'
+  final generated2 = '.test {\n'
       '  filter: progid:DXImageTransform.Microsoft.gradient'
       "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
       '         progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n'
@@ -1028,7 +1027,7 @@
   expect(errors.isEmpty, true, reason: errors.toString());
   expect(prettyPrint(stylesheet), generated2);
 
-  final String input3 = '''
+  final input3 = '''
 div {
   filter: alpha(opacity=80);          /* IE7 and under */
   -ms-filter: "Alpha(Opacity=40)";    /* IE8 and newer */
@@ -1042,7 +1041,7 @@
       Phase=220, Strength=10);
 }
 ''';
-  final String generated3 = 'div {\n  filter: alpha(opacity=80);\n'
+  final generated3 = 'div {\n  filter: alpha(opacity=80);\n'
       '  -ms-filter: "Alpha(Opacity=40)";\n'
       '  Filter: Blur(Add = 0, Direction = 225, Strength = 10);\n'
       '  Filter: FlipV;\n  Filter: Gray;\n'
@@ -1354,7 +1353,7 @@
 
 void selectorWithCalcs() {
   var errors = <Message>[];
-  final String input = r'''
+  final input = r'''
 .foo {
   width: calc(1em + 5 * 2em);
   height: calc(1px + 2%) !important;
@@ -1362,7 +1361,7 @@
   border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px);
   margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(100% - 10px);
 }''';
-  final String generated = r'''
+  final generated = r'''
 .foo {
   width: calc(1em + 5 * 2em);
   height: calc(1px + 2%) !important;
diff --git a/test/error_test.dart b/test/error_test.dart
index f4ec960..d242176 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -248,7 +248,7 @@
 
 void testBadUnicode() {
   var errors = <Message>[];
-  final String input = '''
+  final input = '''
 @font-face {
   src: url(fonts/BBCBengali.ttf) format("opentype");
   unicode-range: U+400-200;
@@ -266,7 +266,7 @@
       '  │                    ^^^^^^^\n'
       '  ╵');
 
-  final String input2 = '''
+  final input2 = '''
 @font-face {
   src: url(fonts/BBCBengali.ttf) format("opentype");
   unicode-range: U+12FFFF;
@@ -288,7 +288,7 @@
   var errors = <Message>[];
 
   // Test for bad declaration in a nested rule.
-  final String input = '''
+  final input = '''
 div {
   width: 20px;
   span + ul { color: blue; }
@@ -309,7 +309,7 @@
   expect(errorMessage.span.text, '#ffghghgh');
 
   // Test for bad selector syntax.
-  final String input2 = '''
+  final input2 = '''
 div {
   span + ul #aaaa > (3333)  {
     color: #ffghghgh;
@@ -347,7 +347,7 @@
   expect(errorMessage.span.text, '(');
 
   // Test for missing close braces and bad declaration.
-  final String input3 = '''
+  final input3 = '''
 div {
   span {
     color: #green;
diff --git a/test/extend_test.dart b/test/extend_test.dart
index ed5904f..38e0ea0 100644
--- a/test/extend_test.dart
+++ b/test/extend_test.dart
@@ -9,7 +9,7 @@
 
 import 'testing.dart';
 
-compileAndValidate(String input, String generated) {
+void compileAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
diff --git a/test/mixin_test.dart b/test/mixin_test.dart
index dec6651..f562f38 100644
--- a/test/mixin_test.dart
+++ b/test/mixin_test.dart
@@ -9,7 +9,7 @@
 
 import 'testing.dart';
 
-compileAndValidate(String input, String generated) {
+void compileAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
@@ -17,7 +17,7 @@
   expect(prettyPrint(stylesheet), generated);
 }
 
-compilePolyfillAndValidate(String input, String generated) {
+void compilePolyfillAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
diff --git a/test/nested_test.dart b/test/nested_test.dart
index b8ef9eb..b096fc2 100644
--- a/test/nested_test.dart
+++ b/test/nested_test.dart
@@ -9,7 +9,7 @@
 
 import 'testing.dart';
 
-compileAndValidate(String input, String generated) {
+void compileAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: simpleOptions);
   expect(stylesheet != null, true);
@@ -17,7 +17,7 @@
   expect(prettyPrint(stylesheet), generated);
 }
 
-selectorVariations() {
+void selectorVariations() {
   final input1 = r'''html { color: red; }''';
   final generated1 = r'''html {
   color: #f00;
@@ -479,7 +479,7 @@
   compileAndValidate(input2, generated2);
 }
 
-variationsThis() {
+void variationsThis() {
   final input1 = r'''
 .textLink {
   a {
@@ -590,7 +590,7 @@
   compileAndValidate(input10, generated10);
 }
 
-thisCombinator() {
+void thisCombinator() {
   var input = r'''
 .btn {
   color: red;
diff --git a/test/var_test.dart b/test/var_test.dart
index db03b25..1ebd975 100644
--- a/test/var_test.dart
+++ b/test/var_test.dart
@@ -9,7 +9,7 @@
 
 import 'testing.dart';
 
-compileAndValidate(String input, String generated) {
+void compileAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = compileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
@@ -17,7 +17,7 @@
   expect(prettyPrint(stylesheet), generated);
 }
 
-compilePolyfillAndValidate(String input, String generated) {
+void compilePolyfillAndValidate(String input, String generated) {
   var errors = <Message>[];
   var stylesheet = polyFillCompileCss(input, errors: errors, opts: options);
   expect(stylesheet != null, true);
@@ -496,7 +496,7 @@
   expect(prettyPrint(stylesheet), generatedPolyfill);
 }
 
-parserVar() {
+void parserVar() {
   final input = '''
 :root {
   var-color-background: red;
@@ -656,7 +656,7 @@
   compilePolyfillAndValidate(input, generatedPolyfill);
 }
 
-testVar() {
+void testVar() {
   final errors = <Message>[];
   final input = '''
 @color-background: red;
@@ -711,7 +711,7 @@
   compileAndValidate(input2, generated2);
 }
 
-testLess() {
+void testLess() {
   final errors = <Message>[];
   final input = '''
 @color-background: red;
