diff options
Diffstat (limited to 'crates/rust-analyzer/src/to_proto.rs')
-rw-r--r-- | crates/rust-analyzer/src/to_proto.rs | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 2fbbb4e63..66144fe24 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs | |||
@@ -3,13 +3,16 @@ use ra_db::{FileId, FileRange}; | |||
3 | use ra_ide::{ | 3 | use ra_ide::{ |
4 | Assist, CompletionItem, CompletionItemKind, Documentation, FileSystemEdit, Fold, FoldKind, | 4 | Assist, CompletionItem, CompletionItemKind, Documentation, FileSystemEdit, Fold, FoldKind, |
5 | FunctionSignature, Highlight, HighlightModifier, HighlightTag, HighlightedRange, Indel, | 5 | FunctionSignature, Highlight, HighlightModifier, HighlightTag, HighlightedRange, Indel, |
6 | InlayHint, InlayKind, InsertTextFormat, LineIndex, NavigationTarget, ReferenceAccess, Severity, | 6 | InlayHint, InlayKind, InsertTextFormat, LineIndex, NavigationTarget, ReferenceAccess, Runnable, |
7 | SourceChange, SourceFileEdit, TextEdit, | 7 | RunnableKind, Severity, SourceChange, SourceFileEdit, TextEdit, |
8 | }; | 8 | }; |
9 | use ra_syntax::{SyntaxKind, TextRange, TextSize}; | 9 | use ra_syntax::{SyntaxKind, TextRange, TextSize}; |
10 | use ra_vfs::LineEndings; | 10 | use ra_vfs::LineEndings; |
11 | use rustc_hash::FxHashMap; | ||
11 | 12 | ||
12 | use crate::{lsp_ext, semantic_tokens, world::WorldSnapshot, Result}; | 13 | use crate::{ |
14 | cargo_target_spec::CargoTargetSpec, lsp_ext, semantic_tokens, world::WorldSnapshot, Result, | ||
15 | }; | ||
13 | 16 | ||
14 | pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position { | 17 | pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position { |
15 | let line_col = line_index.line_col(offset); | 18 | let line_col = line_index.line_col(offset); |
@@ -627,3 +630,38 @@ pub(crate) fn code_action(world: &WorldSnapshot, assist: Assist) -> Result<lsp_e | |||
627 | }; | 630 | }; |
628 | Ok(res) | 631 | Ok(res) |
629 | } | 632 | } |
633 | |||
634 | pub(crate) fn runnable( | ||
635 | world: &WorldSnapshot, | ||
636 | file_id: FileId, | ||
637 | runnable: Runnable, | ||
638 | ) -> Result<lsp_ext::Runnable> { | ||
639 | let spec = CargoTargetSpec::for_file(world, file_id)?; | ||
640 | let target = spec.as_ref().map(|s| s.target.clone()); | ||
641 | let (args, extra_args) = | ||
642 | CargoTargetSpec::runnable_args(spec, &runnable.kind, &runnable.cfg_exprs)?; | ||
643 | let line_index = world.analysis().file_line_index(file_id)?; | ||
644 | let label = match &runnable.kind { | ||
645 | RunnableKind::Test { test_id, .. } => format!("test {}", test_id), | ||
646 | RunnableKind::TestMod { path } => format!("test-mod {}", path), | ||
647 | RunnableKind::Bench { test_id } => format!("bench {}", test_id), | ||
648 | RunnableKind::DocTest { test_id, .. } => format!("doctest {}", test_id), | ||
649 | RunnableKind::Bin => { | ||
650 | target.map_or_else(|| "run binary".to_string(), |t| format!("run {}", t)) | ||
651 | } | ||
652 | }; | ||
653 | |||
654 | Ok(lsp_ext::Runnable { | ||
655 | range: range(&line_index, runnable.range), | ||
656 | label, | ||
657 | kind: lsp_ext::RunnableKind::Cargo, | ||
658 | args, | ||
659 | extra_args, | ||
660 | env: { | ||
661 | let mut m = FxHashMap::default(); | ||
662 | m.insert("RUST_BACKTRACE".to_string(), "short".to_string()); | ||
663 | m | ||
664 | }, | ||
665 | cwd: world.workspace_root_for(file_id).map(|root| root.to_owned()), | ||
666 | }) | ||
667 | } | ||