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

Unified Diff: pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart

Issue 886463002: use CompletionTarget for replacement offset/length (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 11 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
« no previous file with comments | « no previous file | pkg/analysis_server/test/services/completion/completion_test_util.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
index 65e3a46187c4f916e23437caf99d0bd0fe9506da..1c19a17d3ed133889deac8159febf438716e7cbf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -21,6 +21,7 @@ import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/scanner.dart';
// TODO (danrubel) these are temporary constants as we transition completion
// relevance from CompletionRelevance.LOW/DEFAULT/HIGH to int.
@@ -61,15 +62,18 @@ class DartCompletionManager extends CompletionManager {
List<DartCompletionComputer> computers;
DartCompletionManager(AnalysisContext context, this.searchEngine,
- Source source, this.cache)
- : super(context, source),
- computers = [
+ Source source, this.cache, [this.computers])
+ : super(context, source) {
+ if (computers == null) {
+ computers = [
new KeywordComputer(),
new LocalComputer(),
new ArgListComputer(),
new CombinatorComputer(),
new ImportedComputer(),
new InvocationComputer()];
+ }
+ }
/**
* Create a new initialized Dart source completion manager
@@ -104,8 +108,25 @@ class DartCompletionManager extends CompletionManager {
CompilationUnit unit = context.parseCompilationUnit(source);
request.unit = unit;
request.node = new NodeLocator.con1(request.offset).searchWithin(unit);
- request.node.accept(new _ReplacementOffsetBuilder(request));
request.target = new CompletionTarget.forOffset(unit, request.offset);
+
+ request.replacementOffset = request.offset;
Paul Berry 2015/01/28 16:32:21 Some issues with this code: - It doesn't handle th
danrubel 2015/01/28 20:10:43 Good eyes. I like that code better. Done with a sl
+ request.replacementLength = 0;
+ var entity = request.target.entity;
+ if (entity is SimpleIdentifier) {
+ if (entity.offset <= request.offset) {
+ request.replacementOffset = entity.offset;
+ request.replacementLength = entity.length;
+ }
+ } else if (entity is AstNode) {
+ Token token = entity.beginToken;
+ if (token.offset <= request.offset &&
+ (token.type == TokenType.KEYWORD || token.type == TokenType.IDENTIFIER)) {
+ request.replacementOffset = token.offset;
+ request.replacementLength = token.length;
+ }
+ }
+
List<DartCompletionComputer> todo = new List.from(computers);
todo.removeWhere((DartCompletionComputer c) {
return request.performance.logElapseTime(
@@ -122,14 +143,12 @@ class DartCompletionManager extends CompletionManager {
/**
* If there is remaining work to be done, then wait for the unit to be
* resolved and request that each remaining computer finish their work.
+ * Return a [Future] that completes when the last notification has been sent.
*/
- void computeFull(DartCompletionRequest request,
+ Future computeFull(DartCompletionRequest request,
List<DartCompletionComputer> todo) {
request.performance.logStartTime('waitForAnalysis');
- waitForAnalysis().then((CompilationUnit unit) {
- if (controller.isClosed) {
Paul Berry 2015/01/28 16:32:21 Nit: can we keep this? Granted, it's unnecessary
danrubel 2015/01/28 20:10:43 Makes sense. I'll put this back in. I've made the
- return;
- }
+ return waitForAnalysis().then((CompilationUnit unit) {
request.performance.logElapseTime('waitForAnalysis');
if (unit == null) {
sendResults(request, true);
@@ -181,7 +200,7 @@ class DartCompletionManager extends CompletionManager {
* Send the current list of suggestions to the client.
*/
void sendResults(DartCompletionRequest request, bool last) {
- if (controller.isClosed) {
+ if (controller == null || controller.isClosed) {
return;
}
controller.add(
@@ -315,21 +334,3 @@ class DartCompletionRequest extends CompletionRequest {
return _optype;
}
}
-
-/**
- * Visitor used to determine the replacement offset and length
- * based upon the cursor location.
- */
-class _ReplacementOffsetBuilder extends SimpleAstVisitor {
- final DartCompletionRequest request;
-
- _ReplacementOffsetBuilder(this.request) {
- request.replacementOffset = request.offset;
- request.replacementLength = 0;
- }
-
- visitSimpleIdentifier(SimpleIdentifier node) {
- request.replacementOffset = node.offset;
- request.replacementLength = node.length;
- }
-}
« no previous file with comments | « no previous file | pkg/analysis_server/test/services/completion/completion_test_util.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698