OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:core'; | 6 import 'dart:core'; |
7 | 7 |
8 import 'package:analysis_server/protocol/protocol.dart'; | 8 import 'package:analysis_server/protocol/protocol.dart'; |
9 import 'package:analysis_server/protocol/protocol_constants.dart'; | 9 import 'package:analysis_server/protocol/protocol_constants.dart'; |
10 import 'package:analysis_server/protocol/protocol_generated.dart'; | 10 import 'package:analysis_server/protocol/protocol_generated.dart'; |
11 import 'package:analysis_server/src/analysis_server.dart'; | 11 import 'package:analysis_server/src/analysis_server.dart'; |
| 12 import 'package:analysis_server/src/domain_abstract.dart'; |
| 13 import 'package:analysis_server/src/plugin/plugin_manager.dart'; |
| 14 import 'package:analysis_server/src/plugin/result_merger.dart'; |
12 import 'package:analysis_server/src/services/kythe/kythe_visitors.dart'; | 15 import 'package:analysis_server/src/services/kythe/kythe_visitors.dart'; |
| 16 import 'package:analyzer/dart/ast/ast.dart'; |
13 import 'package:analyzer/src/dart/analysis/driver.dart'; | 17 import 'package:analyzer/src/dart/analysis/driver.dart'; |
14 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart'; | 18 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart'; |
| 19 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin; |
15 import 'package:analyzer_plugin/protocol/protocol_common.dart'; | 20 import 'package:analyzer_plugin/protocol/protocol_common.dart'; |
| 21 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin; |
| 22 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin; |
16 | 23 |
17 /** | 24 /** |
18 * Instances of the class [KytheDomainHandler] implement a [RequestHandler] | 25 * Instances of the class [KytheDomainHandler] implement a [RequestHandler] |
19 * that handles requests in the `kythe` domain. | 26 * that handles requests in the `kythe` domain. |
20 */ | 27 */ |
21 class KytheDomainHandler implements RequestHandler { | 28 class KytheDomainHandler extends AbstractRequestHandler { |
22 /** | |
23 * The analysis server that is using this handler to process requests. | |
24 */ | |
25 final AnalysisServer server; | |
26 | |
27 /** | 29 /** |
28 * Initialize a newly created handler to handle requests for the given [server
]. | 30 * Initialize a newly created handler to handle requests for the given [server
]. |
29 */ | 31 */ |
30 KytheDomainHandler(this.server); | 32 KytheDomainHandler(AnalysisServer server) : super(server); |
31 | 33 |
32 /** | 34 /** |
33 * Implement the `kythe.getKytheEntries` request. | 35 * Implement the `kythe.getKytheEntries` request. |
34 */ | 36 */ |
35 Future<Null> getKytheEntries(Request request) async { | 37 Future<Null> getKytheEntries(Request request) async { |
36 String file = new KytheGetKytheEntriesParams.fromRequest(request).file; | 38 String file = new KytheGetKytheEntriesParams.fromRequest(request).file; |
37 AnalysisResult result = await server.getAnalysisResult(file); | 39 AnalysisDriver driver = server.getAnalysisDriver(file); |
38 List<KytheEntry> entries = <KytheEntry>[]; | 40 if (driver == null) { |
39 // TODO(brianwilkerson) Figure out how to get the list of files. | 41 server.sendResponse(new Response.getKytheEntriesInvalidFile(request)); |
40 List<String> files = <String>[]; | 42 } else { |
41 result.unit.accept(new KytheDartVisitor([] /*entries*/, file, | 43 // |
42 new InheritanceManager(result.libraryElement), result.content)); | 44 // Allow plugins to start computing entries. |
43 server.sendResponse( | 45 // |
44 new KytheGetKytheEntriesResult(entries, files).toResponse(request.id)); | 46 plugin.KytheGetKytheEntriesParams requestParams = |
| 47 new plugin.KytheGetKytheEntriesParams(file); |
| 48 Map<PluginInfo, Future<plugin.Response>> pluginFutures = server |
| 49 .pluginManager |
| 50 .broadcastRequest(requestParams, contextRoot: driver.contextRoot); |
| 51 // |
| 52 // Compute entries generated by server. |
| 53 // |
| 54 List<KytheGetKytheEntriesResult> allResults = |
| 55 <KytheGetKytheEntriesResult>[]; |
| 56 AnalysisResult result = await server.getAnalysisResult(file); |
| 57 CompilationUnit unit = result?.unit; |
| 58 if (unit != null && result.exists) { |
| 59 List<KytheEntry> entries = <KytheEntry>[]; |
| 60 // TODO(brianwilkerson) Figure out how to get the list of files. |
| 61 List<String> files = <String>[]; |
| 62 result.unit.accept(new KytheDartVisitor(entries, file, |
| 63 new InheritanceManager(result.libraryElement), result.content)); |
| 64 allResults.add(new KytheGetKytheEntriesResult(entries, files)); |
| 65 } |
| 66 // |
| 67 // Add the entries produced by plugins to the server-generated entries. |
| 68 // |
| 69 if (pluginFutures != null) { |
| 70 List<plugin.Response> responses = await waitForResponses(pluginFutures, |
| 71 requestParameters: requestParams); |
| 72 for (plugin.Response response in responses) { |
| 73 plugin.KytheGetKytheEntriesResult result = |
| 74 new plugin.KytheGetKytheEntriesResult.fromResponse(response); |
| 75 allResults.add( |
| 76 new KytheGetKytheEntriesResult(result.entries, result.files)); |
| 77 } |
| 78 } |
| 79 // |
| 80 // Return the result. |
| 81 // |
| 82 ResultMerger merger = new ResultMerger(); |
| 83 KytheGetKytheEntriesResult mergedResults = |
| 84 merger.mergeKytheEntries(allResults); |
| 85 if (mergedResults == null) { |
| 86 server.sendResponse( |
| 87 new KytheGetKytheEntriesResult(<KytheEntry>[], <String>[]) |
| 88 .toResponse(request.id)); |
| 89 } else { |
| 90 server.sendResponse(new KytheGetKytheEntriesResult( |
| 91 mergedResults.entries, mergedResults.files) |
| 92 .toResponse(request.id)); |
| 93 } |
| 94 } |
45 } | 95 } |
46 | 96 |
47 @override | 97 @override |
48 Response handleRequest(Request request) { | 98 Response handleRequest(Request request) { |
49 try { | 99 try { |
50 String requestName = request.method; | 100 String requestName = request.method; |
51 if (requestName == KYTHE_REQUEST_GET_KYTHE_ENTRIES) { | 101 if (requestName == KYTHE_REQUEST_GET_KYTHE_ENTRIES) { |
52 getKytheEntries(request); | 102 getKytheEntries(request); |
53 return Response.DELAYED_RESPONSE; | 103 return Response.DELAYED_RESPONSE; |
54 } | 104 } |
55 } on RequestFailure catch (exception) { | 105 } on RequestFailure catch (exception) { |
56 return exception.response; | 106 return exception.response; |
57 } | 107 } |
58 return null; | 108 return null; |
59 } | 109 } |
60 } | 110 } |
OLD | NEW |