| 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.driver; | 5 library analyzer_cli.src.driver; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:io' as io; | 9 import 'dart:io' as io; |
| 10 | 10 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 import 'package:analyzer/src/generated/constant.dart'; | 26 import 'package:analyzer/src/generated/constant.dart'; |
| 27 import 'package:analyzer/src/generated/engine.dart'; | 27 import 'package:analyzer/src/generated/engine.dart'; |
| 28 import 'package:analyzer/src/generated/interner.dart'; | 28 import 'package:analyzer/src/generated/interner.dart'; |
| 29 import 'package:analyzer/src/generated/java_engine.dart'; | 29 import 'package:analyzer/src/generated/java_engine.dart'; |
| 30 import 'package:analyzer/src/generated/sdk.dart'; | 30 import 'package:analyzer/src/generated/sdk.dart'; |
| 31 import 'package:analyzer/src/generated/source.dart'; | 31 import 'package:analyzer/src/generated/source.dart'; |
| 32 import 'package:analyzer/src/generated/source_io.dart'; | 32 import 'package:analyzer/src/generated/source_io.dart'; |
| 33 import 'package:analyzer/src/generated/utilities_general.dart' | 33 import 'package:analyzer/src/generated/utilities_general.dart' |
| 34 show PerformanceTag; | 34 show PerformanceTag; |
| 35 import 'package:analyzer/src/lint/registry.dart'; | 35 import 'package:analyzer/src/lint/registry.dart'; |
| 36 import 'package:analyzer/src/services/lint.dart'; | |
| 37 import 'package:analyzer/src/source/source_resource.dart'; | 36 import 'package:analyzer/src/source/source_resource.dart'; |
| 38 import 'package:analyzer/src/summary/idl.dart'; | 37 import 'package:analyzer/src/summary/idl.dart'; |
| 39 import 'package:analyzer/src/summary/package_bundle_reader.dart'; | 38 import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
| 40 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; | 39 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; |
| 41 import 'package:analyzer/src/task/options.dart'; | 40 import 'package:analyzer/src/task/options.dart'; |
| 42 import 'package:analyzer_cli/src/analyzer_impl.dart'; | 41 import 'package:analyzer_cli/src/analyzer_impl.dart'; |
| 43 import 'package:analyzer_cli/src/build_mode.dart'; | 42 import 'package:analyzer_cli/src/build_mode.dart'; |
| 44 import 'package:analyzer_cli/src/error_formatter.dart'; | 43 import 'package:analyzer_cli/src/error_formatter.dart'; |
| 45 import 'package:analyzer_cli/src/options.dart'; | 44 import 'package:analyzer_cli/src/options.dart'; |
| 46 import 'package:analyzer_cli/src/perf_report.dart'; | 45 import 'package:analyzer_cli/src/perf_report.dart'; |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 // TODO(paulberry): diet parse 'package:' imports when we don't want | 356 // TODO(paulberry): diet parse 'package:' imports when we don't want |
| 358 // diagnostics. (Full parse is still needed for "self" packages.) | 357 // diagnostics. (Full parse is still needed for "self" packages.) |
| 359 return true; | 358 return true; |
| 360 } | 359 } |
| 361 }; | 360 }; |
| 362 } | 361 } |
| 363 | 362 |
| 364 /// Decide on the appropriate method for resolving URIs based on the given | 363 /// Decide on the appropriate method for resolving URIs based on the given |
| 365 /// [options] and [customUrlMappings] settings, and return a | 364 /// [options] and [customUrlMappings] settings, and return a |
| 366 /// [SourceFactory] that has been configured accordingly. | 365 /// [SourceFactory] that has been configured accordingly. |
| 366 /// When [includeSdkResolver] is `false`, return a temporary [SourceFactory] |
| 367 /// for the purpose of resolved analysis options file `include:` directives. |
| 368 /// In this situation, [analysisOptions] is ignored and can be `null`. |
| 367 SourceFactory _chooseUriResolutionPolicy( | 369 SourceFactory _chooseUriResolutionPolicy( |
| 368 CommandLineOptions options, | 370 CommandLineOptions options, |
| 369 Map<file_system.Folder, YamlMap> embedderMap, | 371 Map<file_system.Folder, YamlMap> embedderMap, |
| 370 _PackageInfo packageInfo, | 372 _PackageInfo packageInfo, |
| 371 SummaryDataStore summaryDataStore) { | 373 SummaryDataStore summaryDataStore, |
| 374 bool includeSdkResolver, |
| 375 AnalysisOptions analysisOptions) { |
| 372 // Create a custom package resolver if one has been specified. | 376 // Create a custom package resolver if one has been specified. |
| 373 if (packageResolverProvider != null) { | 377 if (packageResolverProvider != null) { |
| 374 file_system.Folder folder = resourceProvider.getResource('.'); | 378 file_system.Folder folder = resourceProvider.getResource('.'); |
| 375 UriResolver resolver = packageResolverProvider(folder); | 379 UriResolver resolver = packageResolverProvider(folder); |
| 376 if (resolver != null) { | 380 if (resolver != null) { |
| 377 UriResolver sdkResolver = new DartUriResolver(sdk); | |
| 378 | |
| 379 // TODO(brianwilkerson) This doesn't handle sdk extensions. | 381 // TODO(brianwilkerson) This doesn't handle sdk extensions. |
| 380 List<UriResolver> resolvers = <UriResolver>[ | 382 List<UriResolver> resolvers = <UriResolver>[]; |
| 381 sdkResolver, | 383 if (includeSdkResolver) { |
| 382 new InSummaryUriResolver(resourceProvider, summaryDataStore), | 384 resolvers.add(new DartUriResolver(sdk)); |
| 383 resolver, | 385 } |
| 384 new file_system.ResourceUriResolver(resourceProvider) | 386 resolvers |
| 385 ]; | 387 .add(new InSummaryUriResolver(resourceProvider, summaryDataStore)); |
| 388 resolvers.add(resolver); |
| 389 resolvers.add(new file_system.ResourceUriResolver(resourceProvider)); |
| 386 return new SourceFactory(resolvers); | 390 return new SourceFactory(resolvers); |
| 387 } | 391 } |
| 388 } | 392 } |
| 389 | 393 |
| 390 UriResolver packageUriResolver; | 394 UriResolver packageUriResolver; |
| 391 | 395 |
| 392 if (options.packageRootPath != null) { | 396 if (options.packageRootPath != null) { |
| 393 ContextBuilderOptions builderOptions = new ContextBuilderOptions(); | 397 ContextBuilderOptions builderOptions = new ContextBuilderOptions(); |
| 394 builderOptions.defaultPackagesDirectoryPath = options.packageRootPath; | 398 builderOptions.defaultPackagesDirectoryPath = options.packageRootPath; |
| 395 ContextBuilder builder = new ContextBuilder(resourceProvider, null, null, | 399 ContextBuilder builder = new ContextBuilder(resourceProvider, null, null, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 417 } | 421 } |
| 418 } | 422 } |
| 419 } | 423 } |
| 420 | 424 |
| 421 // Now, build our resolver list. | 425 // Now, build our resolver list. |
| 422 List<UriResolver> resolvers = []; | 426 List<UriResolver> resolvers = []; |
| 423 | 427 |
| 424 // 'dart:' URIs come first. | 428 // 'dart:' URIs come first. |
| 425 | 429 |
| 426 // Setup embedding. | 430 // Setup embedding. |
| 427 EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap); | 431 if (includeSdkResolver) { |
| 428 if (embedderSdk.libraryMap.size() == 0) { | 432 EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap); |
| 429 // The embedder uri resolver has no mappings. Use the default Dart SDK | 433 if (embedderSdk.libraryMap.size() == 0) { |
| 430 // uri resolver. | 434 // The embedder uri resolver has no mappings. Use the default Dart SDK |
| 431 resolvers.add(new DartUriResolver(sdk)); | 435 // uri resolver. |
| 432 } else { | 436 resolvers.add(new DartUriResolver(sdk)); |
| 433 // The embedder uri resolver has mappings, use it instead of the default | 437 } else { |
| 434 // Dart SDK uri resolver. | 438 // The embedder uri resolver has mappings, use it instead of the default |
| 435 embedderSdk.analysisOptions = _context.analysisOptions; | 439 // Dart SDK uri resolver. |
| 436 resolvers.add(new DartUriResolver(embedderSdk)); | 440 embedderSdk.analysisOptions = analysisOptions; |
| 441 resolvers.add(new DartUriResolver(embedderSdk)); |
| 442 } |
| 437 } | 443 } |
| 438 | 444 |
| 439 // Next SdkExts. | 445 // Next SdkExts. |
| 440 if (packageInfo.packageMap != null) { | 446 if (packageInfo.packageMap != null) { |
| 441 resolvers.add(new SdkExtUriResolver(packageInfo.packageMap)); | 447 resolvers.add(new SdkExtUriResolver(packageInfo.packageMap)); |
| 442 } | 448 } |
| 443 | 449 |
| 444 // Then package URIs from summaries. | 450 // Then package URIs from summaries. |
| 445 resolvers.add(new InSummaryUriResolver(resourceProvider, summaryDataStore)); | 451 resolvers.add(new InSummaryUriResolver(resourceProvider, summaryDataStore)); |
| 446 | 452 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 if (_canContextBeReused(options)) { | 508 if (_canContextBeReused(options)) { |
| 503 return; | 509 return; |
| 504 } | 510 } |
| 505 _previousOptions = options; | 511 _previousOptions = options; |
| 506 | 512 |
| 507 // Save stats from previous context before clobbering it. | 513 // Save stats from previous context before clobbering it. |
| 508 if (_context != null) { | 514 if (_context != null) { |
| 509 _analyzedFileCount += _context.sources.length; | 515 _analyzedFileCount += _context.sources.length; |
| 510 } | 516 } |
| 511 | 517 |
| 512 // Create a context. | |
| 513 _context = AnalysisEngine.instance.createAnalysisContext(); | |
| 514 | |
| 515 // Find package info. | 518 // Find package info. |
| 516 _PackageInfo packageInfo = _findPackages(options); | 519 _PackageInfo packageInfo = _findPackages(options); |
| 517 | 520 |
| 518 // Process embedders. | 521 // Process embedders. |
| 519 Map<file_system.Folder, YamlMap> embedderMap = | 522 Map<file_system.Folder, YamlMap> embedderMap = |
| 520 new EmbedderYamlLocator(packageInfo.packageMap).embedderYamls; | 523 new EmbedderYamlLocator(packageInfo.packageMap).embedderYamls; |
| 521 | 524 |
| 522 // Scan for SDK extenders. | 525 // Scan for SDK extenders. |
| 523 bool hasSdkExt = _hasSdkExt(packageInfo.packageMap?.values); | 526 bool hasSdkExt = _hasSdkExt(packageInfo.packageMap?.values); |
| 524 | 527 |
| 525 // No summaries in the presence of embedders or extenders. | 528 // No summaries in the presence of embedders or extenders. |
| 526 bool useSummaries = embedderMap.isEmpty && !hasSdkExt; | 529 bool useSummaries = embedderMap.isEmpty && !hasSdkExt; |
| 527 | 530 |
| 528 if (!useSummaries && options.buildSummaryInputs.isNotEmpty) { | 531 if (!useSummaries && options.buildSummaryInputs.isNotEmpty) { |
| 529 throw new _DriverError( | 532 throw new _DriverError( |
| 530 'Summaries are not yet supported when using Flutter.'); | 533 'Summaries are not yet supported when using Flutter.'); |
| 531 } | 534 } |
| 532 | 535 |
| 533 // Read any input summaries. | 536 // Read any input summaries. |
| 534 SummaryDataStore summaryDataStore = new SummaryDataStore( | 537 SummaryDataStore summaryDataStore = new SummaryDataStore( |
| 535 useSummaries ? options.buildSummaryInputs : <String>[]); | 538 useSummaries ? options.buildSummaryInputs : <String>[]); |
| 536 | 539 |
| 540 // Create a temporary source factory without an SDK resolver |
| 541 // for resolving "include:" directives in analysis options files. |
| 542 SourceFactory tempSourceFactory = _chooseUriResolutionPolicy( |
| 543 options, embedderMap, packageInfo, summaryDataStore, false, null); |
| 544 |
| 545 AnalysisOptionsImpl analysisOptions = |
| 546 createAnalysisOptions(resourceProvider, tempSourceFactory, options); |
| 547 analysisOptions.analyzeFunctionBodiesPredicate = |
| 548 _chooseDietParsingPolicy(options); |
| 549 |
| 537 // Once options and embedders are processed, setup the SDK. | 550 // Once options and embedders are processed, setup the SDK. |
| 538 _setupSdk(options, useSummaries); | 551 _setupSdk(options, useSummaries, analysisOptions); |
| 539 | 552 |
| 540 PackageBundle sdkBundle = sdk.getLinkedBundle(); | 553 PackageBundle sdkBundle = sdk.getLinkedBundle(); |
| 541 if (sdkBundle != null) { | 554 if (sdkBundle != null) { |
| 542 summaryDataStore.addBundle(null, sdkBundle); | 555 summaryDataStore.addBundle(null, sdkBundle); |
| 543 } | 556 } |
| 544 | 557 |
| 545 // Choose a package resolution policy and a diet parsing policy based on | 558 // Choose a package resolution policy and a diet parsing policy based on |
| 546 // the command-line options. | 559 // the command-line options. |
| 547 SourceFactory sourceFactory = _chooseUriResolutionPolicy( | 560 SourceFactory sourceFactory = _chooseUriResolutionPolicy(options, |
| 548 options, embedderMap, packageInfo, summaryDataStore); | 561 embedderMap, packageInfo, summaryDataStore, true, analysisOptions); |
| 549 | 562 |
| 550 AnalyzeFunctionBodiesPredicate dietParsingPolicy = | 563 // Create a context. |
| 551 _chooseDietParsingPolicy(options); | 564 _context = AnalysisEngine.instance.createAnalysisContext(); |
| 552 setAnalysisContextOptions( | 565 setupAnalysisContext(_context, options, analysisOptions); |
| 553 resourceProvider, sourceFactory, _context, options, | |
| 554 (AnalysisOptionsImpl contextOptions) { | |
| 555 contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; | |
| 556 }); | |
| 557 | |
| 558 _context.sourceFactory = sourceFactory; | 566 _context.sourceFactory = sourceFactory; |
| 559 | 567 |
| 560 if (options.enableNewAnalysisDriver) { | 568 if (options.enableNewAnalysisDriver) { |
| 561 PerformanceLog log = new PerformanceLog(null); | 569 PerformanceLog log = new PerformanceLog(null); |
| 562 AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log); | 570 AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log); |
| 563 analysisDriver = new AnalysisDriver( | 571 analysisDriver = new AnalysisDriver( |
| 564 scheduler, | 572 scheduler, |
| 565 log, | 573 log, |
| 566 resourceProvider, | 574 resourceProvider, |
| 567 analysisDriverByteStore, | 575 analysisDriverByteStore, |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 ErrorSeverity errorSeverity = await analyzer.analyze(); | 687 ErrorSeverity errorSeverity = await analyzer.analyze(); |
| 680 if (errorSeverity == ErrorSeverity.ERROR) { | 688 if (errorSeverity == ErrorSeverity.ERROR) { |
| 681 io.exitCode = errorSeverity.ordinal; | 689 io.exitCode = errorSeverity.ordinal; |
| 682 } | 690 } |
| 683 if (options.warningsAreFatal && errorSeverity == ErrorSeverity.WARNING) { | 691 if (options.warningsAreFatal && errorSeverity == ErrorSeverity.WARNING) { |
| 684 io.exitCode = errorSeverity.ordinal; | 692 io.exitCode = errorSeverity.ordinal; |
| 685 } | 693 } |
| 686 return errorSeverity; | 694 return errorSeverity; |
| 687 } | 695 } |
| 688 | 696 |
| 689 void _setupSdk(CommandLineOptions options, bool useSummaries) { | 697 void _setupSdk(CommandLineOptions options, bool useSummaries, |
| 698 AnalysisOptions analysisOptions) { |
| 690 if (sdk == null) { | 699 if (sdk == null) { |
| 691 if (options.dartSdkSummaryPath != null) { | 700 if (options.dartSdkSummaryPath != null) { |
| 692 sdk = new SummaryBasedDartSdk( | 701 sdk = new SummaryBasedDartSdk( |
| 693 options.dartSdkSummaryPath, options.strongMode); | 702 options.dartSdkSummaryPath, options.strongMode); |
| 694 } else { | 703 } else { |
| 695 String dartSdkPath = options.dartSdkPath; | 704 String dartSdkPath = options.dartSdkPath; |
| 696 FolderBasedDartSdk dartSdk = new FolderBasedDartSdk(resourceProvider, | 705 FolderBasedDartSdk dartSdk = new FolderBasedDartSdk(resourceProvider, |
| 697 resourceProvider.getFolder(dartSdkPath), options.strongMode); | 706 resourceProvider.getFolder(dartSdkPath), options.strongMode); |
| 698 dartSdk.useSummary = useSummaries && | 707 dartSdk.useSummary = useSummaries && |
| 699 options.sourceFiles.every((String sourcePath) { | 708 options.sourceFiles.every((String sourcePath) { |
| 700 sourcePath = path.absolute(sourcePath); | 709 sourcePath = path.absolute(sourcePath); |
| 701 sourcePath = path.normalize(sourcePath); | 710 sourcePath = path.normalize(sourcePath); |
| 702 return !path.isWithin(dartSdkPath, sourcePath); | 711 return !path.isWithin(dartSdkPath, sourcePath); |
| 703 }); | 712 }); |
| 704 | 713 dartSdk.analysisOptions = analysisOptions; |
| 705 dartSdk.analysisOptions = context.analysisOptions; | |
| 706 sdk = dartSdk; | 714 sdk = dartSdk; |
| 707 } | 715 } |
| 708 } | 716 } |
| 709 } | 717 } |
| 710 | 718 |
| 711 static AnalysisOptionsImpl createAnalysisOptionsForCommandLineOptions( | 719 static AnalysisOptionsImpl createAnalysisOptionsForCommandLineOptions( |
| 712 CommandLineOptions options) { | 720 CommandLineOptions options) { |
| 713 AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl(); | 721 AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl(); |
| 714 contextOptions.trackCacheDependencies = false; | 722 contextOptions.trackCacheDependencies = false; |
| 715 contextOptions.disableCacheFlushing = options.disableCacheFlushing; | 723 contextOptions.disableCacheFlushing = options.disableCacheFlushing; |
| 716 contextOptions.hint = !options.disableHints; | 724 contextOptions.hint = !options.disableHints; |
| 717 contextOptions.enableStrictCallChecks = options.enableStrictCallChecks; | 725 contextOptions.enableStrictCallChecks = options.enableStrictCallChecks; |
| 718 contextOptions.enableSuperMixins = options.enableSuperMixins; | 726 contextOptions.enableSuperMixins = options.enableSuperMixins; |
| 719 contextOptions.generateImplicitErrors = options.showPackageWarnings; | 727 contextOptions.generateImplicitErrors = options.showPackageWarnings; |
| 720 contextOptions.generateSdkErrors = options.showSdkWarnings; | 728 contextOptions.generateSdkErrors = options.showSdkWarnings; |
| 721 contextOptions.lint = options.lints; | 729 contextOptions.lint = options.lints; |
| 722 contextOptions.strongMode = options.strongMode; | 730 contextOptions.strongMode = options.strongMode; |
| 723 contextOptions.implicitCasts = options.implicitCasts; | 731 contextOptions.implicitCasts = options.implicitCasts; |
| 724 contextOptions.implicitDynamic = options.implicitDynamic; | 732 contextOptions.implicitDynamic = options.implicitDynamic; |
| 725 return contextOptions; | 733 return contextOptions; |
| 726 } | 734 } |
| 727 | 735 |
| 736 static AnalysisOptionsImpl createAnalysisOptions( |
| 737 file_system.ResourceProvider resourceProvider, |
| 738 SourceFactory sourceFactory, |
| 739 CommandLineOptions options) { |
| 740 // Prepare context options. |
| 741 AnalysisOptionsImpl analysisOptions = |
| 742 createAnalysisOptionsForCommandLineOptions(options); |
| 743 |
| 744 // Process analysis options file (and notify all interested parties). |
| 745 _processAnalysisOptions( |
| 746 resourceProvider, sourceFactory, analysisOptions, options); |
| 747 return analysisOptions; |
| 748 } |
| 749 |
| 728 static void setAnalysisContextOptions( | 750 static void setAnalysisContextOptions( |
| 729 file_system.ResourceProvider resourceProvider, | 751 file_system.ResourceProvider resourceProvider, |
| 730 SourceFactory sourceFactory, | 752 SourceFactory sourceFactory, |
| 731 AnalysisContext context, | 753 AnalysisContext context, |
| 732 CommandLineOptions options, | 754 CommandLineOptions options, |
| 733 void configureContextOptions(AnalysisOptionsImpl contextOptions)) { | 755 void configureContextOptions(AnalysisOptionsImpl contextOptions)) { |
| 756 AnalysisOptionsImpl analysisOptions = |
| 757 createAnalysisOptions(resourceProvider, sourceFactory, options); |
| 758 configureContextOptions(analysisOptions); |
| 759 setupAnalysisContext(context, options, analysisOptions); |
| 760 } |
| 761 |
| 762 static void setupAnalysisContext(AnalysisContext context, |
| 763 CommandLineOptions options, AnalysisOptionsImpl analysisOptions) { |
| 734 Map<String, String> definedVariables = options.definedVariables; | 764 Map<String, String> definedVariables = options.definedVariables; |
| 735 if (definedVariables.isNotEmpty) { | 765 if (definedVariables.isNotEmpty) { |
| 736 DeclaredVariables declaredVariables = context.declaredVariables; | 766 DeclaredVariables declaredVariables = context.declaredVariables; |
| 737 definedVariables.forEach((String variableName, String value) { | 767 definedVariables.forEach((String variableName, String value) { |
| 738 declaredVariables.define(variableName, value); | 768 declaredVariables.define(variableName, value); |
| 739 }); | 769 }); |
| 740 } | 770 } |
| 741 | 771 |
| 742 if (options.log) { | 772 if (options.log) { |
| 743 AnalysisEngine.instance.logger = new StdLogger(); | 773 AnalysisEngine.instance.logger = new StdLogger(); |
| 744 } | 774 } |
| 745 | 775 |
| 746 // Prepare context options. | |
| 747 AnalysisOptionsImpl contextOptions = | |
| 748 createAnalysisOptionsForCommandLineOptions(options); | |
| 749 configureContextOptions(contextOptions); | |
| 750 | |
| 751 // Set context options. | 776 // Set context options. |
| 752 context.analysisOptions = contextOptions; | 777 context.analysisOptions = analysisOptions; |
| 753 | |
| 754 // Process analysis options file (and notify all interested parties). | |
| 755 _processAnalysisOptions(resourceProvider, sourceFactory, context, options); | |
| 756 } | 778 } |
| 757 | 779 |
| 758 /// Perform a deep comparison of two string lists. | 780 /// Perform a deep comparison of two string lists. |
| 759 static bool _equalLists(List<String> l1, List<String> l2) { | 781 static bool _equalLists(List<String> l1, List<String> l2) { |
| 760 if (l1.length != l2.length) { | 782 if (l1.length != l2.length) { |
| 761 return false; | 783 return false; |
| 762 } | 784 } |
| 763 for (int i = 0; i < l1.length; i++) { | 785 for (int i = 0; i < l1.length; i++) { |
| 764 if (l1[i] != l2[i]) { | 786 if (l1[i] != l2[i]) { |
| 765 return false; | 787 return false; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 return file; | 825 return file; |
| 804 } | 826 } |
| 805 | 827 |
| 806 /// Convert [sourcePath] into an absolute path. | 828 /// Convert [sourcePath] into an absolute path. |
| 807 static String _normalizeSourcePath(String sourcePath) => | 829 static String _normalizeSourcePath(String sourcePath) => |
| 808 path.normalize(new io.File(sourcePath).absolute.path); | 830 path.normalize(new io.File(sourcePath).absolute.path); |
| 809 | 831 |
| 810 static void _processAnalysisOptions( | 832 static void _processAnalysisOptions( |
| 811 file_system.ResourceProvider resourceProvider, | 833 file_system.ResourceProvider resourceProvider, |
| 812 SourceFactory sourceFactory, | 834 SourceFactory sourceFactory, |
| 813 AnalysisContext context, | 835 AnalysisOptionsImpl analysisOptions, |
| 814 CommandLineOptions options) { | 836 CommandLineOptions options) { |
| 815 file_system.File file = _getOptionsFile(resourceProvider, options); | 837 file_system.File file = _getOptionsFile(resourceProvider, options); |
| 816 | 838 |
| 817 AnalysisOptionsProvider analysisOptionsProvider = | 839 AnalysisOptionsProvider analysisOptionsProvider = |
| 818 new AnalysisOptionsProvider(sourceFactory); | 840 new AnalysisOptionsProvider(sourceFactory); |
| 819 Map<String, YamlNode> optionMap = | 841 Map<String, YamlNode> optionMap = |
| 820 analysisOptionsProvider.getOptionsFromFile(file); | 842 analysisOptionsProvider.getOptionsFromFile(file); |
| 821 | 843 |
| 822 // Fill in lint rule defaults in case lints are enabled and rules are | 844 // Fill in lint rule defaults in case lints are enabled and rules are |
| 823 // not specified in an options file. | 845 // not specified in an options file. |
| 824 if (options.lints && !containsLintRuleEntry(optionMap)) { | 846 if (options.lints && !containsLintRuleEntry(optionMap)) { |
| 825 setLints(context, Registry.ruleRegistry.defaultRules); | 847 analysisOptions.lintRules = Registry.ruleRegistry.defaultRules; |
| 826 } | 848 } |
| 827 | 849 |
| 828 // Ask engine to further process options. | 850 // Ask engine to further process options. |
| 829 if (optionMap != null) { | 851 if (optionMap != null) { |
| 830 applyToAnalysisOptions(context.analysisOptions, optionMap); | 852 applyToAnalysisOptions(analysisOptions, optionMap); |
| 831 } | 853 } |
| 832 } | 854 } |
| 833 } | 855 } |
| 834 | 856 |
| 835 /// Provides a framework to read command line options from stdin and feed them | 857 /// Provides a framework to read command line options from stdin and feed them |
| 836 /// to a callback. | 858 /// to a callback. |
| 837 class _BatchRunner { | 859 class _BatchRunner { |
| 838 /// Run the tool in 'batch' mode, receiving command lines through stdin and | 860 /// Run the tool in 'batch' mode, receiving command lines through stdin and |
| 839 /// returning pass/fail status through stdout. This feature is intended for | 861 /// returning pass/fail status through stdout. This feature is intended for |
| 840 /// use in unit testing. | 862 /// use in unit testing. |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 for (var package in packages) { | 938 for (var package in packages) { |
| 917 var packageName = path.basename(package.path); | 939 var packageName = path.basename(package.path); |
| 918 var realPath = package.resolveSymbolicLinksSync(); | 940 var realPath = package.resolveSymbolicLinksSync(); |
| 919 result[packageName] = [ | 941 result[packageName] = [ |
| 920 PhysicalResourceProvider.INSTANCE.getFolder(realPath) | 942 PhysicalResourceProvider.INSTANCE.getFolder(realPath) |
| 921 ]; | 943 ]; |
| 922 } | 944 } |
| 923 return result; | 945 return result; |
| 924 } | 946 } |
| 925 } | 947 } |
| OLD | NEW |