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

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

Issue 1417363007: Fix to give `LineInfo` to options error spans. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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.options; 5 library analyzer.src.task.options;
6 6
7 import 'package:analyzer/analyzer.dart'; 7 import 'package:analyzer/analyzer.dart';
8 import 'package:analyzer/plugin/options.dart'; 8 import 'package:analyzer/plugin/options.dart';
9 import 'package:analyzer/source/analysis_options_provider.dart'; 9 import 'package:analyzer/source/analysis_options_provider.dart';
10 import 'package:analyzer/src/generated/engine.dart'; 10 import 'package:analyzer/src/generated/engine.dart';
(...skipping 30 matching lines...) Expand all
41 /// A task that generates errors for an `.analysis_options` file. 41 /// A task that generates errors for an `.analysis_options` file.
42 class GenerateOptionsErrorsTask extends SourceBasedAnalysisTask { 42 class GenerateOptionsErrorsTask extends SourceBasedAnalysisTask {
43 /// The name of the input whose value is the content of the file. 43 /// The name of the input whose value is the content of the file.
44 static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME'; 44 static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME';
45 45
46 /// The task descriptor describing this kind of task. 46 /// The task descriptor describing this kind of task.
47 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 47 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
48 'GenerateOptionsErrorsTask', 48 'GenerateOptionsErrorsTask',
49 createTask, 49 createTask,
50 buildInputs, 50 buildInputs,
51 <ResultDescriptor>[ANALYSIS_OPTIONS_ERRORS]); 51 <ResultDescriptor>[ANALYSIS_OPTIONS_ERRORS, LINE_INFO]);
52 52
53 final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider(); 53 final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider();
54 54
55 GenerateOptionsErrorsTask(AnalysisContext context, AnalysisTarget target) 55 GenerateOptionsErrorsTask(AnalysisContext context, AnalysisTarget target)
56 : super(context, target); 56 : super(context, target);
57 57
58 @override 58 @override
59 TaskDescriptor get descriptor => DESCRIPTOR; 59 TaskDescriptor get descriptor => DESCRIPTOR;
60 60
61 Source get source => target.source; 61 Source get source => target.source;
(...skipping 12 matching lines...) Expand all
74 SourceSpan span = e.span; 74 SourceSpan span = e.span;
75 var error = new AnalysisError(source, span.start.column + 1, span.length, 75 var error = new AnalysisError(source, span.start.column + 1, span.length,
76 AnalysisOptionsErrorCode.PARSE_ERROR, [e.message]); 76 AnalysisOptionsErrorCode.PARSE_ERROR, [e.message]);
77 errors.add(error); 77 errors.add(error);
78 } 78 }
79 79
80 // 80 //
81 // Record outputs. 81 // Record outputs.
82 // 82 //
83 outputs[ANALYSIS_OPTIONS_ERRORS] = errors; 83 outputs[ANALYSIS_OPTIONS_ERRORS] = errors;
84 outputs[LINE_INFO] = _computeLineInfo(content);
84 } 85 }
85 86
86 List<AnalysisError> _validate(Map<String, YamlNode> options) => 87 List<AnalysisError> _validate(Map<String, YamlNode> options) =>
87 new OptionsFileValidator(source).validate(options); 88 new OptionsFileValidator(source).validate(options);
88 89
89 /// Return a map from the names of the inputs of this kind of task to the 90 /// Return a map from the names of the inputs of this kind of task to the
90 /// task input descriptors describing those inputs for a task with the 91 /// task input descriptors describing those inputs for a task with the
91 /// given [target]. 92 /// given [target].
92 static Map<String, TaskInput> buildInputs(Source source) => 93 static Map<String, TaskInput> buildInputs(Source source) =>
93 <String, TaskInput>{CONTENT_INPUT_NAME: CONTENT.of(source)}; 94 <String, TaskInput>{CONTENT_INPUT_NAME: CONTENT.of(source)};
94 95
95 /// Create a task based on the given [target] in the given [context]. 96 /// Create a task based on the given [target] in the given [context].
96 static GenerateOptionsErrorsTask createTask( 97 static GenerateOptionsErrorsTask createTask(
97 AnalysisContext context, AnalysisTarget target) => 98 AnalysisContext context, AnalysisTarget target) =>
98 new GenerateOptionsErrorsTask(context, target); 99 new GenerateOptionsErrorsTask(context, target);
100
101 /// Compute [LineInfo] for the given [content].
102 static LineInfo _computeLineInfo(String content) {
103 List<int> lineStarts = <int>[0];
104 for (int index = 0; index < content.length; index++) {
105 if (content.codeUnitAt(index) == 0x0A) {
Brian Wilkerson 2015/10/27 13:18:29 For Dart files we accept either CR, CR/LF, or LF a
pquitslund 2015/10/27 15:31:44 I was folllowing HTML's suit but this is not a bad
Brian Wilkerson 2015/10/27 15:59:44 We compute line info while scanning, as part of th
106 lineStarts.add(index + 1);
107 }
108 }
109 return new LineInfo(lineStarts);
110 }
99 } 111 }
100 112
101 /// Validates `linter` top-level options. 113 /// Validates `linter` top-level options.
102 /// TODO(pq): move into `linter` package and plugin. 114 /// TODO(pq): move into `linter` package and plugin.
103 class LinterOptionsValidator extends TopLevelOptionValidator { 115 class LinterOptionsValidator extends TopLevelOptionValidator {
104 LinterOptionsValidator() : super('linter', const ['rules']); 116 LinterOptionsValidator() : super('linter', const ['rules']);
105 } 117 }
106 118
107 /// Validates options defined in an `.analysis_options` file. 119 /// Validates options defined in an `.analysis_options` file.
108 class OptionsFileValidator { 120 class OptionsFileValidator {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 AnalysisOptionsWarningCode.UNSUPPORTED_OPTION, 156 AnalysisOptionsWarningCode.UNSUPPORTED_OPTION,
145 k.span, 157 k.span,
146 [pluginName, k.value]); 158 [pluginName, k.value]);
147 } 159 }
148 } 160 }
149 //TODO(pq): consider an error if the node is not a Scalar. 161 //TODO(pq): consider an error if the node is not a Scalar.
150 }); 162 });
151 } 163 }
152 } 164 }
153 } 165 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698