Get minimal POC working

This commit is contained in:
Isaac Clayton 2022-05-30 17:00:45 +02:00 committed by Keith Simmons
parent 24ad60a651
commit 470c70d394
5 changed files with 200 additions and 37 deletions

View file

@ -2439,16 +2439,49 @@ impl Editor {
return; return;
}; };
let hover = HoverPopover { let snapshot = self.snapshot(cx);
// TODO: beginning of symbol based on range let (buffer, buffer_position) = if let Some(output) = self
point: action.0, .buffer
text: "Test hover information".to_string(), .read(cx)
runs: Vec::new(), .text_anchor_for_position(action.0.to_point(&snapshot.display_snapshot), cx)
{
output
} else {
return;
}; };
let hover = project.update(cx, |project, cx| {
project.hover(&buffer, buffer_position.clone(), cx)
});
let point = action.0.clone();
let id = post_inc(&mut self.next_completion_id); let id = post_inc(&mut self.next_completion_id);
let task = cx.spawn_weak(|this, mut cx| { let task = cx.spawn_weak(|this, mut cx| {
async move { async move {
// TODO: what to show while language server is loading?
let text: String = match hover.await? {
None => "Language server is warming up...".into(),
Some(hover) => match hover.contents {
lsp::HoverContents::Scalar(marked_string) => match marked_string {
lsp::MarkedString::String(string) => string,
lsp::MarkedString::LanguageString(string) => string.value,
},
lsp::HoverContents::Array(marked_strings) => {
// TODO: what to do?
todo!()
}
lsp::HoverContents::Markup(markup) => markup.value,
},
};
let mut hover_popover = HoverPopover {
// TODO: fix tooltip to beginning of symbol based on range
point,
text,
runs: Vec::new(),
};
if let Some(this) = this.upgrade(&cx) { if let Some(this) = this.upgrade(&cx) {
this.update(&mut cx, |this, cx| { this.update(&mut cx, |this, cx| {
if !matches!( if !matches!(
@ -2459,7 +2492,7 @@ impl Editor {
} }
if this.focused { if this.focused {
this.show_context_menu(ContextMenu::Hover(hover), cx); this.show_context_menu(ContextMenu::Hover(hover_popover), cx);
} }
cx.notify(); cx.notify();

View file

@ -80,6 +80,10 @@ pub(crate) struct GetDocumentHighlights {
pub position: PointUtf16, pub position: PointUtf16,
} }
pub(crate) struct GetHover {
pub position: PointUtf16,
}
#[async_trait(?Send)] #[async_trait(?Send)]
impl LspCommand for PrepareRename { impl LspCommand for PrepareRename {
type Response = Option<Range<Anchor>>; type Response = Option<Range<Anchor>>;
@ -794,3 +798,99 @@ impl LspCommand for GetDocumentHighlights {
message.buffer_id message.buffer_id
} }
} }
#[async_trait(?Send)]
impl LspCommand for GetHover {
// TODO: proper response type
type Response = Option<lsp::Hover>;
type LspRequest = lsp::request::HoverRequest;
type ProtoRequest = proto::GetHover;
fn to_lsp(&self, path: &Path, cx: &AppContext) -> lsp::HoverParams {
lsp::HoverParams {
text_document_position_params: lsp::TextDocumentPositionParams {
text_document: lsp::TextDocumentIdentifier {
uri: lsp::Url::from_file_path(path).unwrap(),
},
position: point_to_lsp(self.position),
},
work_done_progress_params: Default::default(),
}
}
async fn response_from_lsp(
self,
message: Option<lsp::Hover>,
project: ModelHandle<Project>,
buffer: ModelHandle<Buffer>,
cx: AsyncAppContext,
) -> Result<Self::Response> {
// let (lsp_adapter, language_server) = project
// .read_with(&cx, |project, cx| {
// project
// .language_server_for_buffer(buffer.read(cx), cx)
// .cloned()
// })
// .ok_or_else(|| anyhow!("no language server found for buffer"))?;
// TODO: what here?
Ok(Some(
message.ok_or_else(|| anyhow!("invalid lsp response"))?,
))
}
fn to_proto(&self, project_id: u64, buffer: &Buffer) -> Self::ProtoRequest {
proto::GetHover {
project_id,
buffer_id: buffer.remote_id(),
position: Some(language::proto::serialize_anchor(
&buffer.anchor_before(self.position),
)),
version: serialize_version(&buffer.version),
}
}
async fn from_proto(
message: Self::ProtoRequest,
project: ModelHandle<Project>,
buffer: ModelHandle<Buffer>,
mut cx: AsyncAppContext,
) -> Result<Self> {
let position = message
.position
.and_then(deserialize_anchor)
.ok_or_else(|| anyhow!("invalid position"))?;
buffer
.update(&mut cx, |buffer, _| {
buffer.wait_for_version(deserialize_version(message.version))
})
.await;
Ok(Self {
position: buffer.read_with(&cx, |buffer, _| position.to_point_utf16(buffer)),
})
}
fn response_to_proto(
response: Self::Response,
project: &mut Project,
peer_id: PeerId,
buffer_version: &clock::Global,
cx: &AppContext,
) -> proto::GetHoverResponse {
todo!()
}
async fn response_from_proto(
self,
message: <Self::ProtoRequest as proto::RequestMessage>::Response,
project: ModelHandle<Project>,
buffer: ModelHandle<Buffer>,
cx: AsyncAppContext,
) -> Result<Self::Response> {
todo!()
}
fn buffer_id_from_proto(message: &Self::ProtoRequest) -> u64 {
message.buffer_id
}
}

View file

@ -302,6 +302,7 @@ impl Project {
client.add_model_request_handler(Self::handle_format_buffers); client.add_model_request_handler(Self::handle_format_buffers);
client.add_model_request_handler(Self::handle_get_code_actions); client.add_model_request_handler(Self::handle_get_code_actions);
client.add_model_request_handler(Self::handle_get_completions); 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::<GetDefinition>);
client.add_model_request_handler(Self::handle_lsp_command::<GetDocumentHighlights>); 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::<GetReferences>);
@ -2884,6 +2885,17 @@ impl Project {
} }
} }
pub fn hover<T: ToPointUtf16>(
&self,
buffer: &ModelHandle<Buffer>,
position: T,
cx: &mut ModelContext<Self>,
) -> Task<Result<Option<lsp::Hover>>> {
// TODO: proper return type
let position = position.to_point_utf16(buffer.read(cx));
self.request_lsp(buffer.clone(), GetHover { position }, cx)
}
pub fn completions<T: ToPointUtf16>( pub fn completions<T: ToPointUtf16>(
&self, &self,
source_buffer_handle: &ModelHandle<Buffer>, source_buffer_handle: &ModelHandle<Buffer>,

View file

@ -66,41 +66,43 @@ message Envelope {
ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 56; ApplyCompletionAdditionalEditsResponse apply_completion_additional_edits_response = 56;
GetCodeActions get_code_actions = 57; GetCodeActions get_code_actions = 57;
GetCodeActionsResponse get_code_actions_response = 58; GetCodeActionsResponse get_code_actions_response = 58;
ApplyCodeAction apply_code_action = 59; GetHover get_hover = 59;
ApplyCodeActionResponse apply_code_action_response = 60; GetHoverResponse get_hover_response = 60;
PrepareRename prepare_rename = 61; ApplyCodeAction apply_code_action = 61;
PrepareRenameResponse prepare_rename_response = 62; ApplyCodeActionResponse apply_code_action_response = 62;
PerformRename perform_rename = 63; PrepareRename prepare_rename = 63;
PerformRenameResponse perform_rename_response = 64; PrepareRenameResponse prepare_rename_response = 64;
SearchProject search_project = 65; PerformRename perform_rename = 65;
SearchProjectResponse search_project_response = 66; PerformRenameResponse perform_rename_response = 66;
SearchProject search_project = 67;
SearchProjectResponse search_project_response = 68;
GetChannels get_channels = 67; GetChannels get_channels = 69;
GetChannelsResponse get_channels_response = 68; GetChannelsResponse get_channels_response = 70;
JoinChannel join_channel = 69; JoinChannel join_channel = 71;
JoinChannelResponse join_channel_response = 70; JoinChannelResponse join_channel_response = 72;
LeaveChannel leave_channel = 71; LeaveChannel leave_channel = 73;
SendChannelMessage send_channel_message = 72; SendChannelMessage send_channel_message = 74;
SendChannelMessageResponse send_channel_message_response = 73; SendChannelMessageResponse send_channel_message_response = 75;
ChannelMessageSent channel_message_sent = 74; ChannelMessageSent channel_message_sent = 76;
GetChannelMessages get_channel_messages = 75; GetChannelMessages get_channel_messages = 77;
GetChannelMessagesResponse get_channel_messages_response = 76; GetChannelMessagesResponse get_channel_messages_response = 78;
UpdateContacts update_contacts = 77; UpdateContacts update_contacts = 79;
UpdateInviteInfo update_invite_info = 78; UpdateInviteInfo update_invite_info = 80;
ShowContacts show_contacts = 79; ShowContacts show_contacts = 81;
GetUsers get_users = 80; GetUsers get_users = 82;
FuzzySearchUsers fuzzy_search_users = 81; FuzzySearchUsers fuzzy_search_users = 83;
UsersResponse users_response = 82; UsersResponse users_response = 84;
RequestContact request_contact = 83; RequestContact request_contact = 85;
RespondToContactRequest respond_to_contact_request = 84; RespondToContactRequest respond_to_contact_request = 86;
RemoveContact remove_contact = 85; RemoveContact remove_contact = 87;
Follow follow = 86; Follow follow = 88;
FollowResponse follow_response = 87; FollowResponse follow_response = 89;
UpdateFollowers update_followers = 88; UpdateFollowers update_followers = 90;
Unfollow unfollow = 89; Unfollow unfollow = 91;
} }
} }
@ -426,6 +428,18 @@ message GetCodeActionsResponse {
repeated VectorClockEntry version = 2; repeated VectorClockEntry version = 2;
} }
message GetHover {
uint64 project_id = 1;
uint64 buffer_id = 2;
Anchor position = 3;
repeated VectorClockEntry version = 5;
}
message GetHoverResponse {
repeated CodeAction actions = 1;
repeated VectorClockEntry version = 2;
}
message ApplyCodeAction { message ApplyCodeAction {
uint64 project_id = 1; uint64 project_id = 1;
uint64 buffer_id = 2; uint64 buffer_id = 2;

View file

@ -99,6 +99,8 @@ messages!(
(GetChannelsResponse, Foreground), (GetChannelsResponse, Foreground),
(GetCodeActions, Background), (GetCodeActions, Background),
(GetCodeActionsResponse, Background), (GetCodeActionsResponse, Background),
(GetHover, Background),
(GetHoverResponse, Background),
(GetCompletions, Background), (GetCompletions, Background),
(GetCompletionsResponse, Background), (GetCompletionsResponse, Background),
(GetDefinition, Background), (GetDefinition, Background),
@ -175,6 +177,7 @@ request_messages!(
(GetChannelMessages, GetChannelMessagesResponse), (GetChannelMessages, GetChannelMessagesResponse),
(GetChannels, GetChannelsResponse), (GetChannels, GetChannelsResponse),
(GetCodeActions, GetCodeActionsResponse), (GetCodeActions, GetCodeActionsResponse),
(GetHover, GetHoverResponse),
(GetCompletions, GetCompletionsResponse), (GetCompletions, GetCompletionsResponse),
(GetDefinition, GetDefinitionResponse), (GetDefinition, GetDefinitionResponse),
(GetDocumentHighlights, GetDocumentHighlightsResponse), (GetDocumentHighlights, GetDocumentHighlightsResponse),
@ -221,6 +224,7 @@ entity_messages!(
GetCompletions, GetCompletions,
GetDefinition, GetDefinition,
GetDocumentHighlights, GetDocumentHighlights,
GetHover,
GetReferences, GetReferences,
GetProjectSymbols, GetProjectSymbols,
JoinProject, JoinProject,