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

Side by Side Diff: pkg/analyzer/lib/src/analyzer_impl.dart

Issue 993633002: Fix for issue 22709 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer_impl; 5 library analyzer_impl;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:io'; 9 import 'dart:io';
10 10
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 * synchronous algorithm over the analysis engine. If [printMode] is `0`, 137 * synchronous algorithm over the analysis engine. If [printMode] is `0`,
138 * then no error or performance information is printed. If [printMode] is `1`, 138 * then no error or performance information is printed. If [printMode] is `1`,
139 * then both will be printed. If [printMode] is `2`, then only performance 139 * then both will be printed. If [printMode] is `2`, then only performance
140 * information will be printed, and it will be marked as being for a cold VM. 140 * information will be printed, and it will be marked as being for a cold VM.
141 */ 141 */
142 ErrorSeverity analyzeSync({int printMode: 1}) { 142 ErrorSeverity analyzeSync({int printMode: 1}) {
143 setupForAnalysis(); 143 setupForAnalysis();
144 return _analyzeSync(printMode); 144 return _analyzeSync(printMode);
145 } 145 }
146 146
147 void prepareAnalysisContext(JavaFile sourceFile, Source source) { 147 Source computeLibrarySource() {
148 JavaFile sourceFile = new JavaFile(sourcePath);
149 Source source = sdk.fromFileUri(sourceFile.toURI());
150 if (source != null) {
151 return source;
152 }
153 source = new FileBasedSource.con2(sourceFile.toURI(), sourceFile);
154 Uri uri = context.sourceFactory.restoreUri(source);
155 return new FileBasedSource.con2(uri, sourceFile);
156 }
157
158 /**
159 * Create and return the source factory to be used by the analysis context.
160 */
161 SourceFactory createSourceFactory() {
148 List<UriResolver> resolvers = [ 162 List<UriResolver> resolvers = [
149 new CustomUriResolver(options.customUrlMappings), 163 new CustomUriResolver(options.customUrlMappings),
150 new DartUriResolver(sdk), 164 new DartUriResolver(sdk)
151 new FileUriResolver()
152 ]; 165 ];
153 // maybe add package resolver 166 if (options.packageRootPath != null) {
154 { 167 JavaFile packageDirectory = new JavaFile(options.packageRootPath);
155 JavaFile packageDirectory; 168 resolvers.add(new PackageUriResolver([packageDirectory]));
156 if (options.packageRootPath != null) { 169 } else {
157 packageDirectory = new JavaFile(options.packageRootPath); 170 PubPackageMapProvider pubPackageMapProvider =
158 resolvers.add(new PackageUriResolver([packageDirectory])); 171 new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk);
159 } else { 172 PackageMapInfo packageMapInfo = pubPackageMapProvider.computePackageMap(
160 PubPackageMapProvider pubPackageMapProvider = 173 PhysicalResourceProvider.INSTANCE.getResource('.'));
161 new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk); 174 Map<String, List<Folder>> packageMap = packageMapInfo.packageMap;
162 PackageMapInfo packageMapInfo = pubPackageMapProvider.computePackageMap( 175 if (packageMap != null) {
163 PhysicalResourceProvider.INSTANCE.getResource('.')); 176 resolvers.add(new PackageMapUriResolver(
164 Map<String, List<Folder>> packageMap = packageMapInfo.packageMap; 177 PhysicalResourceProvider.INSTANCE, packageMap));
165 if (packageMap != null) {
166 resolvers.add(new PackageMapUriResolver(
167 PhysicalResourceProvider.INSTANCE, packageMap));
168 }
169 } 178 }
170 } 179 }
171 sourceFactory = new SourceFactory(resolvers); 180 resolvers.add(new FileUriResolver());
181 return new SourceFactory(resolvers);
182 }
183
184 void prepareAnalysisContext() {
185 sourceFactory = createSourceFactory();
172 context = AnalysisEngine.instance.createAnalysisContext(); 186 context = AnalysisEngine.instance.createAnalysisContext();
173 context.sourceFactory = sourceFactory; 187 context.sourceFactory = sourceFactory;
174 Map<String, String> definedVariables = options.definedVariables; 188 Map<String, String> definedVariables = options.definedVariables;
175 if (!definedVariables.isEmpty) { 189 if (!definedVariables.isEmpty) {
176 DeclaredVariables declaredVariables = context.declaredVariables; 190 DeclaredVariables declaredVariables = context.declaredVariables;
177 definedVariables.forEach((String variableName, String value) { 191 definedVariables.forEach((String variableName, String value) {
178 declaredVariables.define(variableName, value); 192 declaredVariables.define(variableName, value);
179 }); 193 });
180 } 194 }
181 // Uncomment the following to have errors reported on stdout and stderr 195 // Uncomment the following to have errors reported on stdout and stderr
182 AnalysisEngine.instance.logger = new StdLogger(options.log); 196 AnalysisEngine.instance.logger = new StdLogger(options.log);
183 197
184 // set options for context 198 // set options for context
185 AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl(); 199 AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
186 contextOptions.cacheSize = _MAX_CACHE_SIZE; 200 contextOptions.cacheSize = _MAX_CACHE_SIZE;
187 contextOptions.hint = !options.disableHints; 201 contextOptions.hint = !options.disableHints;
188 contextOptions.analyzeFunctionBodiesPredicate = 202 contextOptions.analyzeFunctionBodiesPredicate =
189 _analyzeFunctionBodiesPredicate; 203 _analyzeFunctionBodiesPredicate;
190 contextOptions.generateImplicitErrors = options.showPackageWarnings; 204 contextOptions.generateImplicitErrors = options.showPackageWarnings;
191 contextOptions.generateSdkErrors = options.showSdkWarnings; 205 contextOptions.generateSdkErrors = options.showSdkWarnings;
192 context.analysisOptions = contextOptions; 206 context.analysisOptions = contextOptions;
193 207
208 librarySource = computeLibrarySource();
209
194 // Create and add a ChangeSet 210 // Create and add a ChangeSet
195 ChangeSet changeSet = new ChangeSet(); 211 ChangeSet changeSet = new ChangeSet();
196 changeSet.addedSource(source); 212 changeSet.addedSource(librarySource);
197 context.applyChanges(changeSet); 213 context.applyChanges(changeSet);
198 } 214 }
199 215
200 /// Fills [errorInfos] using [sources]. 216 /// Fills [errorInfos] using [sources].
201 void prepareErrors() { 217 void prepareErrors() {
202 for (Source source in sources) { 218 for (Source source in sources) {
203 context.computeErrors(source); 219 context.computeErrors(source);
204 var sourceErrors = context.getErrors(source); 220 var sourceErrors = context.getErrors(source);
205 errorInfos.add(sourceErrors); 221 errorInfos.add(sourceErrors);
206 } 222 }
207 } 223 }
208 224
209 /// Fills [sources]. 225 /// Fills [sources].
210 void prepareSources(LibraryElement library) { 226 void prepareSources(LibraryElement library) {
211 var units = new Set<CompilationUnitElement>(); 227 var units = new Set<CompilationUnitElement>();
212 var libraries = new Set<LibraryElement>(); 228 var libraries = new Set<LibraryElement>();
213 addLibrarySources(library, libraries, units); 229 addLibrarySources(library, libraries, units);
214 } 230 }
215 231
216 /** 232 /**
217 * Setup local fields such as the analysis context for analysis. 233 * Setup local fields such as the analysis context for analysis.
218 */ 234 */
219 void setupForAnalysis() { 235 void setupForAnalysis() {
220 sources.clear(); 236 sources.clear();
221 errorInfos.clear(); 237 errorInfos.clear();
222 if (sourcePath == null) { 238 if (sourcePath == null) {
223 throw new ArgumentError("sourcePath cannot be null"); 239 throw new ArgumentError("sourcePath cannot be null");
224 } 240 }
225 JavaFile sourceFile = new JavaFile(sourcePath);
226 Uri uri = getUri(sourceFile);
227 librarySource = new FileBasedSource.con2(uri, sourceFile);
228
229 // prepare context 241 // prepare context
230 prepareAnalysisContext(sourceFile, librarySource); 242 prepareAnalysisContext();
231 } 243 }
232 244
233 /// The async version of the analysis 245 /// The async version of the analysis
234 void _analyzeAsync() { 246 void _analyzeAsync() {
235 new Future(context.performAnalysisTask).then((AnalysisResult result) { 247 new Future(context.performAnalysisTask).then((AnalysisResult result) {
236 List<ChangeNotice> notices = result.changeNotices; 248 List<ChangeNotice> notices = result.changeNotices;
237 if (result.hasMoreWork) { 249 if (result.hasMoreWork) {
238 // There is more work, record the set of sources, and then call self 250 // There is more work, record the set of sources, and then call self
239 // again to perform next task 251 // again to perform next task
240 for (ChangeNotice notice in notices) { 252 for (ChangeNotice notice in notices) {
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 if (packagesDir.exists()) { 408 if (packagesDir.exists()) {
397 return packagesDir; 409 return packagesDir;
398 } 410 }
399 dir = dir.getParentFile(); 411 dir = dir.getParentFile();
400 } 412 }
401 // not found 413 // not found
402 return null; 414 return null;
403 } 415 }
404 416
405 /** 417 /**
406 * Returns the [Uri] for the given input file.
407 *
408 * Usually it is a `file:` [Uri], but if [file] is located in the `lib`
409 * directory of the [sdk], then returns a `dart:` [Uri].
410 */
411 static Uri getUri(JavaFile file) {
412 // may be file in SDK
413 {
414 Source source = sdk.fromFileUri(file.toURI());
415 if (source != null) {
416 return source.uri;
417 }
418 }
419 // some generic file
420 return file.toURI();
421 }
422
423 /**
424 * Convert [sourcePath] into an absolute path. 418 * Convert [sourcePath] into an absolute path.
425 */ 419 */
426 static String _normalizeSourcePath(String sourcePath) { 420 static String _normalizeSourcePath(String sourcePath) {
427 return new File(sourcePath).absolute.path; 421 return new File(sourcePath).absolute.path;
428 } 422 }
429 } 423 }
430 424
431 /** 425 /**
432 * This [Logger] prints out information comments to [stdout] and error messages 426 * This [Logger] prints out information comments to [stdout] and error messages
433 * to [stderr]. 427 * to [stderr].
(...skipping 26 matching lines...) Expand all
460 } 454 }
461 } 455 }
462 456
463 @override 457 @override
464 void logInformation2(String message, Object exception) { 458 void logInformation2(String message, Object exception) {
465 if (log) { 459 if (log) {
466 stdout.writeln(message); 460 stdout.writeln(message);
467 } 461 }
468 } 462 }
469 } 463 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698