Version 1.13.0-dev.7.11
cherry-pick bf713555bffaece660b0df2ee5fed44603fa5c9a to dev
cherry-pick 00396f5df0b2a9c471a760af9e55cbe5a5acb39b to dev
cherry-pick e1c39602ba1ef866934f35d3d8a0ab7f8efa38e5 to dev
cherry-pick 02fe5bcd5af7b25e0ff2fd73c751865b323baf85 to dev
cherry-pick 5b61845221b0d40f31edf5cfc2155e2253b2aa72 to dev
cherry-pick a19b2985dcee58b92a5324842051b72642793e4b to dev
cherry-pick a21e3a5a7f954649434c1edfa6cba5c0e99f8bc9 to dev
cherry-pick eac5a0eb15d79f0cc048ca3bd909f434c36696ee to dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b8a6e6b..52b004a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -38,8 +38,7 @@
sockets and `HttpServer` to distribute accepted sockets between isolates.
* `dart:isolate`
- * `Isolate` added `packageRoot` and `packageMap` getters.
- * `Isolate.spawnUri` added `packageMap` parameter.
+ * `spawnUri` added an `environment` named argument.
### Tool changes
diff --git a/DEPS b/DEPS
index 31a38ba..1b0567c 100644
--- a/DEPS
+++ b/DEPS
@@ -51,7 +51,7 @@
"crypto_rev" : "@2df57a1e26dd88e8d0614207d4b062c73209917d",
"csslib_tag" : "@0.12.0",
"dart2js_info_rev" : "@c4ad464717e3a304fb0d44a6937c25ff2049b863",
- "dartdoc_rev" : "@02a94ec329ab8b5767e0d20f6585b9cf5c937c73",
+ "dartdoc_rev" : "@18f85ff0b389c417550e541055a84b04273f2b38",
"dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
"dart_style_tag": "@0.2.0",
"dev_compiler_rev": "@0.1.9",
diff --git a/pkg/analysis_server/lib/src/analysis_logger.dart b/pkg/analysis_server/lib/src/analysis_logger.dart
index 9e751a4..04ad6c6 100644
--- a/pkg/analysis_server/lib/src/analysis_logger.dart
+++ b/pkg/analysis_server/lib/src/analysis_logger.dart
@@ -4,6 +4,7 @@
library analysis.logger;
+import 'package:analysis_server/src/analysis_server.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/java_engine.dart';
import 'package:logging/logging.dart' as logging;
@@ -18,7 +19,13 @@
*/
final logging.Logger baseLogger = new logging.Logger('analysis.server');
- AnalysisLogger() {
+ /**
+ * The analysis server that is using this logger.
+ */
+ final AnalysisServer server;
+
+ AnalysisLogger(this.server) {
+ assert(server != null);
logging.Logger.root.onRecord.listen((logging.LogRecord record) {
AnalysisEngine.instance.instrumentationService.logLogEntry(
record.level.name,
@@ -36,6 +43,8 @@
} else {
baseLogger.severe(message, exception.exception, exception.stackTrace);
}
+ server.sendServerErrorNotification(
+ message, exception, exception?.stackTrace);
}
@override
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 9222f4e..c42b327 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -9,7 +9,6 @@
import 'dart:core' hide Resource;
import 'dart:math' show max;
-import 'package:analysis_server/plugin/analysis/analyzed_files.dart';
import 'package:analysis_server/plugin/analysis/resolver_provider.dart';
import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element;
import 'package:analysis_server/src/analysis_logger.dart';
@@ -316,7 +315,7 @@
options.enableIncrementalResolutionValidation;
defaultContextOptions.generateImplicitErrors = false;
_noErrorNotification = options.noErrorNotification;
- AnalysisEngine.instance.logger = new AnalysisLogger();
+ AnalysisEngine.instance.logger = new AnalysisLogger(this);
_onAnalysisStartedController = new StreamController.broadcast();
_onFileAnalyzedController = new StreamController.broadcast();
_onPriorityChangeController =
@@ -711,7 +710,11 @@
channel.sendResponse(new Response.unknownRequest(request));
});
}, onError: (exception, stackTrace) {
- sendServerErrorNotification(exception, stackTrace, fatal: true);
+ sendServerErrorNotification(
+ 'Failed to handle request: ${request.toJson()}',
+ exception,
+ stackTrace,
+ fatal: true);
});
}
@@ -792,12 +795,13 @@
try {
operation.perform(this);
} catch (exception, stackTrace) {
- AnalysisEngine.instance.logger.logError("${exception}\n${stackTrace}");
+ sendServerErrorNotification(
+ 'Failed to perform operation: $operation', exception, stackTrace,
+ fatal: true);
if (rethrowExceptions) {
throw new AnalysisException('Unexpected exception during analysis',
new CaughtException(exception, stackTrace));
}
- sendServerErrorNotification(exception, stackTrace, fatal: true);
shutdown();
} finally {
if (_test_onOperationPerformedCompleter != null) {
@@ -887,7 +891,8 @@
/**
* Sends a `server.error` notification.
*/
- void sendServerErrorNotification(exception, stackTrace, {bool fatal: false}) {
+ void sendServerErrorNotification(String msg, exception, stackTrace,
+ {bool fatal: false}) {
// prepare exception.toString()
String exceptionString;
if (exception != null) {
@@ -895,6 +900,8 @@
} else {
exceptionString = 'null exception';
}
+ // prepare message
+ String message = msg != null ? '$msg\n$exceptionString' : exceptionString;
// prepare stackTrace.toString()
String stackTraceString;
if (stackTrace != null) {
@@ -912,7 +919,7 @@
}
// send the notification
channel.sendNotification(
- new ServerErrorParams(fatal, exceptionString, stackTraceString)
+ new ServerErrorParams(fatal, message, stackTraceString)
.toNotification());
}
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index b3dbca7..e232607 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -311,6 +311,11 @@
*/
class ContextManagerImpl implements ContextManager {
/**
+ * The name of the `doc` directory.
+ */
+ static const String DOC_DIR_NAME = 'doc';
+
+ /**
* The name of the `lib` directory.
*/
static const String LIB_DIR_NAME = 'lib';
@@ -694,7 +699,9 @@
* Recursively adds all Dart and HTML files to the [changeSet].
*/
void _addSourceFiles(ChangeSet changeSet, Folder folder, ContextInfo info) {
- if (info.excludesResource(folder) || folder.shortName.startsWith('.')) {
+ if (info.excludesResource(folder) ||
+ folder.shortName.startsWith('.') ||
+ _isInTopLevelDocDir(info.folder.path, folder.path)) {
return;
}
List<Resource> children = null;
@@ -1052,7 +1059,10 @@
_recomputeFolderDisposition(info);
}
// maybe excluded globally
- if (_isExcluded(path) || _isContainedInDotFolder(info.folder.path, path)) {
+ if (_isExcluded(path) ||
+ _isContainedInDotFolder(info.folder.path, path) ||
+ _isInPackagesDir(info.folder.path, path) ||
+ _isInTopLevelDocDir(info.folder.path, path)) {
return;
}
// maybe excluded from the context, so other context will handle it
@@ -1065,10 +1075,6 @@
// handle the change
switch (event.type) {
case ChangeType.ADD:
- if (_isInPackagesDir(path, info.folder)) {
- return;
- }
-
Resource resource = resourceProvider.getResource(path);
String directoryPath = pathContext.dirname(path);
@@ -1204,15 +1210,25 @@
}
/**
- * Determine if the path from [folder] to [path] contains a 'packages'
- * directory.
+ * Determine whether the given [path], when interpreted relative to the
+ * context root [root], contains a 'packages' folder.
*/
- bool _isInPackagesDir(String path, Folder folder) {
- String relativePath = pathContext.relative(path, from: folder.path);
+ bool _isInPackagesDir(String root, String path) {
+ String relativePath = pathContext.relative(path, from: root);
List<String> pathParts = pathContext.split(relativePath);
return pathParts.contains(PACKAGES_NAME);
}
+ /**
+ * Determine whether the given [path] is in the direct 'doc' folder of the
+ * context root [root].
+ */
+ bool _isInTopLevelDocDir(String root, String path) {
+ String relativePath = pathContext.relative(path, from: root);
+ return relativePath == DOC_DIR_NAME ||
+ relativePath.startsWith(DOC_DIR_NAME + pathContext.separator);
+ }
+
bool _isPackagespec(String path) =>
pathContext.basename(path) == PACKAGE_SPEC_NAME;
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index e204732..6d43e53 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -142,7 +142,10 @@
}
return null;
}, onError: (exception, stackTrace) {
- server.sendServerErrorNotification(exception, stackTrace);
+ server.sendServerErrorNotification(
+ 'Failed to handle completion domain request: ${request.toJson()}',
+ exception,
+ stackTrace);
});
}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 1e430d5..aeb8d03 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -276,7 +276,8 @@
try {
f();
} catch (exception, stackTrace) {
- server.sendServerErrorNotification(exception, stackTrace);
+ server.sendServerErrorNotification(
+ 'Failed to send notification', exception, stackTrace);
}
});
}
@@ -418,7 +419,8 @@
scheduleIndexOperation(server, file, dartUnit);
}
} catch (exception, stackTrace) {
- server.sendServerErrorNotification(exception, stackTrace);
+ server.sendServerErrorNotification(
+ 'Failed to index Dart file: $file', exception, stackTrace);
}
// HTML
try {
@@ -427,7 +429,8 @@
server.addOperation(new _HtmlIndexOperation(context, file, htmlUnit));
}
} catch (exception, stackTrace) {
- server.sendServerErrorNotification(exception, stackTrace);
+ server.sendServerErrorNotification(
+ 'Failed to index HTML file: $file', exception, stackTrace);
}
}
}
@@ -463,7 +466,8 @@
AnalysisContext context = unit.element.context;
index.index(context, unit);
} catch (exception, stackTrace) {
- server.sendServerErrorNotification(exception, stackTrace);
+ server.sendServerErrorNotification(
+ 'Failed to index: $file', exception, stackTrace);
}
});
}
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 695693c..0a666f3 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -85,7 +85,7 @@
TypeHierarchyItem subItem = _elementItemMap[subElement];
if (subItem != null) {
int id = _items.indexOf(subItem);
- subItem.subclasses.add(id);
+ item.subclasses.add(id);
continue;
}
// create a subclass item
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index 698f63f..f00f452 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -452,7 +452,8 @@
dynamic exception, StackTrace stackTrace) {
service.logPriorityException(exception, stackTrace);
AnalysisServer analysisServer = socketServer.analysisServer;
- analysisServer.sendServerErrorNotification(exception, stackTrace);
+ analysisServer.sendServerErrorNotification(
+ 'Captured exception', exception, stackTrace);
throw exception;
};
Function printFunction = print == null
diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart
index 05d651b..a83d95e 100644
--- a/pkg/analysis_server/lib/src/status/get_handler.dart
+++ b/pkg/analysis_server/lib/src/status/get_handler.dart
@@ -377,7 +377,8 @@
MapIterator<AnalysisTarget, CacheEntry> iterator =
context.analysisCache.iterator();
while (iterator.moveNext()) {
- if (iterator.value.exception != null) {
+ CacheEntry entry = iterator.value;
+ if (entry == null || entry.exception != null) {
return true;
}
}
@@ -1344,6 +1345,9 @@
String key = folder.shortName;
buffer.write(makeLink(CONTEXT_PATH, {CONTEXT_QUERY_PARAM: folder.path},
key, _hasException(folderMap[folder])));
+ if (!folder.getChild('.packages').exists) {
+ buffer.write(' <b>[No .packages file]</b>');
+ }
});
// TODO(brianwilkerson) Add items for the SDK contexts (currently only one).
buffer.write('</p>');
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index 26f85a2..081c8b6 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -915,6 +915,19 @@
callbacks.assertContextFiles(project, [fileA, fileB]);
}
+ void test_setRoots_ignoreDocFolder() {
+ String project = '/project';
+ String fileA = '$project/foo.dart';
+ String fileB = '$project/lib/doc/bar.dart';
+ String fileC = '$project/doc/bar.dart';
+ resourceProvider.newFile(fileA, '');
+ resourceProvider.newFile(fileB, '');
+ resourceProvider.newFile(fileC, '');
+ manager.setRoots(<String>[project], <String>[], <String, String>{});
+ callbacks.assertContextPaths([project]);
+ callbacks.assertContextFiles(project, [fileA, fileB]);
+ }
+
void test_setRoots_newFolderWithPackageRoot() {
String packageRootPath = '/package';
manager.setRoots(<String>[projPath], <String>[],
@@ -1199,6 +1212,44 @@
});
}
+ test_watch_addFile_inDocFolder_inner() {
+ // prepare paths
+ String project = '/project';
+ String fileA = '$project/a.dart';
+ String fileB = '$project/lib/doc/b.dart';
+ // create files
+ resourceProvider.newFile(fileA, '');
+ // set roots
+ manager.setRoots(<String>[project], <String>[], <String, String>{});
+ callbacks.assertContextPaths([project]);
+ callbacks.assertContextFiles(project, [fileA]);
+ // add a "lib/doc" file, it is not ignored
+ resourceProvider.newFile(fileB, '');
+ return pumpEventQueue().then((_) {
+ callbacks.assertContextPaths([project]);
+ callbacks.assertContextFiles(project, [fileA, fileB]);
+ });
+ }
+
+ test_watch_addFile_inDocFolder_topLevel() {
+ // prepare paths
+ String project = '/project';
+ String fileA = '$project/a.dart';
+ String fileB = '$project/doc/b.dart';
+ // create files
+ resourceProvider.newFile(fileA, '');
+ // set roots
+ manager.setRoots(<String>[project], <String>[], <String, String>{});
+ callbacks.assertContextPaths([project]);
+ callbacks.assertContextFiles(project, [fileA]);
+ // add a "doc" file, it is ignored
+ resourceProvider.newFile(fileB, '');
+ return pumpEventQueue().then((_) {
+ callbacks.assertContextPaths([project]);
+ callbacks.assertContextFiles(project, [fileA]);
+ });
+ }
+
test_watch_addFile_pathContainsDotFile() async {
// If a file is added and the path to it (relative to the context root)
// contains a folder whose name begins with '.', then the file is ignored.
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index 037d7bb..1d6ddf9a 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -75,7 +75,7 @@
'superclass': 1,
'interfaces': [],
'mixins': [],
- 'subclasses': []
+ 'subclasses': [1]
},
{
'classElement': {
@@ -87,7 +87,7 @@
'superclass': 0,
'interfaces': [],
'mixins': [],
- 'subclasses': [1]
+ 'subclasses': []
}
]);
}
@@ -107,6 +107,66 @@
expect(itemA.displayName, 'A<int>');
}
+ test_class_double_subclass() async {
+ addTestFile('''
+class AAA {} // A
+
+class BBB extends AAA {}
+
+class CCC extends BBB implements AAA {}
+''');
+ List<TypeHierarchyItem> items = await _getTypeHierarchy('AAA {} // A');
+ expect(_toJson(items), [
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'AAA',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'superclass': 1,
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': [2, 3]
+ },
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'Object',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': []
+ },
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'CCC',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'superclass': 0,
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': []
+ },
+ {
+ 'classElement': {
+ 'kind': 'CLASS',
+ 'name': 'BBB',
+ 'location': anything,
+ 'flags': 0
+ },
+ 'superclass': 0,
+ 'interfaces': [],
+ 'mixins': [],
+ 'subclasses': [2]
+ }
+ ]);
+ }
+
test_class_extends_fileAndPackageUris() async {
// prepare packages
String pkgFile = '/packages/pkgA/libA.dart';
diff --git a/pkg/analyzer/lib/src/task/dart_work_manager.dart b/pkg/analyzer/lib/src/task/dart_work_manager.dart
index 62a25ea..793d9ce 100644
--- a/pkg/analyzer/lib/src/task/dart_work_manager.dart
+++ b/pkg/analyzer/lib/src/task/dart_work_manager.dart
@@ -88,7 +88,8 @@
analysisCache.onResultInvalidated.listen((InvalidatedResult event) {
if (event.descriptor == LIBRARY_ERRORS_READY) {
CacheEntry entry = event.entry;
- if (entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY) {
+ if (entry.explicitlyAdded &&
+ entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY) {
librarySourceQueue.add(entry.target);
}
}
@@ -392,7 +393,10 @@
unitTargets.add(target);
Source library = target.library;
if (context.exists(library)) {
- librarySourceQueue.add(library);
+ CacheEntry entry = iterator.value;
+ if (entry.explicitlyAdded) {
+ librarySourceQueue.add(library);
+ }
}
}
}
@@ -408,6 +412,8 @@
entry.setState(EXPLICITLY_IMPORTED_LIBRARIES, CacheState.INVALID);
entry.setState(EXPORTED_LIBRARIES, CacheState.INVALID);
entry.setState(INCLUDED_PARTS, CacheState.INVALID);
+ entry.setState(LIBRARY_SPECIFIC_UNITS, CacheState.INVALID);
+ entry.setState(UNITS, CacheState.INVALID);
}
}
}
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
index f550495..af67453 100644
--- a/pkg/analyzer/lib/task/model.dart
+++ b/pkg/analyzer/lib/task/model.dart
@@ -211,7 +211,7 @@
} on AnalysisException catch (exception, stackTrace) {
caughtException = new CaughtException(exception, stackTrace);
AnalysisEngine.instance.logger
- .logInformation("Task failed: ${description}", caughtException);
+ .logError("Task failed: ${description}", caughtException);
}
}
diff --git a/pkg/analyzer/test/src/context/abstract_context.dart b/pkg/analyzer/test/src/context/abstract_context.dart
index 09c30b2..135fd42 100644
--- a/pkg/analyzer/test/src/context/abstract_context.dart
+++ b/pkg/analyzer/test/src/context/abstract_context.dart
@@ -28,6 +28,9 @@
AnalysisCache analysisCache;
AnalysisDriver analysisDriver;
+ UriResolver sdkResolver;
+ UriResolver resourceResolver;
+
AnalysisTask task;
Map<ResultDescriptor<dynamic>, dynamic> oldOutputs;
Map<ResultDescriptor<dynamic>, dynamic> outputs;
@@ -107,10 +110,10 @@
}
void prepareAnalysisContext([AnalysisOptions options]) {
- sourceFactory = new SourceFactory(<UriResolver>[
- new DartUriResolver(sdk),
- new ResourceUriResolver(resourceProvider)
- ]);
+ sdkResolver = new DartUriResolver(sdk);
+ resourceResolver = new ResourceUriResolver(resourceProvider);
+ sourceFactory =
+ new SourceFactory(<UriResolver>[sdkResolver, resourceResolver]);
context = createAnalysisContext();
if (options != null) {
context.analysisOptions = options;
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index f0d2110..4d68fd3 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -7,6 +7,7 @@
import 'dart:async';
import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
import 'package:analyzer/src/cancelable_future.dart';
import 'package:analyzer/src/context/cache.dart';
import 'package:analyzer/src/context/context.dart';
@@ -34,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/src/generated/utilities_collection.dart';
import 'package:analyzer/src/task/dart.dart';
import 'package:analyzer/src/task/html.dart';
import 'package:analyzer/task/dart.dart';
@@ -1954,6 +1956,60 @@
expect(resolvedUnitUris, contains('file:///test.dart'));
}
+ void test_performAnalysisTask_switchPackageVersion() {
+ // version 1
+ resourceProvider.newFile(
+ '/pkgs/crypto-1/lib/crypto.dart',
+ r'''
+library crypto;
+part 'src/hash_utils.dart';
+''');
+ resourceProvider.newFile(
+ '/pkgs/crypto-1/lib/src/hash_utils.dart',
+ r'''
+part of crypto;
+const _MASK_8 = 0xff;
+''');
+ // version 2
+ resourceProvider.newFile(
+ '/pkgs/crypto-2/lib/crypto.dart',
+ r'''
+library crypto;
+part 'src/hash_utils.dart';
+''');
+ resourceProvider.newFile(
+ '/pkgs/crypto-2/lib/src/hash_utils.dart',
+ r'''
+part of crypto;
+const _MASK_8 = 0xff;
+''');
+ // use version 1
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'crypto': [resourceProvider.getFolder('/pkgs/crypto-1/lib')]
+ })
+ ]);
+ // analyze
+ addSource(
+ "/test.dart",
+ r'''
+import 'package:crypto/crypto.dart';
+''');
+ _analyzeAll_assertFinished();
+ // use version 2
+ context.sourceFactory = new SourceFactory(<UriResolver>[
+ sdkResolver,
+ resourceResolver,
+ new PackageMapUriResolver(resourceProvider, {
+ 'crypto': [resourceProvider.getFolder('/pkgs/crypto-2/lib')]
+ })
+ ]);
+ _analyzeAll_assertFinished();
+ _assertNoExceptions();
+ }
+
void test_resolveCompilationUnit_import_relative() {
Source sourceA =
addSource("/libA.dart", "library libA; import 'libB.dart'; class A{}");
@@ -1993,6 +2049,13 @@
expect(compilationUnit.element, isNotNull);
}
+ void test_resolveCompilationUnit_source() {
+ Source source = addSource("/lib.dart", "library lib;");
+ CompilationUnit compilationUnit =
+ context.resolveCompilationUnit2(source, source);
+ expect(compilationUnit, isNotNull);
+ }
+
// void test_resolveCompilationUnit_sourceChangeDuringResolution() {
// _context = new _AnalysisContext_sourceChangeDuringResolution();
// AnalysisContextFactory.initContextWithCore(_context);
@@ -2004,13 +2067,6 @@
// expect(_context.getLineInfo(source), isNotNull);
// }
- void test_resolveCompilationUnit_source() {
- Source source = addSource("/lib.dart", "library lib;");
- CompilationUnit compilationUnit =
- context.resolveCompilationUnit2(source, source);
- expect(compilationUnit, isNotNull);
- }
-
void test_setAnalysisOptions() {
AnalysisOptionsImpl options = new AnalysisOptionsImpl();
options.cacheSize = 42;
@@ -2263,6 +2319,24 @@
fail("performAnalysisTask failed to terminate after analyzing all sources");
}
+ void _assertNoExceptions() {
+ MapIterator<AnalysisTarget, CacheEntry> iterator = analysisCache.iterator();
+ String exceptionsStr = '';
+ while (iterator.moveNext()) {
+ CaughtException exception = iterator.value.exception;
+ if (exception != null) {
+ AnalysisTarget target = iterator.key;
+ exceptionsStr +=
+ '============= key: $target source: ${target.source}\n';
+ exceptionsStr += exception.toString();
+ exceptionsStr += '\n';
+ }
+ }
+ if (exceptionsStr.isNotEmpty) {
+ fail(exceptionsStr);
+ }
+ }
+
void _changeSource(TestSource source, String contents) {
source.setContents(contents);
ChangeSet changeSet = new ChangeSet();
diff --git a/pkg/analyzer/test/src/task/dart_work_manager_test.dart b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
index 8dd7dbc..a10cfef 100644
--- a/pkg/analyzer/test/src/task/dart_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
@@ -64,10 +64,10 @@
void setUp() {
cache = context.analysisCache;
manager = new DartWorkManager(context);
- entry1 = context.getCacheEntry(source1);
- entry2 = context.getCacheEntry(source2);
- entry3 = context.getCacheEntry(source3);
- entry4 = context.getCacheEntry(source4);
+ entry1 = _getOrCreateEntry(source1);
+ entry2 = _getOrCreateEntry(source2);
+ entry3 = _getOrCreateEntry(source3);
+ entry4 = _getOrCreateEntry(source4);
}
void test_applyChange_add() {
@@ -509,6 +509,8 @@
}
void test_onResultInvalidated_scheduleInvalidatedLibraries() {
+ // make source3 implicit
+ entry3.explicitlyAdded = false;
// set SOURCE_KIND
entry1.setValue(SOURCE_KIND, SourceKind.LIBRARY, []);
entry2.setValue(SOURCE_KIND, SourceKind.PART, []);
@@ -519,9 +521,9 @@
// invalidate LIBRARY_ERRORS_READY for source1, schedule it
entry1.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
expect_librarySourceQueue([source1]);
- // invalidate LIBRARY_ERRORS_READY for source3, schedule it
+ // invalidate LIBRARY_ERRORS_READY for source3, implicit, not scheduled
entry3.setState(LIBRARY_ERRORS_READY, CacheState.INVALID);
- expect_librarySourceQueue([source1, source3]);
+ expect_librarySourceQueue([source1]);
}
void test_onSourceFactoryChanged() {
@@ -532,6 +534,8 @@
entry1.setValue(EXPLICITLY_IMPORTED_LIBRARIES, <Source>[], []);
entry1.setValue(EXPORTED_LIBRARIES, <Source>[], []);
entry1.setValue(INCLUDED_PARTS, <Source>[], []);
+ entry1.setValue(LIBRARY_SPECIFIC_UNITS, <LibrarySpecificUnit>[], []);
+ entry1.setValue(UNITS, <Source>[], []);
// configure LibrarySpecificUnit
LibrarySpecificUnit unitTarget = new LibrarySpecificUnit(source2, source3);
CacheEntry unitEntry = new CacheEntry(unitTarget);
@@ -548,6 +552,8 @@
expect(entry1.getState(EXPLICITLY_IMPORTED_LIBRARIES), CacheState.INVALID);
expect(entry1.getState(EXPORTED_LIBRARIES), CacheState.INVALID);
expect(entry1.getState(INCLUDED_PARTS), CacheState.INVALID);
+ expect(entry1.getState(LIBRARY_SPECIFIC_UNITS), CacheState.INVALID);
+ expect(entry1.getState(UNITS), CacheState.INVALID);
}
void test_resultsComputed_errors_forLibrarySpecificUnit() {
@@ -745,10 +751,11 @@
expect(manager.libraryPartsMap, isEmpty);
}
- CacheEntry _getOrCreateEntry(Source source) {
+ CacheEntry _getOrCreateEntry(Source source, [bool explicit = true]) {
CacheEntry entry = cache.get(source);
if (entry == null) {
entry = new CacheEntry(source);
+ entry.explicitlyAdded = explicit;
cache.put(entry);
}
return entry;
diff --git a/tools/VERSION b/tools/VERSION
index 33535da..ba645bc 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
MINOR 13
PATCH 0
PRERELEASE 7
-PRERELEASE_PATCH 10
+PRERELEASE_PATCH 11