diff options
Diffstat (limited to 'cli/lsp/utils.rs')
-rw-r--r-- | cli/lsp/utils.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/cli/lsp/utils.rs b/cli/lsp/utils.rs index 09657a71d..8f4de9c05 100644 --- a/cli/lsp/utils.rs +++ b/cli/lsp/utils.rs @@ -16,6 +16,19 @@ pub fn normalize_file_name(file_name: &str) -> Result<Url, AnyError> { Url::parse(&specifier_str).map_err(|err| err.into()) } +pub fn normalize_specifier( + specifier: &ModuleSpecifier, +) -> Result<Url, AnyError> { + let url = specifier.as_url(); + if url.scheme() == "file" { + Ok(url.clone()) + } else { + let specifier_str = + format!("deno:///{}", url.as_str().replacen("://", "/", 1)); + Url::parse(&specifier_str).map_err(|err| err.into()) + } +} + /// Normalize URLs from the client, where "virtual" `deno:///` URLs are /// converted into proper module specifiers. pub fn normalize_url(url: Url) -> ModuleSpecifier { @@ -41,6 +54,23 @@ mod tests { use super::*; #[test] + fn test_normalize_file_name() { + let fixture = "https://deno.land/x/mod.ts"; + let actual = normalize_file_name(fixture).unwrap(); + let expected = Url::parse("deno:///https/deno.land/x/mod.ts").unwrap(); + assert_eq!(actual, expected); + } + + #[test] + fn test_normalize_specifier() { + let fixture = + ModuleSpecifier::resolve_url("https://deno.land/x/mod.ts").unwrap(); + let actual = normalize_specifier(&fixture).unwrap(); + let expected = Url::parse("deno:///https/deno.land/x/mod.ts").unwrap(); + assert_eq!(actual, expected); + } + + #[test] fn test_normalize_url() { let fixture = Url::parse("deno:///https/deno.land/x/mod.ts").unwrap(); let actual = normalize_url(fixture); |