From 916afe3219380c98167f999d238aa25d6585a802 Mon Sep 17 00:00:00 2001 From: Brian Wilkerson Date: Thu, 11 Jun 2026 11:09:54 -0700 Subject: [PATCH] Suggest fields from declaring parameters in completions This was preventing suggesting fields from declaring parameters everywhere. Closes https://github.com/dart-lang/sdk/issues/63537 Change-Id: I552f85275c6a1aebaa4a50af88d661bc7e3d6492 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/511040 Reviewed-by: Keerti Parthasarathy Commit-Queue: Brian Wilkerson --- .../completion/dart/declaration_helper.dart | 4 +- .../declaration/declaring_parameter_test.dart | 69 +++++++++++++++++++ .../completion/dart/declaration/test_all.dart | 2 + 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 pkg/analysis_server/test/services/completion/dart/declaration/declaring_parameter_test.dart diff --git a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart index 6a4221c44b7..0e68161ef35 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart @@ -1397,7 +1397,9 @@ class DeclarationHelper { } for (var field in element.fields) { - if (field.isOriginDeclaration && (!mustBeStatic || field.isStatic)) { + if ((field.isOriginDeclaration || + field.isOriginDeclaringFormalParameter) && + (!mustBeStatic || field.isStatic)) { _suggestField( field: field, referencingInterface: referencingInterface, diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/declaring_parameter_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/declaring_parameter_test.dart new file mode 100644 index 00000000000..c390fd160f2 --- /dev/null +++ b/pkg/analysis_server/test/services/completion/dart/declaration/declaring_parameter_test.dart @@ -0,0 +1,69 @@ +// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:test_reflective_loader/test_reflective_loader.dart'; + +import '../../../../client/completion_driver_test.dart'; + +void main() { + defineReflectiveSuite(() { + defineReflectiveTests(DeclaringParameterTest); + }); +} + +@reflectiveTest +class DeclaringParameterTest extends AbstractCompletionDriverTest { + @override + bool get includeKeywords => false; + + Future test_insideFunction() async { + await computeSuggestions(''' +class C(var int f1) { +} + +void f(C c) { + print(c.^); +} +'''); + assertResponse(r''' +suggestions + f1 + kind: field +'''); + } + + Future test_insideMember_sameClass() async { + await computeSuggestions(''' +class C(var int f1) { + void m() { + print(^); + } +} +'''); + assertResponse(r''' +suggestions + f1 + kind: field +'''); + } + + Future test_insideMember_subclass() async { + await computeSuggestions(''' +class A(var int f1) {} + +class B extends A { + new() : super(2); + + void m() { + print(^); + } +} +'''); + assertResponse(r''' +suggestions + f1 + kind: field +'''); + } +} diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart b/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart index c1c38c8743e..f9a67aea84e 100644 --- a/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart +++ b/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart @@ -8,6 +8,7 @@ import 'class_member_test.dart' as class_member; import 'class_test.dart' as class_; import 'closure_test.dart' as closure; import 'constructor_test.dart' as constructor_; +import 'declaring_parameter_test.dart' as declaring_parameter; import 'documentation_test.dart' as documentation; import 'enum_test.dart' as enum_; import 'extension_member_test.dart' as extension_member; @@ -32,6 +33,7 @@ void main() { class_.main(); closure.main(); constructor_.main(); + declaring_parameter.main(); documentation.main(); enum_.main(); extension_member.main();