[DAS] Fix go to type definition for formal parameter
R=paulberry@google.com
Fixes https://github.com/dart-lang/sdk/issues/56844
Change-Id: Idb5c9420ecd9fda1d961c7211758721c4c4c7522
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/388660
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
index 4faf39f..fc461b7 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
@@ -77,7 +77,7 @@
return success(_emptyResult);
}
- SyntacticEntity originEntity;
+ SyntacticEntity? originEntity;
DartType? type;
if (node is NamedType) {
originEntity = node.name2;
@@ -94,7 +94,11 @@
} else if (node is Expression) {
originEntity = node;
type = _getType(node);
- } else {
+ } else if (node is FormalParameter) {
+ originEntity = node.name;
+ type = node.declaredElement?.type;
+ }
+ if (originEntity == null) {
return success(_emptyResult);
}
diff --git a/pkg/analysis_server/test/lsp/type_definition_test.dart b/pkg/analysis_server/test/lsp/type_definition_test.dart
index c2e21e4..b10ddd9 100644
--- a/pkg/analysis_server/test/lsp/type_definition_test.dart
+++ b/pkg/analysis_server/test/lsp/type_definition_test.dart
@@ -108,6 +108,19 @@
_expectNameRange(result.range, 'String');
}
+ Future<void> test_namedParameter_closure() async {
+ var code = TestCode.parse('''
+void bar(void Function(String, {required int? value}) f) {}
+void foo() {
+ bar((str, {required [!val^ue!]}) {});
+}
+''');
+
+ var result = await _getResult(code);
+ expect(result.originSelectionRange, code.range.range);
+ _expectSdkCoreType(result, 'int');
+ }
+
Future<void> test_nonDartFile() async {
var code = TestCode.parse('''
const a = '^';
@@ -120,6 +133,32 @@
expect(results, isEmpty);
}
+ Future<void> test_optionalNamedParameter_closure() async {
+ var code = TestCode.parse('''
+void bar(void Function() f) {}
+void foo() {
+ bar(({String [!s^tr!] = ''}) {});
+}
+''');
+
+ var result = await _getResult(code);
+ expect(result.originSelectionRange, code.range.range);
+ _expectSdkCoreType(result, 'String');
+ }
+
+ Future<void> test_optionalPositionalParameter_closure() async {
+ var code = TestCode.parse('''
+void bar(void Function() f) {}
+void foo() {
+ bar(([String [!s^tr!] = '']) {});
+}
+''');
+
+ var result = await _getResult(code);
+ expect(result.originSelectionRange, code.range.range);
+ _expectSdkCoreType(result, 'String');
+ }
+
Future<void> test_otherFile() async {
var otherFilePath = join(projectFolderPath, 'lib', 'other.dart');
var otherFileUri = pathContext.toUri(otherFilePath);
@@ -153,6 +192,32 @@
_expectSdkCoreType(result, 'String');
}
+ Future<void> test_parameter_closure() async {
+ var code = TestCode.parse('''
+void bar(void Function(String) f) {}
+void foo() {
+ bar(([!st^r!]) {});
+}
+''');
+
+ var result = await _getResult(code);
+ expect(result.originSelectionRange, code.range.range);
+ _expectSdkCoreType(result, 'String');
+ }
+
+ Future<void> test_parameter_named_closure() async {
+ var code = TestCode.parse('''
+void bar({required void Function(String) f}) {}
+void foo() {
+ bar(f: ([!st^r!]) {});
+}
+''');
+
+ var result = await _getResult(code);
+ expect(result.originSelectionRange, code.range.range);
+ _expectSdkCoreType(result, 'String');
+ }
+
Future<void> test_parameter_wildcard() async {
var code = TestCode.parse('''
void f(String _) {
@@ -227,6 +292,19 @@
expect(result.targetRange, rangeOfString(code, 'class _ { }'));
}
+ Future<void> test_typedParameter_closure() async {
+ var code = TestCode.parse('''
+void bar(void Function(String) f) {}
+void foo() {
+ bar((String [!s^tr!]) {});
+}
+''');
+
+ var result = await _getResult(code);
+ expect(result.originSelectionRange, code.range.range);
+ _expectSdkCoreType(result, 'String');
+ }
+
Future<void> test_unopenedFile() async {
var code = TestCode.parse('''
const a = [!'^'!];