summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-07-24 12:24:43 +0200
committerLaurenz <laurmaedje@gmail.com>2023-07-24 12:24:43 +0200
commitc23d036426a1bb96620f2d20215a8efe14ef6746 (patch)
treefb006ac47a96bde4788f9991392838e41592dbc1
parentb2e58f72072b103d2800b2524f324938c9745942 (diff)
Show only latest version until colon is typed
Fixes #1734
-rw-r--r--crates/typst/src/ide/complete.rs16
1 files changed, 12 insertions, 4 deletions
diff --git a/crates/typst/src/ide/complete.rs b/crates/typst/src/ide/complete.rs
index e855dcdb..099454ef 100644
--- a/crates/typst/src/ide/complete.rs
+++ b/crates/typst/src/ide/complete.rs
@@ -1,3 +1,4 @@
+use std::cmp::Reverse;
use std::collections::{BTreeSet, HashSet};
use ecow::{eco_format, EcoString};
@@ -424,10 +425,12 @@ fn complete_imports(ctx: &mut CompletionContext) -> bool {
Some(SyntaxKind::ModuleImport | SyntaxKind::ModuleInclude)
);
if let Some(ast::Expr::Str(str)) = ctx.leaf.cast();
- if str.get().starts_with('@');
+ let value = str.get();
+ if value.starts_with('@');
then {
+ let all_versions = value.contains(':');
ctx.from = ctx.leaf.offset();
- ctx.package_completions();
+ ctx.package_completions(all_versions);
return true;
}
}
@@ -1003,8 +1006,13 @@ impl<'a> CompletionContext<'a> {
}
/// Add completions for all available packages.
- fn package_completions(&mut self) {
- for (package, description) in self.world.packages() {
+ fn package_completions(&mut self, all_versions: bool) {
+ let mut packages: Vec<_> = self.world.packages().iter().collect();
+ packages.sort_by_key(|(spec, _)| (&spec.name, Reverse(spec.version)));
+ if !all_versions {
+ packages.dedup_by_key(|(spec, _)| &spec.name);
+ }
+ for (package, description) in packages {
self.value_completion(
None,
&Value::Str(format_str!("{package}")),