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: }
+''');
+  }
 }