Completion. Issue 55206. Fix completion of partial property access before another identifier.
Bug: https://github.com/dart-lang/sdk/issues/55206
Change-Id: I247464934aa41491ac6e051a28a680c3fe68d2bd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/357921
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Keerti Parthasarathy <keertip@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/test/services/completion/dart/location/property_access_expression_test.dart b/pkg/analysis_server/test/services/completion/dart/location/property_access_expression_test.dart
index ac8f825..4b69550 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/property_access_expression_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/property_access_expression_test.dart
@@ -94,6 +94,24 @@
}
Future<void> test_afterIdentifier_beforeIdentifier_partial() async {
+ await computeSuggestions('''
+void f(String x) {
+ x.len^
+ foo();
+}
+''');
+ allowedIdentifiers = {'length'};
+ assertResponse(r'''
+replacement
+ left: 3
+suggestions
+ length
+ kind: getter
+''');
+ }
+
+ Future<void>
+ test_afterIdentifier_beforeIdentifier_partial_importPrefix() async {
newFile('$testPackageLibPath/a.dart', r'''
void v01() {}
void g01() {}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 485b5bf..417de53 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -3583,7 +3583,8 @@
// await y.bar();
{
var awaitToken = variable.name;
- if (awaitToken.type == Keyword.AWAIT) {
+ if (awaitToken.type == Keyword.AWAIT ||
+ awaitToken.type == TokenType.IDENTIFIER) {
push(
ExpressionStatementImpl(
expression: PrefixedIdentifierImpl(
diff --git a/pkg/analyzer/test/src/dart/parser/variable_declaration_statement_test.dart b/pkg/analyzer/test/src/dart/parser/variable_declaration_statement_test.dart
index d42c7f2..ff6fc5a 100644
--- a/pkg/analyzer/test/src/dart/parser/variable_declaration_statement_test.dart
+++ b/pkg/analyzer/test/src/dart/parser/variable_declaration_statement_test.dart
@@ -97,4 +97,40 @@
rightBracket: }
''');
}
+
+ test_recovery_propertyAccess_beforeIdentifier_hasIdentifier() {
+ final parseResult = parseStringWithErrors(r'''
+void f(x) {
+ x.foo
+ bar();
+}
+''');
+ parseResult.assertErrors([
+ error(ParserErrorCode.EXPECTED_TOKEN, 22, 3),
+ ]);
+
+ final node = parseResult.findNode.singleBlock;
+ assertParsedNodeText(node, r'''
+Block
+ leftBracket: {
+ statements
+ ExpressionStatement
+ expression: PrefixedIdentifier
+ prefix: SimpleIdentifier
+ token: x
+ period: .
+ identifier: SimpleIdentifier
+ token: foo
+ semicolon: ; <synthetic>
+ ExpressionStatement
+ expression: MethodInvocation
+ methodName: SimpleIdentifier
+ token: bar
+ argumentList: ArgumentList
+ leftParenthesis: (
+ rightParenthesis: )
+ semicolon: ;
+ rightBracket: }
+''');
+ }
}