@@ -2057,7 +2057,8 @@ async fn test_definition(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
"a.rs": "const ONE: usize = b::TWO + b::THREE;",
},
"dir-2": {
- "b.rs": "const TWO: usize = 2;\nconst THREE: usize = 3;",
+ "b.rs": "const TWO: c::T2 = 2;\nconst THREE: usize = 3;",
+ "c.rs": "type T2 = usize;",
}
}),
)
@@ -2093,7 +2094,7 @@ async fn test_definition(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
let target_buffer = definitions_1[0].target.buffer.read(cx);
assert_eq!(
target_buffer.text(),
- "const TWO: usize = 2;\nconst THREE: usize = 3;"
+ "const TWO: c::T2 = 2;\nconst THREE: usize = 3;"
);
assert_eq!(
definitions_1[0].target.range.to_point(target_buffer),
@@ -2122,7 +2123,7 @@ async fn test_definition(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
let target_buffer = definitions_2[0].target.buffer.read(cx);
assert_eq!(
target_buffer.text(),
- "const TWO: usize = 2;\nconst THREE: usize = 3;"
+ "const TWO: c::T2 = 2;\nconst THREE: usize = 3;"
);
assert_eq!(
definitions_2[0].target.range.to_point(target_buffer),
@@ -2133,6 +2134,35 @@ async fn test_definition(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
definitions_1[0].target.buffer,
definitions_2[0].target.buffer
);
+
+ fake_language_server.handle_request::<lsp::request::GotoTypeDefinition, _, _>(
+ |req, _| async move {
+ assert_eq!(
+ req.text_document_position_params.position,
+ lsp::Position::new(0, 7)
+ );
+ Ok(Some(lsp::GotoDefinitionResponse::Scalar(
+ lsp::Location::new(
+ lsp::Url::from_file_path("/root/dir-2/c.rs").unwrap(),
+ lsp::Range::new(lsp::Position::new(0, 5), lsp::Position::new(0, 7)),
+ ),
+ )))
+ },
+ );
+
+ let type_definitions = project_b
+ .update(cx_b, |p, cx| p.type_definition(&buffer_b, 7, cx))
+ .await
+ .unwrap();
+ cx_b.read(|cx| {
+ assert_eq!(type_definitions.len(), 1);
+ let target_buffer = type_definitions[0].target.buffer.read(cx);
+ assert_eq!(target_buffer.text(), "type T2 = usize;");
+ assert_eq!(
+ type_definitions[0].target.range.to_point(target_buffer),
+ Point::new(0, 5)..Point::new(0, 7)
+ );
+ });
}
#[gpui::test(iterations = 10)]
@@ -165,6 +165,7 @@ impl Server {
.add_message_handler(Server::update_diagnostic_summary)
.add_request_handler(Server::forward_project_request::<proto::GetHover>)
.add_request_handler(Server::forward_project_request::<proto::GetDefinition>)
+ .add_request_handler(Server::forward_project_request::<proto::GetTypeDefinition>)
.add_request_handler(Server::forward_project_request::<proto::GetReferences>)
.add_request_handler(Server::forward_project_request::<proto::SearchProject>)
.add_request_handler(Server::forward_project_request::<proto::GetDocumentHighlights>)
@@ -389,6 +389,7 @@ impl Project {
client.add_model_request_handler(Self::handle_get_completions);
client.add_model_request_handler(Self::handle_lsp_command::<GetHover>);
client.add_model_request_handler(Self::handle_lsp_command::<GetDefinition>);
+ client.add_model_request_handler(Self::handle_lsp_command::<GetTypeDefinition>);
client.add_model_request_handler(Self::handle_lsp_command::<GetDocumentHighlights>);
client.add_model_request_handler(Self::handle_lsp_command::<GetReferences>);
client.add_model_request_handler(Self::handle_lsp_command::<PrepareRename>);