Index: observatory_pub_packages/analyzer/src/generated/sdk_io.dart |
=================================================================== |
--- observatory_pub_packages/analyzer/src/generated/sdk_io.dart (revision 0) |
+++ observatory_pub_packages/analyzer/src/generated/sdk_io.dart (working copy) |
@@ -0,0 +1,605 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+// This code was auto-generated, is not intended to be edited, and is subject to |
+// significant change. Please see the README file for more information. |
+ |
+library engine.sdk.io; |
+ |
+import 'java_core.dart'; |
+import 'java_io.dart'; |
+import 'java_engine_io.dart'; |
+import 'source_io.dart'; |
+import 'error.dart'; |
+import 'scanner.dart'; |
+import 'ast.dart'; |
+import 'parser.dart'; |
+import 'sdk.dart'; |
+import 'engine.dart'; |
+ |
+/** |
+ * Instances of the class `DirectoryBasedDartSdk` represent a Dart SDK installed in a |
+ * specified directory. Typical Dart SDK layout is something like... |
+ * |
+ * <pre> |
+ * dart-sdk/ |
+ * bin/ |
+ * dart[.exe] <-- VM |
+ * lib/ |
+ * core/ |
+ * core.dart |
+ * ... other core library files ... |
+ * ... other libraries ... |
+ * util/ |
+ * ... Dart utilities ... |
+ * Chromium/ <-- Dartium typically exists in a sibling directory |
+ * </pre> |
+ */ |
+class DirectoryBasedDartSdk implements DartSdk { |
+ /** |
+ * The [AnalysisContext] which is used for all of the sources in this [DartSdk]. |
+ */ |
+ InternalAnalysisContext _analysisContext; |
+ |
+ /** |
+ * The directory containing the SDK. |
+ */ |
+ JavaFile _sdkDirectory; |
+ |
+ /** |
+ * The revision number of this SDK, or `"0"` if the revision number cannot be discovered. |
+ */ |
+ String _sdkVersion; |
+ |
+ /** |
+ * The file containing the dart2js executable. |
+ */ |
+ JavaFile _dart2jsExecutable; |
+ |
+ /** |
+ * The file containing the dart formatter executable. |
+ */ |
+ JavaFile _dartFmtExecutable; |
+ |
+ /** |
+ * The file containing the Dartium executable. |
+ */ |
+ JavaFile _dartiumExecutable; |
+ |
+ /** |
+ * The file containing the pub executable. |
+ */ |
+ JavaFile _pubExecutable; |
+ |
+ /** |
+ * The file containing the VM executable. |
+ */ |
+ JavaFile _vmExecutable; |
+ |
+ /** |
+ * A mapping from Dart library URI's to the library represented by that URI. |
+ */ |
+ LibraryMap _libraryMap; |
+ |
+ /** |
+ * The name of the directory within the SDK directory that contains executables. |
+ */ |
+ static String _BIN_DIRECTORY_NAME = "bin"; |
+ |
+ /** |
+ * The name of the directory on non-Mac that contains dartium. |
+ */ |
+ static String _DARTIUM_DIRECTORY_NAME = "chromium"; |
+ |
+ /** |
+ * The name of the dart2js executable on non-windows operating systems. |
+ */ |
+ static String _DART2JS_EXECUTABLE_NAME = "dart2js"; |
+ |
+ /** |
+ * The name of the file containing the dart2js executable on Windows. |
+ */ |
+ static String _DART2JS_EXECUTABLE_NAME_WIN = "dart2js.bat"; |
+ |
+ /** |
+ * The name of the dart formatter executable on non-windows operating systems. |
+ */ |
+ static String _DARTFMT_EXECUTABLE_NAME = "dartfmt"; |
+ |
+ /** |
+ * The name of the dart formatter executable on windows operating systems. |
+ */ |
+ static String _DARTFMT_EXECUTABLE_NAME_WIN = "dartfmt.bat"; |
+ |
+ /** |
+ * The name of the file containing the Dartium executable on Linux. |
+ */ |
+ static String _DARTIUM_EXECUTABLE_NAME_LINUX = "chrome"; |
+ |
+ /** |
+ * The name of the file containing the Dartium executable on Macintosh. |
+ */ |
+ static String _DARTIUM_EXECUTABLE_NAME_MAC = "Chromium.app/Contents/MacOS/Chromium"; |
+ |
+ /** |
+ * The name of the file containing the Dartium executable on Windows. |
+ */ |
+ static String _DARTIUM_EXECUTABLE_NAME_WIN = "Chrome.exe"; |
+ |
+ /** |
+ * The name of the [System] property whose value is the path to the default Dart SDK |
+ * directory. |
+ */ |
+ static String _DEFAULT_DIRECTORY_PROPERTY_NAME = "com.google.dart.sdk"; |
+ |
+ /** |
+ * The name of the directory within the SDK directory that contains documentation for the |
+ * libraries. |
+ */ |
+ static String _DOCS_DIRECTORY_NAME = "docs"; |
+ |
+ /** |
+ * The suffix added to the name of a library to derive the name of the file containing the |
+ * documentation for that library. |
+ */ |
+ static String _DOC_FILE_SUFFIX = "_api.json"; |
+ |
+ /** |
+ * The name of the directory within the SDK directory that contains the libraries file. |
+ */ |
+ static String _INTERNAL_DIR = "_internal"; |
+ |
+ /** |
+ * The name of the directory within the SDK directory that contains the libraries. |
+ */ |
+ static String _LIB_DIRECTORY_NAME = "lib"; |
+ |
+ /** |
+ * The name of the libraries file. |
+ */ |
+ static String _LIBRARIES_FILE = "libraries.dart"; |
+ |
+ /** |
+ * The name of the pub executable on windows. |
+ */ |
+ static String _PUB_EXECUTABLE_NAME_WIN = "pub.bat"; |
+ |
+ /** |
+ * The name of the pub executable on non-windows operating systems. |
+ */ |
+ static String _PUB_EXECUTABLE_NAME = "pub"; |
+ |
+ /** |
+ * The name of the file within the SDK directory that contains the version number of the SDK. |
+ */ |
+ static String _VERSION_FILE_NAME = "version"; |
+ |
+ /** |
+ * The name of the file containing the VM executable on the Windows operating system. |
+ */ |
+ static String _VM_EXECUTABLE_NAME_WIN = "dart.exe"; |
+ |
+ /** |
+ * The name of the file containing the VM executable on non-Windows operating systems. |
+ */ |
+ static String _VM_EXECUTABLE_NAME = "dart"; |
+ |
+ /** |
+ * Return the default Dart SDK, or `null` if the directory containing the default SDK cannot |
+ * be determined (or does not exist). |
+ * |
+ * @return the default Dart SDK |
+ */ |
+ static DirectoryBasedDartSdk get defaultSdk { |
+ JavaFile sdkDirectory = defaultSdkDirectory; |
+ if (sdkDirectory == null) { |
+ return null; |
+ } |
+ return new DirectoryBasedDartSdk(sdkDirectory); |
+ } |
+ |
+ /** |
+ * Return the default directory for the Dart SDK, or `null` if the directory cannot be |
+ * determined (or does not exist). The default directory is provided by a [System] property |
+ * named `com.google.dart.sdk`. |
+ * |
+ * @return the default directory for the Dart SDK |
+ */ |
+ static JavaFile get defaultSdkDirectory { |
+ String sdkProperty = JavaSystemIO.getProperty(_DEFAULT_DIRECTORY_PROPERTY_NAME); |
+ if (sdkProperty == null) { |
+ return null; |
+ } |
+ JavaFile sdkDirectory = new JavaFile(sdkProperty); |
+ if (!sdkDirectory.exists()) { |
+ return null; |
+ } |
+ return sdkDirectory; |
+ } |
+ |
+ /** |
+ * Initialize a newly created SDK to represent the Dart SDK installed in the given directory. |
+ * |
+ * @param sdkDirectory the directory containing the SDK |
+ * @param useDart2jsPaths `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); |
+ } |
+ |
+ @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.con2(parseUriWithException(path), file); |
+ } on URISyntaxException catch (exception) { |
+ AnalysisEngine.instance.logger.logInformation2("Failed to create URI: ${path}", exception); |
+ return null; |
+ } |
+ } |
+ libraryPath = new JavaFile(libraryPath).getParent(); |
+ if (filePath.startsWith("${libraryPath}${JavaFile.separator}")) { |
+ String path = "${library.shortName}/${filePath.substring(libraryPath.length + 1)}"; |
+ try { |
+ return new FileBasedSource.con2(parseUriWithException(path), file); |
+ } on URISyntaxException catch (exception) { |
+ AnalysisEngine.instance.logger.logInformation2("Failed to create URI: ${path}", exception); |
+ return null; |
+ } |
+ } |
+ } |
+ return null; |
+ } |
+ |
+ @override |
+ AnalysisContext get context { |
+ if (_analysisContext == null) { |
+ _analysisContext = new SdkAnalysisContext(); |
+ SourceFactory factory = new SourceFactory([new DartUriResolver(this)]); |
+ _analysisContext.sourceFactory = factory; |
+ List<String> uris = this.uris; |
+ ChangeSet changeSet = new ChangeSet(); |
+ for (String uri in uris) { |
+ changeSet.addedSource(factory.forUri(uri)); |
+ } |
+ _analysisContext.applyChanges(changeSet); |
+ } |
+ return _analysisContext; |
+ } |
+ |
+ /** |
+ * Return the file containing the dart2js executable, or `null` if it does not exist. |
+ * |
+ * @return the file containing the dart2js executable |
+ */ |
+ JavaFile get dart2JsExecutable { |
+ if (_dart2jsExecutable == null) { |
+ _dart2jsExecutable = _verifyExecutable(new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), OSUtilities.isWindows() ? _DART2JS_EXECUTABLE_NAME_WIN : _DART2JS_EXECUTABLE_NAME)); |
+ } |
+ return _dart2jsExecutable; |
+ } |
+ |
+ /** |
+ * Return the file containing the dart formatter executable, or `null` if it does not exist. |
+ * |
+ * @return the file containing the dart formatter executable |
+ */ |
+ JavaFile get dartFmtExecutable { |
+ if (_dartFmtExecutable == null) { |
+ _dartFmtExecutable = _verifyExecutable(new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), OSUtilities.isWindows() ? _DARTFMT_EXECUTABLE_NAME_WIN : _DARTFMT_EXECUTABLE_NAME)); |
+ } |
+ return _dartFmtExecutable; |
+ } |
+ |
+ /** |
+ * Return the file containing the Dartium executable, or `null` if it does not exist. |
+ * |
+ * @return the file containing the Dartium executable |
+ */ |
+ JavaFile get dartiumExecutable { |
+ if (_dartiumExecutable == null) { |
+ _dartiumExecutable = _verifyExecutable(new JavaFile.relative(dartiumWorkingDirectory, dartiumBinaryName)); |
+ } |
+ return _dartiumExecutable; |
+ } |
+ |
+ /** |
+ * Return the directory where dartium can be found (the directory that will be the working |
+ * directory is Dartium is invoked without changing the default). |
+ * |
+ * @return the directory where dartium can be found |
+ */ |
+ JavaFile get dartiumWorkingDirectory => getDartiumWorkingDirectory(_sdkDirectory.getParentFile()); |
+ |
+ /** |
+ * Return the directory where dartium can be found (the directory that will be the working |
+ * directory is Dartium is invoked without changing the default). |
+ * |
+ * @param installDir the installation directory |
+ * @return the directory where dartium can be found |
+ */ |
+ JavaFile getDartiumWorkingDirectory(JavaFile installDir) => new JavaFile.relative(installDir, _DARTIUM_DIRECTORY_NAME); |
+ |
+ /** |
+ * Return the directory containing the SDK. |
+ * |
+ * @return the directory containing the SDK |
+ */ |
+ JavaFile get directory => _sdkDirectory; |
+ |
+ /** |
+ * Return the directory containing documentation for the SDK. |
+ * |
+ * @return the SDK's documentation directory |
+ */ |
+ JavaFile get docDirectory => new JavaFile.relative(_sdkDirectory, _DOCS_DIRECTORY_NAME); |
+ |
+ /** |
+ * Return the auxiliary documentation file for the given library, or `null` if no such file |
+ * exists. |
+ * |
+ * @param libraryName the name of the library associated with the documentation file to be |
+ * returned |
+ * @return the auxiliary documentation file for the library |
+ */ |
+ JavaFile getDocFileFor(String libraryName) { |
+ JavaFile dir = docDirectory; |
+ if (!dir.exists()) { |
+ return null; |
+ } |
+ JavaFile libDir = new JavaFile.relative(dir, libraryName); |
+ JavaFile docFile = new JavaFile.relative(libDir, "${libraryName}${_DOC_FILE_SUFFIX}"); |
+ if (docFile.exists()) { |
+ return docFile; |
+ } |
+ return null; |
+ } |
+ |
+ /** |
+ * Return the directory within the SDK directory that contains the libraries. |
+ * |
+ * @return the directory that contains the libraries |
+ */ |
+ JavaFile get libraryDirectory => new JavaFile.relative(_sdkDirectory, _LIB_DIRECTORY_NAME); |
+ |
+ /** |
+ * Return the file containing the Pub executable, or `null` if it does not exist. |
+ * |
+ * @return the file containing the Pub executable |
+ */ |
+ JavaFile get pubExecutable { |
+ if (_pubExecutable == null) { |
+ _pubExecutable = _verifyExecutable(new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), OSUtilities.isWindows() ? _PUB_EXECUTABLE_NAME_WIN : _PUB_EXECUTABLE_NAME)); |
+ } |
+ return _pubExecutable; |
+ } |
+ |
+ @override |
+ List<SdkLibrary> get sdkLibraries => _libraryMap.sdkLibraries; |
+ |
+ @override |
+ SdkLibrary getSdkLibrary(String dartUri) => _libraryMap.getLibrary(dartUri); |
+ |
+ /** |
+ * Return the revision number of this SDK, or `"0"` if the revision number cannot be |
+ * discovered. |
+ * |
+ * @return the revision number of this SDK |
+ */ |
+ @override |
+ String get sdkVersion { |
+ if (_sdkVersion == null) { |
+ _sdkVersion = DartSdk.DEFAULT_VERSION; |
+ JavaFile revisionFile = new JavaFile.relative(_sdkDirectory, _VERSION_FILE_NAME); |
+ try { |
+ String revision = revisionFile.readAsStringSync(); |
+ if (revision != null) { |
+ _sdkVersion = revision.trim(); |
+ } |
+ } on JavaIOException catch (exception) { |
+ } |
+ } |
+ return _sdkVersion; |
+ } |
+ |
+ /** |
+ * Return an array containing the library URI's for the libraries defined in this SDK. |
+ * |
+ * @return the library URI's for the libraries defined in this SDK |
+ */ |
+ @override |
+ List<String> get uris => _libraryMap.uris; |
+ |
+ /** |
+ * Return the file containing the VM executable, or `null` if it does not exist. |
+ * |
+ * @return the file containing the VM executable |
+ */ |
+ JavaFile get vmExecutable { |
+ if (_vmExecutable == null) { |
+ _vmExecutable = _verifyExecutable(new JavaFile.relative(new JavaFile.relative(_sdkDirectory, _BIN_DIRECTORY_NAME), vmBinaryName)); |
+ } |
+ return _vmExecutable; |
+ } |
+ |
+ /** |
+ * Return `true` if this SDK includes documentation. |
+ * |
+ * @return `true` if this installation of the SDK has documentation |
+ */ |
+ bool get hasDocumentation => docDirectory.exists(); |
+ |
+ /** |
+ * Return `true` if the Dartium binary is available. |
+ * |
+ * @return `true` if the Dartium binary is available |
+ */ |
+ bool get isDartiumInstalled => dartiumExecutable != null; |
+ |
+ @override |
+ Source mapDartUri(String dartUri) { |
+ 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; |
+ } |
+ try { |
+ JavaFile file = new JavaFile.relative(libraryDirectory, library.path); |
+ if (!relativePath.isEmpty) { |
+ file = file.getParentFile(); |
+ file = new JavaFile.relative(file, relativePath); |
+ } |
+ return new FileBasedSource.con2(parseUriWithException(dartUri), file); |
+ } on URISyntaxException catch (exception) { |
+ return null; |
+ } |
+ } |
+ |
+ /** |
+ * Read all of the configuration files to initialize the library maps. |
+ * |
+ * @param useDart2jsPaths `true` if the dart2js path should be used when it is available |
+ * @return the initialized library map |
+ */ |
+ LibraryMap initialLibraryMap(bool useDart2jsPaths) { |
+ JavaFile librariesFile = new JavaFile.relative(new JavaFile.relative(libraryDirectory, _INTERNAL_DIR), _LIBRARIES_FILE); |
+ try { |
+ String contents = librariesFile.readAsStringSync(); |
+ return new SdkLibrariesReader(useDart2jsPaths).readFromFile(librariesFile, contents); |
+ } catch (exception) { |
+ AnalysisEngine.instance.logger.logError2("Could not initialize the library map from ${librariesFile.getAbsolutePath()}", exception); |
+ return new LibraryMap(); |
+ } |
+ } |
+ |
+ /** |
+ * Ensure that the dart VM is executable. If it is not, make it executable and log that it was |
+ * necessary for us to do so. |
+ */ |
+ void _ensureVmIsExecutable() { |
+ } |
+ |
+ /** |
+ * Return the name of the file containing the Dartium executable. |
+ * |
+ * @return the name of the file containing the Dartium executable |
+ */ |
+ String get dartiumBinaryName { |
+ if (OSUtilities.isWindows()) { |
+ return _DARTIUM_EXECUTABLE_NAME_WIN; |
+ } else if (OSUtilities.isMac()) { |
+ return _DARTIUM_EXECUTABLE_NAME_MAC; |
+ } else { |
+ return _DARTIUM_EXECUTABLE_NAME_LINUX; |
+ } |
+ } |
+ |
+ /** |
+ * Return the name of the file containing the VM executable. |
+ * |
+ * @return the name of the file containing the VM executable |
+ */ |
+ String get vmBinaryName { |
+ if (OSUtilities.isWindows()) { |
+ return _VM_EXECUTABLE_NAME_WIN; |
+ } else { |
+ return _VM_EXECUTABLE_NAME; |
+ } |
+ } |
+ |
+ /** |
+ * Verify that the given executable file exists and is executable. |
+ * |
+ * @param file the binary file |
+ * @return the file if it exists and is executable, else `null` |
+ */ |
+ JavaFile _verifyExecutable(JavaFile file) => file.isExecutable() ? file : null; |
+} |
+ |
+/** |
+ * Instances of the class `SdkLibrariesReader` read and parse the libraries file |
+ * (dart-sdk/lib/_internal/libraries.dart) for information about the libraries in an SDK. The |
+ * library information is represented as a Dart file containing a single top-level variable whose |
+ * value is a const map. The keys of the map are the names of libraries defined in the SDK and the |
+ * values in the map are info objects defining the library. For example, a subset of a typical SDK |
+ * might have a libraries file that looks like the following: |
+ * |
+ * <pre> |
+ * final Map<String, LibraryInfo> LIBRARIES = const <LibraryInfo> { |
+ * // Used by VM applications |
+ * "builtin" : const LibraryInfo( |
+ * "builtin/builtin_runtime.dart", |
+ * category: "Server", |
+ * platforms: VM_PLATFORM), |
+ * |
+ * "compiler" : const LibraryInfo( |
+ * "compiler/compiler.dart", |
+ * category: "Tools", |
+ * platforms: 0), |
+ * }; |
+ * </pre> |
+ */ |
+class SdkLibrariesReader { |
+ /** |
+ * A flag indicating whether the dart2js path should be used when it is available. |
+ */ |
+ final bool _useDart2jsPaths; |
+ |
+ /** |
+ * Initialize a newly created library reader to use the dart2js path if the given value is |
+ * `true`. |
+ * |
+ * @param useDart2jsPaths `true` if the dart2js path should be used when it is available |
+ */ |
+ SdkLibrariesReader(this._useDart2jsPaths); |
+ |
+ /** |
+ * Return the library map read from the given source. |
+ * |
+ * @param file the [File] of the library file |
+ * @param libraryFileContents the contents from the library file |
+ * @return the library map read from the given source |
+ */ |
+ LibraryMap readFromFile(JavaFile file, String libraryFileContents) => readFromSource(new FileBasedSource.con1(file), libraryFileContents); |
+ |
+ /** |
+ * Return the library map read from the given source. |
+ * |
+ * @param source the source of the library file |
+ * @param libraryFileContents the contents from the library file |
+ * @return the library map read from the given source |
+ */ |
+ LibraryMap readFromSource(Source source, String libraryFileContents) { |
+ BooleanErrorListener errorListener = new BooleanErrorListener(); |
+ Scanner scanner = new Scanner(source, new CharSequenceReader(libraryFileContents), errorListener); |
+ Parser parser = new Parser(source, errorListener); |
+ CompilationUnit unit = parser.parseCompilationUnit(scanner.tokenize()); |
+ SdkLibrariesReader_LibraryBuilder libraryBuilder = new SdkLibrariesReader_LibraryBuilder(_useDart2jsPaths); |
+ // If any syntactic errors were found then don't try to visit the AST structure. |
+ if (!errorListener.errorReported) { |
+ unit.accept(libraryBuilder); |
+ } |
+ return libraryBuilder.librariesMap; |
+ } |
+} |