| 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 domain.search; | 5 library search.domain; |
| 6 |
| 7 import 'dart:async'; |
| 6 | 8 |
| 7 import 'package:analysis_server/src/analysis_server.dart'; | 9 import 'package:analysis_server/src/analysis_server.dart'; |
| 10 import 'package:analysis_server/src/search/element_references.dart'; |
| 11 import 'package:analysis_server/src/search/search_result.dart'; |
| 8 import 'package:analysis_server/src/constants.dart'; | 12 import 'package:analysis_server/src/constants.dart'; |
| 9 import 'package:analysis_server/src/protocol.dart'; | 13 import 'package:analysis_server/src/protocol.dart'; |
| 14 import 'package:analysis_services/search/search_engine.dart'; |
| 15 import 'package:analyzer/src/generated/element.dart'; |
| 10 | 16 |
| 11 /** | 17 /** |
| 12 * Instances of the class [SearchDomainHandler] implement a [RequestHandler] | 18 * Instances of the class [SearchDomainHandler] implement a [RequestHandler] |
| 13 * that handles requests in the search domain. | 19 * that handles requests in the search domain. |
| 14 */ | 20 */ |
| 15 class SearchDomainHandler implements RequestHandler { | 21 class SearchDomainHandler implements RequestHandler { |
| 16 /** | 22 /** |
| 17 * The analysis server that is using this handler to process requests. | 23 * The analysis server that is using this handler to process requests. |
| 18 */ | 24 */ |
| 19 final AnalysisServer server; | 25 final AnalysisServer server; |
| 20 | 26 |
| 21 /** | 27 /** |
| 28 * The [SearchEngine] for this server. |
| 29 */ |
| 30 SearchEngine searchEngine; |
| 31 |
| 32 /** |
| 33 * The next searc response id. |
| 34 */ |
| 35 int _nextSearchId = 0; |
| 36 |
| 37 /** |
| 22 * Initialize a newly created handler to handle requests for the given [server
]. | 38 * Initialize a newly created handler to handle requests for the given [server
]. |
| 23 */ | 39 */ |
| 24 SearchDomainHandler(this.server); | 40 SearchDomainHandler(this.server) { |
| 25 | 41 searchEngine = server.searchEngine; |
| 26 @override | |
| 27 Response handleRequest(Request request) { | |
| 28 try { | |
| 29 String requestName = request.method; | |
| 30 if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) { | |
| 31 return findElementReferences(request); | |
| 32 } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) { | |
| 33 return findMemberDeclarations(request); | |
| 34 } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) { | |
| 35 return findMemberReferences(request); | |
| 36 } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) { | |
| 37 return findTopLevelDeclarations(request); | |
| 38 } | |
| 39 } on RequestFailure catch (exception) { | |
| 40 return exception.response; | |
| 41 } | |
| 42 return null; | |
| 43 } | 42 } |
| 44 | 43 |
| 45 Response findElementReferences(Request request) { | 44 Response findElementReferences(Request request) { |
| 46 // file | 45 String file = request.getRequiredParameter(FILE).asString(); |
| 47 RequestDatum fileDatum = request.getRequiredParameter(FILE); | 46 int offset = request.getRequiredParameter(OFFSET).asInt(); |
| 48 String file = fileDatum.asString(); | 47 bool includePotential = |
| 49 // offset | 48 request.getRequiredParameter(INCLUDE_POTENTIAL).asBool(); |
| 50 RequestDatum offsetDatum = request.getRequiredParameter(OFFSET); | 49 // schedule search |
| 51 int offset = offsetDatum.asInt(); | 50 String searchId = (_nextSearchId++).toString(); |
| 52 // includePotential | 51 List<Element> elements = server.getElementsAtOffset(file, offset); |
| 53 RequestDatum includePotentialDatum = request.getRequiredParameter(LENGTH); | 52 elements.forEach((Element element) { |
| 54 bool includePotential = includePotentialDatum.asBool(); | 53 var computer = new ElementReferencesComputer(searchEngine); |
| 55 // TODO(brianwilkerson) implement | 54 var future = computer.compute(element, includePotential); |
| 56 return null; | 55 return future.then((List<SearchResult> results) { |
| 56 bool isLast = identical(element, elements.last); |
| 57 _sendSearchNotification(searchId, isLast, results); |
| 58 }); |
| 59 }); |
| 60 if (elements.isEmpty) { |
| 61 new Future.microtask(() { |
| 62 _sendSearchNotification(searchId, true, []); |
| 63 }); |
| 64 } |
| 65 // respond |
| 66 return new Response(request.id)..setResult(ID, searchId); |
| 57 } | 67 } |
| 58 | 68 |
| 59 Response findMemberDeclarations(Request request) { | 69 Response findMemberDeclarations(Request request) { |
| 60 // name | 70 // name |
| 61 RequestDatum nameDatum = request.getRequiredParameter(FILE); | 71 RequestDatum nameDatum = request.getRequiredParameter(FILE); |
| 62 String name = nameDatum.asString(); | 72 String name = nameDatum.asString(); |
| 63 // TODO(brianwilkerson) implement | 73 // TODO(brianwilkerson) implement |
| 64 return null; | 74 return null; |
| 65 } | 75 } |
| 66 | 76 |
| 67 Response findMemberReferences(Request request) { | 77 Response findMemberReferences(Request request) { |
| 68 // name | 78 // name |
| 69 RequestDatum nameDatum = request.getRequiredParameter(FILE); | 79 RequestDatum nameDatum = request.getRequiredParameter(FILE); |
| 70 String name = nameDatum.asString(); | 80 String name = nameDatum.asString(); |
| 71 // TODO(brianwilkerson) implement | 81 // TODO(brianwilkerson) implement |
| 72 return null; | 82 return null; |
| 73 } | 83 } |
| 74 | 84 |
| 75 Response findTopLevelDeclarations(Request request) { | 85 Response findTopLevelDeclarations(Request request) { |
| 76 // pattern | 86 // pattern |
| 77 RequestDatum patternDatum = request.getRequiredParameter(FILE); | 87 RequestDatum patternDatum = request.getRequiredParameter(FILE); |
| 78 String pattern = patternDatum.asString(); | 88 String pattern = patternDatum.asString(); |
| 79 // TODO(brianwilkerson) implement | 89 // TODO(brianwilkerson) implement |
| 80 return null; | 90 return null; |
| 81 } | 91 } |
| 92 |
| 93 @override |
| 94 Response handleRequest(Request request) { |
| 95 try { |
| 96 String requestName = request.method; |
| 97 if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) { |
| 98 return findElementReferences(request); |
| 99 } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) { |
| 100 return findMemberDeclarations(request); |
| 101 } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) { |
| 102 return findMemberReferences(request); |
| 103 } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) { |
| 104 return findTopLevelDeclarations(request); |
| 105 } |
| 106 } on RequestFailure catch (exception) { |
| 107 return exception.response; |
| 108 } |
| 109 return null; |
| 110 } |
| 111 |
| 112 void _sendSearchNotification(String searchId, bool isLast, |
| 113 List<SearchResult> results) { |
| 114 Notification notification = new Notification(SEARCH_RESULTS); |
| 115 notification.setParameter(ID, searchId); |
| 116 notification.setParameter(LAST, isLast); |
| 117 notification.setParameter( |
| 118 RESULTS, |
| 119 results.map(SearchResult.asJson).toList()); |
| 120 server.sendNotification(notification); |
| 121 } |
| 82 } | 122 } |
| OLD | NEW |