| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 computer.navigation; | 5 library computer.navigation; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/protocol_server.dart' as protocol; | 9 import 'package:analysis_server/src/protocol_server.dart' as protocol; |
| 10 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
| 11 import 'package:analyzer/src/generated/element.dart'; | 11 import 'package:analyzer/src/generated/element.dart'; |
| 12 import 'package:analyzer/src/generated/scanner.dart'; | 12 import 'package:analyzer/src/generated/scanner.dart'; |
| 13 import 'package:analyzer/src/generated/source.dart'; |
| 13 | 14 |
| 14 /** | 15 /** |
| 15 * A computer for navigation regions in a Dart [CompilationUnit]. | 16 * A computer for navigation regions in a Dart [CompilationUnit]. |
| 16 */ | 17 */ |
| 17 class DartUnitNavigationComputer { | 18 class DartUnitNavigationComputer { |
| 18 final CompilationUnit _unit; | 19 final CompilationUnit _unit; |
| 19 | 20 |
| 20 final List<String> files = <String>[]; | 21 final List<String> files = <String>[]; |
| 21 final Map<String, int> fileMap = new HashMap<String, int>(); | 22 final Map<String, int> fileMap = new HashMap<String, int>(); |
| 22 final List<protocol.NavigationTarget> targets = <protocol.NavigationTarget>[]; | 23 final List<protocol.NavigationTarget> targets = <protocol.NavigationTarget>[]; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 } else if (parent is ConstructorDeclaration && | 155 } else if (parent is ConstructorDeclaration && |
| 155 parent.redirectedConstructor == node) { | 156 parent.redirectedConstructor == node) { |
| 156 _addConstructorName(node, node); | 157 _addConstructorName(node, node); |
| 157 } | 158 } |
| 158 } | 159 } |
| 159 | 160 |
| 160 @override | 161 @override |
| 161 visitExportDirective(ExportDirective node) { | 162 visitExportDirective(ExportDirective node) { |
| 162 ExportElement exportElement = node.element; | 163 ExportElement exportElement = node.element; |
| 163 if (exportElement != null) { | 164 if (exportElement != null) { |
| 164 Element element = exportElement.exportedLibrary; | 165 Element libraryElement = exportElement.exportedLibrary; |
| 165 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); | 166 _addUriDirectiveRegion(node, libraryElement); |
| 166 } | 167 } |
| 167 super.visitExportDirective(node); | 168 super.visitExportDirective(node); |
| 168 } | 169 } |
| 169 | 170 |
| 170 @override | 171 @override |
| 171 visitImportDirective(ImportDirective node) { | 172 visitImportDirective(ImportDirective node) { |
| 172 ImportElement importElement = node.element; | 173 ImportElement importElement = node.element; |
| 173 if (importElement != null) { | 174 if (importElement != null) { |
| 174 Element element = importElement.importedLibrary; | 175 Element libraryElement = importElement.importedLibrary; |
| 175 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); | 176 _addUriDirectiveRegion(node, libraryElement); |
| 176 } | 177 } |
| 177 super.visitImportDirective(node); | 178 super.visitImportDirective(node); |
| 178 } | 179 } |
| 179 | 180 |
| 180 @override | 181 @override |
| 181 visitIndexExpression(IndexExpression node) { | 182 visitIndexExpression(IndexExpression node) { |
| 182 super.visitIndexExpression(node); | 183 super.visitIndexExpression(node); |
| 183 computer._addRegionForToken(node.rightBracket, node.bestElement); | 184 computer._addRegionForToken(node.rightBracket, node.bestElement); |
| 184 } | 185 } |
| 185 | 186 |
| 186 @override | 187 @override |
| 187 visitPartDirective(PartDirective node) { | 188 visitPartDirective(PartDirective node) { |
| 188 computer._addRegion_tokenStart_nodeEnd( | 189 _addUriDirectiveRegion(node, node.element); |
| 189 node.keyword, node.uri, node.element); | |
| 190 super.visitPartDirective(node); | 190 super.visitPartDirective(node); |
| 191 } | 191 } |
| 192 | 192 |
| 193 @override | 193 @override |
| 194 visitPartOfDirective(PartOfDirective node) { | 194 visitPartOfDirective(PartOfDirective node) { |
| 195 computer._addRegion_tokenStart_nodeEnd( | 195 computer._addRegion_tokenStart_nodeEnd( |
| 196 node.keyword, node.libraryName, node.element); | 196 node.keyword, node.libraryName, node.element); |
| 197 super.visitPartOfDirective(node); | 197 super.visitPartOfDirective(node); |
| 198 } | 198 } |
| 199 | 199 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 computer._addRegion_nodeStart_nodeEnd(parent, typeName.name, element); | 253 computer._addRegion_nodeStart_nodeEnd(parent, typeName.name, element); |
| 254 // <TypeA, TypeB> | 254 // <TypeA, TypeB> |
| 255 typeArguments.accept(this); | 255 typeArguments.accept(this); |
| 256 // optional ".name" | 256 // optional ".name" |
| 257 if (node.period != null) { | 257 if (node.period != null) { |
| 258 computer._addRegion_tokenStart_nodeEnd(node.period, node, element); | 258 computer._addRegion_tokenStart_nodeEnd(node.period, node, element); |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 } | 261 } |
| 262 | 262 |
| 263 /** |
| 264 * If the source of the given [element] (referenced by the [node]) exists, |
| 265 * then add the navigation region from the [node] to the [element]. |
| 266 */ |
| 267 void _addUriDirectiveRegion(UriBasedDirective node, Element element) { |
| 268 if (element != null) { |
| 269 Source source = element.source; |
| 270 if (element.context.exists(source)) { |
| 271 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); |
| 272 } |
| 273 } |
| 274 } |
| 275 |
| 263 void _safelyVisit(AstNode node) { | 276 void _safelyVisit(AstNode node) { |
| 264 if (node != null) { | 277 if (node != null) { |
| 265 node.accept(this); | 278 node.accept(this); |
| 266 } | 279 } |
| 267 } | 280 } |
| 268 } | 281 } |
| OLD | NEW |