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

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

Issue 2480783003: Avoid writing to the same parts of the element model in two tasks. (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.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 7c6c668d6744c4215594d602787e14ebce7a27d9..54f5619874e1328cac1eebb63ad5b619f892368e 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -1163,6 +1163,125 @@ main() {}
expect(unit, isNotNull);
}
+ void test_flushSingleResolvedUnit_instanceField() {
+ _checkFlushSingleResolvedUnit('class C { var x = 0; }',
+ (CompilationUnitElement unitElement, String reason) {
+ expect(unitElement.types, hasLength(1), reason: reason);
+ ClassElement cls = unitElement.types[0];
+ expect(cls.fields, hasLength(1), reason: reason);
+ expect(cls.fields[0].type.toString(), 'int', reason: reason);
+ expect(cls.accessors, hasLength(2), reason: reason);
+ expect(cls.accessors[0].isGetter, isTrue, reason: reason);
+ expect(cls.accessors[0].returnType.toString(), 'int', reason: reason);
+ expect(cls.accessors[1].isSetter, isTrue, reason: reason);
+ expect(cls.accessors[1].returnType.toString(), 'void', reason: reason);
+ expect(cls.accessors[1].parameters, hasLength(1), reason: reason);
+ expect(cls.accessors[1].parameters[0].type.toString(), 'int',
+ reason: reason);
+ });
+ }
+
+ void test_flushSingleResolvedUnit_instanceGetter() {
+ _checkFlushSingleResolvedUnit(
+ '''
+abstract class B {
+ int get x;
+}
+class C extends B {
+ get x => null;
+}
+''', (CompilationUnitElement unitElement, String reason) {
+ expect(unitElement.types, hasLength(2), reason: reason);
+ ClassElement cls = unitElement.types[1];
+ expect(cls.name, 'C', reason: reason);
+ expect(cls.accessors, hasLength(1), reason: reason);
+ expect(cls.accessors[0].returnType.toString(), 'int', reason: reason);
+ expect(cls.fields, hasLength(1), reason: reason);
+ expect(cls.fields[0].type.toString(), 'int', reason: reason);
+ });
+ }
+
+ void test_flushSingleResolvedUnit_instanceMethod() {
+ _checkFlushSingleResolvedUnit(
+ '''
+abstract class B {
+ int f(String s);
+}
+class C extends B {
+ f(s) => null;
+}
+''', (CompilationUnitElement unitElement, String reason) {
+ expect(unitElement.types, hasLength(2), reason: reason);
+ ClassElement cls = unitElement.types[1];
+ expect(cls.name, 'C', reason: reason);
+ expect(cls.methods, hasLength(1), reason: reason);
+ expect(cls.methods[0].returnType.toString(), 'int', reason: reason);
+ expect(cls.methods[0].parameters, hasLength(1), reason: reason);
+ expect(cls.methods[0].parameters[0].type.toString(), 'String',
+ reason: reason);
+ });
+ }
+
+ void test_flushSingleResolvedUnit_instanceSetter() {
+ _checkFlushSingleResolvedUnit(
+ '''
+abstract class B {
+ set x(int value);
+}
+class C extends B {
+ set x(value) {}
+}
+''', (CompilationUnitElement unitElement, String reason) {
+ expect(unitElement.types, hasLength(2), reason: reason);
+ ClassElement cls = unitElement.types[1];
+ expect(cls.name, 'C', reason: reason);
+ expect(cls.accessors, hasLength(1), reason: reason);
+ expect(cls.accessors[0].returnType.toString(), 'void', reason: reason);
+ expect(cls.accessors[0].parameters, hasLength(1), reason: reason);
+ expect(cls.accessors[0].parameters[0].type.toString(), 'int',
+ reason: reason);
+ expect(cls.fields, hasLength(1), reason: reason);
+ expect(cls.fields[0].type.toString(), 'int', reason: reason);
+ });
+ }
+
+ void test_flushSingleResolvedUnit_staticField() {
+ _checkFlushSingleResolvedUnit('class C { static var x = 0; }',
+ (CompilationUnitElement unitElement, String reason) {
+ expect(unitElement.types, hasLength(1), reason: reason);
+ ClassElement cls = unitElement.types[0];
+ expect(cls.fields, hasLength(1), reason: reason);
+ expect(cls.fields[0].type.toString(), 'int', reason: reason);
+ expect(cls.accessors, hasLength(2), reason: reason);
+ expect(cls.accessors[0].isGetter, isTrue, reason: reason);
+ expect(cls.accessors[0].returnType.toString(), 'int', reason: reason);
+ expect(cls.accessors[1].isSetter, isTrue, reason: reason);
+ expect(cls.accessors[1].returnType.toString(), 'void', reason: reason);
+ expect(cls.accessors[1].parameters, hasLength(1), reason: reason);
+ expect(cls.accessors[1].parameters[0].type.toString(), 'int',
+ reason: reason);
+ });
+ }
+
+ void test_flushSingleResolvedUnit_topLevelVariable() {
+ _checkFlushSingleResolvedUnit('var x = 0;',
+ (CompilationUnitElement unitElement, String reason) {
+ expect(unitElement.topLevelVariables, hasLength(1), reason: reason);
+ expect(unitElement.topLevelVariables[0].type.toString(), 'int',
+ reason: reason);
+ expect(unitElement.accessors, hasLength(2), reason: reason);
+ expect(unitElement.accessors[0].isGetter, isTrue, reason: reason);
+ expect(unitElement.accessors[0].returnType.toString(), 'int',
+ reason: reason);
+ expect(unitElement.accessors[1].isSetter, isTrue, reason: reason);
+ expect(unitElement.accessors[1].returnType.toString(), 'void',
+ reason: reason);
+ expect(unitElement.accessors[1].parameters, hasLength(1), reason: reason);
+ expect(unitElement.accessors[1].parameters[0].type.toString(), 'int',
+ reason: reason);
+ });
+ }
+
void test_getAnalysisOptions() {
expect(context.analysisOptions, isNotNull);
}
@@ -2529,6 +2648,15 @@ void functionWithClosureAsDefaultParam([x = () => null]) {}
assertNamedElements(importedLibraries, ["dart.core", "libB"]);
}
+ void test_resolveCompilationUnit_library() {
+ Source source = addSource("/lib.dart", "library lib;");
+ LibraryElement library = context.computeLibraryElement(source);
+ CompilationUnit compilationUnit =
+ context.resolveCompilationUnit(source, library);
+ expect(compilationUnit, isNotNull);
+ expect(compilationUnit.element, isNotNull);
+ }
+
// void test_resolveCompilationUnit_sourceChangeDuringResolution() {
// _context = new _AnalysisContext_sourceChangeDuringResolution();
// AnalysisContextFactory.initContextWithCore(_context);
@@ -2540,15 +2668,6 @@ void functionWithClosureAsDefaultParam([x = () => null]) {}
// expect(_context.getLineInfo(source), isNotNull);
// }
- void test_resolveCompilationUnit_library() {
- Source source = addSource("/lib.dart", "library lib;");
- LibraryElement library = context.computeLibraryElement(source);
- CompilationUnit compilationUnit =
- context.resolveCompilationUnit(source, library);
- expect(compilationUnit, isNotNull);
- expect(compilationUnit.element, isNotNull);
- }
-
void test_resolveCompilationUnit_source() {
Source source = addSource("/lib.dart", "library lib;");
CompilationUnit compilationUnit =
@@ -2829,6 +2948,25 @@ int a = 0;''');
context.applyChanges(changeSet);
}
+ void _checkFlushSingleResolvedUnit(String code,
+ void validate(CompilationUnitElement unitElement, String reason)) {
+ prepareAnalysisContext(new AnalysisOptionsImpl()..strongMode = true);
+ String path = resourceProvider.convertPath('/test.dart');
+ Source source = resourceProvider.newFile(path, code).createSource();
+ context.applyChanges(new ChangeSet()..addedSource(source));
+ CompilationUnitElement unitElement =
+ context.resolveCompilationUnit2(source, source).element;
+ validate(unitElement, 'initial state');
+ for (ResultDescriptor<CompilationUnit> descriptor
+ in RESOLVED_UNIT_RESULTS) {
+ context.analysisCache.flush(
+ (target, result) => target.source == source && result == descriptor);
+ context.computeResult(
+ new LibrarySpecificUnit(source, source), descriptor);
+ validate(unitElement, 'after flushing $descriptor');
+ }
+ }
+
/**
* Search the given compilation unit for a class with the given name. Return the class with the
* given name, or `null` if the class cannot be found.
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698