Chromium Code Reviews| 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'; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 computer._addRegion_nodeStart_nodeEnd( | 143 computer._addRegion_nodeStart_nodeEnd( |
| 144 firstNode, | 144 firstNode, |
| 145 lastNode, | 145 lastNode, |
| 146 node.element); | 146 node.element); |
| 147 } | 147 } |
| 148 } | 148 } |
| 149 super.visitConstructorDeclaration(node); | 149 super.visitConstructorDeclaration(node); |
| 150 } | 150 } |
| 151 | 151 |
| 152 @override | 152 @override |
| 153 visitConstructorName(ConstructorName node) { | |
| 154 AstNode parent = node.parent; | |
| 155 if (parent is InstanceCreationExpression && | |
| 156 parent.constructorName == node) { | |
| 157 _addConstructorName(parent, node); | |
| 158 } else if (parent is ConstructorDeclaration && | |
| 159 parent.redirectedConstructor == node) { | |
| 160 _addConstructorName(node, node); | |
| 161 } | |
| 162 } | |
| 163 | |
| 164 @override | |
| 153 visitExportDirective(ExportDirective node) { | 165 visitExportDirective(ExportDirective node) { |
| 154 ExportElement exportElement = node.element; | 166 ExportElement exportElement = node.element; |
| 155 if (exportElement != null) { | 167 if (exportElement != null) { |
| 156 Element element = exportElement.exportedLibrary; | 168 Element element = exportElement.exportedLibrary; |
| 157 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); | 169 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); |
| 158 } | 170 } |
| 159 super.visitExportDirective(node); | 171 super.visitExportDirective(node); |
| 160 } | 172 } |
| 161 | 173 |
| 162 @override | 174 @override |
| 163 visitImportDirective(ImportDirective node) { | 175 visitImportDirective(ImportDirective node) { |
| 164 ImportElement importElement = node.element; | 176 ImportElement importElement = node.element; |
| 165 if (importElement != null) { | 177 if (importElement != null) { |
| 166 Element element = importElement.importedLibrary; | 178 Element element = importElement.importedLibrary; |
| 167 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); | 179 computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, element); |
| 168 } | 180 } |
| 169 super.visitImportDirective(node); | 181 super.visitImportDirective(node); |
| 170 } | 182 } |
| 171 | 183 |
| 172 @override | 184 @override |
| 173 visitIndexExpression(IndexExpression node) { | 185 visitIndexExpression(IndexExpression node) { |
| 174 super.visitIndexExpression(node); | 186 super.visitIndexExpression(node); |
| 175 computer._addRegionForToken(node.rightBracket, node.bestElement); | 187 computer._addRegionForToken(node.rightBracket, node.bestElement); |
| 176 } | 188 } |
| 177 | 189 |
| 178 @override | 190 @override |
| 179 visitInstanceCreationExpression(InstanceCreationExpression node) { | |
| 180 Element element = node.staticElement; | |
| 181 ConstructorName constructorName = node.constructorName; | |
| 182 if (element != null && constructorName != null) { | |
| 183 // if a synthetic constructor, navigate to the class | |
| 184 if (element.isSynthetic) { | |
| 185 ClassElement classElement = element.enclosingElement; | |
| 186 element = classElement; | |
| 187 } | |
| 188 // add regions | |
| 189 TypeName typeName = constructorName.type; | |
| 190 TypeArgumentList typeArguments = typeName.typeArguments; | |
| 191 if (typeArguments == null) { | |
| 192 computer._addRegion_nodeStart_nodeEnd(node, constructorName, element); | |
| 193 } else { | |
| 194 computer._addRegion_nodeStart_nodeEnd(node, typeName.name, element); | |
| 195 // <TypeA, TypeB> | |
| 196 typeArguments.accept(this); | |
| 197 // optional ".name" | |
| 198 if (constructorName.period != null) { | |
| 199 computer._addRegion_tokenStart_nodeEnd( | |
| 200 constructorName.period, | |
| 201 constructorName, | |
| 202 element); | |
| 203 } | |
| 204 } | |
| 205 } | |
| 206 _safelyVisit(node.argumentList); | |
| 207 } | |
| 208 | |
| 209 @override | |
| 210 visitPartDirective(PartDirective node) { | 191 visitPartDirective(PartDirective node) { |
| 211 computer._addRegion_tokenStart_nodeEnd( | 192 computer._addRegion_tokenStart_nodeEnd( |
| 212 node.keyword, | 193 node.keyword, |
| 213 node.uri, | 194 node.uri, |
| 214 node.element); | 195 node.element); |
| 215 super.visitPartDirective(node); | 196 super.visitPartDirective(node); |
| 216 } | 197 } |
| 217 | 198 |
| 218 @override | 199 @override |
| 219 visitPartOfDirective(PartOfDirective node) { | 200 visitPartOfDirective(PartOfDirective node) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 SimpleIdentifier name = node.constructorName; | 236 SimpleIdentifier name = node.constructorName; |
| 256 if (name != null) { | 237 if (name != null) { |
| 257 computer._addRegion_nodeStart_nodeEnd(node, name, element); | 238 computer._addRegion_nodeStart_nodeEnd(node, name, element); |
| 258 } else { | 239 } else { |
| 259 computer._addRegionForToken(node.keyword, element); | 240 computer._addRegionForToken(node.keyword, element); |
| 260 } | 241 } |
| 261 // process arguments | 242 // process arguments |
| 262 _safelyVisit(node.argumentList); | 243 _safelyVisit(node.argumentList); |
| 263 } | 244 } |
| 264 | 245 |
| 246 void _addConstructorName(AstNode parent, ConstructorName node) { | |
| 247 Element element = node.staticElement; | |
| 248 if (element == null) { | |
| 249 return; | |
| 250 } | |
| 251 // if a synthetic constructor, navigate to the class | |
| 252 if (element.isSynthetic) { | |
| 253 ClassElement classElement = element.enclosingElement; | |
| 254 element = classElement; | |
|
Brian Wilkerson
2015/02/12 17:56:19
Why the temporary variable? Why not just:
elemen
| |
| 255 } | |
| 256 // add regions | |
| 257 TypeName typeName = node.type; | |
| 258 TypeArgumentList typeArguments = typeName.typeArguments; | |
| 259 if (typeArguments == null) { | |
| 260 computer._addRegion_nodeStart_nodeEnd(parent, node, element); | |
| 261 } else { | |
| 262 computer._addRegion_nodeStart_nodeEnd(parent, typeName.name, element); | |
| 263 // <TypeA, TypeB> | |
| 264 typeArguments.accept(this); | |
| 265 // optional ".name" | |
| 266 if (node.period != null) { | |
| 267 computer._addRegion_tokenStart_nodeEnd(node.period, node, element); | |
| 268 } | |
| 269 } | |
| 270 } | |
| 271 | |
| 265 void _safelyVisit(AstNode node) { | 272 void _safelyVisit(AstNode node) { |
| 266 if (node != null) { | 273 if (node != null) { |
| 267 node.accept(this); | 274 node.accept(this); |
| 268 } | 275 } |
| 269 } | 276 } |
| 270 } | 277 } |
| OLD | NEW |