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

Unified Diff: pkg/analyzer/test/src/context/context_test.dart

Issue 1633233002: Stop creating duplicate enum members when the element model has already been built (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 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
« pkg/analyzer/lib/src/task/dart.dart ('K') | « pkg/analyzer/lib/src/task/dart.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/test/src/context/context_test.dart
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index 510c5711c2a9723a7d3f26de398d1f0ce88d1702..d37179a9449a67d5176e8bc41a4b3b93b6cc95b5 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -5,10 +5,12 @@
library analyzer.test.src.context.context_test;
import 'dart:async';
+import 'dart:collection';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/visitor.dart';
import 'package:analyzer/file_system/memory_file_system.dart';
import 'package:analyzer/source/package_map_resolver.dart';
import 'package:analyzer/src/cancelable_future.dart';
@@ -2002,6 +2004,72 @@ import 'package:crypto/crypto.dart';
_assertNoExceptions();
}
+ void test_resolveCompilationUnit_existingElementModel() {
+ Source source = addSource(
+ '/test.dart',
+ r'''
+library test;
+
+String topLevelVariable;
+int get topLevelGetter => 0;
+void set topLevelSetter(int value) {}
+String topLevelFunction(int i) => '';
+
+typedef String FunctionTypeAlias(int i);
+
+enum EnumeratedType {Invalid, Valid}
+
+class ClassOne {
+ int instanceField;
+ static int staticField;
+
+ ClassOne();
+ ClassOne.named();
+
+ int get instanceGetter => 0;
+ static String get staticGetter => '';
+
+ void set instanceSetter(int value) {}
+ static void set staticSetter(int value) {}
+
+ int instanceMethod(int first, [int second = 0]) {
+ int localVariable;
+ int localFunction(String s) {}
+ }
+ static String staticMethod(int first, {int second: 0}) => '';
+}
+
+class ClassTwo {
+ // Implicit no-argument constructor
+}
+''');
+ context.resolveCompilationUnit2(source, source);
+ LibraryElement firstElement = context.computeLibraryElement(source);
+ _ElementGatherer gatherer = new _ElementGatherer();
+ firstElement.accept(gatherer);
+
+ CacheEntry entry =
+ context.analysisCache.get(new LibrarySpecificUnit(source, source));
+ entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT6, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT7, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT9, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT10, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT11, CacheState.FLUSHED);
+ entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
+
+ context.resolveCompilationUnit2(source, source);
+ LibraryElement secondElement = context.computeLibraryElement(source);
+ _ElementComparer comparer = new _ElementComparer(gatherer.elements);
+ secondElement.accept(comparer);
+ comparer.expectNoDifferences();
+ }
+
void test_resolveCompilationUnit_import_relative() {
Source sourceA =
addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
@@ -2731,3 +2799,82 @@ class _AnalysisContextImplTest_test_applyChanges_removeContainer
@override
bool contains(Source source) => source == libB;
}
+
+/**
+ * A visitor that can be used to compare all of the elements in an element model
+ * with a previously created map of elements. The class [ElementGatherer] can be
+ * used to create the map of elements.
+ */
+class _ElementComparer extends GeneralizingElementVisitor {
+ /**
+ * The previously created map of elements.
+ */
+ final Map<Element, Element> previousElements;
+
+ /**
+ * The number of elements that were found to have been overwritten.
+ */
+ int overwrittenCount = 0;
+
+ /**
+ * A buffer to which a description of the overwritten elements will be written.
+ */
+ final StringBuffer buffer = new StringBuffer();
+
+ /**
+ * Initialize a newly created visitor.
+ */
+ _ElementComparer(this.previousElements);
+
+ /**
+ * Expect that no differences were found, causing the test to fail if that
+ * wasn't the case.
+ */
+ void expectNoDifferences() {
+ if (overwrittenCount > 0) {
+ fail('Found $overwrittenCount overwritten elements.$buffer');
+ }
+ }
+
+ @override
+ void visitElement(Element element) {
+ Element previousElement = previousElements[element];
+ if (!identical(previousElement, element)) {
+ if (overwrittenCount == 0) {
+ buffer.writeln();
+ }
+ overwrittenCount++;
+ buffer.writeln('Overwritten element:');
+ Element currentElement = element;
+ while (currentElement != null) {
+ buffer.write(' ');
+ buffer.writeln(currentElement.toString());
+ currentElement = currentElement.enclosingElement;
+ }
+ }
+ super.visitElement(element);
+ }
+}
+
+/**
+ * A visitor that can be used to collect all of the elements in an element
+ * model.
+ */
+class _ElementGatherer extends GeneralizingElementVisitor {
+ /**
+ * The map in which the elements are collected. The value of each key is the
+ * key itself.
+ */
+ Map<Element, Element> elements = new HashMap<Element, Element>();
+
+ /**
+ * Initialize the visitor.
+ */
+ _ElementGatherer();
+
+ @override
+ void visitElement(Element element) {
+ elements[element] = element;
+ super.visitElement(element);
+ }
+}
« pkg/analyzer/lib/src/task/dart.dart ('K') | « pkg/analyzer/lib/src/task/dart.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698