diff options
author | Kitson Kelly <me@kitsonkelly.com> | 2022-01-04 17:42:33 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-04 17:42:33 +1100 |
commit | 01ff7a87847a690546c62c7bd5c13823d3bb2d42 (patch) | |
tree | 41dcc362866d3b3fc19122e9f0d893c6aff65f2b /cli/lsp/registries.rs | |
parent | d9b130410b78face988e2fa5c3939e3584bc02f7 (diff) |
fix(lsp): handle repeating patterns in registry correctly (#13275)
Diffstat (limited to 'cli/lsp/registries.rs')
-rw-r--r-- | cli/lsp/registries.rs | 99 |
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] |