on master help sign in
Extract a common "language server or return" macro
4e84540Blaž Hrastnik
helix-term/src/commands/lsp.rs+21−54
@@ -16,6 +16,16 @@ use crate::{
16
16
17use std::borrow::Cow;
17use std::borrow::Cow;
18
18
19+#[macro_export]
20+macro_rules! language_server {
21+ ($doc:expr) => {
22+ match $doc.language_server() {
23+ Some(language_server) => language_server,
24+ None => return,
25+ }
26+ };
27+}
28+
19fn location_to_file_location(location: &lsp::Location) -> FileLocation {
29fn location_to_file_location(location: &lsp::Location) -> FileLocation {
20 let path = location.uri.to_file_path().unwrap();
30 let path = location.uri.to_file_path().unwrap();
21 let line = Some((
31 let line = Some((
@@ -91,10 +101,7 @@ pub fn symbol_picker(cx: &mut Context) {
91 }
101 }
92 let doc = doc!(cx.editor);
102 let doc = doc!(cx.editor);
93
103
94− let language_server = match doc.language_server() {
104+ let language_server = language_server!(doc);
95− Some(language_server) => language_server,
96− None => return,
97− };
98 let current_url = doc.url();
105 let current_url = doc.url();
99 let offset_encoding = language_server.offset_encoding();
106 let offset_encoding = language_server.offset_encoding();
100
107
@@ -130,10 +137,7 @@ pub fn symbol_picker(cx: &mut Context) {
130pub fn workspace_symbol_picker(cx: &mut Context) {
137pub fn workspace_symbol_picker(cx: &mut Context) {
131 let doc = doc!(cx.editor);
138 let doc = doc!(cx.editor);
132 let current_url = doc.url();
139 let current_url = doc.url();
133− let language_server = match doc.language_server() {
140+ let language_server = language_server!(doc);
134− Some(language_server) => language_server,
135− None => return,
136− };
137 let offset_encoding = language_server.offset_encoding();
141 let offset_encoding = language_server.offset_encoding();
138 let future = language_server.workspace_symbols("".to_string());
142 let future = language_server.workspace_symbols("".to_string());
139
143
@@ -162,10 +166,7 @@ impl ui::menu::Item for lsp::CodeActionOrCommand {
162pub fn code_action(cx: &mut Context) {
166pub fn code_action(cx: &mut Context) {
163 let (view, doc) = current!(cx.editor);
167 let (view, doc) = current!(cx.editor);
164
168
165− let language_server = match doc.language_server() {
169+ let language_server = language_server!(doc);
166− Some(language_server) => language_server,
167− None => return,
168− };
169
170
170 let range = range_to_lsp_range(
171 let range = range_to_lsp_range(
171 doc.text(),
172 doc.text(),
@@ -230,10 +231,7 @@ pub fn code_action(cx: &mut Context) {
230}
231}
231pub fn execute_lsp_command(editor: &mut Editor, cmd: lsp::Command) {
232pub fn execute_lsp_command(editor: &mut Editor, cmd: lsp::Command) {
232 let doc = doc!(editor);
233 let doc = doc!(editor);
233− let language_server = match doc.language_server() {
234+ let language_server = language_server!(doc);
234− Some(language_server) => language_server,
235− None => return,
236− };
237
235
238 // the command is executed on the server and communicated back
236 // the command is executed on the server and communicated back
239 // to the client asynchronously using workspace edits
237 // to the client asynchronously using workspace edits
@@ -476,11 +474,7 @@ fn goto_impl(
476
474
477pub fn goto_definition(cx: &mut Context) {
475pub fn goto_definition(cx: &mut Context) {
478 let (view, doc) = current!(cx.editor);
476 let (view, doc) = current!(cx.editor);
479− let language_server = match doc.language_server() {
477+ let language_server = language_server!(doc);
480− Some(language_server) => language_server,
481− None => return,
482− };
483−
484 let offset_encoding = language_server.offset_encoding();
478 let offset_encoding = language_server.offset_encoding();
485
479
486 let pos = pos_to_lsp_pos(
480 let pos = pos_to_lsp_pos(
@@ -518,11 +512,7 @@ pub fn goto_definition(cx: &mut Context) {
518
512
519pub fn goto_type_definition(cx: &mut Context) {
513pub fn goto_type_definition(cx: &mut Context) {
520 let (view, doc) = current!(cx.editor);
514 let (view, doc) = current!(cx.editor);
521− let language_server = match doc.language_server() {
515+ let language_server = language_server!(doc);
522− Some(language_server) => language_server,
523− None => return,
524− };
525−
526 let offset_encoding = language_server.offset_encoding();
516 let offset_encoding = language_server.offset_encoding();
527
517
528 let pos = pos_to_lsp_pos(
518 let pos = pos_to_lsp_pos(
@@ -560,11 +550,7 @@ pub fn goto_type_definition(cx: &mut Context) {
560
550
561pub fn goto_implementation(cx: &mut Context) {
551pub fn goto_implementation(cx: &mut Context) {
562 let (view, doc) = current!(cx.editor);
552 let (view, doc) = current!(cx.editor);
563− let language_server = match doc.language_server() {
553+ let language_server = language_server!(doc);
564− Some(language_server) => language_server,
565− None => return,
566− };
567−
568 let offset_encoding = language_server.offset_encoding();
554 let offset_encoding = language_server.offset_encoding();
569
555
570 let pos = pos_to_lsp_pos(
556 let pos = pos_to_lsp_pos(
@@ -602,11 +588,7 @@ pub fn goto_implementation(cx: &mut Context) {
602
588
603pub fn goto_reference(cx: &mut Context) {
589pub fn goto_reference(cx: &mut Context) {
604 let (view, doc) = current!(cx.editor);
590 let (view, doc) = current!(cx.editor);
605− let language_server = match doc.language_server() {
591+ let language_server = language_server!(doc);
606− Some(language_server) => language_server,
607− None => return,
608− };
609−
610 let offset_encoding = language_server.offset_encoding();
592 let offset_encoding = language_server.offset_encoding();
611
593
612 let pos = pos_to_lsp_pos(
594 let pos = pos_to_lsp_pos(
@@ -636,11 +618,7 @@ pub fn goto_reference(cx: &mut Context) {
636
618
637pub fn signature_help(cx: &mut Context) {
619pub fn signature_help(cx: &mut Context) {
638 let (view, doc) = current!(cx.editor);
620 let (view, doc) = current!(cx.editor);
639−
640− let language_server = match doc.language_server() {
621+ let language_server = language_server!(doc);
641− Some(language_server) => language_server,
642− None => return,
643− };
644
622
645 let pos = pos_to_lsp_pos(
623 let pos = pos_to_lsp_pos(
646 doc.text(),
624 doc.text(),
@@ -675,11 +653,7 @@ pub fn signature_help(cx: &mut Context) {
675}
653}
676pub fn hover(cx: &mut Context) {
654pub fn hover(cx: &mut Context) {
677 let (view, doc) = current!(cx.editor);
655 let (view, doc) = current!(cx.editor);
678−
679− let language_server = match doc.language_server() {
656+ let language_server = language_server!(doc);
680− Some(language_server) => language_server,
681− None => return,
682− };
683
657
684 // TODO: factor out a doc.position_identifier() that returns lsp::TextDocumentPositionIdentifier
658 // TODO: factor out a doc.position_identifier() that returns lsp::TextDocumentPositionIdentifier
685
659
@@ -742,14 +716,8 @@ pub fn rename_symbol(cx: &mut Context) {
742 return;
716 return;
743 }
717 }
744
718
745− log::debug!("renaming to: {:?}", input);
746−
747 let (view, doc) = current!(cx.editor);
719 let (view, doc) = current!(cx.editor);
748− let language_server = match doc.language_server() {
720+ let language_server = language_server!(doc);
749− Some(language_server) => language_server,
750− None => return,
751− };
752−
753 let offset_encoding = language_server.offset_encoding();
721 let offset_encoding = language_server.offset_encoding();
754
722
755 let pos = pos_to_lsp_pos(
723 let pos = pos_to_lsp_pos(
@@ -762,7 +730,6 @@ pub fn rename_symbol(cx: &mut Context) {
762
730
763 let task = language_server.rename_symbol(doc.identifier(), pos, input.to_string());
731 let task = language_server.rename_symbol(doc.identifier(), pos, input.to_string());
764 let edits = block_on(task).unwrap_or_default();
732 let edits = block_on(task).unwrap_or_default();
765− log::debug!("Edits from LSP: {:?}", edits);
766 apply_workspace_edit(cx.editor, offset_encoding, &edits);
733 apply_workspace_edit(cx.editor, offset_encoding, &edits);
767 },
734 },
768 );
735 );