pkg/csslib: types, fixes, cleanup

R=terry@google.com

Review URL: https://codereview.chromium.org//64373003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/csslib@30049 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/bin/css.dart b/bin/css.dart
index 08f2930..f64faac 100644
--- a/bin/css.dart
+++ b/bin/css.dart
@@ -5,4 +5,4 @@
 
 import 'package:csslib/css.dart' as css;
 
-void main() => css.main();
+void main(List<String> args) => css.main(args);
diff --git a/lib/src/css_printer.dart b/lib/src/css_printer.dart
index b532544..73c2984 100644
--- a/lib/src/css_printer.dart
+++ b/lib/src/css_printer.dart
@@ -137,7 +137,7 @@
 
   void visitKeyFrameDirective(KeyFrameDirective node) {
     emit('$_newLine${node.keyFrameName} ');
-    node._name.visit(this);
+    node.name.visit(this);
     emit('$_sp{$_newLine');
     for (final block in node._blocks) {
       block.visit(this);
@@ -274,7 +274,7 @@
 
 
   void visitSelectorGroup(SelectorGroup node) {
-    var selectors = node._selectors;
+    var selectors = node.selectors;
     var selectorsLength = selectors.length;
     for (var i = 0; i < selectorsLength; i++) {
       if (i > 0) emit(',$_sp');
@@ -284,7 +284,7 @@
 
   void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
     emit('${node._combinatorToString}');
-    node._selector.visit(this);
+    node.simpleSelector.visit(this);
   }
 
   void visitSimpleSelector(SimpleSelector node) {
diff --git a/lib/src/tree.dart b/lib/src/tree.dart
index 1de5957..941eb57 100644
--- a/lib/src/tree.dart
+++ b/lib/src/tree.dart
@@ -15,7 +15,7 @@
 
   Identifier clone() => new Identifier(name, span);
 
-  visit(VisitorBase visitor) => visitor.visitIdentifier(this);
+  void visit(VisitorBase visitor) => visitor.visitIdentifier(this);
 
   String toString() => name;
 }
@@ -55,51 +55,44 @@
 }
 
 class SelectorGroup extends TreeNode {
-  List<Selector> _selectors;
+  final List<Selector> selectors;
 
-  SelectorGroup(this._selectors, Span span): super(span);
+  SelectorGroup(this.selectors, Span span): super(span);
 
-  List<Selector> get selectors => _selectors;
+  SelectorGroup clone() => new SelectorGroup(selectors, span);
 
-  SelectorGroup clone() => new SelectorGroup(_selectors, span);
-
-  visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitSelectorGroup(this);
 }
 
 class Selector extends TreeNode {
-  final List<SimpleSelectorSequence> _simpleSelectorSequences;
+  final List<SimpleSelectorSequence> simpleSelectorSequences;
 
-  Selector(this._simpleSelectorSequences, Span span) : super(span);
+  Selector(this.simpleSelectorSequences, Span span) : super(span);
 
-  List<SimpleSelectorSequence> get simpleSelectorSequences =>
-      _simpleSelectorSequences;
+  void add(SimpleSelectorSequence seq) => simpleSelectorSequences.add(seq);
 
-  add(SimpleSelectorSequence seq) => _simpleSelectorSequences.add(seq);
-
-  int get length => _simpleSelectorSequences.length;
+  int get length => simpleSelectorSequences.length;
 
   Selector clone() {
-    var simpleSequences = [];
-    for (var simpleSeq in simpleSelectorSequences) {
-      simpleSequences.add(simpleSeq.clone());
-    }
+    var simpleSequences = simpleSelectorSequences
+        .map((ss) => ss.clone())
+        .toList();
+
     return new Selector(simpleSequences, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitSelector(this);
 }
 
 class SimpleSelectorSequence extends TreeNode {
   /** +, >, ~, NONE */
   int combinator;
-  final SimpleSelector _selector;
+  final SimpleSelector simpleSelector;
 
-  SimpleSelectorSequence(this._selector, Span span,
+  SimpleSelectorSequence(this.simpleSelector, Span span,
       [int combinator = TokenKind.COMBINATOR_NONE])
       : combinator = combinator, super(span);
 
-  get simpleSelector => _selector;
-
   bool get isCombinatorNone => combinator == TokenKind.COMBINATOR_NONE;
   bool get isCombinatorPlus => combinator == TokenKind.COMBINATOR_PLUS;
   bool get isCombinatorGreater => combinator == TokenKind.COMBINATOR_GREATER;
@@ -114,16 +107,16 @@
                   isCombinatorTilde ? ' ~ ' : '';
 
   SimpleSelectorSequence clone() =>
-      new SimpleSelectorSequence(_selector, span, combinator);
+      new SimpleSelectorSequence(simpleSelector, span, combinator);
 
-  visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
+  void visit(VisitorBase visitor) => visitor.visitSimpleSelectorSequence(this);
 }
 
 /* All other selectors (element, #id, .class, attribute, pseudo, negation,
  * namespace, *) are derived from this selector.
  */
 class SimpleSelector extends TreeNode {
-  final _name;
+  final _name; // Wildcard, ThisOperator, Identifier, others?
 
   SimpleSelector(this._name, Span span) : super(span);
 
@@ -136,7 +129,7 @@
 
   SimpleSelector clone() => new SimpleSelector(_name, span);
 
-  visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitSimpleSelector(this);
 }
 
 // element name
@@ -319,7 +312,7 @@
 
   NegationSelector clone() => new NegationSelector(negationArg, span);
 
-  visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
+  void visit(VisitorBase visitor) => visitor.visitNegationSelector(this);
 }
 
 class NoOp extends TreeNode {
@@ -334,7 +327,7 @@
   /**
    * Contains charset, ruleset, directives (media, page, etc.), and selectors.
    */
-  final topLevels;
+  final List<TreeNode> topLevels;
 
   StyleSheet(this.topLevels, Span span) : super(span) {
     for (final node in topLevels) {
@@ -346,12 +339,11 @@
   StyleSheet.selector(this.topLevels, Span span) : super(span);
 
   StyleSheet clone() {
-    var clonedTopLevels = [];
-    clonedTopLevels.add(topLevels.clone());
+    var clonedTopLevels = topLevels.map((e) => e.clone()).toList();
     return new StyleSheet(clonedTopLevels, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
+  void visit(VisitorBase visitor) => visitor.visitStyleSheet(this);
 }
 
 class TopLevelProduction extends TreeNode {
@@ -385,7 +377,7 @@
   bool get isExtension => false;    // SCSS extension?
 
   Directive clone() => new Directive(span);
-  visit(VisitorBase visitor) => visitor.visitDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitDirective(this);
 }
 
 class ImportDirective extends Directive {
@@ -405,7 +397,7 @@
     return new ImportDirective(import, cloneMediaQueries, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitImportDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitImportDirective(this);
 }
 
 /**
@@ -427,7 +419,7 @@
     return new MediaExpression(andOperator, _mediaFeature, clonedExprs, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitMediaExpression(this);
 }
 
 /**
@@ -468,8 +460,8 @@
 }
 
 class MediaDirective extends Directive {
-  List<MediaQuery> mediaQueries;
-  List<RuleSet> rulesets;
+  final List<MediaQuery> mediaQueries;
+  final List<RuleSet> rulesets;
 
   MediaDirective(this.mediaQueries, this.rulesets, Span span) : super(span);
 
@@ -484,11 +476,12 @@
     }
     return new MediaDirective(cloneQueries, cloneRulesets, span);
   }
-  visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitMediaDirective(this);
 }
 
 class HostDirective extends Directive {
-  List<RuleSet> rulesets;
+  final List<RuleSet> rulesets;
 
   HostDirective(this.rulesets, Span span) : super(span);
 
@@ -499,13 +492,14 @@
     }
     return new HostDirective(cloneRulesets, span);
   }
-  visit(VisitorBase visitor) => visitor.visitHostDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitHostDirective(this);
 }
 
 class PageDirective extends Directive {
   final String _ident;
   final String _pseudoPage;
-  List<DeclarationGroup> _declsMargin;
+  final List<DeclarationGroup> _declsMargin;
 
   PageDirective(this._ident, this._pseudoPage, this._declsMargin,
       Span span) : super(span);
@@ -517,7 +511,8 @@
     }
     return new PageDirective(_ident, _pseudoPage, cloneDeclsMargin, span);
   }
-  visit(VisitorBase visitor) => visitor.visitPageDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitPageDirective(this);
 
   bool get hasIdent => _ident != null && _ident.length > 0;
   bool get hasPseudoPage => _pseudoPage != null && _pseudoPage.length > 0;
@@ -528,7 +523,7 @@
 
   CharsetDirective(this.charEncoding, Span span) : super(span);
   CharsetDirective clone() => new CharsetDirective(charEncoding, span);
-  visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitCharsetDirective(this);
 }
 
 class KeyFrameDirective extends Directive {
@@ -536,10 +531,10 @@
    * Either @keyframe or keyframe prefixed with @-webkit-, @-moz-, @-ms-, @-o-.
    */
   final int _keyframeName;
-  final _name;
+  final name;
   final List<KeyFrameBlock> _blocks;
 
-  KeyFrameDirective(this._keyframeName, this._name, Span span)
+  KeyFrameDirective(this._keyframeName, this.name, Span span)
       : _blocks = [], super(span);
 
   add(KeyFrameBlock block) {
@@ -557,8 +552,6 @@
     }
   }
 
-  String get name => _name;
-
   KeyFrameDirective clone() {
     var cloneBlocks = [];
     for (var block in _blocks) {
@@ -566,7 +559,7 @@
     }
     return new KeyFrameDirective(_keyframeName, cloneBlocks, span);
   }
-  visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitKeyFrameDirective(this);
 }
 
 class KeyFrameBlock extends Expression {
@@ -578,7 +571,7 @@
 
   KeyFrameBlock clone() =>
       new KeyFrameBlock(_blockSelectors.clone(), _declarations.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
+  void visit(VisitorBase visitor) => visitor.visitKeyFrameBlock(this);
 }
 
 class FontFaceDirective extends Directive {
@@ -588,7 +581,7 @@
 
   FontFaceDirective clone() =>
       new FontFaceDirective(_declarations.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitFontFaceDirective(this);
 }
 
 class StyletDirective extends Directive {
@@ -610,7 +603,7 @@
     }
     return new StyletDirective(_dartClassName, cloneRulesets, span);
   }
-  visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitStyletDirective(this);
 }
 
 class NamespaceDirective extends Directive {
@@ -623,7 +616,7 @@
   NamespaceDirective(this._prefix, this._uri, Span span) : super(span);
 
   NamespaceDirective clone() => new NamespaceDirective(_prefix, _uri, span);
-  visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitNamespaceDirective(this);
 
   String get prefix => _prefix.length > 0 ? '$_prefix ' : '';
 }
@@ -636,7 +629,7 @@
 
   VarDefinitionDirective clone() =>
       new VarDefinitionDirective(def.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitVarDefinitionDirective(this);
 }
 
 class MixinDefinition extends Directive {
@@ -654,7 +647,7 @@
     }
     return new MixinDefinition(name, cloneDefinedArgs, varArgs, span);
   }
-  visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
+  void visit(VisitorBase visitor) => visitor.visitMixinDefinition(this);
 }
 
 /** Support a Sass @mixin. See http://sass-lang.com for description. */
@@ -677,7 +670,7 @@
     return new MixinRulesetDirective(name, clonedArgs, varArgs, clonedRulesets,
         span);
   }
-  visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitMixinRulesetDirective(this);
 }
 
 class MixinDeclarationDirective extends MixinDefinition {
@@ -694,7 +687,7 @@
     return new MixinDeclarationDirective(name, clonedArgs, varArgs,
         declarations.clone(), span);
   }
-  visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitMixinDeclarationDirective(this);
 }
 
 /** To support consuming a SASS mixin @include. */
@@ -713,21 +706,22 @@
     }
     return new IncludeDirective(name, cloneArgs, span);
   }
-  visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
+
+  void visit(VisitorBase visitor) => visitor.visitIncludeDirective(this);
 }
 
 /** To support SASS @content. */
 class ContentDirective extends Directive {
   ContentDirective(Span span) : super(span);
 
-  visit(VisitorBase visitor) => visitor.visitContentDirective(this);
+  void visit(VisitorBase visitor) => visitor.visitContentDirective(this);
 }
 
 class Declaration extends TreeNode {
   final Identifier _property;
   final Expression _expression;
   /** Style exposed to Dart. */
-  var _dart;
+  dynamic _dart;
   final bool important;
 
   /**
@@ -756,7 +750,8 @@
   Declaration clone() =>
       new Declaration(_property.clone(), _expression.clone(), _dart, span,
       important: important);
-  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
@@ -778,7 +773,7 @@
   VarDefinition clone() =>
       new VarDefinition(_property.clone(),
       expression != null ? expression.clone() : null, span);
-  visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
+  void visit(VisitorBase visitor) => visitor.visitVarDefinition(this);
 }
 
 /**
@@ -796,7 +791,9 @@
 
   IncludeMixinAtDeclaration clone() =>
       new IncludeMixinAtDeclaration(include.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitIncludeMixinAtDeclaration(this);
+
+  void visit(VisitorBase visitor) =>
+      visitor.visitIncludeMixinAtDeclaration(this);
 }
 
 class ExtendDeclaration extends Declaration {
@@ -813,7 +810,7 @@
     return new ExtendDeclaration(newSelector, span);
   }
 
-  visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
+  void visit(VisitorBase visitor) => visitor.visitExtendDeclaration(this);
 }
 
 class DeclarationGroup extends TreeNode {
@@ -831,7 +828,8 @@
     }
     return new DeclarationGroup(clonedDecls, span);
   }
-  visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
+
+  void visit(VisitorBase visitor) => visitor.visitDeclarationGroup(this);
 }
 
 class MarginGroup extends DeclarationGroup {
@@ -841,7 +839,7 @@
       : super(decls, span);
   MarginGroup clone() =>
     new MarginGroup(margin_sym, super.clone() as dynamic, span);
-  visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
+  void visit(VisitorBase visitor) => visitor.visitMarginGroup(this);
 }
 
 class VarUsage extends Expression {
@@ -853,35 +851,36 @@
   VarUsage clone() {
     var clonedValues = [];
     for (var expr in defaultValues) {
-      clonedValues.addd(expr.clone());
+      clonedValues.add(expr.clone());
     }
     return new VarUsage(name, clonedValues, span);
   }
-  visit(VisitorBase visitor) => visitor.visitVarUsage(this);
+
+  void visit(VisitorBase visitor) => visitor.visitVarUsage(this);
 }
 
 class OperatorSlash extends Expression {
   OperatorSlash(Span span) : super(span);
   OperatorSlash clone() => new OperatorSlash(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorSlash(this);
 }
 
 class OperatorComma extends Expression {
   OperatorComma(Span span) : super(span);
   OperatorComma clone() => new OperatorComma(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorComma(this);
 }
 
 class OperatorPlus extends Expression {
   OperatorPlus(Span span) : super(span);
   OperatorPlus clone() => new OperatorPlus(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorPlus(this);
 }
 
 class OperatorMinus extends Expression {
   OperatorMinus(Span span) : super(span);
   OperatorMinus clone() => new OperatorMinus(span);
-  visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
+  void visit(VisitorBase visitor) => visitor.visitOperatorMinus(this);
 }
 
 class UnicodeRangeTerm extends Expression {
@@ -894,27 +893,27 @@
 
   UnicodeRangeTerm clone() => new UnicodeRangeTerm(first, second, span);
 
-  visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUnicodeRangeTerm(this);
 }
 
 class LiteralTerm extends Expression {
   // TODO(terry): value and text fields can be made final once all CSS resources
   //              are copied/symlink'd in the build tool and UriVisitor in
   //              web_ui is removed.
-  var value;
+  dynamic value;
   String text;
 
   LiteralTerm(this.value, this.text, Span span) : super(span);
 
   LiteralTerm clone() => new LiteralTerm(value, text, span);
 
-  visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitLiteralTerm(this);
 }
 
 class NumberTerm extends LiteralTerm {
   NumberTerm(value, String t, Span span) : super(value, t, span);
   NumberTerm clone() => new NumberTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitNumberTerm(this);
 }
 
 class UnitTerm extends LiteralTerm {
@@ -926,7 +925,7 @@
 
   UnitTerm clone() => new UnitTerm(value, text, span, _unit);
 
-  visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUnitTerm(this);
 
   String unitToString() => TokenKind.unitToString(_unit);
 
@@ -944,25 +943,25 @@
         this._unit == TokenKind.UNIT_LENGTH_PC);
   }
   LengthTerm clone() => new LengthTerm(value, text, span, _unit);
-  visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitLengthTerm(this);
 }
 
 class PercentageTerm extends LiteralTerm {
   PercentageTerm(value, String t, Span span) : super(value, t, span);
   PercentageTerm clone() => new PercentageTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitPercentageTerm(this);
 }
 
 class EmTerm extends LiteralTerm {
   EmTerm(value, String t, Span span) : super(value, t, span);
   EmTerm clone() => new EmTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitEmTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitEmTerm(this);
 }
 
 class ExTerm extends LiteralTerm {
   ExTerm(value, String t, Span span) : super(value, t, span);
   ExTerm clone() => new ExTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitExTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitExTerm(this);
 }
 
 class AngleTerm extends UnitTerm {
@@ -975,7 +974,7 @@
   }
 
   AngleTerm clone() => new AngleTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitAngleTerm(this);
 }
 
 class TimeTerm extends UnitTerm {
@@ -987,7 +986,7 @@
   }
 
   TimeTerm clone() => new TimeTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitTimeTerm(this);
 }
 
 class FreqTerm extends UnitTerm {
@@ -997,21 +996,21 @@
   }
 
   FreqTerm clone() => new FreqTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFreqTerm(this);
 }
 
 class FractionTerm extends LiteralTerm {
   FractionTerm(var value, String t, Span span) : super(value, t, span);
 
   FractionTerm clone() => new FractionTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFractionTerm(this);
 }
 
 class UriTerm extends LiteralTerm {
   UriTerm(String value, Span span) : super(value, value, span);
 
   UriTerm clone() => new UriTerm(value, span);
-  visit(VisitorBase visitor) => visitor.visitUriTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitUriTerm(this);
 }
 
 class ResolutionTerm extends UnitTerm {
@@ -1023,7 +1022,7 @@
   }
 
   ResolutionTerm clone() => new ResolutionTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitResolutionTerm(this);
 }
 
 class ChTerm extends UnitTerm {
@@ -1033,7 +1032,7 @@
   }
 
   ChTerm clone() => new ChTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitChTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitChTerm(this);
 }
 
 class RemTerm extends UnitTerm {
@@ -1043,7 +1042,7 @@
   }
 
   RemTerm clone() => new RemTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitRemTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitRemTerm(this);
 }
 
 class ViewportTerm extends UnitTerm {
@@ -1056,7 +1055,7 @@
   }
 
   ViewportTerm clone() => new ViewportTerm(value, text, span, unit);
-  visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitViewportTerm(this);
 }
 
 /** Type to signal a bad hex value for HexColorTerm.value. */
@@ -1066,7 +1065,7 @@
   HexColorTerm(var value, String t, Span span) : super(value, t, span);
 
   HexColorTerm clone() => new HexColorTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitHexColorTerm(this);
 }
 
 class FunctionTerm extends LiteralTerm {
@@ -1076,7 +1075,7 @@
       : super(value, t, span);
 
   FunctionTerm clone() => new FunctionTerm(value, text, _params.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitFunctionTerm(this);
 }
 
 /**
@@ -1087,7 +1086,7 @@
 class IE8Term extends LiteralTerm {
   IE8Term(Span span) : super('\\9', '\\9', span);
   IE8Term clone() => new IE8Term(span);
-  visit(VisitorBase visitor) => visitor.visitIE8Term(this);
+  void visit(VisitorBase visitor) => visitor.visitIE8Term(this);
 }
 
 class GroupTerm extends Expression {
@@ -1100,14 +1099,14 @@
   }
 
   GroupTerm clone() => new GroupTerm(span);
-  visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitGroupTerm(this);
 }
 
 class ItemTerm extends NumberTerm {
   ItemTerm(var value, String t, Span span) : super(value, t, span);
 
   ItemTerm clone() => new ItemTerm(value, text, span);
-  visit(VisitorBase visitor) => visitor.visitItemTerm(this);
+  void visit(VisitorBase visitor) => visitor.visitItemTerm(this);
 }
 
 class Expressions extends Expression {
@@ -1126,7 +1125,7 @@
     }
     return clonedExprs;
   }
-  visit(VisitorBase visitor) => visitor.visitExpressions(this);
+  void visit(VisitorBase visitor) => visitor.visitExpressions(this);
 }
 
 class BinaryExpression extends Expression {
@@ -1138,7 +1137,7 @@
 
   BinaryExpression clone() =>
       new BinaryExpression(op, x.clone(), y.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBinaryExpression(this);
 }
 
 class UnaryExpression extends Expression {
@@ -1148,7 +1147,7 @@
   UnaryExpression(this.op, this.self, Span span): super(span);
 
   UnaryExpression clone() => new UnaryExpression(op, self.clone(), span);
-  visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitUnaryExpression(this);
 }
 
 abstract class DartStyleExpression extends TreeNode {
@@ -1183,14 +1182,14 @@
 
   bool isSame(DartStyleExpression other) => this._styleType == other._styleType;
 
-  visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitDartStyleExpression(this);
 }
 
 class FontExpression extends DartStyleExpression {
   Font font;
 
   //   font-style font-variant font-weight font-size/line-height font-family
-  FontExpression(Span span, {var size, List<String>family,
+  FontExpression(Span span, {dynamic size, List<String>family,
       int weight, String style, String variant, LineHeight lineHeight})
       : super(DartStyleExpression.fontStyle, span) {
     // TODO(terry): Only px/pt for now need to handle all possible units to
@@ -1224,7 +1223,7 @@
         weight: font.weight, style: font.style, variant: font.variant,
         lineHeight: font.lineHeight);
 
-  visit(VisitorBase visitor) => visitor.visitFontExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitFontExpression(this);
 }
 
 abstract class BoxExpression extends DartStyleExpression {
@@ -1240,7 +1239,7 @@
    */
   merged(BoxExpression newDartExpr);
 
-  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 &&
@@ -1288,7 +1287,7 @@
       new MarginExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
 
-  visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitMarginExpression(this);
 }
 
 class BorderExpression extends BoxExpression {
@@ -1324,7 +1323,7 @@
       new BorderExpression(span, top: box.top, right: box.right,
       bottom: box.bottom, left: box.left);
 
-  visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
+  void visit(VisitorBase visitor) => visitor.visitBorderExpression(this);
 }
 
 class HeightExpression extends DartStyleExpression {
diff --git a/lib/src/tree_base.dart b/lib/src/tree_base.dart
index 29b955d..e61a06c 100644
--- a/lib/src/tree_base.dart
+++ b/lib/src/tree_base.dart
@@ -9,14 +9,14 @@
  */
 abstract class TreeNode {
   /** The source code this [TreeNode] represents. */
-  Span span;
+  final Span span;
 
-  TreeNode(this.span) {}
+  TreeNode(this.span);
 
   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() {
@@ -36,7 +36,7 @@
 class TreeOutput {
   int depth = 0;
   final StringBuffer buf = new StringBuffer();
-  var printer;
+  VisitorBase printer;
 
   void write(String s) {
     for (int i=0; i < depth; i++) {
@@ -77,7 +77,7 @@
     writeln('${label}: ${v}');
   }
 
-  void writeList(String label, List list) {
+  void writeList(String label, List<TreeNode> list) {
     write('${label}: ');
     if (list == null) {
       buf.write('null');
@@ -91,7 +91,7 @@
     }
   }
 
-  void writeNodeList(String label, List list) {
+  void writeNodeList(String label, List<TreeNode> list) {
     writeln('${label} [');
     if (list != null) {
       depth += 1;
diff --git a/lib/src/tree_printer.dart b/lib/src/tree_printer.dart
index 3dc2afd..8c39476 100644
--- a/lib/src/tree_printer.dart
+++ b/lib/src/tree_printer.dart
@@ -7,7 +7,7 @@
 // TODO(terry): Enable class for debug only; when conditional imports enabled.
 
 /** Helper function to dump the CSS AST. */
-String treeToDebugString(styleSheet, [bool useSpan = false]) {
+String treeToDebugString(StyleSheet styleSheet, [bool useSpan = false]) {
   var to = new TreeOutput();
   new _TreePrinter(to, useSpan)..visitTree(styleSheet);
   return to.toString();
@@ -15,11 +15,11 @@
 
 /** Tree dump for debug output of the CSS AST. */
 class _TreePrinter extends Visitor {
-  var output;
+  final TreeOutput output;
   final bool useSpan;
   _TreePrinter(this.output, this.useSpan) { output.printer = this; }
 
-  void visitTree(tree) => visitStylesheet(tree);
+  void visitTree(StyleSheet tree) => visitStylesheet(tree);
 
   void heading(String heading, node) {
     if (useSpan) {
@@ -66,7 +66,7 @@
   }
 
   void visitMediaQueries(MediaQuery query) {
-    output.headeing('MediaQueries');
+    output.heading('MediaQueries');
     output.writeValue('unary', query.unary);
     output.writeValue('media type', query.mediaType);
     output.writeNodeList('media expressions', query.expressions);
@@ -111,7 +111,7 @@
     heading('KeyFrameDirective', node);
     output.depth++;
     output.writeValue('keyframe', node.keyFrameName);
-    output.writeValue('name', node._name);
+    output.writeValue('name', node.name);
     output.writeNodeList('blocks', node._blocks);
     output.depth--;
   }
@@ -244,7 +244,7 @@
     heading('Selector', node);
     output.depth++;
     output.writeNodeList('simpleSelectorsSequences',
-        node._simpleSelectorSequences);
+        node.simpleSelectorSequences);
     output.depth--;
   }
 
diff --git a/lib/src/validate.dart b/lib/src/validate.dart
index d2301d7..d85c341 100644
--- a/lib/src/validate.dart
+++ b/lib/src/validate.dart
@@ -4,7 +4,6 @@
 
 library csslib.src.validate;
 
-import 'package:csslib/parser.dart';
 import 'package:csslib/visitor.dart';
 import 'package:source_maps/span.dart' show Span;
 
diff --git a/lib/visitor.dart b/lib/visitor.dart
index 91fa714..3b20a4e 100644
--- a/lib/visitor.dart
+++ b/lib/visitor.dart
@@ -180,7 +180,7 @@
   }
 
   void visitKeyFrameDirective(KeyFrameDirective node) {
-    visitIdentifier(node._name);
+    visitIdentifier(node.name);
     _visitNodeList(node._blocks);
   }
 
@@ -258,11 +258,11 @@
   }
 
   void visitSelector(Selector node) {
-    _visitNodeList(node._simpleSelectorSequences);
+    _visitNodeList(node.simpleSelectorSequences);
   }
 
   void visitSimpleSelectorSequence(SimpleSelectorSequence node) {
-    var selector = node._selector;
+    var selector = node.simpleSelector;
     if (selector is NamespaceSelector) {
       visitNamespaceSelector(selector);
     } else if (selector is ElementSelector) {
diff --git a/test/debug_test.dart b/test/debug_test.dart
new file mode 100644
index 0000000..6cfea56
--- /dev/null
+++ b/test/debug_test.dart
@@ -0,0 +1,30 @@
+library debug;
+
+import 'package:unittest/unittest.dart';
+import 'testing.dart';
+
+void main() {
+  test("excercise debug", () {
+    var style = parseCss(_input);
+
+    var debugValue = style.toDebugString();
+    expect(debugValue, isNotNull);
+
+    var style2 = style.clone();
+
+    expect(style2.toDebugString(), debugValue);
+  });
+}
+
+const String _input = r'''
+.foo {
+background-color: #191919;
+width: 10PX;
+height: 22mM !important;
+border-width: 20cm;
+margin-width: 33%;
+border-height: 30EM;
+width: .6in;
+length: 1.2in;
+-web-stuff: -10Px;
+}''';
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index 3d6912c..fa14ed3 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -6,8 +6,6 @@
 
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
-import 'package:csslib/parser.dart';
-import 'package:csslib/visitor.dart';
 
 
 /** CSS compiler options no checks in in memory style sheet. */
diff --git a/test/error_test.dart b/test/error_test.dart
index 98acffc..935c618 100644
--- a/test/error_test.dart
+++ b/test/error_test.dart
@@ -6,8 +6,6 @@
 
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
-import 'package:csslib/parser.dart';
-import 'package:csslib/visitor.dart';
 import 'package:csslib/src/messages.dart';
 
 /**
diff --git a/test/run_all.dart b/test/run_all.dart
index f57ff3e..36020cd 100644
--- a/test/run_all.dart
+++ b/test/run_all.dart
@@ -8,27 +8,28 @@
  */
 library run_impl;
 
-import 'dart:io';
 import 'package:unittest/compact_vm_config.dart';
 import 'testing.dart';
 
+import 'big_1_test.dart' as big_1_test;
 import 'compiler_test.dart' as compiler_test;
 import 'declaration_test.dart' as declaration_test;
-import 'var_test.dart' as var_test;
-import 'nested_test.dart' as nested_test;
+import 'debug_test.dart' as debug_test;
 import 'error_test.dart' as error_test;
-import 'selector_test.dart' as selector_test;
-import 'visitor_test.dart' as visitor_test;
-import 'mixin_test.dart' as mixin_test;
 import 'extend_test.dart' as extend_test;
-import 'big_1_test.dart' as big_1_test;
+import 'mixin_test.dart' as mixin_test;
+import 'nested_test.dart' as nested_test;
+import 'selector_test.dart' as selector_test;
+import 'var_test.dart' as var_test;
+import 'visitor_test.dart' as visitor_test;
 
-main(List<String> arguments) {
+void main(List<String> arguments) {
   var pattern = new RegExp(arguments.length > 0 ? arguments[0] : '.');
 
   useCompactVMConfiguration();
   useMockMessages();
 
+  if (pattern.hasMatch('debug_test.dart')) debug_test.main();
   if (pattern.hasMatch('compiler_test.dart')) compiler_test.main();
   if (pattern.hasMatch('declaration_test.dart')) declaration_test.main();
   if (pattern.hasMatch('var_test.dart')) var_test.main();
diff --git a/test/selector_test.dart b/test/selector_test.dart
index ad015bb..f87136e 100644
--- a/test/selector_test.dart
+++ b/test/selector_test.dart
@@ -7,7 +7,6 @@
 import 'package:unittest/unittest.dart';
 import 'testing.dart';
 import 'package:csslib/parser.dart';
-import 'package:csslib/visitor.dart';
 
 void testSelectorSuccesses() {
   var errors = [];
diff --git a/test/testing.dart b/test/testing.dart
index f15805c..168a4e5 100644
--- a/test/testing.dart
+++ b/test/testing.dart
@@ -9,7 +9,7 @@
 import 'package:csslib/visitor.dart';
 import 'package:csslib/src/messages.dart';
 
-useMockMessages() {
+void useMockMessages() {
   messages = new Messages(printHandler: (message) {});
 }
 
@@ -37,10 +37,10 @@
     compileCss(input, errors: errors, polyfill: true, opts: opts);
 
 /** CSS emitter walks the style sheet tree and emits readable CSS. */
-var _emitCss = new CssPrinter();
+final _emitCss = new CssPrinter();
 
 /** Simple Visitor does nothing but walk tree. */
-var _cssVisitor = new Visitor();
+final _cssVisitor = new Visitor();
 
 /** Pretty printer for CSS. */
 String prettyPrint(StyleSheet ss) {
@@ -65,5 +65,3 @@
 }
 
 String dumpTree(StyleSheet ss) => treeToDebugString(ss);
-
-
diff --git a/test/visitor_test.dart b/test/visitor_test.dart
index 7fcde97..451b687 100644
--- a/test/visitor_test.dart
+++ b/test/visitor_test.dart
@@ -5,7 +5,6 @@
 library visitor_test;
 
 import 'package:unittest/unittest.dart';
-import 'package:csslib/parser.dart';
 import 'package:csslib/visitor.dart';
 import 'testing.dart';