| 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 5230b3b0e34e4c4585fe25d1f51aa366cf875cc2..e6ecc6c12f99b7b677d8acc00f33d5bf54421a56 100644
|
| --- a/pkg/analyzer/test/src/context/context_test.dart
|
| +++ b/pkg/analyzer/test/src/context/context_test.dart
|
| @@ -35,6 +35,7 @@ import 'package:analyzer/src/generated/resolver.dart';
|
| import 'package:analyzer/src/generated/scanner.dart';
|
| import 'package:analyzer/src/generated/source.dart';
|
| import 'package:analyzer/task/dart.dart';
|
| +import 'package:html/dom.dart' show Document;
|
| import 'package:path/path.dart' as pathos;
|
| import 'package:unittest/unittest.dart';
|
| import 'package:watcher/src/utils.dart';
|
| @@ -43,7 +44,6 @@ import '../../generated/engine_test.dart';
|
| import '../../generated/test_support.dart';
|
| import '../../reflective_tests.dart';
|
| import 'abstract_context.dart';
|
| -import 'package:html/dom.dart' show Document;
|
|
|
| main() {
|
| groupSep = ' | ';
|
| @@ -61,600 +61,63 @@ class AnalysisContextImplTest extends AbstractContextTest {
|
| fail('Should have failed');
|
| }
|
|
|
| - void test_applyChanges_overriddenSource() {
|
| - // Note: addSource adds the source to the contentCache.
|
| - Source source = addSource("/test.dart", "library test;");
|
| - context.computeErrors(source);
|
| - while (!context.sourcesNeedingProcessing.isEmpty) {
|
| - context.performAnalysisTask();
|
| - }
|
| - // Adding the source as a changedSource should have no effect since
|
| - // it is already overridden in the content cache.
|
| - ChangeSet changeSet = new ChangeSet();
|
| - changeSet.changedSource(source);
|
| - context.applyChanges(changeSet);
|
| - expect(context.sourcesNeedingProcessing, hasLength(0));
|
| - }
|
| -
|
| - Future test_applyChanges_remove() {
|
| - SourcesChangedListener listener = new SourcesChangedListener();
|
| - context.onSourcesChanged.listen(listener.onData);
|
| - String libAContents = r'''
|
| -library libA;
|
| -import 'libB.dart';''';
|
| - Source libA = addSource("/libA.dart", libAContents);
|
| - String libBContents = "library libB;";
|
| - Source libB = addSource("/libB.dart", libBContents);
|
| - LibraryElement libAElement = context.computeLibraryElement(libA);
|
| - expect(libAElement, isNotNull);
|
| - List<LibraryElement> importedLibraries = libAElement.importedLibraries;
|
| - expect(importedLibraries, hasLength(2));
|
| - context.computeErrors(libA);
|
| - context.computeErrors(libB);
|
| - expect(context.sourcesNeedingProcessing, hasLength(0));
|
| - context.setContents(libB, null);
|
| - _removeSource(libB);
|
| - List<Source> sources = context.sourcesNeedingProcessing;
|
| - expect(sources, hasLength(1));
|
| - expect(sources[0], same(libA));
|
| - libAElement = context.computeLibraryElement(libA);
|
| - importedLibraries = libAElement.importedLibraries;
|
| - expect(importedLibraries, hasLength(1));
|
| - return pumpEventQueue().then((_) {
|
| - listener.assertEvent(wereSourcesAdded: true);
|
| - listener.assertEvent(wereSourcesAdded: true);
|
| - listener.assertEvent(wereSourcesRemovedOrDeleted: true);
|
| - listener.assertNoMoreEvents();
|
| - });
|
| - }
|
| -
|
| - Future test_applyChanges_removeContainer() {
|
| - SourcesChangedListener listener = new SourcesChangedListener();
|
| - context.onSourcesChanged.listen(listener.onData);
|
| - String libAContents = r'''
|
| -library libA;
|
| -import 'libB.dart';''';
|
| - Source libA = addSource("/libA.dart", libAContents);
|
| - String libBContents = "library libB;";
|
| - Source libB = addSource("/libB.dart", libBContents);
|
| - context.computeLibraryElement(libA);
|
| - context.computeErrors(libA);
|
| - context.computeErrors(libB);
|
| - expect(context.sourcesNeedingProcessing, hasLength(0));
|
| - ChangeSet changeSet = new ChangeSet();
|
| - SourceContainer removedContainer =
|
| - new _AnalysisContextImplTest_test_applyChanges_removeContainer(libB);
|
| - changeSet.removedContainer(removedContainer);
|
| - context.applyChanges(changeSet);
|
| - List<Source> sources = context.sourcesNeedingProcessing;
|
| - expect(sources, hasLength(1));
|
| - expect(sources[0], same(libA));
|
| - return pumpEventQueue().then((_) {
|
| - listener.assertEvent(wereSourcesAdded: true);
|
| - listener.assertEvent(wereSourcesAdded: true);
|
| - listener.assertEvent(wereSourcesRemovedOrDeleted: true);
|
| - listener.assertNoMoreEvents();
|
| - });
|
| - }
|
| -
|
| - void test_computeErrors_dart_none() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - List<AnalysisError> errors = context.computeErrors(source);
|
| - expect(errors, hasLength(0));
|
| - }
|
| -
|
| - void test_computeErrors_dart_part() {
|
| - Source librarySource =
|
| - addSource("/lib.dart", "library lib; part 'part.dart';");
|
| - Source partSource = addSource("/part.dart", "part of 'lib';");
|
| - context.parseCompilationUnit(librarySource);
|
| - List<AnalysisError> errors = context.computeErrors(partSource);
|
| - expect(errors, isNotNull);
|
| - expect(errors.length > 0, isTrue);
|
| - }
|
| -
|
| - void test_computeErrors_dart_some() {
|
| - Source source = addSource("/lib.dart", "library 'lib';");
|
| - List<AnalysisError> errors = context.computeErrors(source);
|
| - expect(errors, isNotNull);
|
| - expect(errors.length > 0, isTrue);
|
| - }
|
| -
|
| - void test_computeErrors_html_none() {
|
| - Source source = addSource("/test.html", "<!DOCTYPE html><html></html>");
|
| - List<AnalysisError> errors = context.computeErrors(source);
|
| - expect(errors, hasLength(0));
|
| - }
|
| -
|
| void fail_computeHtmlElement_valid() {
|
| - Source source = addSource("/test.html", "<html></html>");
|
| - HtmlElement element = context.computeHtmlElement(source);
|
| - expect(element, isNotNull);
|
| - expect(context.computeHtmlElement(source), same(element));
|
| - }
|
| -
|
| - void test_computeImportedLibraries_none() {
|
| - Source source = addSource("/test.dart", "library test;");
|
| - expect(context.computeImportedLibraries(source), hasLength(0));
|
| - }
|
| -
|
| - void test_computeImportedLibraries_some() {
|
| - Source source = addSource(
|
| - "/test.dart", "library test; import 'lib1.dart'; import 'lib2.dart';");
|
| - expect(context.computeImportedLibraries(source), hasLength(2));
|
| - }
|
| -
|
| - void fail_computeResolvableCompilationUnit_dart_exception() {
|
| - TestSource source = _addSourceWithException("/test.dart");
|
| - try {
|
| - context.computeResolvableCompilationUnit(source);
|
| - fail("Expected AnalysisException");
|
| - } on AnalysisException {
|
| - // Expected
|
| - }
|
| - }
|
| -
|
| - void fail_computeResolvableCompilationUnit_html_exception() {
|
| - Source source = addSource("/lib.html", "<html></html>");
|
| - try {
|
| - context.computeResolvableCompilationUnit(source);
|
| - fail("Expected AnalysisException");
|
| - } on AnalysisException {
|
| - // Expected
|
| - }
|
| - }
|
| -
|
| - void fail_computeResolvableCompilationUnit_valid() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - CompilationUnit parsedUnit = context.parseCompilationUnit(source);
|
| - expect(parsedUnit, isNotNull);
|
| - CompilationUnit resolvedUnit =
|
| - context.computeResolvableCompilationUnit(source);
|
| - expect(resolvedUnit, isNotNull);
|
| - expect(resolvedUnit, same(parsedUnit));
|
| - }
|
| -
|
| - Future test_computeResolvedCompilationUnitAsync_dispose() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - // Complete all pending analysis tasks and flush the AST so that it won't
|
| - // be available immediately.
|
| - _performPendingAnalysisTasks();
|
| - _flushAst(source);
|
| - bool completed = false;
|
| - CancelableFuture<CompilationUnit> future =
|
| - context.computeResolvedCompilationUnitAsync(source, source);
|
| - future.then((CompilationUnit unit) {
|
| - fail('Future should have completed with error');
|
| - }, onError: (error) {
|
| - expect(error, new isInstanceOf<AnalysisNotScheduledError>());
|
| - completed = true;
|
| - });
|
| - expect(completed, isFalse);
|
| - expect(context.pendingFutureSources_forTesting, isNotEmpty);
|
| - // Disposing of the context should cause all pending futures to complete
|
| - // with AnalysisNotScheduled, so that no clients are left hanging.
|
| - context.dispose();
|
| - expect(context.pendingFutureSources_forTesting, isEmpty);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completed, isTrue);
|
| - expect(context.pendingFutureSources_forTesting, isEmpty);
|
| - });
|
| - }
|
| -
|
| - Future test_computeResolvedCompilationUnitAsync_noCacheEntry() {
|
| - Source librarySource = addSource("/lib.dart", "library lib;");
|
| - Source partSource = addSource("/part.dart", "part of foo;");
|
| - bool completed = false;
|
| - context
|
| - .computeResolvedCompilationUnitAsync(partSource, librarySource)
|
| - .then((CompilationUnit unit) {
|
| - expect(unit, isNotNull);
|
| - completed = true;
|
| - });
|
| - return pumpEventQueue().then((_) {
|
| - expect(completed, isFalse);
|
| - _performPendingAnalysisTasks();
|
| - }).then((_) => pumpEventQueue()).then((_) {
|
| - expect(completed, isTrue);
|
| - });
|
| - }
|
| -
|
| - void fail_extractContext() {
|
| - fail("Implement this");
|
| - }
|
| -
|
| - void test_getElement_constructor_named() {
|
| - Source source = addSource("/lib.dart", r'''
|
| -class A {
|
| - A.named() {}
|
| -}''');
|
| - _analyzeAll_assertFinished();
|
| - LibraryElement library = context.computeLibraryElement(source);
|
| - ClassElement classA = _findClass(library.definingCompilationUnit, "A");
|
| - ConstructorElement constructor = classA.constructors[0];
|
| - ElementLocation location = constructor.location;
|
| - Element element = context.getElement(location);
|
| - expect(element, same(constructor));
|
| - }
|
| -
|
| - void test_getElement_constructor_unnamed() {
|
| - Source source = addSource("/lib.dart", r'''
|
| -class A {
|
| - A() {}
|
| -}''');
|
| - _analyzeAll_assertFinished();
|
| - LibraryElement library = context.computeLibraryElement(source);
|
| - ClassElement classA = _findClass(library.definingCompilationUnit, "A");
|
| - ConstructorElement constructor = classA.constructors[0];
|
| - ElementLocation location = constructor.location;
|
| - Element element = context.getElement(location);
|
| - expect(element, same(constructor));
|
| - }
|
| -
|
| - void test_getElement_enum() {
|
| - Source source = addSource('/test.dart', 'enum MyEnum {A, B, C}');
|
| - _analyzeAll_assertFinished();
|
| - LibraryElement library = context.computeLibraryElement(source);
|
| - ClassElement myEnum = library.definingCompilationUnit.getEnum('MyEnum');
|
| - ElementLocation location = myEnum.location;
|
| - Element element = context.getElement(location);
|
| - expect(element, same(myEnum));
|
| - }
|
| -
|
| - void test_getErrors_dart_none() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - var errorInfo = context.getErrors(source);
|
| - expect(errorInfo, isNotNull);
|
| - List<AnalysisError> errors = errorInfo.errors;
|
| - expect(errors, hasLength(0));
|
| - context.computeErrors(source);
|
| - errors = errorInfo.errors;
|
| - expect(errors, hasLength(0));
|
| - }
|
| -
|
| - void test_getErrors_dart_some() {
|
| - Source source = addSource("/lib.dart", "library 'lib';");
|
| - var errorInfo = context.getErrors(source);
|
| - expect(errorInfo, isNotNull);
|
| - List<AnalysisError> errors = errorInfo.errors;
|
| - expect(errors, hasLength(0));
|
| - errors = context.computeErrors(source);
|
| - expect(errors, hasLength(1));
|
| - }
|
| -
|
| - void test_getErrors_html_none() {
|
| - Source source = addSource("/test.html", "<html></html>");
|
| - AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| - expect(errorInfo, isNotNull);
|
| - List<AnalysisError> errors = errorInfo.errors;
|
| - expect(errors, hasLength(0));
|
| - context.computeErrors(source);
|
| - errors = errorInfo.errors;
|
| - expect(errors, hasLength(0));
|
| - }
|
| -
|
| - void test_getErrors_html_some() {
|
| - Source source = addSource("/test.html", r'''
|
| -<html><head>
|
| -<script type='application/dart' src='test.dart'/>
|
| -</head></html>''');
|
| - AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| - expect(errorInfo, isNotNull);
|
| - List<AnalysisError> errors = errorInfo.errors;
|
| - expect(errors, hasLength(0));
|
| - errors = context.computeErrors(source);
|
| - expect(errors, hasLength(3));
|
| - }
|
| -
|
| - void fail_getHtmlElement_html() {
|
| - Source source = addSource("/test.html", "<html></html>");
|
| - HtmlElement element = context.getHtmlElement(source);
|
| - expect(element, isNull);
|
| - context.computeHtmlElement(source);
|
| - element = context.getHtmlElement(source);
|
| - expect(element, isNotNull);
|
| - }
|
| -
|
| - void test_getHtmlFilesReferencing_library() {
|
| - Source htmlSource = addSource("/test.html", r'''
|
| -<!DOCTYPE html>
|
| -<html><head>
|
| -<script type='application/dart' src='test.dart'/>
|
| -<script type='application/dart' src='test.js'/>
|
| -</head></html>''');
|
| - Source librarySource = addSource("/test.dart", "library lib;");
|
| - context.computeLibraryElement(librarySource);
|
| - List<Source> result = context.getHtmlFilesReferencing(librarySource);
|
| - expect(result, hasLength(0));
|
| - context.computeHtmlElement(htmlSource);
|
| - result = context.getHtmlFilesReferencing(librarySource);
|
| - expect(result, hasLength(1));
|
| - expect(result[0], htmlSource);
|
| - }
|
| -
|
| - void test_getHtmlFilesReferencing_part() {
|
| - Source htmlSource = addSource("/test.html", r'''
|
| -<!DOCTYPE html>
|
| -<html><head>
|
| -<script type='application/dart' src='test.dart'/>
|
| -<script type='application/dart' src='test.js'/>
|
| -</head></html>''');
|
| - Source librarySource =
|
| - addSource("/test.dart", "library lib; part 'part.dart';");
|
| - Source partSource = addSource("/part.dart", "part of lib;");
|
| - context.computeLibraryElement(librarySource);
|
| - List<Source> result = context.getHtmlFilesReferencing(partSource);
|
| - expect(result, hasLength(0));
|
| - context.computeHtmlElement(htmlSource);
|
| - result = context.getHtmlFilesReferencing(partSource);
|
| - expect(result, hasLength(1));
|
| - expect(result[0], htmlSource);
|
| - }
|
| -
|
| - void test_getHtmlSources() {
|
| - List<Source> sources = context.htmlSources;
|
| - expect(sources, hasLength(0));
|
| - Source source = addSource("/test.html", "");
|
| - sources = context.htmlSources;
|
| - expect(sources, hasLength(1));
|
| - expect(sources[0], source);
|
| - }
|
| -
|
| - void test_getLibrariesReferencedFromHtml() {
|
| - Source htmlSource = addSource("/test.html", r'''
|
| -<!DOCTYPE html>
|
| -<html><head>
|
| -<script type='application/dart' src='test.dart'/>
|
| -<script type='application/dart' src='test.js'/>
|
| -</head></html>''');
|
| - Source librarySource = addSource("/test.dart", "library lib;");
|
| - context.computeLibraryElement(librarySource);
|
| - context.computeHtmlElement(htmlSource);
|
| - List<Source> result = context.getLibrariesReferencedFromHtml(htmlSource);
|
| - expect(result, hasLength(1));
|
| - expect(result[0], librarySource);
|
| - }
|
| -
|
| - void test_getResolvedCompilationUnit_library() {
|
| - Source source = addSource("/lib.dart", "library libb;");
|
| - LibraryElement library = context.computeLibraryElement(source);
|
| - context.computeErrors(source); // Force the resolved unit to be built.
|
| - expect(context.getResolvedCompilationUnit(source, library), isNotNull);
|
| - context.setContents(source, "library lib;");
|
| - expect(context.getResolvedCompilationUnit(source, library), isNull);
|
| - }
|
| -
|
| - void fail_getResolvedHtmlUnit() {
|
| - Source source = addSource("/test.html", "<html></html>");
|
| - expect(context.getResolvedHtmlUnit(source), isNull);
|
| - context.resolveHtmlUnit(source);
|
| - expect(context.getResolvedHtmlUnit(source), isNotNull);
|
| - }
|
| -
|
| - void fail_mergeContext() {
|
| - fail("Implement this");
|
| - }
|
| -
|
| - void test_parseDocument() {
|
| - Source source = addSource("/lib.html", "<!DOCTYPE html><html></html>");
|
| - Document unit = context.parseHtmlDocument(source);
|
| - expect(unit, isNotNull);
|
| - }
|
| -
|
| - void fail_parseHtmlUnit_noErrors() {
|
| - Source source = addSource("/lib.html", "<html></html>");
|
| - ht.HtmlUnit unit = context.parseHtmlUnit(source);
|
| - expect(unit, isNotNull);
|
| - }
|
| -
|
| - void fail_parseHtmlUnit_resolveDirectives() {
|
| - Source libSource = addSource("/lib.dart", r'''
|
| -library lib;
|
| -class ClassA {}''');
|
| - Source source = addSource("/lib.html", r'''
|
| -<!DOCTYPE html>
|
| -<html>
|
| -<head>
|
| - <script type='application/dart'>
|
| - import 'lib.dart';
|
| - ClassA v = null;
|
| - </script>
|
| -</head>
|
| -<body>
|
| -</body>
|
| -</html>''');
|
| - ht.HtmlUnit unit = context.parseHtmlUnit(source);
|
| - expect(unit, isNotNull);
|
| - // import directive should be resolved
|
| - ht.XmlTagNode htmlNode = unit.tagNodes[0];
|
| - ht.XmlTagNode headNode = htmlNode.tagNodes[0];
|
| - ht.HtmlScriptTagNode scriptNode = headNode.tagNodes[0];
|
| - CompilationUnit script = scriptNode.script;
|
| - ImportDirective importNode = script.directives[0] as ImportDirective;
|
| - expect(importNode.uriContent, isNotNull);
|
| - expect(importNode.source, libSource);
|
| - }
|
| -
|
| - void test_performAnalysisTask_addPart() {
|
| - Source libSource = addSource("/lib.dart", r'''
|
| -library lib;
|
| -part 'part.dart';''');
|
| - // run all tasks without part
|
| - _analyzeAll_assertFinished();
|
| - expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libSource)),
|
| - isTrue, reason: "lib has errors");
|
| - // add part and run all tasks
|
| - Source partSource = addSource("/part.dart", r'''
|
| -part of lib;
|
| -''');
|
| - _analyzeAll_assertFinished();
|
| - // "libSource" should be here
|
| - List<Source> librariesWithPart = context.getLibrariesContaining(partSource);
|
| - expect(librariesWithPart, unorderedEquals([libSource]));
|
| - expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libSource)),
|
| - isFalse, reason: "lib doesn't have errors");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved");
|
| - }
|
| -
|
| - void test_performAnalysisTask_changeLibraryContents() {
|
| - Source libSource =
|
| - addSource("/test.dart", "library lib; part 'test-part.dart';");
|
| - Source partSource = addSource("/test-part.dart", "part of lib;");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 1");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 1");
|
| - // update and analyze #1
|
| - context.setContents(libSource, "library lib;");
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| - reason: "library changed 2");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part changed 2");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 2");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part resolved 2");
|
| - // update and analyze #2
|
| - context.setContents(libSource, "library lib; part 'test-part.dart';");
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| - reason: "library changed 3");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part changed 3");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 2");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 3");
|
| - }
|
| -
|
| - void test_performAnalysisTask_changeLibraryThenPartContents() {
|
| - Source libSource =
|
| - addSource("/test.dart", "library lib; part 'test-part.dart';");
|
| - Source partSource = addSource("/test-part.dart", "part of lib;");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 1");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 1");
|
| - // update and analyze #1
|
| - context.setContents(libSource, "library lib;");
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| - reason: "library changed 2");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part changed 2");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 2");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part resolved 2");
|
| - // update and analyze #2
|
| - context.setContents(partSource, "part of lib; // 1");
|
| - // Assert that changing the part's content does not effect the library
|
| - // now that it is no longer part of that library
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library changed 3");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part changed 3");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 3");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part resolved 3");
|
| - }
|
| -
|
| - void test_performAnalysisTask_changePartContents_makeItAPart() {
|
| - Source libSource = addSource("/lib.dart", r'''
|
| -library lib;
|
| -part 'part.dart';
|
| -void f(x) {}''');
|
| - Source partSource = addSource("/part.dart", "void g() { f(null); }");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 1");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, partSource), isNotNull,
|
| - reason: "part resolved 1");
|
| - // update and analyze
|
| - context.setContents(partSource, r'''
|
| -part of lib;
|
| -void g() { f(null); }''');
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| - reason: "library changed 2");
|
| - expect(context.getResolvedCompilationUnit2(partSource, partSource), isNull,
|
| - reason: "part changed 2");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 2");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 2");
|
| - expect(context.getErrors(libSource).errors, hasLength(0));
|
| - expect(context.getErrors(partSource).errors, hasLength(0));
|
| - }
|
| -
|
| - /**
|
| - * https://code.google.com/p/dart/issues/detail?id=12424
|
| - */
|
| - void test_performAnalysisTask_changePartContents_makeItNotPart() {
|
| - Source libSource = addSource("/lib.dart", r'''
|
| -library lib;
|
| -part 'part.dart';
|
| -void f(x) {}''');
|
| - Source partSource = addSource("/part.dart", r'''
|
| -part of lib;
|
| -void g() { f(null); }''');
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getErrors(libSource).errors, hasLength(0));
|
| - expect(context.getErrors(partSource).errors, hasLength(0));
|
| - // Remove 'part' directive, which should make "f(null)" an error.
|
| - context.setContents(partSource, r'''
|
| -//part of lib;
|
| -void g() { f(null); }''');
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getErrors(libSource).errors.length != 0, isTrue);
|
| - }
|
| -
|
| - void test_performAnalysisTask_changePartContents_noSemanticChanges() {
|
| - Source libSource =
|
| - addSource("/test.dart", "library lib; part 'test-part.dart';");
|
| - Source partSource = addSource("/test-part.dart", "part of lib;");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 1");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 1");
|
| - // update and analyze #1
|
| - context.setContents(partSource, "part of lib; // 1");
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| - reason: "library changed 2");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part changed 2");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 2");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 2");
|
| - // update and analyze #2
|
| - context.setContents(partSource, "part of lib; // 12");
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| - reason: "library changed 3");
|
| - expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| - reason: "part changed 3");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| - reason: "library resolved 3");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| - reason: "part resolved 3");
|
| + Source source = addSource("/test.html", "<html></html>");
|
| + HtmlElement element = context.computeHtmlElement(source);
|
| + expect(element, isNotNull);
|
| + expect(context.computeHtmlElement(source), same(element));
|
| + }
|
| +
|
| + void fail_extractContext() {
|
| + fail("Implement this");
|
| + }
|
| +
|
| + void fail_getHtmlElement_html() {
|
| + Source source = addSource("/test.html", "<html></html>");
|
| + HtmlElement element = context.getHtmlElement(source);
|
| + expect(element, isNull);
|
| + context.computeHtmlElement(source);
|
| + element = context.getHtmlElement(source);
|
| + expect(element, isNotNull);
|
| + }
|
| +
|
| + void fail_getResolvedHtmlUnit() {
|
| + Source source = addSource("/test.html", "<html></html>");
|
| + expect(context.getResolvedHtmlUnit(source), isNull);
|
| + context.resolveHtmlUnit(source);
|
| + expect(context.getResolvedHtmlUnit(source), isNotNull);
|
| + }
|
| +
|
| + void fail_mergeContext() {
|
| + fail("Implement this");
|
| + }
|
| +
|
| + void fail_parseHtmlUnit_resolveDirectives() {
|
| + Source libSource = addSource("/lib.dart", r'''
|
| +library lib;
|
| +class ClassA {}''');
|
| + Source source = addSource("/lib.html", r'''
|
| +<!DOCTYPE html>
|
| +<html>
|
| +<head>
|
| + <script type='application/dart'>
|
| + import 'lib.dart';
|
| + ClassA v = null;
|
| + </script>
|
| +</head>
|
| +<body>
|
| +</body>
|
| +</html>''');
|
| + ht.HtmlUnit unit = context.parseHtmlUnit(source);
|
| + expect(unit, isNotNull);
|
| + // import directive should be resolved
|
| + ht.XmlTagNode htmlNode = unit.tagNodes[0];
|
| + ht.XmlTagNode headNode = htmlNode.tagNodes[0];
|
| + ht.HtmlScriptTagNode scriptNode = headNode.tagNodes[0];
|
| + CompilationUnit script = scriptNode.script;
|
| + ImportDirective importNode = script.directives[0] as ImportDirective;
|
| + expect(importNode.uriContent, isNotNull);
|
| + expect(importNode.source, libSource);
|
| }
|
|
|
| void fail_performAnalysisTask_getContentException_dart() {
|
| @@ -693,28 +156,6 @@ void g() { f(null); }''');
|
| expect(error.errorCode, ScannerErrorCode.UNABLE_GET_CONTENT);
|
| }
|
|
|
| - void test_performAnalysisTask_importedLibraryAdd() {
|
| - Source libASource =
|
| - addSource("/libA.dart", "library libA; import 'libB.dart';");
|
| - _analyzeAll_assertFinished();
|
| - expect(
|
| - context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| - reason: "libA resolved 1");
|
| - expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| - isTrue, reason: "libA has an error");
|
| - // add libB.dart and analyze
|
| - Source libBSource = addSource("/libB.dart", "library libB;");
|
| - _analyzeAll_assertFinished();
|
| - expect(
|
| - context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| - reason: "libA resolved 2");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
|
| - reason: "libB resolved 2");
|
| - expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| - isFalse, reason: "libA doesn't have errors");
|
| - }
|
| -
|
| void fail_performAnalysisTask_importedLibraryAdd_html() {
|
| Source htmlSource = addSource("/page.html", r'''
|
| <html><body><script type="application/dart">
|
| @@ -742,29 +183,6 @@ void g() { f(null); }''');
|
| // reason: "htmlSource doesn't have errors");
|
| }
|
|
|
| - void test_performAnalysisTask_importedLibraryDelete() {
|
| - Source libASource =
|
| - addSource("/libA.dart", "library libA; import 'libB.dart';");
|
| - Source libBSource = addSource("/libB.dart", "library libB;");
|
| - _analyzeAll_assertFinished();
|
| - expect(
|
| - context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| - reason: "libA resolved 1");
|
| - expect(
|
| - context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
|
| - reason: "libB resolved 1");
|
| - expect(!_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| - isTrue, reason: "libA doesn't have errors");
|
| - // remove libB.dart and analyze
|
| - _removeSource(libBSource);
|
| - _analyzeAll_assertFinished();
|
| - expect(
|
| - context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| - reason: "libA resolved 2");
|
| - expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| - isTrue, reason: "libA has an error");
|
| - }
|
| -
|
| void fail_performAnalysisTask_importedLibraryDelete_html() {
|
| // NOTE: This was failing before converting to the new task model.
|
| Source htmlSource = addSource("/page.html", r'''
|
| @@ -791,36 +209,6 @@ void g() { f(null); }''');
|
| reason: "htmlSource has an error");
|
| }
|
|
|
| - void test_performAnalysisTask_onResultComputed() {
|
| - Set<String> libraryElementUris = new Set<String>();
|
| - Set<String> parsedUnitUris = new Set<String>();
|
| - Set<String> resolvedUnitUris = new Set<String>();
|
| - // listen
|
| - context.onResultComputed(LIBRARY_ELEMENT).listen((event) {
|
| - Source librarySource = event.target;
|
| - libraryElementUris.add(librarySource.uri.toString());
|
| - });
|
| - context.onResultComputed(PARSED_UNIT).listen((event) {
|
| - Source source = event.target;
|
| - parsedUnitUris.add(source.uri.toString());
|
| - });
|
| - context.onResultComputed(RESOLVED_UNIT).listen((event) {
|
| - LibrarySpecificUnit target = event.target;
|
| - Source librarySource = target.library;
|
| - resolvedUnitUris.add(librarySource.uri.toString());
|
| - });
|
| - // analyze
|
| - addSource('/test.dart', 'main() {}');
|
| - _analyzeAll_assertFinished();
|
| - // verify
|
| - expect(libraryElementUris, contains('dart:core'));
|
| - expect(libraryElementUris, contains('file:///test.dart'));
|
| - expect(parsedUnitUris, contains('dart:core'));
|
| - expect(parsedUnitUris, contains('file:///test.dart'));
|
| - expect(resolvedUnitUris, contains('dart:core'));
|
| - expect(resolvedUnitUris, contains('file:///test.dart'));
|
| - }
|
| -
|
| void fail_performAnalysisTask_IOException() {
|
| TestSource source = _addSourceWithException2("/test.dart", "library test;");
|
| int oldTimestamp = context.getModificationStamp(source);
|
| @@ -837,58 +225,10 @@ void g() { f(null); }''');
|
| expect(source.readCount, 2);
|
| }
|
|
|
| - void test_performAnalysisTask_missingPart() {
|
| - Source source =
|
| - addSource("/test.dart", "library lib; part 'no-such-file.dart';");
|
| - _analyzeAll_assertFinished();
|
| - expect(context.getLibraryElement(source), isNotNull,
|
| - reason: "performAnalysisTask failed to compute an element model");
|
| - }
|
| -
|
| void fail_recordLibraryElements() {
|
| fail("Implement this");
|
| }
|
|
|
| - void test_resolveCompilationUnit_import_relative() {
|
| - Source sourceA =
|
| - addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
|
| - addSource("/libB.dart", "library libB; class B{}");
|
| - CompilationUnit compilationUnit =
|
| - context.resolveCompilationUnit2(sourceA, sourceA);
|
| - expect(compilationUnit, isNotNull);
|
| - LibraryElement library = compilationUnit.element.library;
|
| - List<LibraryElement> importedLibraries = library.importedLibraries;
|
| - assertNamedElements(importedLibraries, ["dart.core", "libB"]);
|
| - List<LibraryElement> visibleLibraries = library.visibleLibraries;
|
| - assertNamedElements(visibleLibraries, [
|
| - "dart.core",
|
| - "dart.async",
|
| - "dart.math",
|
| - "libA",
|
| - "libB"
|
| - ]);
|
| - }
|
| -
|
| - void test_resolveCompilationUnit_import_relative_cyclic() {
|
| - Source sourceA =
|
| - addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
|
| - addSource("/libB.dart", "library libB; import 'libA.dart'; class B{}");
|
| - CompilationUnit compilationUnit =
|
| - context.resolveCompilationUnit2(sourceA, sourceA);
|
| - expect(compilationUnit, isNotNull);
|
| - LibraryElement library = compilationUnit.element.library;
|
| - List<LibraryElement> importedLibraries = library.importedLibraries;
|
| - assertNamedElements(importedLibraries, ["dart.core", "libB"]);
|
| - List<LibraryElement> visibleLibraries = library.visibleLibraries;
|
| - assertNamedElements(visibleLibraries, [
|
| - "dart.core",
|
| - "dart.async",
|
| - "dart.math",
|
| - "libA",
|
| - "libB"
|
| - ]);
|
| - }
|
| -
|
| void fail_resolveHtmlUnit() {
|
| Source source = addSource("/lib.html", "<html></html>");
|
| ht.HtmlUnit unit = context.resolveHtmlUnit(source);
|
| @@ -963,24 +303,6 @@ int ya = 0;''';
|
| });
|
| }
|
|
|
| - void test_setContents_unchanged_consistentModificationTime() {
|
| - String contents = "// foo";
|
| - Source source = addSource("/test.dart", contents);
|
| - context.setContents(source, contents);
|
| - // do all, no tasks
|
| - _analyzeAll_assertFinished();
|
| - {
|
| - AnalysisResult result = context.performAnalysisTask();
|
| - expect(result.changeNotices, isNull);
|
| - }
|
| - // set the same contents, still no tasks
|
| - context.setContents(source, contents);
|
| - {
|
| - AnalysisResult result = context.performAnalysisTask();
|
| - expect(result.changeNotices, isNull);
|
| - }
|
| - }
|
| -
|
| void fail_unreadableSource() {
|
| Source test1 = addSource("/test1.dart", r'''
|
| import 'test2.dart';
|
| @@ -1136,7 +458,83 @@ int b = aa;''';
|
| context.applyChanges(changeSet2);
|
| return pumpEventQueue().then((_) {
|
| listener.assertEvent(wereSourcesAdded: true);
|
| - listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
|
| + listener.assertEvent(wereSourcesAdded: true, changedSources: [source]);
|
| + listener.assertNoMoreEvents();
|
| + });
|
| + }
|
| +
|
| + void test_applyChanges_overriddenSource() {
|
| + // Note: addSource adds the source to the contentCache.
|
| + Source source = addSource("/test.dart", "library test;");
|
| + context.computeErrors(source);
|
| + while (!context.sourcesNeedingProcessing.isEmpty) {
|
| + context.performAnalysisTask();
|
| + }
|
| + // Adding the source as a changedSource should have no effect since
|
| + // it is already overridden in the content cache.
|
| + ChangeSet changeSet = new ChangeSet();
|
| + changeSet.changedSource(source);
|
| + context.applyChanges(changeSet);
|
| + expect(context.sourcesNeedingProcessing, hasLength(0));
|
| + }
|
| +
|
| + Future test_applyChanges_remove() {
|
| + SourcesChangedListener listener = new SourcesChangedListener();
|
| + context.onSourcesChanged.listen(listener.onData);
|
| + String libAContents = r'''
|
| +library libA;
|
| +import 'libB.dart';''';
|
| + Source libA = addSource("/libA.dart", libAContents);
|
| + String libBContents = "library libB;";
|
| + Source libB = addSource("/libB.dart", libBContents);
|
| + LibraryElement libAElement = context.computeLibraryElement(libA);
|
| + expect(libAElement, isNotNull);
|
| + List<LibraryElement> importedLibraries = libAElement.importedLibraries;
|
| + expect(importedLibraries, hasLength(2));
|
| + context.computeErrors(libA);
|
| + context.computeErrors(libB);
|
| + expect(context.sourcesNeedingProcessing, hasLength(0));
|
| + context.setContents(libB, null);
|
| + _removeSource(libB);
|
| + List<Source> sources = context.sourcesNeedingProcessing;
|
| + expect(sources, hasLength(1));
|
| + expect(sources[0], same(libA));
|
| + libAElement = context.computeLibraryElement(libA);
|
| + importedLibraries = libAElement.importedLibraries;
|
| + expect(importedLibraries, hasLength(1));
|
| + return pumpEventQueue().then((_) {
|
| + listener.assertEvent(wereSourcesAdded: true);
|
| + listener.assertEvent(wereSourcesAdded: true);
|
| + listener.assertEvent(wereSourcesRemovedOrDeleted: true);
|
| + listener.assertNoMoreEvents();
|
| + });
|
| + }
|
| +
|
| + Future test_applyChanges_removeContainer() {
|
| + SourcesChangedListener listener = new SourcesChangedListener();
|
| + context.onSourcesChanged.listen(listener.onData);
|
| + String libAContents = r'''
|
| +library libA;
|
| +import 'libB.dart';''';
|
| + Source libA = addSource("/libA.dart", libAContents);
|
| + String libBContents = "library libB;";
|
| + Source libB = addSource("/libB.dart", libBContents);
|
| + context.computeLibraryElement(libA);
|
| + context.computeErrors(libA);
|
| + context.computeErrors(libB);
|
| + expect(context.sourcesNeedingProcessing, hasLength(0));
|
| + ChangeSet changeSet = new ChangeSet();
|
| + SourceContainer removedContainer =
|
| + new _AnalysisContextImplTest_test_applyChanges_removeContainer(libB);
|
| + changeSet.removedContainer(removedContainer);
|
| + context.applyChanges(changeSet);
|
| + List<Source> sources = context.sourcesNeedingProcessing;
|
| + expect(sources, hasLength(1));
|
| + expect(sources[0], same(libA));
|
| + return pumpEventQueue().then((_) {
|
| + listener.assertEvent(wereSourcesAdded: true);
|
| + listener.assertEvent(wereSourcesAdded: true);
|
| + listener.assertEvent(wereSourcesRemovedOrDeleted: true);
|
| listener.assertNoMoreEvents();
|
| });
|
| }
|
| @@ -1188,6 +586,35 @@ class A {}""");
|
| expect(actual, "/// line 1\n/// line 2\n/// line 3");
|
| }
|
|
|
| + void test_computeErrors_dart_none() {
|
| + Source source = addSource("/lib.dart", "library lib;");
|
| + List<AnalysisError> errors = context.computeErrors(source);
|
| + expect(errors, hasLength(0));
|
| + }
|
| +
|
| + void test_computeErrors_dart_part() {
|
| + Source librarySource =
|
| + addSource("/lib.dart", "library lib; part 'part.dart';");
|
| + Source partSource = addSource("/part.dart", "part of 'lib';");
|
| + context.parseCompilationUnit(librarySource);
|
| + List<AnalysisError> errors = context.computeErrors(partSource);
|
| + expect(errors, isNotNull);
|
| + expect(errors.length > 0, isTrue);
|
| + }
|
| +
|
| + void test_computeErrors_dart_some() {
|
| + Source source = addSource("/lib.dart", "library 'lib';");
|
| + List<AnalysisError> errors = context.computeErrors(source);
|
| + expect(errors, isNotNull);
|
| + expect(errors.length > 0, isTrue);
|
| + }
|
| +
|
| + void test_computeErrors_html_none() {
|
| + Source source = addSource("/test.html", "<!DOCTYPE html><html></html>");
|
| + List<AnalysisError> errors = context.computeErrors(source);
|
| + expect(errors, hasLength(0));
|
| + }
|
| +
|
| void test_computeExportedLibraries_none() {
|
| Source source = addSource("/test.dart", "library test;");
|
| expect(context.computeExportedLibraries(source), hasLength(0));
|
| @@ -1206,6 +633,17 @@ class A {}""");
|
| expect(context.computeHtmlElement(source), isNull);
|
| }
|
|
|
| + void test_computeImportedLibraries_none() {
|
| + Source source = addSource("/test.dart", "library test;");
|
| + expect(context.computeImportedLibraries(source), hasLength(0));
|
| + }
|
| +
|
| + void test_computeImportedLibraries_some() {
|
| + Source source = addSource(
|
| + "/test.dart", "library test; import 'lib1.dart'; import 'lib2.dart';");
|
| + expect(context.computeImportedLibraries(source), hasLength(2));
|
| + }
|
| +
|
| void test_computeKindOf_html() {
|
| Source source = addSource("/test.html", "");
|
| expect(context.computeKindOf(source), same(SourceKind.HTML));
|
| @@ -1252,6 +690,27 @@ main() {}''');
|
| expect(info, isNotNull);
|
| }
|
|
|
| + Future test_computeResolvedCompilationUnitAsync() {
|
| + Source source = addSource("/lib.dart", "library lib;");
|
| + // Complete all pending analysis tasks and flush the AST so that it won't
|
| + // be available immediately.
|
| + _performPendingAnalysisTasks();
|
| + _flushAst(source);
|
| + bool completed = false;
|
| + context
|
| + .computeResolvedCompilationUnitAsync(source, source)
|
| + .then((CompilationUnit unit) {
|
| + expect(unit, isNotNull);
|
| + completed = true;
|
| + });
|
| + return pumpEventQueue().then((_) {
|
| + expect(completed, isFalse);
|
| + _performPendingAnalysisTasks();
|
| + }).then((_) => pumpEventQueue()).then((_) {
|
| + expect(completed, isTrue);
|
| + });
|
| + }
|
| +
|
| Future test_computeResolvedCompilationUnitAsync_afterDispose() {
|
| Source source = addSource("/lib.dart", "library lib;");
|
| // Complete all pending analysis tasks and flush the AST so that it won't
|
| @@ -1276,6 +735,76 @@ main() {}''');
|
| });
|
| }
|
|
|
| + Future test_computeResolvedCompilationUnitAsync_cancel() {
|
| + Source source = addSource("/lib.dart", "library lib;");
|
| + // Complete all pending analysis tasks and flush the AST so that it won't
|
| + // be available immediately.
|
| + _performPendingAnalysisTasks();
|
| + _flushAst(source);
|
| + CancelableFuture<CompilationUnit> future =
|
| + context.computeResolvedCompilationUnitAsync(source, source);
|
| + bool completed = false;
|
| + future.then((CompilationUnit unit) {
|
| + fail('Future should have been canceled');
|
| + }, onError: (error) {
|
| + expect(error, new isInstanceOf<FutureCanceledError>());
|
| + completed = true;
|
| + });
|
| + expect(completed, isFalse);
|
| + expect(context.pendingFutureSources_forTesting, isNotEmpty);
|
| + future.cancel();
|
| + expect(context.pendingFutureSources_forTesting, isEmpty);
|
| + return pumpEventQueue().then((_) {
|
| + expect(completed, isTrue);
|
| + expect(context.pendingFutureSources_forTesting, isEmpty);
|
| + });
|
| + }
|
| +
|
| + Future test_computeResolvedCompilationUnitAsync_dispose() {
|
| + Source source = addSource("/lib.dart", "library lib;");
|
| + // Complete all pending analysis tasks and flush the AST so that it won't
|
| + // be available immediately.
|
| + _performPendingAnalysisTasks();
|
| + _flushAst(source);
|
| + bool completed = false;
|
| + CancelableFuture<CompilationUnit> future =
|
| + context.computeResolvedCompilationUnitAsync(source, source);
|
| + future.then((CompilationUnit unit) {
|
| + fail('Future should have completed with error');
|
| + }, onError: (error) {
|
| + expect(error, new isInstanceOf<AnalysisNotScheduledError>());
|
| + completed = true;
|
| + });
|
| + expect(completed, isFalse);
|
| + expect(context.pendingFutureSources_forTesting, isNotEmpty);
|
| + // Disposing of the context should cause all pending futures to complete
|
| + // with AnalysisNotScheduled, so that no clients are left hanging.
|
| + context.dispose();
|
| + expect(context.pendingFutureSources_forTesting, isEmpty);
|
| + return pumpEventQueue().then((_) {
|
| + expect(completed, isTrue);
|
| + expect(context.pendingFutureSources_forTesting, isEmpty);
|
| + });
|
| + }
|
| +
|
| + Future test_computeResolvedCompilationUnitAsync_noCacheEntry() {
|
| + Source librarySource = addSource("/lib.dart", "library lib;");
|
| + Source partSource = addSource("/part.dart", "part of foo;");
|
| + bool completed = false;
|
| + context
|
| + .computeResolvedCompilationUnitAsync(partSource, librarySource)
|
| + .then((CompilationUnit unit) {
|
| + expect(unit, isNotNull);
|
| + completed = true;
|
| + });
|
| + return pumpEventQueue().then((_) {
|
| + expect(completed, isFalse);
|
| + _performPendingAnalysisTasks();
|
| + }).then((_) => pumpEventQueue()).then((_) {
|
| + expect(completed, isTrue);
|
| + });
|
| + }
|
| +
|
| void test_dispose() {
|
| expect(context.isDisposed, isFalse);
|
| context.dispose();
|
| @@ -1308,7 +837,7 @@ main() {}''');
|
| expect(nextResult.result, RESOLVED_UNIT);
|
| }
|
|
|
| - void test_ensureResolvedDartUnits_partUnit_notResolved() {
|
| + void test_ensureResolvedDartUnits_partUnit_hasResolved() {
|
| Source libSource1 = addSource('/lib1.dart', r'''
|
| library lib;
|
| part 'part.dart';
|
| @@ -1326,21 +855,15 @@ part of lib;
|
| new LibrarySpecificUnit(libSource2, partSource);
|
| analysisDriver.computeResult(partTarget1, RESOLVED_UNIT);
|
| analysisDriver.computeResult(partTarget2, RESOLVED_UNIT);
|
| - // flush
|
| - context.getCacheEntry(partTarget1).setState(
|
| - RESOLVED_UNIT, CacheState.FLUSHED);
|
| - context.getCacheEntry(partTarget2).setState(
|
| - RESOLVED_UNIT, CacheState.FLUSHED);
|
| - // schedule recomputing
|
| + CompilationUnit unit1 =
|
| + context.getCacheEntry(partTarget1).getValue(RESOLVED_UNIT);
|
| + CompilationUnit unit2 =
|
| + context.getCacheEntry(partTarget2).getValue(RESOLVED_UNIT);
|
| List<CompilationUnit> units = context.ensureResolvedDartUnits(partSource);
|
| - expect(units, isNull);
|
| - // should be the next result to compute
|
| - TargetedResult nextResult = context.dartWorkManager.getNextResult();
|
| - expect(nextResult.target, anyOf(partTarget1, partTarget2));
|
| - expect(nextResult.result, RESOLVED_UNIT);
|
| + expect(units, unorderedEquals([unit1, unit2]));
|
| }
|
|
|
| - void test_ensureResolvedDartUnits_partUnit_hasResolved() {
|
| + void test_ensureResolvedDartUnits_partUnit_notResolved() {
|
| Source libSource1 = addSource('/lib1.dart', r'''
|
| library lib;
|
| part 'part.dart';
|
| @@ -1358,12 +881,18 @@ part of lib;
|
| new LibrarySpecificUnit(libSource2, partSource);
|
| analysisDriver.computeResult(partTarget1, RESOLVED_UNIT);
|
| analysisDriver.computeResult(partTarget2, RESOLVED_UNIT);
|
| - CompilationUnit unit1 =
|
| - context.getCacheEntry(partTarget1).getValue(RESOLVED_UNIT);
|
| - CompilationUnit unit2 =
|
| - context.getCacheEntry(partTarget2).getValue(RESOLVED_UNIT);
|
| + // flush
|
| + context.getCacheEntry(partTarget1).setState(
|
| + RESOLVED_UNIT, CacheState.FLUSHED);
|
| + context.getCacheEntry(partTarget2).setState(
|
| + RESOLVED_UNIT, CacheState.FLUSHED);
|
| + // schedule recomputing
|
| List<CompilationUnit> units = context.ensureResolvedDartUnits(partSource);
|
| - expect(units, unorderedEquals([unit1, unit2]));
|
| + expect(units, isNull);
|
| + // should be the next result to compute
|
| + TargetedResult nextResult = context.dartWorkManager.getNextResult();
|
| + expect(nextResult.target, anyOf(partTarget1, partTarget2));
|
| + expect(nextResult.result, RESOLVED_UNIT);
|
| }
|
|
|
| void test_exists_false() {
|
| @@ -1431,6 +960,89 @@ part of lib;
|
| expect(element, same(classObject));
|
| }
|
|
|
| + void test_getElement_constructor_named() {
|
| + Source source = addSource("/lib.dart", r'''
|
| +class A {
|
| + A.named() {}
|
| +}''');
|
| + _analyzeAll_assertFinished();
|
| + LibraryElement library = context.computeLibraryElement(source);
|
| + ClassElement classA = _findClass(library.definingCompilationUnit, "A");
|
| + ConstructorElement constructor = classA.constructors[0];
|
| + ElementLocation location = constructor.location;
|
| + Element element = context.getElement(location);
|
| + expect(element, same(constructor));
|
| + }
|
| +
|
| + void test_getElement_constructor_unnamed() {
|
| + Source source = addSource("/lib.dart", r'''
|
| +class A {
|
| + A() {}
|
| +}''');
|
| + _analyzeAll_assertFinished();
|
| + LibraryElement library = context.computeLibraryElement(source);
|
| + ClassElement classA = _findClass(library.definingCompilationUnit, "A");
|
| + ConstructorElement constructor = classA.constructors[0];
|
| + ElementLocation location = constructor.location;
|
| + Element element = context.getElement(location);
|
| + expect(element, same(constructor));
|
| + }
|
| +
|
| + void test_getElement_enum() {
|
| + Source source = addSource('/test.dart', 'enum MyEnum {A, B, C}');
|
| + _analyzeAll_assertFinished();
|
| + LibraryElement library = context.computeLibraryElement(source);
|
| + ClassElement myEnum = library.definingCompilationUnit.getEnum('MyEnum');
|
| + ElementLocation location = myEnum.location;
|
| + Element element = context.getElement(location);
|
| + expect(element, same(myEnum));
|
| + }
|
| +
|
| + void test_getErrors_dart_none() {
|
| + Source source = addSource("/lib.dart", "library lib;");
|
| + var errorInfo = context.getErrors(source);
|
| + expect(errorInfo, isNotNull);
|
| + List<AnalysisError> errors = errorInfo.errors;
|
| + expect(errors, hasLength(0));
|
| + context.computeErrors(source);
|
| + errors = errorInfo.errors;
|
| + expect(errors, hasLength(0));
|
| + }
|
| +
|
| + void test_getErrors_dart_some() {
|
| + Source source = addSource("/lib.dart", "library 'lib';");
|
| + var errorInfo = context.getErrors(source);
|
| + expect(errorInfo, isNotNull);
|
| + List<AnalysisError> errors = errorInfo.errors;
|
| + expect(errors, hasLength(0));
|
| + errors = context.computeErrors(source);
|
| + expect(errors, hasLength(1));
|
| + }
|
| +
|
| + void test_getErrors_html_none() {
|
| + Source source = addSource("/test.html", "<html></html>");
|
| + AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| + expect(errorInfo, isNotNull);
|
| + List<AnalysisError> errors = errorInfo.errors;
|
| + expect(errors, hasLength(0));
|
| + context.computeErrors(source);
|
| + errors = errorInfo.errors;
|
| + expect(errors, hasLength(0));
|
| + }
|
| +
|
| + void test_getErrors_html_some() {
|
| + Source source = addSource("/test.html", r'''
|
| +<html><head>
|
| +<script type='application/dart' src='test.dart'/>
|
| +</head></html>''');
|
| + AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| + expect(errorInfo, isNotNull);
|
| + List<AnalysisError> errors = errorInfo.errors;
|
| + expect(errors, hasLength(0));
|
| + errors = context.computeErrors(source);
|
| + expect(errors, hasLength(3));
|
| + }
|
| +
|
| void test_getHtmlElement_dart() {
|
| Source source = addSource("/test.dart", "");
|
| expect(context.getHtmlElement(source), isNull);
|
| @@ -1454,6 +1066,51 @@ part of lib;
|
| expect(result, hasLength(0));
|
| }
|
|
|
| + void test_getHtmlFilesReferencing_library() {
|
| + Source htmlSource = addSource("/test.html", r'''
|
| +<!DOCTYPE html>
|
| +<html><head>
|
| +<script type='application/dart' src='test.dart'/>
|
| +<script type='application/dart' src='test.js'/>
|
| +</head></html>''');
|
| + Source librarySource = addSource("/test.dart", "library lib;");
|
| + context.computeLibraryElement(librarySource);
|
| + List<Source> result = context.getHtmlFilesReferencing(librarySource);
|
| + expect(result, hasLength(0));
|
| + context.computeHtmlElement(htmlSource);
|
| + result = context.getHtmlFilesReferencing(librarySource);
|
| + expect(result, hasLength(1));
|
| + expect(result[0], htmlSource);
|
| + }
|
| +
|
| + void test_getHtmlFilesReferencing_part() {
|
| + Source htmlSource = addSource("/test.html", r'''
|
| +<!DOCTYPE html>
|
| +<html><head>
|
| +<script type='application/dart' src='test.dart'/>
|
| +<script type='application/dart' src='test.js'/>
|
| +</head></html>''');
|
| + Source librarySource =
|
| + addSource("/test.dart", "library lib; part 'part.dart';");
|
| + Source partSource = addSource("/part.dart", "part of lib;");
|
| + context.computeLibraryElement(librarySource);
|
| + List<Source> result = context.getHtmlFilesReferencing(partSource);
|
| + expect(result, hasLength(0));
|
| + context.computeHtmlElement(htmlSource);
|
| + result = context.getHtmlFilesReferencing(partSource);
|
| + expect(result, hasLength(1));
|
| + expect(result[0], htmlSource);
|
| + }
|
| +
|
| + void test_getHtmlSources() {
|
| + List<Source> sources = context.htmlSources;
|
| + expect(sources, hasLength(0));
|
| + Source source = addSource("/test.html", "");
|
| + sources = context.htmlSources;
|
| + expect(sources, hasLength(1));
|
| + expect(sources[0], source);
|
| + }
|
| +
|
| void test_getKindOf_html() {
|
| Source source = addSource("/test.html", "");
|
| expect(context.getKindOf(source), same(SourceKind.HTML));
|
| @@ -1589,6 +1246,21 @@ export 'libA.dart';''');
|
| expect(result, unorderedEquals([lib1Source, lib2Source]));
|
| }
|
|
|
| + void test_getLibrariesReferencedFromHtml() {
|
| + Source htmlSource = addSource("/test.html", r'''
|
| +<!DOCTYPE html>
|
| +<html><head>
|
| +<script type='application/dart' src='test.dart'/>
|
| +<script type='application/dart' src='test.js'/>
|
| +</head></html>''');
|
| + Source librarySource = addSource("/test.dart", "library lib;");
|
| + context.computeLibraryElement(librarySource);
|
| + context.computeHtmlElement(htmlSource);
|
| + List<Source> result = context.getLibrariesReferencedFromHtml(htmlSource);
|
| + expect(result, hasLength(1));
|
| + expect(result[0], librarySource);
|
| + }
|
| +
|
| void test_getLibrariesReferencedFromHtml_none() {
|
| Source htmlSource = addSource("/test.html", r'''
|
| <html><head>
|
| @@ -1662,6 +1334,15 @@ main() {}''');
|
| (obj) => obj is ClassElement, ClassElement, namespace.get("A"));
|
| }
|
|
|
| + void test_getResolvedCompilationUnit_library() {
|
| + Source source = addSource("/lib.dart", "library libb;");
|
| + LibraryElement library = context.computeLibraryElement(source);
|
| + context.computeErrors(source); // Force the resolved unit to be built.
|
| + expect(context.getResolvedCompilationUnit(source, library), isNotNull);
|
| + context.setContents(source, "library lib;");
|
| + expect(context.getResolvedCompilationUnit(source, library), isNull);
|
| + }
|
| +
|
| void test_getResolvedCompilationUnit_library_null() {
|
| Source source = addSource("/lib.dart", "library lib;");
|
| expect(context.getResolvedCompilationUnit(source, null), isNull);
|
| @@ -1786,41 +1467,271 @@ main() {}''');
|
| }
|
| }
|
|
|
| - void test_parseCompilationUnit_html() {
|
| - Source source = addSource("/test.html", "<html></html>");
|
| - expect(context.parseCompilationUnit(source), isNull);
|
| + void test_parseCompilationUnit_html() {
|
| + Source source = addSource("/test.html", "<html></html>");
|
| + expect(context.parseCompilationUnit(source), isNull);
|
| + }
|
| +
|
| + void test_parseCompilationUnit_noErrors() {
|
| + Source source = addSource("/lib.dart", "library lib;");
|
| + CompilationUnit compilationUnit = context.parseCompilationUnit(source);
|
| + expect(compilationUnit, isNotNull);
|
| + AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| + expect(errorInfo, isNotNull);
|
| + expect(errorInfo.errors, hasLength(0));
|
| + }
|
| +
|
| + void test_parseCompilationUnit_nonExistentSource() {
|
| + Source source = newSource('/test.dart');
|
| + resourceProvider.deleteFile('/test.dart');
|
| + try {
|
| + context.parseCompilationUnit(source);
|
| + fail("Expected AnalysisException because file does not exist");
|
| + } on AnalysisException {
|
| + // Expected result
|
| + }
|
| + }
|
| +
|
| + void test_parseHtmlDocument() {
|
| + Source source = addSource("/lib.html", "<!DOCTYPE html><html></html>");
|
| + Document document = context.parseHtmlDocument(source);
|
| + expect(document, isNotNull);
|
| + }
|
| +
|
| + void test_performAnalysisTask_addPart() {
|
| + Source libSource = addSource("/lib.dart", r'''
|
| +library lib;
|
| +part 'part.dart';''');
|
| + // run all tasks without part
|
| + _analyzeAll_assertFinished();
|
| + expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libSource)),
|
| + isTrue, reason: "lib has errors");
|
| + // add part and run all tasks
|
| + Source partSource = addSource("/part.dart", r'''
|
| +part of lib;
|
| +''');
|
| + _analyzeAll_assertFinished();
|
| + // "libSource" should be here
|
| + List<Source> librariesWithPart = context.getLibrariesContaining(partSource);
|
| + expect(librariesWithPart, unorderedEquals([libSource]));
|
| + expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libSource)),
|
| + isFalse, reason: "lib doesn't have errors");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved");
|
| + }
|
| +
|
| + void test_performAnalysisTask_changeLibraryContents() {
|
| + Source libSource =
|
| + addSource("/test.dart", "library lib; part 'test-part.dart';");
|
| + Source partSource = addSource("/test-part.dart", "part of lib;");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 1");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 1");
|
| + // update and analyze #1
|
| + context.setContents(libSource, "library lib;");
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| + reason: "library changed 2");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part changed 2");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 2");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part resolved 2");
|
| + // update and analyze #2
|
| + context.setContents(libSource, "library lib; part 'test-part.dart';");
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| + reason: "library changed 3");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part changed 3");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 2");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 3");
|
| + }
|
| +
|
| + void test_performAnalysisTask_changeLibraryThenPartContents() {
|
| + Source libSource =
|
| + addSource("/test.dart", "library lib; part 'test-part.dart';");
|
| + Source partSource = addSource("/test-part.dart", "part of lib;");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 1");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 1");
|
| + // update and analyze #1
|
| + context.setContents(libSource, "library lib;");
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| + reason: "library changed 2");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part changed 2");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 2");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part resolved 2");
|
| + // update and analyze #2
|
| + context.setContents(partSource, "part of lib; // 1");
|
| + // Assert that changing the part's content does not effect the library
|
| + // now that it is no longer part of that library
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library changed 3");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part changed 3");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 3");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part resolved 3");
|
| + }
|
| +
|
| + void test_performAnalysisTask_changePartContents_makeItAPart() {
|
| + Source libSource = addSource("/lib.dart", r'''
|
| +library lib;
|
| +part 'part.dart';
|
| +void f(x) {}''');
|
| + Source partSource = addSource("/part.dart", "void g() { f(null); }");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 1");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, partSource), isNotNull,
|
| + reason: "part resolved 1");
|
| + // update and analyze
|
| + context.setContents(partSource, r'''
|
| +part of lib;
|
| +void g() { f(null); }''');
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| + reason: "library changed 2");
|
| + expect(context.getResolvedCompilationUnit2(partSource, partSource), isNull,
|
| + reason: "part changed 2");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 2");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 2");
|
| + expect(context.getErrors(libSource).errors, hasLength(0));
|
| + expect(context.getErrors(partSource).errors, hasLength(0));
|
| + }
|
| +
|
| + /**
|
| + * https://code.google.com/p/dart/issues/detail?id=12424
|
| + */
|
| + void test_performAnalysisTask_changePartContents_makeItNotPart() {
|
| + Source libSource = addSource("/lib.dart", r'''
|
| +library lib;
|
| +part 'part.dart';
|
| +void f(x) {}''');
|
| + Source partSource = addSource("/part.dart", r'''
|
| +part of lib;
|
| +void g() { f(null); }''');
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getErrors(libSource).errors, hasLength(0));
|
| + expect(context.getErrors(partSource).errors, hasLength(0));
|
| + // Remove 'part' directive, which should make "f(null)" an error.
|
| + context.setContents(partSource, r'''
|
| +//part of lib;
|
| +void g() { f(null); }''');
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getErrors(libSource).errors.length != 0, isTrue);
|
| + }
|
| +
|
| + void test_performAnalysisTask_changePartContents_noSemanticChanges() {
|
| + Source libSource =
|
| + addSource("/test.dart", "library lib; part 'test-part.dart';");
|
| + Source partSource = addSource("/test-part.dart", "part of lib;");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 1");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 1");
|
| + // update and analyze #1
|
| + context.setContents(partSource, "part of lib; // 1");
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| + reason: "library changed 2");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part changed 2");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 2");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 2");
|
| + // update and analyze #2
|
| + context.setContents(partSource, "part of lib; // 12");
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull,
|
| + reason: "library changed 3");
|
| + expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull,
|
| + reason: "part changed 3");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull,
|
| + reason: "library resolved 3");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(partSource, libSource), isNotNull,
|
| + reason: "part resolved 3");
|
| }
|
|
|
| - void test_parseCompilationUnit_noErrors() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - CompilationUnit compilationUnit = context.parseCompilationUnit(source);
|
| - expect(compilationUnit, isNotNull);
|
| - AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| - expect(errorInfo, isNotNull);
|
| - expect(errorInfo.errors, hasLength(0));
|
| + void test_performAnalysisTask_importedLibraryAdd() {
|
| + Source libASource =
|
| + addSource("/libA.dart", "library libA; import 'libB.dart';");
|
| + _analyzeAll_assertFinished();
|
| + expect(
|
| + context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| + reason: "libA resolved 1");
|
| + expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| + isTrue, reason: "libA has an error");
|
| + // add libB.dart and analyze
|
| + Source libBSource = addSource("/libB.dart", "library libB;");
|
| + _analyzeAll_assertFinished();
|
| + expect(
|
| + context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| + reason: "libA resolved 2");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
|
| + reason: "libB resolved 2");
|
| + expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| + isFalse, reason: "libA doesn't have errors");
|
| }
|
|
|
| - void test_parseCompilationUnit_nonExistentSource() {
|
| - Source source = newSource('/test.dart');
|
| - resourceProvider.deleteFile('/test.dart');
|
| - try {
|
| - context.parseCompilationUnit(source);
|
| - fail("Expected AnalysisException because file does not exist");
|
| - } on AnalysisException {
|
| - // Expected result
|
| - }
|
| + void test_performAnalysisTask_importedLibraryDelete() {
|
| + Source libASource =
|
| + addSource("/libA.dart", "library libA; import 'libB.dart';");
|
| + Source libBSource = addSource("/libB.dart", "library libB;");
|
| + _analyzeAll_assertFinished();
|
| + expect(
|
| + context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| + reason: "libA resolved 1");
|
| + expect(
|
| + context.getResolvedCompilationUnit2(libBSource, libBSource), isNotNull,
|
| + reason: "libB resolved 1");
|
| + expect(!_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| + isTrue, reason: "libA doesn't have errors");
|
| + // remove libB.dart and analyze
|
| + _removeSource(libBSource);
|
| + _analyzeAll_assertFinished();
|
| + expect(
|
| + context.getResolvedCompilationUnit2(libASource, libASource), isNotNull,
|
| + reason: "libA resolved 2");
|
| + expect(_hasAnalysisErrorWithErrorSeverity(context.getErrors(libASource)),
|
| + isTrue, reason: "libA has an error");
|
| }
|
|
|
| -// void test_resolveCompilationUnit_sourceChangeDuringResolution() {
|
| -// _context = new _AnalysisContext_sourceChangeDuringResolution();
|
| -// AnalysisContextFactory.initContextWithCore(_context);
|
| -// _sourceFactory = _context.sourceFactory;
|
| -// Source source = _addSource("/lib.dart", "library lib;");
|
| -// CompilationUnit compilationUnit =
|
| -// _context.resolveCompilationUnit2(source, source);
|
| -// expect(compilationUnit, isNotNull);
|
| -// expect(_context.getLineInfo(source), isNotNull);
|
| -// }
|
| + void test_performAnalysisTask_missingPart() {
|
| + Source source =
|
| + addSource("/test.dart", "library lib; part 'no-such-file.dart';");
|
| + _analyzeAll_assertFinished();
|
| + expect(context.getLibraryElement(source), isNotNull,
|
| + reason: "performAnalysisTask failed to compute an element model");
|
| + }
|
|
|
| void test_performAnalysisTask_modifiedAfterParse() {
|
| // TODO(scheglov) no threads in Dart
|
| @@ -1840,6 +1751,87 @@ main() {}''');
|
| // JUnitTestCase.assertNotNullMsg("performAnalysisTask failed to compute an element model", _context.getLibraryElement(source));
|
| }
|
|
|
| + void test_performAnalysisTask_onResultComputed() {
|
| + Set<String> libraryElementUris = new Set<String>();
|
| + Set<String> parsedUnitUris = new Set<String>();
|
| + Set<String> resolvedUnitUris = new Set<String>();
|
| + // listen
|
| + context.onResultComputed(LIBRARY_ELEMENT).listen((event) {
|
| + Source librarySource = event.target;
|
| + libraryElementUris.add(librarySource.uri.toString());
|
| + });
|
| + context.onResultComputed(PARSED_UNIT).listen((event) {
|
| + Source source = event.target;
|
| + parsedUnitUris.add(source.uri.toString());
|
| + });
|
| + context.onResultComputed(RESOLVED_UNIT).listen((event) {
|
| + LibrarySpecificUnit target = event.target;
|
| + Source librarySource = target.library;
|
| + resolvedUnitUris.add(librarySource.uri.toString());
|
| + });
|
| + // analyze
|
| + addSource('/test.dart', 'main() {}');
|
| + _analyzeAll_assertFinished();
|
| + // verify
|
| + expect(libraryElementUris, contains('dart:core'));
|
| + expect(libraryElementUris, contains('file:///test.dart'));
|
| + expect(parsedUnitUris, contains('dart:core'));
|
| + expect(parsedUnitUris, contains('file:///test.dart'));
|
| + expect(resolvedUnitUris, contains('dart:core'));
|
| + expect(resolvedUnitUris, contains('file:///test.dart'));
|
| + }
|
| +
|
| +// void test_resolveCompilationUnit_sourceChangeDuringResolution() {
|
| +// _context = new _AnalysisContext_sourceChangeDuringResolution();
|
| +// AnalysisContextFactory.initContextWithCore(_context);
|
| +// _sourceFactory = _context.sourceFactory;
|
| +// Source source = _addSource("/lib.dart", "library lib;");
|
| +// CompilationUnit compilationUnit =
|
| +// _context.resolveCompilationUnit2(source, source);
|
| +// expect(compilationUnit, isNotNull);
|
| +// expect(_context.getLineInfo(source), isNotNull);
|
| +// }
|
| +
|
| + void test_resolveCompilationUnit_import_relative() {
|
| + Source sourceA =
|
| + addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
|
| + addSource("/libB.dart", "library libB; class B{}");
|
| + CompilationUnit compilationUnit =
|
| + context.resolveCompilationUnit2(sourceA, sourceA);
|
| + expect(compilationUnit, isNotNull);
|
| + LibraryElement library = compilationUnit.element.library;
|
| + List<LibraryElement> importedLibraries = library.importedLibraries;
|
| + assertNamedElements(importedLibraries, ["dart.core", "libB"]);
|
| + List<LibraryElement> visibleLibraries = library.visibleLibraries;
|
| + assertNamedElements(visibleLibraries, [
|
| + "dart.core",
|
| + "dart.async",
|
| + "dart.math",
|
| + "libA",
|
| + "libB"
|
| + ]);
|
| + }
|
| +
|
| + void test_resolveCompilationUnit_import_relative_cyclic() {
|
| + Source sourceA =
|
| + addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
|
| + addSource("/libB.dart", "library libB; import 'libA.dart'; class B{}");
|
| + CompilationUnit compilationUnit =
|
| + context.resolveCompilationUnit2(sourceA, sourceA);
|
| + expect(compilationUnit, isNotNull);
|
| + LibraryElement library = compilationUnit.element.library;
|
| + List<LibraryElement> importedLibraries = library.importedLibraries;
|
| + assertNamedElements(importedLibraries, ["dart.core", "libB"]);
|
| + List<LibraryElement> visibleLibraries = library.visibleLibraries;
|
| + assertNamedElements(visibleLibraries, [
|
| + "dart.core",
|
| + "dart.async",
|
| + "dart.math",
|
| + "libA",
|
| + "libB"
|
| + ]);
|
| + }
|
| +
|
| void test_resolveCompilationUnit_library() {
|
| Source source = addSource("/lib.dart", "library lib;");
|
| LibraryElement library = context.computeLibraryElement(source);
|
| @@ -1945,6 +1937,24 @@ int a = 0;''');
|
| expect(_getIncrementalAnalysisCache(context), isNull);
|
| }
|
|
|
| + void test_setContents_unchanged_consistentModificationTime() {
|
| + String contents = "// foo";
|
| + Source source = addSource("/test.dart", contents);
|
| + context.setContents(source, contents);
|
| + // do all, no tasks
|
| + _analyzeAll_assertFinished();
|
| + {
|
| + AnalysisResult result = context.performAnalysisTask();
|
| + expect(result.changeNotices, isNull);
|
| + }
|
| + // set the same contents, still no tasks
|
| + context.setContents(source, contents);
|
| + {
|
| + AnalysisResult result = context.performAnalysisTask();
|
| + expect(result.changeNotices, isNull);
|
| + }
|
| + }
|
| +
|
| void test_setSourceFactory() {
|
| expect(context.sourceFactory, sourceFactory);
|
| SourceFactory factory = new SourceFactory([]);
|
| @@ -1965,52 +1975,6 @@ int a = 0;''');
|
| expect(context.sourcesNeedingProcessing.contains(source), isFalse);
|
| }
|
|
|
| - Future test_computeResolvedCompilationUnitAsync() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - // Complete all pending analysis tasks and flush the AST so that it won't
|
| - // be available immediately.
|
| - _performPendingAnalysisTasks();
|
| - _flushAst(source);
|
| - bool completed = false;
|
| - context
|
| - .computeResolvedCompilationUnitAsync(source, source)
|
| - .then((CompilationUnit unit) {
|
| - expect(unit, isNotNull);
|
| - completed = true;
|
| - });
|
| - return pumpEventQueue().then((_) {
|
| - expect(completed, isFalse);
|
| - _performPendingAnalysisTasks();
|
| - }).then((_) => pumpEventQueue()).then((_) {
|
| - expect(completed, isTrue);
|
| - });
|
| - }
|
| -
|
| - Future test_computeResolvedCompilationUnitAsync_cancel() {
|
| - Source source = addSource("/lib.dart", "library lib;");
|
| - // Complete all pending analysis tasks and flush the AST so that it won't
|
| - // be available immediately.
|
| - _performPendingAnalysisTasks();
|
| - _flushAst(source);
|
| - CancelableFuture<CompilationUnit> future =
|
| - context.computeResolvedCompilationUnitAsync(source, source);
|
| - bool completed = false;
|
| - future.then((CompilationUnit unit) {
|
| - fail('Future should have been canceled');
|
| - }, onError: (error) {
|
| - expect(error, new isInstanceOf<FutureCanceledError>());
|
| - completed = true;
|
| - });
|
| - expect(completed, isFalse);
|
| - expect(context.pendingFutureSources_forTesting, isNotEmpty);
|
| - future.cancel();
|
| - expect(context.pendingFutureSources_forTesting, isEmpty);
|
| - return pumpEventQueue().then((_) {
|
| - expect(completed, isTrue);
|
| - expect(context.pendingFutureSources_forTesting, isEmpty);
|
| - });
|
| - }
|
| -
|
| void xtest_performAnalysisTask_stress() {
|
| int maxCacheSize = 4;
|
| AnalysisOptionsImpl options =
|
|
|