| Index: pkg/polymer/lib/src/build/common.dart
 | 
| diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
 | 
| index bcde554030e4896273a70c5e164dc13049c62395..b1a7851b7141f07764ae3a52a7df1e167e51da8e 100644
 | 
| --- a/pkg/polymer/lib/src/build/common.dart
 | 
| +++ b/pkg/polymer/lib/src/build/common.dart
 | 
| @@ -8,6 +8,10 @@ library polymer.src.build.common;
 | 
|  import 'dart:async';
 | 
|  import 'dart:math' show min, max;
 | 
|  
 | 
| +import 'package:analyzer/src/generated/ast.dart';
 | 
| +import 'package:analyzer/src/generated/error.dart';
 | 
| +import 'package:analyzer/src/generated/parser.dart';
 | 
| +import 'package:analyzer/src/generated/scanner.dart';
 | 
|  import 'package:barback/barback.dart';
 | 
|  import 'package:html5lib/dom.dart' show Document;
 | 
|  import 'package:html5lib/parser.dart' show HtmlParser;
 | 
| @@ -101,28 +105,28 @@ abstract class PolymerTransformer {
 | 
|      });
 | 
|    }
 | 
|  
 | 
| -  /// Gets the appropriate URL to use in a [Span] to produce messages
 | 
| -  /// (e.g. warnings) for users. This will attempt to format the URL in the most
 | 
| -  /// useful way:
 | 
| -  ///
 | 
| -  /// - If the asset is within the primary package, then use the [id.path],
 | 
| -  ///   the user will know it is a file from their own code.
 | 
| -  /// - If the asset is from another package, then use [assetUrlFor], this will
 | 
| -  ///   likely be a "package:" url to the file in the other package, which is
 | 
| -  ///   enough for users to identify where the error is.
 | 
| -  String spanUrlFor(AssetId id, Transform transform) {
 | 
| -    var primaryId = transform.primaryInput.id;
 | 
| -    bool samePackage = id.package == primaryId.package;
 | 
| -    return samePackage ? id.path
 | 
| -        : assetUrlFor(id, primaryId, transform.logger, allowAssetUrl: true);
 | 
| -  }
 | 
| -
 | 
|    Future<bool> assetExists(AssetId id, Transform transform) =>
 | 
|        transform.getInput(id).then((_) => true).catchError((_) => false);
 | 
|  
 | 
|    String toString() => 'polymer ($runtimeType)';
 | 
|  }
 | 
|  
 | 
| +/// Gets the appropriate URL to use in a [Span] to produce messages
 | 
| +/// (e.g. warnings) for users. This will attempt to format the URL in the most
 | 
| +/// useful way:
 | 
| +///
 | 
| +/// - If the asset is within the primary package, then use the [id.path],
 | 
| +///   the user will know it is a file from their own code.
 | 
| +/// - If the asset is from another package, then use [assetUrlFor], this will
 | 
| +///   likely be a "package:" url to the file in the other package, which is
 | 
| +///   enough for users to identify where the error is.
 | 
| +String spanUrlFor(AssetId id, Transform transform) {
 | 
| +  var primaryId = transform.primaryInput.id;
 | 
| +  bool samePackage = id.package == primaryId.package;
 | 
| +  return samePackage ? id.path
 | 
| +      : assetUrlFor(id, primaryId, transform.logger, allowAssetUrl: true);
 | 
| +}
 | 
| +
 | 
|  /// Transformer phases which should be applied to the Polymer package.
 | 
|  List<List<Transformer>> get phasesForPolymer =>
 | 
|      [[new ObservableTransformer(['lib/src/instance.dart'])]];
 | 
| @@ -250,3 +254,19 @@ String _systemToAssetPath(String assetPath) {
 | 
|    if (path.Style.platform != path.Style.windows) return assetPath;
 | 
|    return path.posix.joinAll(path.split(assetPath));
 | 
|  }
 | 
| +
 | 
| +
 | 
| +/// Parse [code] using analyzer.
 | 
| +CompilationUnit parseCompilationUnit(String code) {
 | 
| +  var errorListener = new _ErrorCollector();
 | 
| +  var reader = new CharSequenceReader(code);
 | 
| +  var scanner = new Scanner(null, reader, errorListener);
 | 
| +  var token = scanner.tokenize();
 | 
| +  var parser = new Parser(null, errorListener);
 | 
| +  return parser.parseCompilationUnit(token);
 | 
| +}
 | 
| +
 | 
| +class _ErrorCollector extends AnalysisErrorListener {
 | 
| +  final errors = <AnalysisError>[];
 | 
| +  onError(error) => errors.add(error);
 | 
| +}
 | 
| 
 |