| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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_cli.src.package_analyzer; | 5 library analyzer_cli.src.package_analyzer; |
| 6 | 6 |
| 7 import 'dart:convert'; | |
| 8 import 'dart:core' hide Resource; | 7 import 'dart:core' hide Resource; |
| 9 import 'dart:io' as io; | 8 import 'dart:io' as io; |
| 10 | 9 |
| 11 import 'package:analyzer/dart/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| 12 import 'package:analyzer/file_system/file_system.dart'; | 11 import 'package:analyzer/file_system/file_system.dart'; |
| 13 import 'package:analyzer/file_system/physical_file_system.dart'; | 12 import 'package:analyzer/file_system/physical_file_system.dart'; |
| 14 import 'package:analyzer/source/package_map_resolver.dart'; | 13 import 'package:analyzer/source/package_map_resolver.dart'; |
| 15 import 'package:analyzer/src/context/cache.dart'; | 14 import 'package:analyzer/src/context/cache.dart'; |
| 16 import 'package:analyzer/src/context/context.dart'; | 15 import 'package:analyzer/src/context/context.dart'; |
| 17 import 'package:analyzer/src/generated/engine.dart'; | 16 import 'package:analyzer/src/generated/engine.dart'; |
| 18 import 'package:analyzer/src/generated/error.dart'; | 17 import 'package:analyzer/src/generated/error.dart'; |
| 19 import 'package:analyzer/src/generated/resolver.dart'; | 18 import 'package:analyzer/src/generated/resolver.dart'; |
| 20 import 'package:analyzer/src/generated/sdk_io.dart'; | 19 import 'package:analyzer/src/generated/sdk_io.dart'; |
| 21 import 'package:analyzer/src/generated/source.dart'; | 20 import 'package:analyzer/src/generated/source.dart'; |
| 22 import 'package:analyzer/src/generated/source_io.dart'; | 21 import 'package:analyzer/src/generated/source_io.dart'; |
| 23 import 'package:analyzer/src/summary/format.dart'; | 22 import 'package:analyzer/src/summary/format.dart'; |
| 24 import 'package:analyzer/src/summary/idl.dart'; | 23 import 'package:analyzer/src/summary/idl.dart'; |
| 25 import 'package:analyzer/src/summary/resynthesize.dart'; | 24 import 'package:analyzer/src/summary/resynthesize.dart'; |
| 26 import 'package:analyzer/src/summary/summarize_elements.dart'; | 25 import 'package:analyzer/src/summary/summarize_elements.dart'; |
| 27 import 'package:analyzer/src/summary/summary_sdk.dart'; | 26 import 'package:analyzer/src/summary/summary_sdk.dart'; |
| 28 import 'package:analyzer/src/task/dart.dart'; | 27 import 'package:analyzer/src/task/dart.dart'; |
| 29 import 'package:analyzer/task/dart.dart'; | 28 import 'package:analyzer/task/dart.dart'; |
| 30 import 'package:analyzer/task/model.dart'; | 29 import 'package:analyzer/task/model.dart'; |
| 31 import 'package:analyzer_cli/src/analyzer_impl.dart'; | 30 import 'package:analyzer_cli/src/analyzer_impl.dart'; |
| 32 import 'package:analyzer_cli/src/driver.dart'; | 31 import 'package:analyzer_cli/src/driver.dart'; |
| 33 import 'package:analyzer_cli/src/error_formatter.dart'; | 32 import 'package:analyzer_cli/src/error_formatter.dart'; |
| 34 import 'package:analyzer_cli/src/options.dart'; | 33 import 'package:analyzer_cli/src/options.dart'; |
| 35 import 'package:crypto/crypto.dart'; | |
| 36 import 'package:path/path.dart' as pathos; | 34 import 'package:path/path.dart' as pathos; |
| 37 | 35 |
| 38 /** | 36 /** |
| 39 * If [uri] has the `package` scheme in form of `package:pkg/file.dart`, | 37 * If [uri] has the `package` scheme in form of `package:pkg/file.dart`, |
| 40 * return the `pkg` name. Otherwise return `null`. | 38 * return the `pkg` name. Otherwise return `null`. |
| 41 */ | 39 */ |
| 42 String getPackageName(Uri uri) { | 40 String getPackageName(Uri uri) { |
| 43 if (uri.scheme != 'package') { | 41 if (uri.scheme != 'package') { |
| 44 return null; | 42 return null; |
| 45 } | 43 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 class PackageAnalyzer { | 240 class PackageAnalyzer { |
| 243 final CommandLineOptions options; | 241 final CommandLineOptions options; |
| 244 | 242 |
| 245 String packagePath; | 243 String packagePath; |
| 246 String packageLibPath; | 244 String packageLibPath; |
| 247 | 245 |
| 248 final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE; | 246 final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE; |
| 249 InternalAnalysisContext context; | 247 InternalAnalysisContext context; |
| 250 final List<Source> explicitSources = <Source>[]; | 248 final List<Source> explicitSources = <Source>[]; |
| 251 | 249 |
| 252 final List<String> linkedLibraryUris = <String>[]; | |
| 253 final List<LinkedLibraryBuilder> linkedLibraries = <LinkedLibraryBuilder>[]; | |
| 254 final List<String> unlinkedUnitUris = <String>[]; | |
| 255 final List<UnlinkedUnitBuilder> unlinkedUnits = <UnlinkedUnitBuilder>[]; | |
| 256 final List<String> unlinkedUnitHashes = <String>[]; | |
| 257 | |
| 258 PackageAnalyzer(this.options); | 250 PackageAnalyzer(this.options); |
| 259 | 251 |
| 260 /** | 252 /** |
| 261 * Perform package analysis according to the given [options]. | 253 * Perform package analysis according to the given [options]. |
| 262 */ | 254 */ |
| 263 ErrorSeverity analyze() { | 255 ErrorSeverity analyze() { |
| 264 packagePath = options.packageModePath; | 256 packagePath = options.packageModePath; |
| 265 packageLibPath = resourceProvider.pathContext.join(packagePath, 'lib'); | 257 packageLibPath = resourceProvider.pathContext.join(packagePath, 'lib'); |
| 266 if (packageLibPath == null) { | 258 if (packageLibPath == null) { |
| 267 errorSink.writeln('--package-mode-path must be set to the root ' | 259 errorSink.writeln('--package-mode-path must be set to the root ' |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 // Perform full analysis. | 291 // Perform full analysis. |
| 300 while (true) { | 292 while (true) { |
| 301 AnalysisResult analysisResult = context.performAnalysisTask(); | 293 AnalysisResult analysisResult = context.performAnalysisTask(); |
| 302 if (!analysisResult.hasMoreWork) { | 294 if (!analysisResult.hasMoreWork) { |
| 303 break; | 295 break; |
| 304 } | 296 } |
| 305 } | 297 } |
| 306 | 298 |
| 307 // Write summary for Dart libraries. | 299 // Write summary for Dart libraries. |
| 308 if (options.packageSummaryOutput != null) { | 300 if (options.packageSummaryOutput != null) { |
| 301 PackageBundleAssembler assembler = new PackageBundleAssembler(); |
| 309 for (Source source in context.librarySources) { | 302 for (Source source in context.librarySources) { |
| 310 if (pathos.isWithin(packageLibPath, source.fullName)) { | 303 if (pathos.isWithin(packageLibPath, source.fullName)) { |
| 311 LibraryElement libraryElement = context.getLibraryElement(source); | 304 LibraryElement libraryElement = context.getLibraryElement(source); |
| 312 if (libraryElement != null) { | 305 if (libraryElement != null) { |
| 313 _serializeSingleLibrary(libraryElement); | 306 assembler.serializeLibraryElement(libraryElement); |
| 314 } | 307 } |
| 315 } | 308 } |
| 316 } | 309 } |
| 317 // Write the whole package bundle. | 310 // Write the whole package bundle. |
| 318 PackageBundleBuilder sdkBundle = new PackageBundleBuilder( | 311 PackageBundleBuilder sdkBundle = assembler.assemble(); |
| 319 linkedLibraryUris: linkedLibraryUris, | |
| 320 linkedLibraries: linkedLibraries, | |
| 321 unlinkedUnitUris: unlinkedUnitUris, | |
| 322 unlinkedUnits: unlinkedUnits, | |
| 323 unlinkedUnitHashes: unlinkedUnitHashes); | |
| 324 io.File file = new io.File(options.packageSummaryOutput); | 312 io.File file = new io.File(options.packageSummaryOutput); |
| 325 file.writeAsBytesSync(sdkBundle.toBuffer(), mode: io.FileMode.WRITE_ONLY); | 313 file.writeAsBytesSync(sdkBundle.toBuffer(), mode: io.FileMode.WRITE_ONLY); |
| 326 } | 314 } |
| 327 | 315 |
| 328 // Process errors. | 316 // Process errors. |
| 329 _printErrors(); | 317 _printErrors(); |
| 330 return _computeMaxSeverity(); | 318 return _computeMaxSeverity(); |
| 331 } | 319 } |
| 332 | 320 |
| 333 ErrorSeverity _computeMaxSeverity() { | 321 ErrorSeverity _computeMaxSeverity() { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 Source _createSourceInContext(File file) { | 366 Source _createSourceInContext(File file) { |
| 379 Source source = file.createSource(); | 367 Source source = file.createSource(); |
| 380 if (context == null) { | 368 if (context == null) { |
| 381 return source; | 369 return source; |
| 382 } | 370 } |
| 383 Uri uri = context.sourceFactory.restoreUri(source); | 371 Uri uri = context.sourceFactory.restoreUri(source); |
| 384 return file.createSource(uri); | 372 return file.createSource(uri); |
| 385 } | 373 } |
| 386 | 374 |
| 387 /** | 375 /** |
| 388 * Compute a hash of the given file contents. | |
| 389 */ | |
| 390 String _hash(String contents) { | |
| 391 MD5 md5 = new MD5(); | |
| 392 md5.add(UTF8.encode(contents)); | |
| 393 return CryptoUtils.bytesToHex(md5.close()); | |
| 394 } | |
| 395 | |
| 396 /** | |
| 397 * Print errors for all explicit sources. | 376 * Print errors for all explicit sources. |
| 398 */ | 377 */ |
| 399 void _printErrors() { | 378 void _printErrors() { |
| 400 StringSink sink = options.machineFormat ? errorSink : outSink; | 379 StringSink sink = options.machineFormat ? errorSink : outSink; |
| 401 ErrorFormatter formatter = new ErrorFormatter( | 380 ErrorFormatter formatter = new ErrorFormatter( |
| 402 sink, | 381 sink, |
| 403 options, | 382 options, |
| 404 (AnalysisError error) => | 383 (AnalysisError error) => |
| 405 AnalyzerImpl.processError(error, options, context)); | 384 AnalyzerImpl.processError(error, options, context)); |
| 406 for (Source source in explicitSources) { | 385 for (Source source in explicitSources) { |
| 407 AnalysisErrorInfo errorInfo = context.getErrors(source); | 386 AnalysisErrorInfo errorInfo = context.getErrors(source); |
| 408 formatter.formatErrors([errorInfo]); | 387 formatter.formatErrors([errorInfo]); |
| 409 } | 388 } |
| 410 } | 389 } |
| 411 | |
| 412 /** | |
| 413 * Serialize the library with the given [element]. | |
| 414 */ | |
| 415 void _serializeSingleLibrary(LibraryElement element) { | |
| 416 String uri = element.source.uri.toString(); | |
| 417 LibrarySerializationResult libraryResult = | |
| 418 serializeLibrary(element, context.typeProvider, options.strongMode); | |
| 419 linkedLibraryUris.add(uri); | |
| 420 linkedLibraries.add(libraryResult.linked); | |
| 421 unlinkedUnitUris.addAll(libraryResult.unitUris); | |
| 422 unlinkedUnits.addAll(libraryResult.unlinkedUnits); | |
| 423 for (Source source in libraryResult.unitSources) { | |
| 424 unlinkedUnitHashes.add(_hash(source.contents.data)); | |
| 425 } | |
| 426 } | |
| 427 } | 390 } |
| OLD | NEW |