| Index: pkg/analyzer/lib/src/context/builder.dart
|
| diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
|
| index 882094f350c37e6594bd3fba4aaeff45235ee842..d0d9b1e85f58404960ea7183bf44c4c1dc49367e 100644
|
| --- a/pkg/analyzer/lib/src/context/builder.dart
|
| +++ b/pkg/analyzer/lib/src/context/builder.dart
|
| @@ -69,6 +69,11 @@ class ContextBuilder {
|
| final ContentCache contentCache;
|
|
|
| /**
|
| + * The options used by the context builder.
|
| + */
|
| + final ContextBuilderOptions builderOptions;
|
| +
|
| + /**
|
| * The resolver provider used to create a package: URI resolver, or `null` if
|
| * the normal (Package Specification DEP) lookup mechanism is to be used.
|
| */
|
| @@ -83,56 +88,12 @@ class ContextBuilder {
|
| ResolverProvider fileResolverProvider;
|
|
|
| /**
|
| - * The file path of the .packages file that should be used in place of any
|
| - * file found using the normal (Package Specification DEP) lookup mechanism,
|
| - * or `null` if the normal lookup mechanism should be used.
|
| - */
|
| - String defaultPackageFilePath;
|
| -
|
| - /**
|
| - * The file path of the packages directory that should be used in place of any
|
| - * file found using the normal (Package Specification DEP) lookup mechanism,
|
| - * or `null` if the normal lookup mechanism should be used.
|
| - */
|
| - String defaultPackagesDirectoryPath;
|
| -
|
| - /**
|
| - * The file path of the file containing the summary of the SDK that should be
|
| - * used to "analyze" the SDK. This option should only be specified by
|
| - * command-line tools such as 'dartanalyzer' or 'ddc'.
|
| - */
|
| - String dartSdkSummaryPath;
|
| -
|
| - /**
|
| - * The file path of the analysis options file that should be used in place of
|
| - * any file in the root directory or a parent of the root directory, or `null`
|
| - * if the normal lookup mechanism should be used.
|
| - */
|
| - String defaultAnalysisOptionsFilePath;
|
| -
|
| - /**
|
| - * The default analysis options that should be used unless some or all of them
|
| - * are overridden in the analysis options file, or `null` if the default
|
| - * defaults should be used.
|
| - */
|
| - AnalysisOptions defaultOptions;
|
| -
|
| - /**
|
| - * A table mapping variable names to values for the declared variables, or
|
| - * `null` if no additional variables should be declared.
|
| - */
|
| - Map<String, String> declaredVariables;
|
| -
|
| - /**
|
| - * The manager of pub package summaries.
|
| - */
|
| - PubSummaryManager pubSummaryManager;
|
| -
|
| - /**
|
| * Initialize a newly created builder to be ready to build a context rooted in
|
| * the directory with the given [rootDirectoryPath].
|
| */
|
| - ContextBuilder(this.resourceProvider, this.sdkManager, this.contentCache);
|
| + ContextBuilder(this.resourceProvider, this.sdkManager, this.contentCache,
|
| + {ContextBuilderOptions options})
|
| + : builderOptions = options ?? new ContextBuilderOptions();
|
|
|
| /**
|
| * Return an analysis context that is configured correctly to analyze code in
|
| @@ -158,9 +119,9 @@ class ContextBuilder {
|
| * Configure the context to make use of summaries.
|
| */
|
| void configureSummaries(InternalAnalysisContext context) {
|
| - if (pubSummaryManager != null) {
|
| - List<LinkedPubPackage> linkedBundles =
|
| - pubSummaryManager.getLinkedBundles(context);
|
| + PubSummaryManager manager = builderOptions.pubSummaryManager;
|
| + if (manager != null) {
|
| + List<LinkedPubPackage> linkedBundles = manager.getLinkedBundles(context);
|
| if (linkedBundles.isNotEmpty) {
|
| SummaryDataStore store = new SummaryDataStore([]);
|
| for (LinkedPubPackage package in linkedBundles) {
|
| @@ -211,6 +172,7 @@ class ContextBuilder {
|
| * Return an analysis options object containing the default option values.
|
| */
|
| AnalysisOptions createDefaultOptions() {
|
| + AnalysisOptions defaultOptions = builderOptions.defaultOptions;
|
| if (defaultOptions == null) {
|
| return new AnalysisOptionsImpl();
|
| }
|
| @@ -218,14 +180,17 @@ class ContextBuilder {
|
| }
|
|
|
| Packages createPackageMap(String rootDirectoryPath) {
|
| - if (defaultPackageFilePath != null) {
|
| - File configFile = resourceProvider.getFile(defaultPackageFilePath);
|
| + String filePath = builderOptions.defaultPackageFilePath;
|
| + if (filePath != null) {
|
| + File configFile = resourceProvider.getFile(filePath);
|
| List<int> bytes = configFile.readAsBytesSync();
|
| Map<String, Uri> map = parse(bytes, configFile.toUri());
|
| resolveSymbolicLinks(map);
|
| return new MapPackages(map);
|
| - } else if (defaultPackagesDirectoryPath != null) {
|
| - Folder folder = resourceProvider.getFolder(defaultPackagesDirectoryPath);
|
| + }
|
| + String directoryPath = builderOptions.defaultPackagesDirectoryPath;
|
| + if (directoryPath != null) {
|
| + Folder folder = resourceProvider.getFolder(directoryPath);
|
| return getPackagesFromFolder(folder);
|
| }
|
| return findPackagesFromFile(rootDirectoryPath);
|
| @@ -258,9 +223,10 @@ class ContextBuilder {
|
| * given [context].
|
| */
|
| void declareVariables(InternalAnalysisContext context) {
|
| - if (declaredVariables != null && declaredVariables.isNotEmpty) {
|
| + Map<String, String> variables = builderOptions.declaredVariables;
|
| + if (variables != null && variables.isNotEmpty) {
|
| DeclaredVariables contextVariables = context.declaredVariables;
|
| - declaredVariables.forEach((String variableName, String value) {
|
| + variables.forEach((String variableName, String value) {
|
| contextVariables.define(variableName, value);
|
| });
|
| }
|
| @@ -292,12 +258,13 @@ class ContextBuilder {
|
|
|
| /**
|
| * Return the SDK that should be used to analyze code. Use the given
|
| - * [packageMap] and [options] to locate the SDK.
|
| + * [packageMap] and [analysisOptions] to locate the SDK.
|
| */
|
| DartSdk findSdk(
|
| - Map<String, List<Folder>> packageMap, AnalysisOptions options) {
|
| - if (dartSdkSummaryPath != null) {
|
| - return new SummaryBasedDartSdk(dartSdkSummaryPath, options.strongMode);
|
| + Map<String, List<Folder>> packageMap, AnalysisOptions analysisOptions) {
|
| + String summaryPath = builderOptions.dartSdkSummaryPath;
|
| + if (summaryPath != null) {
|
| + return new SummaryBasedDartSdk(summaryPath, analysisOptions.strongMode);
|
| } else if (packageMap != null) {
|
| SdkExtensionFinder extFinder = new SdkExtensionFinder(packageMap);
|
| List<String> extFilePaths = extFinder.extensionFilePaths;
|
| @@ -317,12 +284,12 @@ class ContextBuilder {
|
| .path);
|
| }
|
| paths.addAll(extFilePaths);
|
| - SdkDescription description = new SdkDescription(paths, options);
|
| + SdkDescription description = new SdkDescription(paths, analysisOptions);
|
| DartSdk dartSdk = sdkManager.getSdk(description, () {
|
| if (extFilePaths.isNotEmpty) {
|
| embedderSdk.addExtensions(extFinder.urlMappings);
|
| }
|
| - embedderSdk.analysisOptions = options;
|
| + embedderSdk.analysisOptions = analysisOptions;
|
| embedderSdk.useSummary = sdkManager.canUseSummaries;
|
| return embedderSdk;
|
| });
|
| @@ -334,25 +301,26 @@ class ContextBuilder {
|
| String sdkPath = sdkManager.defaultSdkDirectory;
|
| List<String> paths = <String>[sdkPath];
|
| paths.addAll(extFilePaths);
|
| - SdkDescription description = new SdkDescription(paths, options);
|
| + SdkDescription description = new SdkDescription(paths, analysisOptions);
|
| return sdkManager.getSdk(description, () {
|
| FolderBasedDartSdk sdk = new FolderBasedDartSdk(
|
| resourceProvider, resourceProvider.getFolder(sdkPath));
|
| if (extFilePaths.isNotEmpty) {
|
| sdk.addExtensions(extFinder.urlMappings);
|
| }
|
| - sdk.analysisOptions = options;
|
| + sdk.analysisOptions = analysisOptions;
|
| sdk.useSummary = sdkManager.canUseSummaries;
|
| return sdk;
|
| });
|
| }
|
| }
|
| String sdkPath = sdkManager.defaultSdkDirectory;
|
| - SdkDescription description = new SdkDescription(<String>[sdkPath], options);
|
| + SdkDescription description =
|
| + new SdkDescription(<String>[sdkPath], analysisOptions);
|
| return sdkManager.getSdk(description, () {
|
| FolderBasedDartSdk sdk = new FolderBasedDartSdk(resourceProvider,
|
| - resourceProvider.getFolder(sdkPath), options.strongMode);
|
| - sdk.analysisOptions = options;
|
| + resourceProvider.getFolder(sdkPath), analysisOptions.strongMode);
|
| + sdk.analysisOptions = analysisOptions;
|
| sdk.useSummary = sdkManager.canUseSummaries;
|
| return sdk;
|
| });
|
| @@ -386,8 +354,9 @@ class ContextBuilder {
|
| * the directory with the given [path].
|
| */
|
| File getOptionsFile(String path) {
|
| - if (defaultAnalysisOptionsFilePath != null) {
|
| - return resourceProvider.getFile(defaultAnalysisOptionsFilePath);
|
| + String filePath = builderOptions.defaultAnalysisOptionsFilePath;
|
| + if (filePath != null) {
|
| + return resourceProvider.getFile(filePath);
|
| }
|
| Folder root = resourceProvider.getFolder(path);
|
| for (Folder folder = root; folder != null; folder = folder.parent) {
|
| @@ -504,6 +473,62 @@ class ContextBuilder {
|
| }
|
|
|
| /**
|
| + * Options used by a [ContextBuilder].
|
| + */
|
| +class ContextBuilderOptions {
|
| + /**
|
| + * The file path of the file containing the summary of the SDK that should be
|
| + * used to "analyze" the SDK. This option should only be specified by
|
| + * command-line tools such as 'dartanalyzer' or 'ddc'.
|
| + */
|
| + String dartSdkSummaryPath;
|
| +
|
| + /**
|
| + * The file path of the analysis options file that should be used in place of
|
| + * any file in the root directory or a parent of the root directory, or `null`
|
| + * if the normal lookup mechanism should be used.
|
| + */
|
| + String defaultAnalysisOptionsFilePath;
|
| +
|
| + /**
|
| + * A table mapping variable names to values for the declared variables, or
|
| + * `null` if no additional variables should be declared.
|
| + */
|
| + Map<String, String> declaredVariables;
|
| +
|
| + /**
|
| + * The default analysis options that should be used unless some or all of them
|
| + * are overridden in the analysis options file, or `null` if the default
|
| + * defaults should be used.
|
| + */
|
| + AnalysisOptions defaultOptions;
|
| +
|
| + /**
|
| + * The file path of the .packages file that should be used in place of any
|
| + * file found using the normal (Package Specification DEP) lookup mechanism,
|
| + * or `null` if the normal lookup mechanism should be used.
|
| + */
|
| + String defaultPackageFilePath;
|
| +
|
| + /**
|
| + * The file path of the packages directory that should be used in place of any
|
| + * file found using the normal (Package Specification DEP) lookup mechanism,
|
| + * or `null` if the normal lookup mechanism should be used.
|
| + */
|
| + String defaultPackagesDirectoryPath;
|
| +
|
| + /**
|
| + * The manager of pub package summaries.
|
| + */
|
| + PubSummaryManager pubSummaryManager;
|
| +
|
| + /**
|
| + * Initialize a newly created set of options
|
| + */
|
| + ContextBuilderOptions();
|
| +}
|
| +
|
| +/**
|
| * Given a package map, check in each package's lib directory for the existence
|
| * of an `_embedder.yaml` file. If the file contains a top level YamlMap, it
|
| * will be added to the [embedderYamls] map.
|
|
|