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

Unified Diff: pkg/analysis_server/lib/src/search/search_domain.dart

Issue 392693002: Initial implementation for 'search.findElementReferences'. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add comments Created 6 years, 5 months 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analysis_server/lib/src/search/search_domain.dart
diff --git a/pkg/analysis_server/lib/src/domain_search.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
similarity index 54%
rename from pkg/analysis_server/lib/src/domain_search.dart
rename to pkg/analysis_server/lib/src/search/search_domain.dart
index 8b1a2b235932c0aae2b35ed5da41b79acb63703d..f7bab4130e627939bf5037a5e57a07220c10c17a 100644
--- a/pkg/analysis_server/lib/src/domain_search.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -2,11 +2,17 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library domain.search;
+library search.domain;
+
+import 'dart:async';
import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/search/element_references.dart';
+import 'package:analysis_server/src/search/search_result.dart';
import 'package:analysis_server/src/constants.dart';
import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_services/search/search_engine.dart';
+import 'package:analyzer/src/generated/element.dart';
/**
* Instances of the class [SearchDomainHandler] implement a [RequestHandler]
@@ -19,41 +25,45 @@ class SearchDomainHandler implements RequestHandler {
final AnalysisServer server;
/**
- * Initialize a newly created handler to handle requests for the given [server].
+ * The [SearchEngine] for this server.
*/
- SearchDomainHandler(this.server);
+ SearchEngine searchEngine;
- @override
- Response handleRequest(Request request) {
- try {
- String requestName = request.method;
- if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
- return findElementReferences(request);
- } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) {
- return findMemberDeclarations(request);
- } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) {
- return findMemberReferences(request);
- } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
- return findTopLevelDeclarations(request);
- }
- } on RequestFailure catch (exception) {
- return exception.response;
- }
- return null;
+ /**
+ * The next searc response id.
+ */
+ int _nextSearchId = 0;
+
+ /**
+ * Initialize a newly created handler to handle requests for the given [server].
+ */
+ SearchDomainHandler(this.server) {
+ searchEngine = server.searchEngine;
}
Response findElementReferences(Request request) {
- // file
- RequestDatum fileDatum = request.getRequiredParameter(FILE);
- String file = fileDatum.asString();
- // offset
- RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
- int offset = offsetDatum.asInt();
- // includePotential
- RequestDatum includePotentialDatum = request.getRequiredParameter(LENGTH);
- bool includePotential = includePotentialDatum.asBool();
- // TODO(brianwilkerson) implement
- return null;
+ String file = request.getRequiredParameter(FILE).asString();
+ int offset = request.getRequiredParameter(OFFSET).asInt();
+ bool includePotential =
+ request.getRequiredParameter(INCLUDE_POTENTIAL).asBool();
+ // schedule search
+ String searchId = (_nextSearchId++).toString();
+ List<Element> elements = server.getElementsAtOffset(file, offset);
+ elements.forEach((Element element) {
+ var computer = new ElementReferencesComputer(searchEngine);
+ var future = computer.compute(element, includePotential);
+ return future.then((List<SearchResult> results) {
+ bool isLast = identical(element, elements.last);
+ _sendSearchNotification(searchId, isLast, results);
+ });
+ });
+ if (elements.isEmpty) {
+ new Future.microtask(() {
+ _sendSearchNotification(searchId, true, []);
+ });
+ }
+ // respond
+ return new Response(request.id)..setResult(ID, searchId);
}
Response findMemberDeclarations(Request request) {
@@ -79,4 +89,34 @@ class SearchDomainHandler implements RequestHandler {
// TODO(brianwilkerson) implement
return null;
}
+
+ @override
+ Response handleRequest(Request request) {
+ try {
+ String requestName = request.method;
+ if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
+ return findElementReferences(request);
+ } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) {
+ return findMemberDeclarations(request);
+ } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) {
+ return findMemberReferences(request);
+ } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
+ return findTopLevelDeclarations(request);
+ }
+ } on RequestFailure catch (exception) {
+ return exception.response;
+ }
+ return null;
+ }
+
+ void _sendSearchNotification(String searchId, bool isLast,
+ List<SearchResult> results) {
+ Notification notification = new Notification(SEARCH_RESULTS);
+ notification.setParameter(ID, searchId);
+ notification.setParameter(LAST, isLast);
+ notification.setParameter(
+ RESULTS,
+ results.map(SearchResult.asJson).toList());
+ server.sendNotification(notification);
+ }
}
« no previous file with comments | « pkg/analysis_server/lib/src/search/element_references.dart ('k') | pkg/analysis_server/lib/src/search/search_result.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698