| Index: lib/src/info.dart
|
| diff --git a/lib/src/info.dart b/lib/src/info.dart
|
| index 8bfc909e753c1d089d4220fff25c6b3aa291046a..5da0f644c3a0694d3faef695fa4326df58da74e4 100644
|
| --- a/lib/src/info.dart
|
| +++ b/lib/src/info.dart
|
| @@ -9,6 +9,7 @@ library dev_compiler.src.info;
|
| import 'package:analyzer/src/generated/ast.dart';
|
| import 'package:analyzer/src/generated/element.dart';
|
| import 'package:analyzer/src/generated/error.dart';
|
| +import 'package:analyzer/src/generated/parser.dart';
|
|
|
| import 'package:dev_compiler/src/checker/rules.dart';
|
| import 'package:dev_compiler/src/utils.dart' as utils;
|
| @@ -53,6 +54,43 @@ class LibraryUnit {
|
| yield* parts;
|
| yield library;
|
| }
|
| +
|
| + /// Creates a clone of this library's AST.
|
| + LibraryUnit clone() {
|
| + return new LibraryUnit(
|
| + _cloneUnit(library), parts.map(_cloneUnit).toList(growable: false));
|
| + }
|
| +
|
| + static CompilationUnit _cloneUnit(CompilationUnit oldNode) {
|
| + var newNode = oldNode.accept(new _AstCloner());
|
| + ResolutionCopier.copyResolutionData(oldNode, newNode);
|
| + return newNode;
|
| + }
|
| +}
|
| +
|
| +class _AstCloner extends AstCloner {
|
| + void _cloneProperties(AstNode clone, AstNode node) {
|
| + if (clone != null) {
|
| + CoercionInfo.set(clone, CoercionInfo.get(node));
|
| + DynamicInvoke.set(clone, DynamicInvoke.get(node));
|
| + }
|
| + }
|
| +
|
| + @override
|
| + AstNode cloneNode(AstNode node) {
|
| + var clone = super.cloneNode(node);
|
| + _cloneProperties(clone, node);
|
| + return clone;
|
| + }
|
| +
|
| + @override
|
| + List cloneNodeList(List list) {
|
| + var clone = super.cloneNodeList(list);
|
| + for (int i = 0, len = list.length; i < len; i++) {
|
| + _cloneProperties(clone[i], list[i]);
|
| + }
|
| + return clone;
|
| + }
|
| }
|
|
|
| // The abstract type of coercions mapping one type to another.
|
|
|