Index: dart/site/try/poi/diff.dart |
diff --git a/dart/site/try/poi/diff.dart b/dart/site/try/poi/diff.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a2e17eb420156146bf4600b96cd7d64d4d8fe94e |
--- /dev/null |
+++ b/dart/site/try/poi/diff.dart |
@@ -0,0 +1,134 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library trydart.poi.diff; |
+ |
+import 'dart:async' show |
+ Completer, |
+ Future, |
+ Stream; |
+ |
+import 'dart:convert' show |
+ LineSplitter, |
+ UTF8; |
+ |
+import 'package:compiler/compiler.dart' as api; |
+ |
+import 'package:compiler/implementation/dart2jslib.dart' show |
+ Compiler, |
+ Enqueuer, |
+ QueueFilter, |
+ Script, |
+ WorkItem; |
+ |
+import 'package:compiler/implementation/elements/visitor.dart' show |
+ ElementVisitor; |
+ |
+import 'package:compiler/implementation/elements/elements.dart' show |
+ AbstractFieldElement, |
+ ClassElement, |
+ CompilationUnitElement, |
+ Element, |
+ ElementCategory, |
+ FunctionElement, |
+ LibraryElement, |
+ ScopeContainerElement; |
+ |
+import 'package:compiler/implementation/elements/modelx.dart' as modelx; |
+ |
+import 'package:compiler/implementation/dart_types.dart' show |
+ DartType; |
+ |
+import 'package:compiler/implementation/scanner/scannerlib.dart' show |
+ EOF_TOKEN, |
+ ErrorToken, |
+ IDENTIFIER_TOKEN, |
+ KEYWORD_TOKEN, |
+ PartialClassElement, |
+ PartialElement, |
+ Token; |
+ |
+import 'package:compiler/implementation/source_file.dart' show |
+ StringSourceFile; |
+ |
+class Difference { |
+ final Element before; |
+ final Element after; |
+ Token token; |
+ |
+ Difference(this.before, this.after); |
+ |
+ String toString() { |
+ if (before == null) return 'Added($after)'; |
+ if (after == null) return 'Removed($before)'; |
+ return 'Modified($after -> $before)'; |
+ } |
+} |
+ |
+List<Difference> computeDifference( |
+ ScopeContainerElement before, |
+ ScopeContainerElement after) { |
+ Map<String, Element> beforeMap = <String, Element>{}; |
+ before.forEachLocalMember((Element element) { |
+ beforeMap[element.name] = element; |
+ }); |
+ List<Difference> modifications = <Difference>[]; |
+ List<Difference> potentiallyChanged = <Difference>[]; |
+ after.forEachLocalMember((Element element) { |
+ Element existing = beforeMap.remove(element.name); |
+ if (existing == null) { |
+ modifications.add(new Difference(null, element)); |
+ } else { |
+ potentiallyChanged.add(new Difference(existing, element)); |
+ } |
+ }); |
+ |
+ modifications.addAll( |
+ beforeMap.values.map((Element element) => new Difference(element, null))); |
+ |
+ modifications.addAll( |
+ potentiallyChanged.where(areDifferentElements)); |
+ |
+ return modifications; |
+} |
+ |
+bool areDifferentElements(Difference diff) { |
+ Element beforeElement = diff.before; |
+ Element afterElement = diff.after; |
+ var before = (beforeElement is modelx.VariableElementX) |
+ ? beforeElement.variables : beforeElement; |
+ var after = (afterElement is modelx.VariableElementX) |
+ ? afterElement.variables : afterElement; |
+ if (before is PartialElement && after is PartialElement) { |
+ Token beforeToken = before.beginToken; |
+ Token afterToken = after.beginToken; |
+ Token stop = before.endToken; |
+ int beforeKind = beforeToken.kind; |
+ int afterKind = afterToken.kind; |
+ while (beforeKind != EOF_TOKEN && afterKind != EOF_TOKEN) { |
+ |
+ if (beforeKind != afterKind) { |
+ diff.token = afterToken; |
+ return true; |
+ } |
+ |
+ if (beforeToken is! ErrorToken && afterToken is! ErrorToken) { |
+ if (beforeToken.value != afterToken.value) { |
+ diff.token = afterToken; |
+ return true; |
+ } |
+ } |
+ |
+ if (beforeToken == stop) return false; |
+ |
+ beforeToken = beforeToken.next; |
+ afterToken = afterToken.next; |
+ beforeKind = beforeToken.kind; |
+ afterKind = afterToken.kind; |
+ } |
+ return beforeKind != afterKind; |
+ } |
+ print("$before isn't a PartialElement"); |
+ return true; |
+} |