mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 09:01:42 +00:00
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:
parent
25edea3d8d
commit
eb51dbc403
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
}) {
|
||||
|
|
Loading…
Reference in a new issue