Chromium Code Reviews| Index: pkg/analyzer/lib/src/generated/sdk_io.dart |
| diff --git a/pkg/analyzer/lib/src/generated/sdk_io.dart b/pkg/analyzer/lib/src/generated/sdk_io.dart |
| index 0d053f6b1f2e5b2cf6a60c9705a35b802a2c5dda..acdc3ab11fce604592a26c79bbdcdde5735a1499 100644 |
| --- a/pkg/analyzer/lib/src/generated/sdk_io.dart |
| +++ b/pkg/analyzer/lib/src/generated/sdk_io.dart |
| @@ -25,6 +25,205 @@ import 'package:analyzer/src/summary/summary_sdk.dart'; |
| import 'package:path/path.dart' as pathos; |
| /** |
| + * An abstract implementation of a Dart SDK in which the available libraries are |
| + * stored in a library map. Subclasses are responsible for populating the |
| + * library map. |
| + */ |
| +abstract class AbstractDartSdk implements DartSdk { |
| + /** |
| + * A mapping from Dart library URI's to the library represented by that URI. |
| + */ |
| + LibraryMap libraryMap = new LibraryMap(); |
|
pquitslund
2016/06/14 17:50:59
Any reason not to make this final?
Brian Wilkerson
2016/06/14 20:53:03
Yes. Unless we change it, DirectoryBasedDartSdk cr
|
| + |
| + /** |
| + * The [AnalysisOptions] to use to create the [context]. |
| + */ |
| + AnalysisOptions _analysisOptions; |
| + |
| + /** |
| + * The flag that specifies whether an SDK summary should be used. This is a |
| + * temporary flag until summaries are enabled by default. |
| + */ |
| + bool _useSummary = false; |
| + |
| + /** |
| + * The [AnalysisContext] which is used for all of the sources in this sdk. |
|
pquitslund
2016/06/14 17:50:59
sdk => SDK ?
Brian Wilkerson
2016/06/14 20:53:03
Done
|
| + */ |
| + InternalAnalysisContext _analysisContext; |
| + |
| + /** |
| + * The mapping from Dart URI's to the corresponding sources. |
| + */ |
| + Map<String, Source> _uriToSourceMap = new HashMap<String, Source>(); |
| + |
| + /** |
| + * Set the [options] for this SDK analysis context. Throw [StateError] if the |
| + * context has been already created. |
| + */ |
| + void set analysisOptions(AnalysisOptions options) { |
| + if (_analysisContext != null) { |
| + throw new StateError( |
| + 'Analysis options cannot be changed after context creation.'); |
| + } |
| + _analysisOptions = options; |
| + } |
| + |
| + @override |
| + AnalysisContext get context { |
| + if (_analysisContext == null) { |
| + _analysisContext = new SdkAnalysisContext(_analysisOptions); |
| + SourceFactory factory = new SourceFactory([new DartUriResolver(this)]); |
| + _analysisContext.sourceFactory = factory; |
| + if (_useSummary) { |
| + bool strongMode = _analysisOptions?.strongMode ?? false; |
| + PackageBundle sdkBundle = getSummarySdkBundle(strongMode); |
| + if (sdkBundle != null) { |
| + _analysisContext.resultProvider = new SdkSummaryResultProvider( |
| + _analysisContext, sdkBundle, strongMode); |
| + } |
| + } |
| + } |
| + return _analysisContext; |
| + } |
| + |
| + @override |
| + List<SdkLibrary> get sdkLibraries => libraryMap.sdkLibraries; |
| + |
| + @override |
| + List<String> get uris => libraryMap.uris; |
| + |
| + /** |
| + * Return `true` if the SDK summary will be used when available. |
| + */ |
| + bool get useSummary => _useSummary; |
| + |
| + /** |
| + * Specify whether SDK summary should be used. |
| + */ |
| + void set useSummary(bool use) { |
| + if (_analysisContext != null) { |
| + throw new StateError( |
| + 'The "useSummary" flag cannot be changed after context creation.'); |
| + } |
| + _useSummary = use; |
| + } |
| + |
| + @override |
| + Source fromFileUri(Uri uri) { |
| + JavaFile file = new JavaFile.fromUri(uri); |
| + |
| + String path = _getPath(file); |
| + if (path == null) { |
| + return null; |
| + } |
| + try { |
| + return new FileBasedSource(file, parseUriWithException(path)); |
| + } on URISyntaxException catch (exception, stackTrace) { |
| + AnalysisEngine.instance.logger.logInformation( |
| + "Failed to create URI: $path", |
| + new CaughtException(exception, stackTrace)); |
| + } |
| + return null; |
| + } |
| + |
| + String getRelativePathFromFile(JavaFile file); |
| + |
| + @override |
| + SdkLibrary getSdkLibrary(String dartUri) => libraryMap.getLibrary(dartUri); |
| + |
| + /** |
| + * Return the [PackageBundle] for this SDK, if it exists, or `null` otherwise. |
| + * This method should not be used outside of `analyzer` and `analyzer_cli` |
| + * packages. |
| + */ |
| + PackageBundle getSummarySdkBundle(bool strongMode); |
| + |
| + FileBasedSource internalMapDartUri(String dartUri) { |
| + // TODO(brianwilkerson) Figure out how to unify the implementations in the |
| + // two subclasses. |
| + String libraryName; |
| + String relativePath; |
| + int index = dartUri.indexOf('/'); |
| + if (index >= 0) { |
| + libraryName = dartUri.substring(0, index); |
| + relativePath = dartUri.substring(index + 1); |
| + } else { |
| + libraryName = dartUri; |
| + relativePath = ""; |
| + } |
| + SdkLibrary library = getSdkLibrary(libraryName); |
| + if (library == null) { |
| + return null; |
| + } |
| + String srcPath; |
| + if (relativePath.isEmpty) { |
| + srcPath = library.path; |
| + } else { |
| + String libraryPath = library.path; |
| + int index = libraryPath.lastIndexOf(JavaFile.separator); |
| + if (index == -1) { |
| + index = libraryPath.lastIndexOf('/'); |
| + if (index == -1) { |
| + return null; |
| + } |
| + } |
| + String prefix = libraryPath.substring(0, index + 1); |
| + srcPath = '$prefix$relativePath'; |
| + } |
| + String filePath = srcPath.replaceAll('/', JavaFile.separator); |
| + try { |
| + JavaFile file = new JavaFile(filePath); |
| + return new FileBasedSource(file, parseUriWithException(dartUri)); |
| + } on URISyntaxException { |
| + return null; |
| + } |
| + } |
| + |
| + @override |
| + Source mapDartUri(String dartUri) { |
| + Source source = _uriToSourceMap[dartUri]; |
| + if (source == null) { |
| + source = internalMapDartUri(dartUri); |
| + _uriToSourceMap[dartUri] = source; |
| + } |
| + return source; |
| + } |
| + |
| + String _getPath(JavaFile file) { |
| + List<SdkLibrary> libraries = libraryMap.sdkLibraries; |
| + int length = libraries.length; |
| + List<String> paths = new List(length); |
| + String filePath = getRelativePathFromFile(file); |
| + if (filePath == null) { |
| + return null; |
| + } |
| + for (int i = 0; i < length; i++) { |
| + SdkLibrary library = libraries[i]; |
| + String libraryPath = library.path.replaceAll('/', JavaFile.separator); |
| + if (filePath == libraryPath) { |
| + return library.shortName; |
| + } |
| + paths[i] = libraryPath; |
| + } |
| + for (int i = 0; i < length; i++) { |
| + SdkLibrary library = libraries[i]; |
| + String libraryPath = paths[i]; |
| + int index = libraryPath.lastIndexOf(JavaFile.separator); |
| + if (index >= 0) { |
| + String prefix = libraryPath.substring(0, index + 1); |
| + if (filePath.startsWith(prefix)) { |
| + String relPath = filePath |
| + .substring(prefix.length) |
| + .replaceAll(JavaFile.separator, '/'); |
| + return '${library.shortName}/$relPath'; |
| + } |
| + } |
| + } |
| + return null; |
| + } |
| +} |
| + |
| +/** |
| * A Dart SDK installed in a specified directory. Typical Dart SDK layout is |
| * something like... |
| * |
| @@ -40,7 +239,7 @@ import 'package:path/path.dart' as pathos; |
| * ... Dart utilities ... |
| * Chromium/ <-- Dartium typically exists in a sibling directory |
| */ |
| -class DirectoryBasedDartSdk implements DartSdk { |
| +class DirectoryBasedDartSdk extends AbstractDartSdk { |
| /** |
| * The default SDK, or `null` if the default SDK either has not yet been |
| * created or cannot be created for some reason. |
| @@ -193,11 +392,6 @@ class DirectoryBasedDartSdk implements DartSdk { |
| } |
| /** |
| - * The [AnalysisContext] which is used for all of the sources in this sdk. |
| - */ |
| - InternalAnalysisContext _analysisContext; |
| - |
| - /** |
| * The directory containing the SDK. |
| */ |
| JavaFile _sdkDirectory; |
| @@ -208,11 +402,6 @@ class DirectoryBasedDartSdk implements DartSdk { |
| JavaFile _libraryDirectory; |
| /** |
| - * The flag that specifies whether SDK summary should be used. |
| - */ |
| - bool _useSummary = false; |
| - |
| - /** |
| * The revision number of this SDK, or `"0"` if the revision number cannot be |
| * discovered. |
| */ |
| @@ -239,58 +428,13 @@ class DirectoryBasedDartSdk implements DartSdk { |
| JavaFile _vmExecutable; |
| /** |
| - * A mapping from Dart library URI's to the library represented by that URI. |
| - */ |
| - LibraryMap _libraryMap; |
| - |
| - /** |
| - * The mapping from Dart URI's to the corresponding sources. |
| - */ |
| - Map<String, Source> _uriToSourceMap = new HashMap<String, Source>(); |
| - |
| - /** |
| - * The [AnalysisOptions] to use to create the [context]. |
| - */ |
| - AnalysisOptions _analysisOptions; |
| - |
| - /** |
| * Initialize a newly created SDK to represent the Dart SDK installed in the |
| * [sdkDirectory]. The flag [useDart2jsPaths] is `true` if the dart2js path |
| * should be used when it is available |
| */ |
| DirectoryBasedDartSdk(JavaFile sdkDirectory, [bool useDart2jsPaths = false]) { |
| this._sdkDirectory = sdkDirectory.getAbsoluteFile(); |
| - _libraryMap = initialLibraryMap(useDart2jsPaths); |
| - } |
| - |
| - /** |
| - * Set the [options] for this SDK analysis context. Throw [StateError] if the |
| - * context has been already created. |
| - */ |
| - void set analysisOptions(AnalysisOptions options) { |
| - if (_analysisContext != null) { |
| - throw new StateError( |
| - 'Analysis options cannot be changed after context creation.'); |
| - } |
| - _analysisOptions = options; |
| - } |
| - |
| - @override |
| - AnalysisContext get context { |
| - if (_analysisContext == null) { |
| - _analysisContext = new SdkAnalysisContext(_analysisOptions); |
| - SourceFactory factory = new SourceFactory([new DartUriResolver(this)]); |
| - _analysisContext.sourceFactory = factory; |
| - if (_useSummary) { |
| - PackageBundle sdkBundle = getSummarySdkBundle(); |
| - if (sdkBundle != null) { |
| - bool strongMode = _analysisOptions?.strongMode ?? false; |
| - _analysisContext.resultProvider = new SdkSummaryResultProvider( |
| - _analysisContext, sdkBundle, strongMode); |
| - } |
| - } |
| - } |
| - return _analysisContext; |
| + libraryMap = initialLibraryMap(useDart2jsPaths); |
| } |
| /** |
| @@ -386,9 +530,6 @@ class DirectoryBasedDartSdk implements DartSdk { |
| return _pubExecutable; |
| } |
| - @override |
| - List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries; |
| - |
| /** |
| * Return the revision number of this SDK, or `"0"` if the revision number |
| * cannot be discovered. |
| @@ -411,25 +552,6 @@ class DirectoryBasedDartSdk implements DartSdk { |
| return _sdkVersion; |
| } |
| - @override |
| - List<String> get uris => _libraryMap.uris; |
| - |
| - /** |
| - * Whether an SDK summary should be used. |
| - */ |
| - bool get useSummary => _useSummary; |
| - |
| - /** |
| - * Specify whether SDK summary should be used. |
| - */ |
| - void set useSummary(bool use) { |
| - if (_analysisContext != null) { |
| - throw new StateError( |
| - 'The "useSummary" flag cannot be changed after context creation.'); |
| - } |
| - _useSummary = use; |
| - } |
| - |
| /** |
| * Return the name of the file containing the VM executable. |
| */ |
| @@ -470,45 +592,6 @@ class DirectoryBasedDartSdk implements DartSdk { |
| _LIBRARIES_FILE); |
| } |
| - @override |
| - Source fromFileUri(Uri uri) { |
| - JavaFile file = new JavaFile.fromUri(uri); |
| - String filePath = file.getAbsolutePath(); |
| - String libPath = libraryDirectory.getAbsolutePath(); |
| - if (!filePath.startsWith("$libPath${JavaFile.separator}")) { |
| - return null; |
| - } |
| - filePath = filePath.substring(libPath.length + 1); |
| - for (SdkLibrary library in _libraryMap.sdkLibraries) { |
| - String libraryPath = library.path; |
| - if (filePath.replaceAll('\\', '/') == libraryPath) { |
| - String path = library.shortName; |
| - try { |
| - return new FileBasedSource(file, parseUriWithException(path)); |
| - } on URISyntaxException catch (exception, stackTrace) { |
| - AnalysisEngine.instance.logger.logInformation( |
| - "Failed to create URI: $path", |
| - new CaughtException(exception, stackTrace)); |
| - return null; |
| - } |
| - } |
| - libraryPath = new JavaFile(library.path).getParent(); |
| - if (filePath.startsWith("$libraryPath${JavaFile.separator}")) { |
| - String path = |
| - "${library.shortName}/${filePath.substring(libraryPath.length + 1)}"; |
| - try { |
| - return new FileBasedSource(file, parseUriWithException(path)); |
| - } on URISyntaxException catch (exception, stackTrace) { |
| - AnalysisEngine.instance.logger.logInformation( |
| - "Failed to create URI: $path", |
| - new CaughtException(exception, stackTrace)); |
| - return null; |
| - } |
| - } |
| - } |
| - return null; |
| - } |
| - |
| /** |
| * Return the directory where dartium can be found (the directory that will be |
| * the working directory if Dartium is invoked without changing the default), |
| @@ -536,16 +619,22 @@ class DirectoryBasedDartSdk implements DartSdk { |
| } |
| @override |
| - SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri); |
| + String getRelativePathFromFile(JavaFile file) { |
| + String filePath = file.getAbsolutePath(); |
| + String libPath = libraryDirectory.getAbsolutePath(); |
| + if (!filePath.startsWith("$libPath${JavaFile.separator}")) { |
| + return null; |
| + } |
| + return filePath.substring(libPath.length + 1); |
| + } |
| /** |
| * Return the [PackageBundle] for this SDK, if it exists, or `null` otherwise. |
| * This method should not be used outside of `analyzer` and `analyzer_cli` |
| * packages. |
| */ |
| - PackageBundle getSummarySdkBundle() { |
| + PackageBundle getSummarySdkBundle(bool strongMode) { |
| String rootPath = directory.getAbsolutePath(); |
| - bool strongMode = _analysisOptions?.strongMode ?? false; |
| String name = strongMode ? 'strong.sum' : 'spec.sum'; |
| String path = pathos.join(rootPath, 'lib', '_internal', name); |
| try { |
| @@ -589,16 +678,7 @@ class DirectoryBasedDartSdk implements DartSdk { |
| } |
| @override |
| - Source mapDartUri(String dartUri) { |
| - Source source = _uriToSourceMap[dartUri]; |
| - if (source == null) { |
| - source = _mapDartUri(dartUri); |
| - _uriToSourceMap[dartUri] = source; |
| - } |
| - return source; |
| - } |
| - |
| - FileBasedSource _mapDartUri(String dartUri) { |
| + FileBasedSource internalMapDartUri(String dartUri) { |
| String libraryName; |
| String relativePath; |
| int index = dartUri.indexOf('/'); |