[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 = [!'^'!];