Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: lib/src/info.dart

Issue 1245013005: fixes #259, clone ast before mutation (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: revert dependency_overrides in pubspec Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.
« no previous file with comments | « lib/src/compiler.dart ('k') | pubspec.yaml » ('j') | test/codegen/expect/sunflower/dom.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698