| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 services.completion.dart.manager; | 5 library services.completion.dart.manager; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 10 import 'package:analysis_server/src/provisional/completion/completion_core.dart' | 10 import 'package:analysis_server/src/provisional/completion/completion_core.dart' |
| 11 show CompletionContributor, CompletionRequest; | 11 show CompletionContributor, CompletionRequest; |
| 12 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; | 12 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; |
| 13 import 'package:analysis_server/src/provisional/completion/dart/completion_plugi
n.dart'; | 13 import 'package:analysis_server/src/provisional/completion/dart/completion_plugi
n.dart'; |
| 14 import 'package:analysis_server/src/provisional/completion/dart/completion_targe
t.dart'; | 14 import 'package:analysis_server/src/provisional/completion/dart/completion_targe
t.dart'; |
| 15 import 'package:analysis_server/src/services/completion/completion_core.dart'; | 15 import 'package:analysis_server/src/services/completion/completion_core.dart'; |
| 16 import 'package:analysis_server/src/services/completion/optype.dart'; | 16 import 'package:analysis_server/src/services/completion/optype.dart'; |
| 17 import 'package:analysis_server/src/services/search/search_engine.dart'; | 17 import 'package:analysis_server/src/services/search/search_engine.dart'; |
| 18 import 'package:analyzer/dart/element/element.dart'; | 18 import 'package:analyzer/dart/element/element.dart'; |
| 19 import 'package:analyzer/dart/element/type.dart'; | 19 import 'package:analyzer/dart/element/type.dart'; |
| 20 import 'package:analyzer/file_system/file_system.dart'; | 20 import 'package:analyzer/file_system/file_system.dart'; |
| 21 import 'package:analyzer/src/context/context.dart' | 21 import 'package:analyzer/src/context/context.dart' |
| 22 show AnalysisFutureHelper, AnalysisContextImpl; | 22 show AnalysisFutureHelper, AnalysisContextImpl; |
| 23 import 'package:analyzer/src/generated/ast.dart'; | 23 import 'package:analyzer/src/generated/ast.dart'; |
| 24 import 'package:analyzer/src/generated/engine.dart' hide AnalysisContextImpl; | 24 import 'package:analyzer/src/generated/engine.dart' hide AnalysisContextImpl; |
| 25 import 'package:analyzer/src/generated/source.dart'; | 25 import 'package:analyzer/src/generated/source.dart'; |
| 26 import 'package:analyzer/src/task/dart.dart'; | 26 import 'package:analyzer/src/task/dart.dart'; |
| 27 import 'package:analyzer/task/dart.dart'; | 27 import 'package:analyzer/task/dart.dart'; |
| 28 import 'package:analyzer/src/generated/scanner.dart'; | 28 import 'package:analyzer/src/generated/scanner.dart'; |
| 29 import 'package:analysis_server/src/services/completion/dart/contribution_sorter
.dart'; |
| 30 import 'package:analysis_server/src/services/completion/dart/common_usage_sorter
.dart'; |
| 29 | 31 |
| 30 /** | 32 /** |
| 31 * [DartCompletionManager] determines if a completion request is Dart specific | 33 * [DartCompletionManager] determines if a completion request is Dart specific |
| 32 * and forwards those requests to all [DartCompletionContributor]s. | 34 * and forwards those requests to all [DartCompletionContributor]s. |
| 33 */ | 35 */ |
| 34 class DartCompletionManager implements CompletionContributor { | 36 class DartCompletionManager implements CompletionContributor { |
| 37 /** |
| 38 * The [contributionSorter] is a long-lived object that isn't allowed |
| 39 * to maintain state between calls to [DartContributionSorter#sort(...)]. |
| 40 */ |
| 41 static DartContributionSorter contributionSorter = new CommonUsageSorter(); |
| 42 |
| 35 @override | 43 @override |
| 36 Future<List<CompletionSuggestion>> computeSuggestions( | 44 Future<List<CompletionSuggestion>> computeSuggestions( |
| 37 CompletionRequest request) async { | 45 CompletionRequest request) async { |
| 38 if (!AnalysisEngine.isDartFileName(request.source.shortName)) { | 46 if (!AnalysisEngine.isDartFileName(request.source.shortName)) { |
| 39 return EMPTY_LIST; | 47 return EMPTY_LIST; |
| 40 } | 48 } |
| 41 | 49 |
| 42 DartCompletionRequestImpl dartRequest = | 50 DartCompletionRequestImpl dartRequest = |
| 43 await DartCompletionRequestImpl.from(request); | 51 await DartCompletionRequestImpl.from(request); |
| 44 ReplacementRange range = | 52 ReplacementRange range = |
| 45 new ReplacementRange.compute(dartRequest.offset, dartRequest.target); | 53 new ReplacementRange.compute(dartRequest.offset, dartRequest.target); |
| 46 (request as CompletionRequestImpl) | 54 (request as CompletionRequestImpl) |
| 47 ..replacementOffset = range.offset | 55 ..replacementOffset = range.offset |
| 48 ..replacementLength = range.length; | 56 ..replacementLength = range.length; |
| 49 | 57 |
| 50 // Don't suggest in comments. | 58 // Don't suggest in comments. |
| 51 if (dartRequest.target.isCommentText) { | 59 if (dartRequest.target.isCommentText) { |
| 52 return EMPTY_LIST; | 60 return EMPTY_LIST; |
| 53 } | 61 } |
| 54 | 62 |
| 55 // Request Dart specific completions from each contributor | 63 // Request Dart specific completions from each contributor |
| 56 Map<String, CompletionSuggestion> suggestionMap = | 64 Map<String, CompletionSuggestion> suggestionMap = |
| 57 <String, CompletionSuggestion>{}; | 65 <String, CompletionSuggestion>{}; |
| 58 for (DartCompletionContributor contributor | 66 for (DartCompletionContributor contributor |
| 59 in dartCompletionPlugin.contributors) { | 67 in dartCompletionPlugin.contributors) { |
| 60 for (CompletionSuggestion newSuggestion | 68 List<CompletionSuggestion> contributorSuggestions = |
| 61 in await contributor.computeSuggestions(dartRequest)) { | 69 await contributor.computeSuggestions(dartRequest); |
| 70 |
| 71 for (CompletionSuggestion newSuggestion in contributorSuggestions) { |
| 62 var oldSuggestion = suggestionMap.putIfAbsent( | 72 var oldSuggestion = suggestionMap.putIfAbsent( |
| 63 newSuggestion.completion, () => newSuggestion); | 73 newSuggestion.completion, () => newSuggestion); |
| 64 if (newSuggestion != oldSuggestion && | 74 if (newSuggestion != oldSuggestion && |
| 65 newSuggestion.relevance > oldSuggestion.relevance) { | 75 newSuggestion.relevance > oldSuggestion.relevance) { |
| 66 suggestionMap[newSuggestion.completion] = newSuggestion; | 76 suggestionMap[newSuggestion.completion] = newSuggestion; |
| 67 } | 77 } |
| 68 } | 78 } |
| 69 } | 79 } |
| 70 return suggestionMap.values.toList(); | 80 |
| 81 // Adjust suggestion relevance before returning |
| 82 List<CompletionSuggestion> suggestions = suggestionMap.values.toList(); |
| 83 await contributionSorter.sort(dartRequest, suggestions); |
| 84 return suggestions; |
| 71 } | 85 } |
| 72 } | 86 } |
| 73 | 87 |
| 74 /** | 88 /** |
| 75 * The information about a requested list of completions within a Dart file. | 89 * The information about a requested list of completions within a Dart file. |
| 76 */ | 90 */ |
| 77 class DartCompletionRequestImpl extends CompletionRequestImpl | 91 class DartCompletionRequestImpl extends CompletionRequestImpl |
| 78 implements DartCompletionRequest { | 92 implements DartCompletionRequest { |
| 79 /** | 93 /** |
| 80 * The [LibraryElement] representing dart:core | 94 * The [LibraryElement] representing dart:core |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 // Replacement range for import URI | 347 // Replacement range for import URI |
| 334 return new ReplacementRange(start, end - start); | 348 return new ReplacementRange(start, end - start); |
| 335 } | 349 } |
| 336 } | 350 } |
| 337 } | 351 } |
| 338 } | 352 } |
| 339 } | 353 } |
| 340 return new ReplacementRange(requestOffset, 0); | 354 return new ReplacementRange(requestOffset, 0); |
| 341 } | 355 } |
| 342 } | 356 } |
| OLD | NEW |