Fix prefix start for locations before a token.

Bug: https://buganizer.corp.google.com/issues/161242256
Change-Id: I67a5ee774090f155d53e9c71e7a06d848e1d9c72
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/159324
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2020-08-20 15:51:59 +00:00 committed by commit-bot@chromium.org
parent 25edea3d8d
commit eb51dbc403
2 changed files with 54 additions and 1 deletions

View file

@ -37,6 +37,7 @@ import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/exception/exception.dart';
@ -405,6 +406,14 @@ class DartCompletionRequestImpl implements DartCompletionRequest {
@override
String get targetPrefix {
var entity = target.entity;
if (entity is Token) {
var prev = entity.previous;
if (prev?.end == offset && prev.isKeywordOrIdentifier) {
return prev.lexeme;
}
}
while (entity is AstNode) {
if (entity is SimpleIdentifier) {
var identifier = entity.name;

View file

@ -71,7 +71,29 @@ main() {
]);
}
Future<void> test_compute_prefixStart_hasPrefix() async {
Future<void> test_compute_prefixStart_beforeToken_identifier() async {
await _compute('''
const foo = 0;
class A {
@fo^
}
''');
expect(_completionResult.prefixStart.line, 3);
expect(_completionResult.prefixStart.column, 3);
}
Future<void> test_compute_prefixStart_beforeToken_keyword() async {
await _compute('''
import 'dart:async' h^;
''');
_assertHasKeyword(text: 'hide');
_assertNoKeyword(text: 'show');
expect(_completionResult.prefixStart.line, 0);
expect(_completionResult.prefixStart.column, 20);
}
Future<void> test_compute_prefixStart_identifier() async {
await _compute('''
class A {
String foobar;
@ -552,6 +574,12 @@ import 'a.dart';
return matching.single;
}
CompletionSuggestion _assertHasKeyword({@required String text}) {
var matching = _matchingKeywordCompletions(text: text);
expect(matching, hasLength(1), reason: 'Expected exactly one completion');
return matching.single;
}
CompletionSuggestion _assertHasLocalVariable({@required String text}) {
var matching = _matchingCompletions(
text: text,
@ -628,6 +656,11 @@ import 'a.dart';
expect(matching, isEmpty, reason: 'Expected zero completions');
}
void _assertNoKeyword({@required String text}) {
var matching = _matchingKeywordCompletions(text: text);
expect(matching, isEmpty, reason: 'Expected zero completions');
}
void _assertNoNamedArgument({@required String name}) {
var matching = _matchingNamedArgumentSuggestions(name: name);
expect(matching, isEmpty, reason: 'Expected zero completions');
@ -694,6 +727,17 @@ import 'a.dart';
}).toList();
}
List<CompletionSuggestion> _matchingKeywordCompletions({
@required String text,
}) {
return _suggestions.where((e) {
if (e.completion != text) {
return false;
}
return e.kind == CompletionSuggestionKind.KEYWORD;
}).toList();
}
List<CompletionSuggestion> _matchingNamedArgumentSuggestions({
@required String name,
}) {