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 protocol.server; | 5 library protocol.server; |
| 6 | 6 |
| 7 import 'package:analysis_server/src/computer/element.dart'; | |
| 8 import 'package:analysis_server/src/protocol.dart'; | 7 import 'package:analysis_server/src/protocol.dart'; |
| 9 import 'package:analysis_server/src/services/search/search_engine.dart' as | 8 import 'package:analysis_server/src/services/search/search_engine.dart' as |
| 10 engine; | 9 engine; |
| 11 import 'package:analyzer/src/generated/ast.dart' as engine; | 10 import 'package:analyzer/src/generated/ast.dart' as engine; |
| 12 import 'package:analyzer/src/generated/element.dart' as engine; | 11 import 'package:analyzer/src/generated/element.dart' as engine; |
| 13 import 'package:analyzer/src/generated/engine.dart' as engine; | 12 import 'package:analyzer/src/generated/engine.dart' as engine; |
| 14 import 'package:analyzer/src/generated/error.dart' as engine; | 13 import 'package:analyzer/src/generated/error.dart' as engine; |
| 15 import 'package:analyzer/src/generated/source.dart' as engine; | 14 import 'package:analyzer/src/generated/source.dart' as engine; |
| 15 import 'package:analyzer/src/generated/utilities_dart.dart' as engine; | |
| 16 | 16 |
| 17 export 'package:analysis_server/src/protocol.dart'; | 17 export 'package:analysis_server/src/protocol.dart'; |
| 18 | 18 |
| 19 | 19 |
| 20 /** | 20 /** |
| 21 * Returns a list of AnalysisErrors correponding to the given list of Engine | 21 * Returns a list of AnalysisErrors correponding to the given list of Engine |
| 22 * errors. | 22 * errors. |
| 23 */ | 23 */ |
| 24 List<AnalysisError> doAnalysisError_listFromEngine(engine.LineInfo lineInfo, | 24 List<AnalysisError> doAnalysisError_listFromEngine(engine.LineInfo lineInfo, |
| 25 List<engine.AnalysisError> errors) { | 25 List<engine.AnalysisError> errors) { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 196 return ElementKind.TYPE_PARAMETER; | 196 return ElementKind.TYPE_PARAMETER; |
| 197 } | 197 } |
| 198 return ElementKind.UNKNOWN; | 198 return ElementKind.UNKNOWN; |
| 199 } | 199 } |
| 200 | 200 |
| 201 | 201 |
| 202 /** | 202 /** |
| 203 * Construct based on a value from the analyzer engine. | 203 * Construct based on a value from the analyzer engine. |
| 204 */ | 204 */ |
| 205 Element newElement_fromEngine(engine.Element element) { | 205 Element newElement_fromEngine(engine.Element element) { |
| 206 return elementFromEngine(element); | 206 String name = element.displayName; |
| 207 String elementParameters = _getParametersString(element); | |
| 208 String elementReturnType = _getReturnTypeString(element); | |
| 209 return new Element( | |
| 210 newElementKind_fromEngine(element.kind), | |
| 211 name, | |
| 212 Element.makeFlags( | |
| 213 isPrivate: element.isPrivate, | |
| 214 isDeprecated: element.isDeprecated, | |
| 215 isAbstract: _isAbstract(element), | |
| 216 isConst: _isConst(element), | |
| 217 isFinal: _isFinal(element), | |
| 218 isStatic: _isStatic(element)), | |
| 219 location: newLocation_fromElement(element), | |
| 220 parameters: elementParameters, | |
| 221 returnType: elementReturnType); | |
| 207 } | 222 } |
| 208 | 223 |
| 209 | 224 |
| 210 /** | 225 /** |
| 211 * Create a Location based on an [engine.Element]. | 226 * Create a Location based on an [engine.Element]. |
| 212 */ | 227 */ |
| 213 Location newLocation_fromElement(engine.Element element) { | 228 Location newLocation_fromElement(engine.Element element) { |
| 214 engine.AnalysisContext context = element.context; | 229 engine.AnalysisContext context = element.context; |
| 215 engine.Source source = element.source; | 230 engine.Source source = element.source; |
| 216 if (context == null || source == null) { | 231 if (context == null || source == null) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 engine.AnalysisContext context = unitElement.context; | 278 engine.AnalysisContext context = unitElement.context; |
| 264 engine.Source source = unitElement.source; | 279 engine.Source source = unitElement.source; |
| 265 return _locationForArgs(context, source, range); | 280 return _locationForArgs(context, source, range); |
| 266 } | 281 } |
| 267 | 282 |
| 268 | 283 |
| 269 /** | 284 /** |
| 270 * Construct based on an element from the analyzer engine. | 285 * Construct based on an element from the analyzer engine. |
| 271 */ | 286 */ |
| 272 OverriddenMember newOverriddenMember_fromEngine(engine.Element member) { | 287 OverriddenMember newOverriddenMember_fromEngine(engine.Element member) { |
| 273 Element element = elementFromEngine(member); | 288 Element element = newElement_fromEngine(member); |
| 274 String className = member.enclosingElement.displayName; | 289 String className = member.enclosingElement.displayName; |
| 275 return new OverriddenMember(element, className); | 290 return new OverriddenMember(element, className); |
| 276 } | 291 } |
| 277 | 292 |
| 278 | 293 |
| 279 | 294 |
| 280 /** | 295 /** |
| 281 * Construct based on a value from the search engine. | 296 * Construct based on a value from the search engine. |
| 282 */ | 297 */ |
| 283 SearchResultKind newSearchResultKind_fromEngine(engine.MatchKind kind) { | 298 SearchResultKind newSearchResultKind_fromEngine(engine.MatchKind kind) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 List<Element> _computePath(engine.Element element) { | 340 List<Element> _computePath(engine.Element element) { |
| 326 List<Element> path = <Element>[]; | 341 List<Element> path = <Element>[]; |
| 327 while (element != null) { | 342 while (element != null) { |
| 328 path.add(newElement_fromEngine(element)); | 343 path.add(newElement_fromEngine(element)); |
| 329 element = element.enclosingElement; | 344 element = element.enclosingElement; |
| 330 } | 345 } |
| 331 return path; | 346 return path; |
| 332 } | 347 } |
| 333 | 348 |
| 334 | 349 |
| 350 String _getParametersString(engine.Element element) { | |
| 351 // TODO(scheglov) expose the corresponding feature from ExecutableElement | |
| 352 if (element is engine.ExecutableElement) { | |
| 353 var sb = new StringBuffer(); | |
| 354 String closeOptionalString = ''; | |
| 355 for (var parameter in element.parameters) { | |
| 356 if (sb.isNotEmpty) { | |
| 357 sb.write(', '); | |
| 358 } | |
| 359 if (closeOptionalString.isEmpty) { | |
| 360 if (parameter.kind == engine.ParameterKind.NAMED) { | |
| 361 sb.write('{'); | |
| 362 closeOptionalString = '}'; | |
| 363 } | |
| 364 if (parameter.kind == engine.ParameterKind.POSITIONAL) { | |
| 365 sb.write('['); | |
| 366 closeOptionalString = ']'; | |
| 367 } | |
| 368 } | |
| 369 sb.write(parameter.toString()); | |
| 370 } | |
| 371 sb.write(closeOptionalString); | |
| 372 return '(' + sb.toString() + ')'; | |
| 373 } else { | |
| 374 return null; | |
| 375 } | |
| 376 } | |
| 377 | |
| 378 | |
| 379 String _getReturnTypeString(engine.Element element) { | |
| 380 if (element is engine.ExecutableElement) { | |
| 381 if (element.kind == engine.ElementKind.SETTER) { | |
| 382 return null; | |
| 383 } else { | |
| 384 return element.returnType.toString(); | |
| 385 } | |
| 386 } else { | |
| 387 return null; | |
| 388 } | |
| 389 } | |
| 390 | |
| 391 bool _isAbstract(engine.Element element) { | |
| 392 // TODO(scheglov) add isAbstract to Element API | |
|
Brian Wilkerson
2014/10/07 22:21:55
It doesn't make sense to ask isAbstract, etc. for
| |
| 393 if (element is engine.ClassElement) { | |
| 394 return element.isAbstract; | |
| 395 } | |
| 396 if (element is engine.MethodElement) { | |
| 397 return element.isAbstract; | |
| 398 } | |
| 399 if (element is engine.PropertyAccessorElement) { | |
| 400 return element.isAbstract; | |
| 401 } | |
| 402 return false; | |
| 403 } | |
| 404 | |
| 405 bool _isConst(engine.Element element) { | |
| 406 // TODO(scheglov) add isConst to Element API | |
| 407 if (element is engine.ConstructorElement) { | |
| 408 return element.isConst; | |
| 409 } | |
| 410 if (element is engine.VariableElement) { | |
| 411 return element.isConst; | |
| 412 } | |
| 413 return false; | |
| 414 } | |
| 415 | |
| 416 bool _isFinal(engine.Element element) { | |
| 417 // TODO(scheglov) add isFinal to Element API | |
| 418 if (element is engine.VariableElement) { | |
| 419 return element.isFinal; | |
| 420 } | |
| 421 return false; | |
| 422 } | |
| 423 | |
| 424 bool _isStatic(engine.Element element) { | |
| 425 // TODO(scheglov) add isStatic to Element API | |
| 426 if (element is engine.ExecutableElement) { | |
| 427 return element.isStatic; | |
| 428 } | |
| 429 if (element is engine.PropertyInducingElement) { | |
| 430 return element.isStatic; | |
| 431 } | |
| 432 return false; | |
| 433 } | |
| 434 | |
| 335 /** | 435 /** |
| 336 * Creates a new [Location]. | 436 * Creates a new [Location]. |
| 337 */ | 437 */ |
| 338 Location _locationForArgs(engine.AnalysisContext context, engine.Source source, | 438 Location _locationForArgs(engine.AnalysisContext context, engine.Source source, |
| 339 engine.SourceRange range) { | 439 engine.SourceRange range) { |
| 340 int startLine = 0; | 440 int startLine = 0; |
| 341 int startColumn = 0; | 441 int startColumn = 0; |
| 342 { | 442 { |
| 343 engine.LineInfo lineInfo = context.getLineInfo(source); | 443 engine.LineInfo lineInfo = context.getLineInfo(source); |
| 344 if (lineInfo != null) { | 444 if (lineInfo != null) { |
| 345 engine.LineInfo_Location offsetLocation = | 445 engine.LineInfo_Location offsetLocation = |
| 346 lineInfo.getLocation(range.offset); | 446 lineInfo.getLocation(range.offset); |
| 347 startLine = offsetLocation.lineNumber; | 447 startLine = offsetLocation.lineNumber; |
| 348 startColumn = offsetLocation.columnNumber; | 448 startColumn = offsetLocation.columnNumber; |
| 349 } | 449 } |
| 350 } | 450 } |
| 351 return new Location( | 451 return new Location( |
| 352 source.fullName, | 452 source.fullName, |
| 353 range.offset, | 453 range.offset, |
| 354 range.length, | 454 range.length, |
| 355 startLine, | 455 startLine, |
| 356 startColumn); | 456 startColumn); |
| 357 } | 457 } |
| OLD | NEW |