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

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

Issue 1385293002: Lint support for the new task model. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Tests and tweaks. Created 5 years, 2 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
OLDNEW
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.src.task.dart; 5 library analyzer.src.task.dart;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/src/context/cache.dart'; 9 import 'package:analyzer/src/context/cache.dart';
10 import 'package:analyzer/src/generated/ast.dart'; 10 import 'package:analyzer/src/generated/ast.dart';
11 import 'package:analyzer/src/generated/constant.dart'; 11 import 'package:analyzer/src/generated/constant.dart';
12 import 'package:analyzer/src/generated/element.dart'; 12 import 'package:analyzer/src/generated/element.dart';
13 import 'package:analyzer/src/generated/engine.dart' 13 import 'package:analyzer/src/generated/engine.dart'
14 hide AnalysisCache, AnalysisTask; 14 hide AnalysisCache, AnalysisTask;
15 import 'package:analyzer/src/generated/error.dart'; 15 import 'package:analyzer/src/generated/error.dart';
16 import 'package:analyzer/src/generated/error_verifier.dart'; 16 import 'package:analyzer/src/generated/error_verifier.dart';
17 import 'package:analyzer/src/generated/incremental_resolver.dart'; 17 import 'package:analyzer/src/generated/incremental_resolver.dart';
18 import 'package:analyzer/src/generated/java_engine.dart'; 18 import 'package:analyzer/src/generated/java_engine.dart';
19 import 'package:analyzer/src/generated/parser.dart'; 19 import 'package:analyzer/src/generated/parser.dart';
20 import 'package:analyzer/src/generated/resolver.dart'; 20 import 'package:analyzer/src/generated/resolver.dart';
21 import 'package:analyzer/src/generated/scanner.dart'; 21 import 'package:analyzer/src/generated/scanner.dart';
22 import 'package:analyzer/src/generated/sdk.dart'; 22 import 'package:analyzer/src/generated/sdk.dart';
23 import 'package:analyzer/src/generated/source.dart'; 23 import 'package:analyzer/src/generated/source.dart';
24 import 'package:analyzer/src/generated/visitors.dart';
24 import 'package:analyzer/src/plugin/engine_plugin.dart'; 25 import 'package:analyzer/src/plugin/engine_plugin.dart';
26 import 'package:analyzer/src/services/lint.dart';
25 import 'package:analyzer/src/task/driver.dart'; 27 import 'package:analyzer/src/task/driver.dart';
26 import 'package:analyzer/src/task/general.dart'; 28 import 'package:analyzer/src/task/general.dart';
27 import 'package:analyzer/src/task/html.dart'; 29 import 'package:analyzer/src/task/html.dart';
28 import 'package:analyzer/src/task/inputs.dart'; 30 import 'package:analyzer/src/task/inputs.dart';
29 import 'package:analyzer/src/task/model.dart'; 31 import 'package:analyzer/src/task/model.dart';
30 import 'package:analyzer/src/task/strong_mode.dart'; 32 import 'package:analyzer/src/task/strong_mode.dart';
31 import 'package:analyzer/task/dart.dart'; 33 import 'package:analyzer/task/dart.dart';
32 import 'package:analyzer/task/general.dart'; 34 import 'package:analyzer/task/general.dart';
33 import 'package:analyzer/task/model.dart'; 35 import 'package:analyzer/task/model.dart';
34 36
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 /** 286 /**
285 * The analysis errors associated with a compilation unit in a specific library. 287 * The analysis errors associated with a compilation unit in a specific library.
286 * 288 *
287 * The result is only available for [LibrarySpecificUnit]s. 289 * The result is only available for [LibrarySpecificUnit]s.
288 */ 290 */
289 final ListResultDescriptor<AnalysisError> LIBRARY_UNIT_ERRORS = 291 final ListResultDescriptor<AnalysisError> LIBRARY_UNIT_ERRORS =
290 new ListResultDescriptor<AnalysisError>( 292 new ListResultDescriptor<AnalysisError>(
291 'LIBRARY_UNIT_ERRORS', AnalysisError.NO_ERRORS); 293 'LIBRARY_UNIT_ERRORS', AnalysisError.NO_ERRORS);
292 294
293 /** 295 /**
296 * The errors produced while generating lints for a compilation unit.
297 *
298 * The list will be empty if there were no errors, but will not be `null`.
299 *
300 * The result is only available for [LibrarySpecificUnit]s.
301 */
302 final ListResultDescriptor<AnalysisError> LINTS =
303 new ListResultDescriptor<AnalysisError>(
304 'LINT_ERRORS', AnalysisError.NO_ERRORS);
305
306 /**
294 * The errors produced while parsing a compilation unit. 307 * The errors produced while parsing a compilation unit.
295 * 308 *
296 * The list will be empty if there were no errors, but will not be `null`. 309 * The list will be empty if there were no errors, but will not be `null`.
297 * 310 *
298 * The result is only available for [Source]s representing a compilation unit. 311 * The result is only available for [Source]s representing a compilation unit.
299 */ 312 */
300 final ListResultDescriptor<AnalysisError> PARSE_ERRORS = 313 final ListResultDescriptor<AnalysisError> PARSE_ERRORS =
301 new ListResultDescriptor<AnalysisError>( 314 new ListResultDescriptor<AnalysisError>(
302 'PARSE_ERRORS', AnalysisError.NO_ERRORS); 315 'PARSE_ERRORS', AnalysisError.NO_ERRORS);
303 316
(...skipping 2108 matching lines...) Expand 10 before | Expand all | Expand 10 after
2412 * Create a [GenerateHintsTask] based on the given [target] in 2425 * Create a [GenerateHintsTask] based on the given [target] in
2413 * the given [context]. 2426 * the given [context].
2414 */ 2427 */
2415 static GenerateHintsTask createTask( 2428 static GenerateHintsTask createTask(
2416 AnalysisContext context, AnalysisTarget target) { 2429 AnalysisContext context, AnalysisTarget target) {
2417 return new GenerateHintsTask(context, target); 2430 return new GenerateHintsTask(context, target);
2418 } 2431 }
2419 } 2432 }
2420 2433
2421 /** 2434 /**
2435 * A task that generates [LINTS] for a unit.
2436 */
2437 class GenerateLintsTask extends SourceBasedAnalysisTask {
2438 /**
2439 * The name of the [RESOLVED_UNIT8] input.
2440 */
2441 static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT';
2442
2443 /**
2444 * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input.
2445 */
2446 static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS';
scheglov 2015/10/09 03:45:10 It seems that this and the next two input names ar
pquitslund 2015/10/09 15:25:36 Good catch! https://codereview.chromium.org/13863
2447
2448 /**
2449 * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input.
2450 */
2451 static const String USED_IMPORTED_ELEMENTS_INPUT = 'USED_IMPORTED_ELEMENTS';
2452
2453 /**
2454 * The name of the [TYPE_PROVIDER] input.
2455 */
2456 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
2457
2458 /**
2459 * The task descriptor describing this kind of task.
2460 */
2461 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
2462 'GenerateLintsTask', createTask, buildInputs, <ResultDescriptor>[LINTS]);
2463
2464 GenerateLintsTask(InternalAnalysisContext context, AnalysisTarget target)
2465 : super(context, target);
2466
2467 @override
2468 TaskDescriptor get descriptor => DESCRIPTOR;
2469
2470 @override
2471 void internalPerform() {
2472 AnalysisOptions analysisOptions = context.analysisOptions;
2473 if (!analysisOptions.lint) {
2474 outputs[LINTS] = AnalysisError.NO_ERRORS;
2475 return;
2476 }
2477 //
2478 // Prepare collectors.
2479 //
2480 RecordingErrorListener errorListener = new RecordingErrorListener();
2481 Source source = getRequiredSource();
2482 ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
2483 //
2484 // Prepare inputs.
2485 //
2486 CompilationUnit unit = getRequiredInput(RESOLVED_UNIT_INPUT);
2487
2488 //
2489 // Generate lints.
2490 //
2491 LintGenerator.LINTERS.forEach((l) => l.reporter = errorReporter);
2492 Iterable<AstVisitor> visitors =
2493 LintGenerator.LINTERS.map((l) => l.getVisitor()).toList();
2494 unit.accept(new DelegatingAstVisitor(visitors.where((v) => v != null)));
2495
2496 //
2497 // Record outputs.
2498 //
2499 outputs[LINTS] = errorListener.errors;
2500 }
2501
2502 /**
2503 * Return a map from the names of the inputs of this kind of task to the task
2504 * input descriptors describing those inputs for a task with the
2505 * given [target].
2506 */
2507 static Map<String, TaskInput> buildInputs(AnalysisTarget target) =>
2508 <String, TaskInput>{RESOLVED_UNIT_INPUT: RESOLVED_UNIT.of(target)};
2509
2510 /**
2511 * Create a [GenerateLintsTask] based on the given [target] in
2512 * the given [context].
2513 */
2514 static GenerateLintsTask createTask(
2515 AnalysisContext context, AnalysisTarget target) {
2516 return new GenerateLintsTask(context, target);
2517 }
2518 }
2519
2520 /**
2422 * A task that ensures that all of the inferrable instance members in a 2521 * A task that ensures that all of the inferrable instance members in a
2423 * compilation unit have had their type inferred. 2522 * compilation unit have had their type inferred.
2424 */ 2523 */
2425 class InferInstanceMembersInUnitTask extends SourceBasedAnalysisTask { 2524 class InferInstanceMembersInUnitTask extends SourceBasedAnalysisTask {
2426 /** 2525 /**
2427 * The name of the [TYPE_PROVIDER] input. 2526 * The name of the [TYPE_PROVIDER] input.
2428 */ 2527 */
2429 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; 2528 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT';
2430 2529
2431 /** 2530 /**
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
2812 * The name of the [BUILD_LIBRARY_ERRORS] input. 2911 * The name of the [BUILD_LIBRARY_ERRORS] input.
2813 */ 2912 */
2814 static const String BUILD_LIBRARY_ERRORS_INPUT = 'BUILD_LIBRARY_ERRORS'; 2913 static const String BUILD_LIBRARY_ERRORS_INPUT = 'BUILD_LIBRARY_ERRORS';
2815 2914
2816 /** 2915 /**
2817 * The name of the [HINTS] input. 2916 * The name of the [HINTS] input.
2818 */ 2917 */
2819 static const String HINTS_INPUT = 'HINTS'; 2918 static const String HINTS_INPUT = 'HINTS';
2820 2919
2821 /** 2920 /**
2921 * The name of the [LINTS] input.
2922 */
2923 static const String LINTS_INPUT = 'LINTS';
2924
2925 /**
2822 * The name of the [INFER_STATIC_VARIABLE_TYPES_ERRORS] input. 2926 * The name of the [INFER_STATIC_VARIABLE_TYPES_ERRORS] input.
2823 */ 2927 */
2824 static const String INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT = 2928 static const String INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT =
2825 'INFER_STATIC_VARIABLE_TYPES_ERRORS'; 2929 'INFER_STATIC_VARIABLE_TYPES_ERRORS';
2826 2930
2827 /** 2931 /**
2828 * The name of the [PARTIALLY_RESOLVE_REFERENCES_ERRORS] input. 2932 * The name of the [PARTIALLY_RESOLVE_REFERENCES_ERRORS] input.
2829 */ 2933 */
2830 static const String PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT = 2934 static const String PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT =
2831 'PARTIALLY_RESOLVE_REFERENCES_ERRORS'; 2935 'PARTIALLY_RESOLVE_REFERENCES_ERRORS';
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2870 2974
2871 @override 2975 @override
2872 void internalPerform() { 2976 void internalPerform() {
2873 // 2977 //
2874 // Prepare inputs. 2978 // Prepare inputs.
2875 // 2979 //
2876 List<List<AnalysisError>> errorLists = <List<AnalysisError>>[]; 2980 List<List<AnalysisError>> errorLists = <List<AnalysisError>>[];
2877 errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT)); 2981 errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT));
2878 errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT)); 2982 errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT));
2879 errorLists.add(getRequiredInput(HINTS_INPUT)); 2983 errorLists.add(getRequiredInput(HINTS_INPUT));
2984 errorLists.add(getRequiredInput(LINTS_INPUT));
2880 errorLists.add(getRequiredInput(INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT)); 2985 errorLists.add(getRequiredInput(INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT));
2881 errorLists.add(getRequiredInput(PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT)); 2986 errorLists.add(getRequiredInput(PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT));
2882 errorLists.add(getRequiredInput(RESOLVE_FUNCTION_BODIES_ERRORS_INPUT)); 2987 errorLists.add(getRequiredInput(RESOLVE_FUNCTION_BODIES_ERRORS_INPUT));
2883 errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT)); 2988 errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT));
2884 errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT)); 2989 errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT));
2885 errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT)); 2990 errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT));
2886 // 2991 //
2887 // Record outputs. 2992 // Record outputs.
2888 // 2993 //
2889 outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists); 2994 outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists);
2890 } 2995 }
2891 2996
2892 /** 2997 /**
2893 * Return a map from the names of the inputs of this kind of task to the task 2998 * Return a map from the names of the inputs of this kind of task to the task
2894 * input descriptors describing those inputs for a task with the 2999 * input descriptors describing those inputs for a task with the
2895 * given [unit]. 3000 * given [unit].
2896 */ 3001 */
2897 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 3002 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2898 LibrarySpecificUnit unit = target; 3003 LibrarySpecificUnit unit = target;
2899 Map<String, TaskInput> inputs = <String, TaskInput>{ 3004 Map<String, TaskInput> inputs = <String, TaskInput>{
2900 HINTS_INPUT: HINTS.of(unit), 3005 HINTS_INPUT: HINTS.of(unit),
3006 LINTS_INPUT: LINTS.of(unit),
scheglov 2015/10/09 03:45:10 Would be nice to keep these sorted.
pquitslund 2015/10/09 15:25:36 I think this has been fixed already.
2901 INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT: 3007 INFER_STATIC_VARIABLE_TYPES_ERRORS_INPUT:
2902 INFER_STATIC_VARIABLE_TYPES_ERRORS.of(unit), 3008 INFER_STATIC_VARIABLE_TYPES_ERRORS.of(unit),
2903 PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT: 3009 PARTIALLY_RESOLVE_REFERENCES_ERRORS_INPUT:
2904 PARTIALLY_RESOLVE_REFERENCES_ERRORS.of(unit), 3010 PARTIALLY_RESOLVE_REFERENCES_ERRORS.of(unit),
2905 RESOLVE_FUNCTION_BODIES_ERRORS_INPUT: 3011 RESOLVE_FUNCTION_BODIES_ERRORS_INPUT:
2906 RESOLVE_FUNCTION_BODIES_ERRORS.of(unit), 3012 RESOLVE_FUNCTION_BODIES_ERRORS.of(unit),
2907 RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit), 3013 RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit),
2908 VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit), 3014 VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit),
2909 VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit) 3015 VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit)
2910 }; 3016 };
(...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after
4128 4234
4129 @override 4235 @override
4130 bool moveNext() { 4236 bool moveNext() {
4131 if (_newSources.isEmpty) { 4237 if (_newSources.isEmpty) {
4132 return false; 4238 return false;
4133 } 4239 }
4134 currentTarget = _newSources.removeLast(); 4240 currentTarget = _newSources.removeLast();
4135 return true; 4241 return true;
4136 } 4242 }
4137 } 4243 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/plugin/engine_plugin.dart ('k') | pkg/analyzer/lib/src/task/dart_work_manager.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698