summaryrefslogtreecommitdiff
path: root/cli/lsp/registries.rs
diff options
context:
space:
mode:
authorKitson Kelly <me@kitsonkelly.com>2022-01-04 17:42:33 +1100
committerGitHub <noreply@github.com>2022-01-04 17:42:33 +1100
commit01ff7a87847a690546c62c7bd5c13823d3bb2d42 (patch)
tree41dcc362866d3b3fc19122e9f0d893c6aff65f2b /cli/lsp/registries.rs
parentd9b130410b78face988e2fa5c3939e3584bc02f7 (diff)
fix(lsp): handle repeating patterns in registry correctly (#13275)
Diffstat (limited to 'cli/lsp/registries.rs')
-rw-r--r--cli/lsp/registries.rs99
1 files changed, 77 insertions, 22 deletions
diff --git a/cli/lsp/registries.rs b/cli/lsp/registries.rs
index acb6a401a..93333dd92 100644
--- a/cli/lsp/registries.rs
+++ b/cli/lsp/registries.rs
@@ -112,7 +112,7 @@ fn get_completor_type(
if let StringOrNumber::String(name) = &k.name {
let value = match_result
.get(name)
- .map(|s| s.to_string(Some(k)))
+ .map(|s| s.to_string(Some(k), false))
.unwrap_or_default();
len += value.chars().count();
if offset <= len {
@@ -213,11 +213,12 @@ fn get_endpoint_with_match(
Token::Key(k) if k.name == *key => Some(k),
_ => None,
});
- url = url.replace(&format!("${{{}}}", name), &value.to_string(maybe_key));
+ url = url
+ .replace(&format!("${{{}}}", name), &value.to_string(maybe_key, true));
url = url.replace(
&format!("${{{{{}}}}}", name),
&percent_encoding::percent_encode(
- value.to_string(maybe_key).as_bytes(),
+ value.to_string(maybe_key, true).as_bytes(),
COMPONENT,
)
.to_string(),
@@ -1212,15 +1213,7 @@ mod tests {
.await;
assert!(completions.is_some());
let completions = completions.unwrap().items;
- assert_eq!(completions.len(), 1);
- assert_eq!(completions[0].label, "/x");
- assert_eq!(
- completions[0].text_edit,
- Some(lsp::CompletionTextEdit::Edit(lsp::TextEdit {
- range,
- new_text: "http://localhost:4545/x".to_string()
- }))
- );
+ assert_eq!(completions.len(), 3);
let range = lsp::Range {
start: lsp::Position {
line: 0,
@@ -1236,15 +1229,7 @@ mod tests {
.await;
assert!(completions.is_some());
let completions = completions.unwrap().items;
- assert_eq!(completions.len(), 1);
- assert_eq!(completions[0].label, "/x");
- assert_eq!(
- completions[0].text_edit,
- Some(lsp::CompletionTextEdit::Edit(lsp::TextEdit {
- range,
- new_text: "http://localhost:4545/x".to_string()
- }))
- );
+ assert_eq!(completions.len(), 3);
let range = lsp::Range {
start: lsp::Position {
line: 0,
@@ -1328,6 +1313,7 @@ mod tests {
"documentation": format!("http://localhost:4545/lsp/registries/doc_a_{}.json", completions[0].label),
}))
);
+
let range = lsp::Range {
start: lsp::Position {
line: 0,
@@ -1335,10 +1321,32 @@ mod tests {
},
end: lsp::Position {
line: 0,
- character: 53,
+ character: 49,
},
};
+ let completions = module_registry
+ .get_completions("http://localhost:4545/x/a@v1.", 29, &range, |_| false)
+ .await;
+ assert!(completions.is_some());
+ let completions = completions.unwrap().items;
+ assert_eq!(completions.len(), 2);
+ assert_eq!(
+ completions[0].data,
+ Some(json!({
+ "documentation": format!("http://localhost:4545/lsp/registries/doc_a_{}.json", completions[0].label),
+ }))
+ );
+ let range = lsp::Range {
+ start: lsp::Position {
+ line: 0,
+ character: 20,
+ },
+ end: lsp::Position {
+ line: 0,
+ character: 53,
+ },
+ };
let completions = module_registry
.get_completions("http://localhost:4545/x/a@v1.0.0/", 33, &range, |_| {
false
@@ -1353,6 +1361,53 @@ mod tests {
assert_eq!(completions[1].detail, Some("(path)".to_string()));
assert_eq!(completions[0].kind, Some(lsp::CompletionItemKind::FILE));
assert!(completions[1].command.is_some());
+
+ let range = lsp::Range {
+ start: lsp::Position {
+ line: 0,
+ character: 20,
+ },
+ end: lsp::Position {
+ line: 0,
+ character: 54,
+ },
+ };
+ let completions = module_registry
+ .get_completions("http://localhost:4545/x/a@v1.0.0/b", 34, &range, |_| {
+ false
+ })
+ .await;
+ assert!(completions.is_some());
+ let completions = completions.unwrap().items;
+ assert_eq!(completions.len(), 1);
+ assert_eq!(completions[0].detail, Some("(path)".to_string()));
+ assert_eq!(completions[0].kind, Some(lsp::CompletionItemKind::FILE));
+ assert!(completions[0].command.is_some());
+
+ let range = lsp::Range {
+ start: lsp::Position {
+ line: 0,
+ character: 20,
+ },
+ end: lsp::Position {
+ line: 0,
+ character: 55,
+ },
+ };
+ let completions = module_registry
+ .get_completions(
+ "http://localhost:4545/x/a@v1.0.0/b/",
+ 35,
+ &range,
+ |_| false,
+ )
+ .await;
+ assert!(completions.is_some());
+ let completions = completions.unwrap().items;
+ assert_eq!(completions.len(), 1);
+ assert_eq!(completions[0].detail, Some("(path)".to_string()));
+ assert_eq!(completions[0].kind, Some(lsp::CompletionItemKind::FILE));
+ assert!(completions[0].command.is_some());
}
#[tokio::test]