-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement completion for cargo crate versions
- Loading branch information
1 parent
c479bcd
commit a2b8bfd
Showing
4 changed files
with
120 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
use std::ops::Range as StdRange; | ||
|
||
use semver::Version; | ||
|
||
use tower_lsp::jsonrpc::Result; | ||
use tower_lsp::lsp_types::*; | ||
|
||
use crate::clients::*; | ||
use crate::server::*; | ||
|
||
async fn complete_package_version( | ||
clients: &Clients, | ||
document: &Document, | ||
range: StdRange<usize>, | ||
name: &str, | ||
version: &str, | ||
) -> Result<Vec<CompletionItem>> { | ||
let metadatas = match clients.crates.get_index_metadatas(name).await { | ||
Err(_) => return Ok(Vec::new()), | ||
Ok(m) => m, | ||
}; | ||
|
||
let mut valid_metadatas = metadatas | ||
.into_iter() | ||
.filter_map(|metadata| { | ||
let ver = metadata.version.to_ascii_lowercase(); | ||
let smallest_len = version.len().min(ver.len()); | ||
if version.is_empty() | ||
|| version[..smallest_len].eq_ignore_ascii_case(&ver[..smallest_len]) | ||
{ | ||
if let Ok(version) = Version::parse(&ver) { | ||
Some((version, metadata)) | ||
} else { | ||
None | ||
} | ||
} else { | ||
None | ||
} | ||
}) | ||
.collect::<Vec<_>>(); | ||
valid_metadatas.sort_by(|left, right| right.0.cmp(&left.0)); | ||
|
||
Ok(valid_metadatas | ||
.into_iter() | ||
.enumerate() | ||
.map(|(index, (version, _))| CompletionItem { | ||
label: version.to_string(), | ||
kind: Some(CompletionItemKind::VALUE), | ||
sort_text: Some(format!("{:0>5}", index)), | ||
text_edit: Some(CompletionTextEdit::Edit( | ||
document.create_edit(range.clone(), version.to_string()), | ||
)), | ||
..Default::default() | ||
}) | ||
.collect()) | ||
} | ||
|
||
pub async fn get_package_completions( | ||
clients: &Clients, | ||
document: &Document, | ||
range: StdRange<usize>, | ||
name: &str, | ||
version: &str, | ||
) -> Result<CompletionResponse> { | ||
let items = complete_package_version(clients, document, range, name, version).await?; | ||
Ok(CompletionResponse::Array(items)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters