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