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

Unified Diff: pkg/analyzer/lib/src/generated/sdk.dart

Issue 2107793002: Generalize DartSdkManager to support embedder SDKs (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analysis_server/test/socket_server_test.dart ('k') | pkg/analyzer/test/generated/sdk_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/sdk.dart
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 8705867323fc27716d9745ec22ba2d6b5f7df1e4..16bc5e85d125ff8b6fc6f281eb6295777683c1ff 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -11,6 +11,7 @@ import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/src/generated/engine.dart'
show AnalysisContext, AnalysisOptions;
import 'package:analyzer/src/generated/source.dart' show Source;
+import 'package:analyzer/src/generated/utilities_general.dart';
/**
* A function used to create a new DartSdk with the given [options]. If the
@@ -96,20 +97,32 @@ abstract class DartSdk {
*/
class DartSdkManager {
/**
+ * The absolute path to the directory containing the default SDK.
+ */
+ final String defaultSdkDirectory;
+
+ /**
+ * A flag indicating whether it is acceptable to use summaries when they are
+ * available.
+ */
+ final bool canUseSummaries;
+
+ /**
* The function used to create new SDK's.
*/
final SdkCreator sdkCreator;
/**
- * A table mapping (an encoding of) analysis options to the SDK that has been
- * configured with those options.
+ * A table mapping (an encoding of) analysis options and SDK locations to the
+ * DartSdk from that location that has been configured with those options.
*/
- Map<int, DartSdk> sdkMap = new HashMap<int, DartSdk>();
+ Map<SdkDescription, DartSdk> sdkMap = new HashMap<SdkDescription, DartSdk>();
/**
* Initialize a newly created manager.
*/
- DartSdkManager(this.sdkCreator);
+ DartSdkManager(
+ this.defaultSdkDirectory, this.canUseSummaries, this.sdkCreator);
/**
* Return any SDK that has been created, or `null` if no SDKs have been
@@ -127,9 +140,20 @@ class DartSdkManager {
* If such an SDK has not yet been created, then the [sdkCreator] will be
* invoked to create it.
*/
+ DartSdk getSdk(SdkDescription description, DartSdk ifAbsent()) {
+ return sdkMap.putIfAbsent(description, ifAbsent);
+ }
+
+ /**
+ * Return the Dart SDK that is appropriate for the given analysis [options].
+ * If such an SDK has not yet been created, then the [sdkCreator] will be
+ * invoked to create it.
+ */
DartSdk getSdkForOptions(AnalysisOptions options) {
- int encoding = options.encodeCrossContextOptions();
- return sdkMap.putIfAbsent(encoding, () => sdkCreator(options));
+ // TODO(brianwilkerson) Remove this method and the field sdkCreator.
+ SdkDescription description =
+ new SdkDescription(<String>[defaultSdkDirectory], options);
+ return getSdk(description, () => sdkCreator(options));
}
}
@@ -173,6 +197,58 @@ class LibraryMap {
int size() => _libraryMap.length;
}
+/**
+ * A description of a [DartSdk].
+ */
+class SdkDescription {
+ /**
+ * The paths to the files or directories that define the SDK.
+ */
+ final List<String> paths;
+
+ /**
+ * The analysis options that will be used by the SDK's context.
+ */
+ final AnalysisOptions options;
+
+ /**
+ * Initialize a newly created SDK description to describe an SDK based on the
+ * files or directories at the given [paths] that is analyzed using the given
+ * [options].
+ */
+ SdkDescription(this.paths, this.options);
+
+ @override
+ int get hashCode {
+ int hashCode = options.encodeCrossContextOptions();
+ for (String path in paths) {
+ hashCode = JenkinsSmiHash.combine(hashCode, path.hashCode);
+ }
+ return JenkinsSmiHash.finish(hashCode);
+ }
+
+ @override
+ bool operator ==(Object other) {
+ if (other is SdkDescription) {
+ if (options.encodeCrossContextOptions() !=
+ other.options.encodeCrossContextOptions()) {
+ return false;
+ }
+ int length = paths.length;
+ if (other.paths.length != length) {
+ return false;
+ }
+ for (int i = 0; i < length; i++) {
+ if (other.paths[i] != paths[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
+
class SdkLibrariesReader_LibraryBuilder extends RecursiveAstVisitor<Object> {
/**
* The prefix added to the name of a library to form the URI used in code to
« no previous file with comments | « pkg/analysis_server/test/socket_server_test.dart ('k') | pkg/analyzer/test/generated/sdk_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698