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

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

Issue 1427513003: Compute documentation offsets for library, import, and export directive elements (issue 24756) (Closed) Base URL: https://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
« no previous file with comments | « no previous file | pkg/analyzer/test/src/context/context_test.dart » ('j') | 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) 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';
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 new ImportElementImpl(directive.offset); 805 new ImportElementImpl(directive.offset);
806 StringLiteral uriLiteral = importDirective.uri; 806 StringLiteral uriLiteral = importDirective.uri;
807 if (uriLiteral != null) { 807 if (uriLiteral != null) {
808 importElement.uriOffset = uriLiteral.offset; 808 importElement.uriOffset = uriLiteral.offset;
809 importElement.uriEnd = uriLiteral.end; 809 importElement.uriEnd = uriLiteral.end;
810 } 810 }
811 importElement.uri = uriContent; 811 importElement.uri = uriContent;
812 importElement.deferred = importDirective.deferredKeyword != null; 812 importElement.deferred = importDirective.deferredKeyword != null;
813 importElement.combinators = _buildCombinators(importDirective); 813 importElement.combinators = _buildCombinators(importDirective);
814 importElement.importedLibrary = importedLibrary; 814 importElement.importedLibrary = importedLibrary;
815 _setDocRange(importElement, importDirective);
815 SimpleIdentifier prefixNode = directive.prefix; 816 SimpleIdentifier prefixNode = directive.prefix;
816 if (prefixNode != null) { 817 if (prefixNode != null) {
817 importElement.prefixOffset = prefixNode.offset; 818 importElement.prefixOffset = prefixNode.offset;
818 String prefixName = prefixNode.name; 819 String prefixName = prefixNode.name;
819 PrefixElementImpl prefix = nameToPrefixMap[prefixName]; 820 PrefixElementImpl prefix = nameToPrefixMap[prefixName];
820 if (prefix == null) { 821 if (prefix == null) {
821 prefix = new PrefixElementImpl.forNode(prefixNode); 822 prefix = new PrefixElementImpl.forNode(prefixNode);
822 nameToPrefixMap[prefixName] = prefix; 823 nameToPrefixMap[prefixName] = prefix;
823 } 824 }
824 importElement.prefix = prefix; 825 importElement.prefix = prefix;
(...skipping 21 matching lines...) Expand all
846 ExportElementImpl exportElement = 847 ExportElementImpl exportElement =
847 new ExportElementImpl(directive.offset); 848 new ExportElementImpl(directive.offset);
848 StringLiteral uriLiteral = exportDirective.uri; 849 StringLiteral uriLiteral = exportDirective.uri;
849 if (uriLiteral != null) { 850 if (uriLiteral != null) {
850 exportElement.uriOffset = uriLiteral.offset; 851 exportElement.uriOffset = uriLiteral.offset;
851 exportElement.uriEnd = uriLiteral.end; 852 exportElement.uriEnd = uriLiteral.end;
852 } 853 }
853 exportElement.uri = exportDirective.uriContent; 854 exportElement.uri = exportDirective.uriContent;
854 exportElement.combinators = _buildCombinators(exportDirective); 855 exportElement.combinators = _buildCombinators(exportDirective);
855 exportElement.exportedLibrary = exportedLibrary; 856 exportElement.exportedLibrary = exportedLibrary;
857 _setDocRange(exportElement, exportDirective);
856 directive.element = exportElement; 858 directive.element = exportElement;
857 exports.add(exportElement); 859 exports.add(exportElement);
858 if (exportSourceKindMap[exportedSource] != SourceKind.LIBRARY) { 860 if (exportSourceKindMap[exportedSource] != SourceKind.LIBRARY) {
859 errors.add(new AnalysisError( 861 errors.add(new AnalysisError(
860 exportedSource, 862 exportedSource,
861 uriLiteral.offset, 863 uriLiteral.offset,
862 uriLiteral.length, 864 uriLiteral.length,
863 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, 865 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY,
864 [uriLiteral.toSource()])); 866 [uriLiteral.toSource()]));
865 } 867 }
(...skipping 20 matching lines...) Expand all
886 // for details on library cycle invalidation. 888 // for details on library cycle invalidation.
887 libraryElement.invalidateLibraryCycles(); 889 libraryElement.invalidateLibraryCycles();
888 // 890 //
889 // Record outputs. 891 // Record outputs.
890 // 892 //
891 outputs[LIBRARY_ELEMENT2] = libraryElement; 893 outputs[LIBRARY_ELEMENT2] = libraryElement;
892 outputs[BUILD_DIRECTIVES_ERRORS] = errors; 894 outputs[BUILD_DIRECTIVES_ERRORS] = errors;
893 } 895 }
894 896
895 /** 897 /**
898 * If the given [node] has a documentation comment, remember its range
899 * into the given [element].
900 */
901 void _setDocRange(ElementImpl element, AnnotatedNode node) {
902 Comment comment = node.documentationComment;
903 if (comment != null && comment.isDocumentation) {
904 element.setDocRange(comment.offset, comment.length);
905 }
906 }
907
908 /**
896 * Return a map from the names of the inputs of this kind of task to the task 909 * Return a map from the names of the inputs of this kind of task to the task
897 * input descriptors describing those inputs for a task with the 910 * input descriptors describing those inputs for a task with the
898 * given library [libSource]. 911 * given library [libSource].
899 */ 912 */
900 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 913 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
901 Source source = target; 914 Source source = target;
902 return <String, TaskInput>{ 915 return <String, TaskInput>{
903 LIBRARY_INPUT: LIBRARY_ELEMENT1.of(source), 916 LIBRARY_INPUT: LIBRARY_ELEMENT1.of(source),
904 UNIT_INPUT_NAME: 917 UNIT_INPUT_NAME:
905 RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)), 918 RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)),
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 definingCompilationUnit.element; 1167 definingCompilationUnit.element;
1155 Map<Source, CompilationUnit> partUnitMap = 1168 Map<Source, CompilationUnit> partUnitMap =
1156 new HashMap<Source, CompilationUnit>(); 1169 new HashMap<Source, CompilationUnit>();
1157 for (CompilationUnit partUnit in partUnits) { 1170 for (CompilationUnit partUnit in partUnits) {
1158 Source partSource = partUnit.element.source; 1171 Source partSource = partUnit.element.source;
1159 partUnitMap[partSource] = partUnit; 1172 partUnitMap[partSource] = partUnit;
1160 } 1173 }
1161 // 1174 //
1162 // Update "part" directives. 1175 // Update "part" directives.
1163 // 1176 //
1177 LibraryDirective libraryDirective = null;
1164 LibraryIdentifier libraryNameNode = null; 1178 LibraryIdentifier libraryNameNode = null;
1165 String partsLibraryName = _UNKNOWN_LIBRARY_NAME; 1179 String partsLibraryName = _UNKNOWN_LIBRARY_NAME;
1166 bool hasPartDirective = false; 1180 bool hasPartDirective = false;
1167 FunctionElement entryPoint = 1181 FunctionElement entryPoint =
1168 _findEntryPoint(definingCompilationUnitElement); 1182 _findEntryPoint(definingCompilationUnitElement);
1169 List<Directive> directivesToResolve = <Directive>[]; 1183 List<Directive> directivesToResolve = <Directive>[];
1170 List<CompilationUnitElementImpl> sourcedCompilationUnits = 1184 List<CompilationUnitElementImpl> sourcedCompilationUnits =
1171 <CompilationUnitElementImpl>[]; 1185 <CompilationUnitElementImpl>[];
1172 for (Directive directive in definingCompilationUnit.directives) { 1186 for (Directive directive in definingCompilationUnit.directives) {
1173 if (directive is LibraryDirective) { 1187 if (directive is LibraryDirective) {
1174 if (libraryNameNode == null) { 1188 if (libraryDirective == null) {
1189 libraryDirective = directive;
1175 libraryNameNode = directive.name; 1190 libraryNameNode = directive.name;
1176 directivesToResolve.add(directive); 1191 directivesToResolve.add(directive);
1177 } 1192 }
1178 } else if (directive is PartDirective) { 1193 } else if (directive is PartDirective) {
1179 PartDirective partDirective = directive; 1194 PartDirective partDirective = directive;
1180 StringLiteral partUri = partDirective.uri; 1195 StringLiteral partUri = partDirective.uri;
1181 Source partSource = partDirective.source; 1196 Source partSource = partDirective.source;
1182 hasPartDirective = true; 1197 hasPartDirective = true;
1183 CompilationUnit partUnit = partUnitMap[partSource]; 1198 CompilationUnit partUnit = partUnitMap[partSource];
1184 if (partUnit != null) { 1199 if (partUnit != null) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 new LibraryElementImpl.forNode(owningContext, libraryNameNode); 1263 new LibraryElementImpl.forNode(owningContext, libraryNameNode);
1249 libraryElement.definingCompilationUnit = definingCompilationUnitElement; 1264 libraryElement.definingCompilationUnit = definingCompilationUnitElement;
1250 libraryElement.entryPoint = entryPoint; 1265 libraryElement.entryPoint = entryPoint;
1251 libraryElement.parts = sourcedCompilationUnits; 1266 libraryElement.parts = sourcedCompilationUnits;
1252 for (Directive directive in directivesToResolve) { 1267 for (Directive directive in directivesToResolve) {
1253 directive.element = libraryElement; 1268 directive.element = libraryElement;
1254 } 1269 }
1255 if (sourcedCompilationUnits.isNotEmpty) { 1270 if (sourcedCompilationUnits.isNotEmpty) {
1256 _patchTopLevelAccessors(libraryElement); 1271 _patchTopLevelAccessors(libraryElement);
1257 } 1272 }
1273 if (libraryDirective != null) {
1274 _setDocRange(libraryElement, libraryDirective);
1275 }
1258 // 1276 //
1259 // Record outputs. 1277 // Record outputs.
1260 // 1278 //
1261 outputs[BUILD_LIBRARY_ERRORS] = errors; 1279 outputs[BUILD_LIBRARY_ERRORS] = errors;
1262 outputs[LIBRARY_ELEMENT1] = libraryElement; 1280 outputs[LIBRARY_ELEMENT1] = libraryElement;
1263 outputs[IS_LAUNCHABLE] = entryPoint != null; 1281 outputs[IS_LAUNCHABLE] = entryPoint != null;
1264 } 1282 }
1265 1283
1266 /** 1284 /**
1267 * Add all of the non-synthetic [getters] and [setters] defined in the given 1285 * Add all of the non-synthetic [getters] and [setters] defined in the given
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 TopLevelVariableElementImpl setterVariable = setter.variable; 1352 TopLevelVariableElementImpl setterVariable = setter.variable;
1335 CompilationUnitElementImpl setterUnit = setterVariable.enclosingElement; 1353 CompilationUnitElementImpl setterUnit = setterVariable.enclosingElement;
1336 setterUnit.replaceTopLevelVariable(setterVariable, variable); 1354 setterUnit.replaceTopLevelVariable(setterVariable, variable);
1337 variable.setter = setter; 1355 variable.setter = setter;
1338 (setter as PropertyAccessorElementImpl).variable = variable; 1356 (setter as PropertyAccessorElementImpl).variable = variable;
1339 } 1357 }
1340 } 1358 }
1341 } 1359 }
1342 1360
1343 /** 1361 /**
1362 * If the given [node] has a documentation comment, remember its range
1363 * into the given [element].
1364 */
1365 void _setDocRange(ElementImpl element, AnnotatedNode node) {
1366 Comment comment = node.documentationComment;
1367 if (comment != null && comment.isDocumentation) {
1368 element.setDocRange(comment.offset, comment.length);
1369 }
1370 }
1371
1372 /**
1344 * Return a map from the names of the inputs of this kind of task to the task 1373 * Return a map from the names of the inputs of this kind of task to the task
1345 * input descriptors describing those inputs for a task with the given 1374 * input descriptors describing those inputs for a task with the given
1346 * [libSource]. 1375 * [libSource].
1347 */ 1376 */
1348 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 1377 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
1349 Source source = target; 1378 Source source = target;
1350 return <String, TaskInput>{ 1379 return <String, TaskInput>{
1351 DEFINING_UNIT_INPUT: 1380 DEFINING_UNIT_INPUT:
1352 RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)), 1381 RESOLVED_UNIT1.of(new LibrarySpecificUnit(source, source)),
1353 PARTS_UNIT_INPUT: INCLUDED_PARTS.of(source).toList((Source unit) { 1382 PARTS_UNIT_INPUT: INCLUDED_PARTS.of(source).toList((Source unit) {
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
2118 2147
2119 // 2148 //
2120 // Gather error filters. 2149 // Gather error filters.
2121 // 2150 //
2122 List<ErrorFilter> filters = 2151 List<ErrorFilter> filters =
2123 context.getConfigurationData(CONFIGURED_ERROR_FILTERS); 2152 context.getConfigurationData(CONFIGURED_ERROR_FILTERS);
2124 for (ResultDescriptor result in enginePlugin.dartErrorsForUnit) { 2153 for (ResultDescriptor result in enginePlugin.dartErrorsForUnit) {
2125 String inputName = result.name + '_input'; 2154 String inputName = result.name + '_input';
2126 Map<Source, List<AnalysisError>> errorMap = getRequiredInput(inputName); 2155 Map<Source, List<AnalysisError>> errorMap = getRequiredInput(inputName);
2127 for (List<AnalysisError> errors in errorMap.values) { 2156 for (List<AnalysisError> errors in errorMap.values) {
2128 errorLists.add(errors 2157 errorLists.add(errors.where((AnalysisError error) {
2129 .where((AnalysisError error) { 2158 return !filters.any((ErrorFilter filter) => filter(error));
2130 return !filters.any((ErrorFilter filter) => filter(error)); 2159 }).toList());
2131 })
2132 .toList());
2133 } 2160 }
2134 } 2161 }
2135 // 2162 //
2136 // Record outputs. 2163 // Record outputs.
2137 // 2164 //
2138 outputs[DART_ERRORS] = AnalysisError.mergeLists(errorLists); 2165 outputs[DART_ERRORS] = AnalysisError.mergeLists(errorLists);
2139 } 2166 }
2140 2167
2141 /** 2168 /**
2142 * Return a map from the names of the inputs of this kind of task to the task 2169 * Return a map from the names of the inputs of this kind of task to the task
(...skipping 2613 matching lines...) Expand 10 before | Expand all | Expand 10 after
4756 4783
4757 @override 4784 @override
4758 bool moveNext() { 4785 bool moveNext() {
4759 if (_newSources.isEmpty) { 4786 if (_newSources.isEmpty) {
4760 return false; 4787 return false;
4761 } 4788 }
4762 currentTarget = _newSources.removeLast(); 4789 currentTarget = _newSources.removeLast();
4763 return true; 4790 return true;
4764 } 4791 }
4765 } 4792 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/src/context/context_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698