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

Side by Side Diff: lib/src/analyzer/context.dart

Issue 1879373004: Implement modular compilation (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 8 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 unified diff | Download patch
« no previous file with comments | « lib/src/analysis_context.dart ('k') | lib/src/analyzer/dart_sdk.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2
3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file.
5
6 import 'package:args/args.dart' show ArgParser, ArgResults;
7 import 'package:analyzer/src/generated/engine.dart'
8 show AnalysisContext, AnalysisEngine, AnalysisOptionsImpl;
9 import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
10 import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
11 import 'package:analyzer/src/generated/source_io.dart'
12 show
13 CustomUriResolver,
14 DartUriResolver,
15 FileUriResolver,
16 PackageUriResolver,
17 SourceFactory,
18 UriResolver;
19 import 'package:cli_util/cli_util.dart' show getSdkDir;
20
21 import 'dart_sdk.dart' show MockDartSdk, mockSdkSources;
22 import 'multi_package_resolver.dart' show MultiPackageResolver;
23
24 /// Options used to set up Source URI resolution in the analysis context.
25 class AnalyzerOptions {
26 /// Custom URI mappings, such as "dart:foo" -> "path/to/foo.dart"
27 final Map<String, String> customUrlMappings;
28
29 /// Package root when resolving 'package:' urls the standard way.
30 final String packageRoot;
31
32 /// List of summary file paths.
33 final List<String> summaryPaths;
34
35 /// List of paths used for the multi-package resolver.
36 final List<String> packagePaths;
37
38 /// Whether to use a mock-sdk during compilation.
39 final bool useMockSdk;
40
41 /// Path to the dart-sdk. Null if `useMockSdk` is true or if the path couldn't
42 /// be determined
43 final String dartSdkPath;
44
45 AnalyzerOptions(
46 {this.summaryPaths: const [],
47 this.useMockSdk: false,
48 String dartSdkPath,
49 this.customUrlMappings: const {},
50 this.packageRoot: 'packages/',
51 this.packagePaths: const []})
52 : dartSdkPath = dartSdkPath ?? getSdkDir().path;
53
54 AnalyzerOptions.fromArguments(ArgResults args)
55 : summaryPaths = args['summary'],
56 useMockSdk = false,
57 dartSdkPath = args['dart-sdk'] ?? getSdkDir().path,
58 customUrlMappings = _parseUrlMappings(args['url-mapping']),
59 packageRoot = args['package-root'],
60 packagePaths = args['package-paths']?.split(',') ?? [];
61
62 /// Whether to resolve 'package:' uris using the multi-package resolver.
63 bool get useMultiPackage => packagePaths.isNotEmpty;
64
65 static ArgParser addArguments(ArgParser parser) {
66 return parser
67 ..addOption('summary',
68 abbr: 's', help: 'summary file(s) to include', allowMultiple: true)
69 ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null)
70 ..addOption('package-root',
71 abbr: 'p',
72 help: 'Package root to resolve "package:" imports',
73 defaultsTo: 'packages/')
74 ..addOption('url-mapping',
75 help: '--url-mapping=libraryUri,/path/to/library.dart uses \n'
76 'library.dart as the source for an import of of "libraryUri".',
77 allowMultiple: true,
78 splitCommas: false)
79 ..addOption('package-paths',
80 help: 'use a list of directories to resolve "package:" imports');
81 }
82
83 static Map<String, String> _parseUrlMappings(Iterable argument) {
84 var mappings = <String, String>{};
85 for (var mapping in argument) {
86 var splitMapping = mapping.split(',');
87 if (splitMapping.length >= 2) {
88 mappings[splitMapping[0]] = splitMapping[1];
89 }
90 }
91 return mappings;
92 }
93 }
94
95 /// Creates an [AnalysisContext] with dev_compiler type rules and inference,
96 /// using [createSourceFactory] to set up its [SourceFactory].
97 AnalysisContext createAnalysisContextWithSources(AnalyzerOptions options,
98 {DartUriResolver sdkResolver, List<UriResolver> fileResolvers}) {
99 AnalysisEngine.instance.processRequiredPlugins();
100 var srcFactory = createSourceFactory(options,
101 sdkResolver: sdkResolver, fileResolvers: fileResolvers);
102 return createAnalysisContext()..sourceFactory = srcFactory;
103 }
104
105 /// Creates an analysis context that contains our restricted typing rules.
106 AnalysisContext createAnalysisContext() {
107 var res = AnalysisEngine.instance.createAnalysisContext();
108 res.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
109 return res;
110 }
111
112 /// Creates a SourceFactory configured by the [options].
113 ///
114 /// Use [options.useMockSdk] to specify the SDK mode, or use [sdkResolver]
115 /// to entirely override the DartUriResolver.
116 ///
117 /// If supplied, [fileResolvers] will override the default `file:` and
118 /// `package:` URI resolvers.
119 SourceFactory createSourceFactory(AnalyzerOptions options,
120 {DartUriResolver sdkResolver, List<UriResolver> fileResolvers}) {
121 sdkResolver ??= options.useMockSdk
122 ? createMockSdkResolver(mockSdkSources)
123 : createSdkPathResolver(options.dartSdkPath);
124
125 var resolvers = <UriResolver>[];
126 if (options.customUrlMappings.isNotEmpty) {
127 resolvers.add(new CustomUriResolver(options.customUrlMappings));
128 }
129 resolvers.add(sdkResolver);
130 if (fileResolvers == null) fileResolvers = createFileResolvers(options);
131 resolvers.addAll(fileResolvers);
132 return new SourceFactory(resolvers);
133 }
134
135 List<UriResolver> createFileResolvers(AnalyzerOptions options) {
136 return [
137 new FileUriResolver(),
138 options.useMultiPackage
139 ? new MultiPackageResolver(options.packagePaths)
140 : new PackageUriResolver([new JavaFile(options.packageRoot)])
141 ];
142 }
143
144 /// Creates a [DartUriResolver] that uses a mock 'dart:' library contents.
145 DartUriResolver createMockSdkResolver(Map<String, String> mockSources) =>
146 new MockDartSdk(mockSources, reportMissing: true).resolver;
147
148 /// Creates a [DartUriResolver] that uses the SDK at the given [sdkPath].
149 DartUriResolver createSdkPathResolver(String sdkPath) {
150 var sdk = new DirectoryBasedDartSdk(
151 new JavaFile(sdkPath), /*useDart2jsPaths:*/ true);
152 sdk.useSummary = true;
153 sdk.analysisOptions = new AnalysisOptionsImpl()..strongMode = true;
154 return new DartUriResolver(sdk);
155 }
OLDNEW
« no previous file with comments | « lib/src/analysis_context.dart ('k') | lib/src/analyzer/dart_sdk.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698