FIX: lsp: Improve URL encoding

This commit is contained in:
Tobias Hunger 2024-01-12 22:30:00 +01:00 committed by Tobias Hunger
parent e7ff4c196e
commit fe0ac9d6e8
4 changed files with 23 additions and 9 deletions

View file

@ -124,10 +124,7 @@ impl ComponentContainer {
}
pub fn subtree_component(self: Pin<&Self>) -> ItemTreeWeak {
self.item_tree
.borrow()
.as_ref()
.map_or(ItemTreeWeak::default(), |rc| vtable::VRc::downgrade(rc))
self.item_tree.borrow().as_ref().map_or(ItemTreeWeak::default(), vtable::VRc::downgrade)
}
pub fn visit_children_item(

View file

@ -12,7 +12,7 @@ pub type Result<T> = std::result::Result<T, Error>;
pub type UrlVersion = Option<i32>;
/// A versioned file
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
#[derive(Clone, serde::Deserialize, serde::Serialize)]
pub struct VersionedUrl {
/// The file url
pub url: Url,
@ -20,6 +20,13 @@ pub struct VersionedUrl {
pub version: UrlVersion,
}
impl std::fmt::Debug for VersionedUrl {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let version = self.version.map(|v| format!("v{v}")).unwrap_or_else(|| "none".to_string());
write!(f, "{}@{}", self.url, version)
}
}
/// A versioned file
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct Position {

View file

@ -83,14 +83,21 @@ fn create_show_preview_command(
#[cfg(feature = "preview-external")]
pub fn request_state(ctx: &std::rc::Rc<Context>) {
use i_slint_compiler::{diagnostics::Spanned, pathutils::to_url};
use i_slint_compiler::diagnostics::Spanned;
let cache = ctx.document_cache.borrow();
let documents = &cache.documents;
for (p, d) in documents.all_file_documents() {
if let Some(node) = &d.node {
let Some(url) = to_url(&p.to_string_lossy()) else {
if p.starts_with("builtin:/") {
continue; // The preview knows these, too.
}
let Ok(url) = Url::from_file_path(p) else {
i_slint_core::debug_log!(
"Could not sent contents of file {p:?}: NOT AN URL (request state!)"
);
continue;
};
let url = VersionedUrl { url, version: node.source_file().and_then(|sf| sf.version()) };

View file

@ -14,7 +14,6 @@ mod preview;
pub mod util;
use common::{ComponentInformation, PreviewApi, Result, VersionedUrl};
use i_slint_compiler::pathutils::to_url;
use language::*;
use i_slint_compiler::CompilerConfiguration;
@ -341,8 +340,12 @@ fn main_loop(connection: Connection, init_param: InitializeParams, cli_args: Cli
Box::pin(async move {
let contents = std::fs::read_to_string(&path);
if let Ok(contents) = &contents {
if let Some(url) = to_url(&path) {
if let Ok(url) = Url::from_file_path(&path) {
preview_notifier.set_contents(&VersionedUrl { url, version: None }, contents);
} else {
i_slint_core::debug_log!(
"Could not sent contents of file {path:?}: NOT AN URL"
);
}
}
Some(contents)