From 1446d5592c9225254071a96cae8f551d07bc5005 Mon Sep 17 00:00:00 2001 From: Arnaud Ritti <77437157+arnaud-ritti@users.noreply.github.com> Date: Sat, 7 Nov 2026 21:14:27 +0100 Subject: [PATCH] feat(plugins): refresh diagnostics while typing (#2048) Closes #1952 API 1.3 adds a diagnostics provider for unsaved documents: the host sends versioned text for the declared languages after a 300 ms debounce, cancels superseded calls, drops late or stale answers under the editor-provider budget, and clears results with the document, project or plugin. Ranges are UTF-16. Actor panics are contained, queued work is rejected after a host panic, and diagnostics arriving after plugin cleanup are discarded. Verified on macOS with the diagnostics fixture. Co-authored-by: arnaud-ritti <77437157+arnaud-ritti@users.noreply.github.com> --- crates/ide-host/src/lib.rs | 2 + crates/ide-host/src/plugins/diagnostics.rs | 245 ++++++++++++ crates/ide-host/src/plugins/mod.rs | 71 ++++ crates/ide-host/src/plugins/providers.rs | 125 ++++++- crates/ide-host/src/project.rs | 9 + crates/ide-host/tests/plugin_diagnostics.rs | 354 ++++++++++++++++++ crates/ide-plugin/src/actor.rs | 94 ++++- crates/ide-plugin/src/runtime.rs | 29 ++ crates/ide-plugin/src/wit_host.rs | 53 ++- crates/ide-plugin/tests/api_compat.rs | 1 + .../tests/fixtures/commit/dist/plugin.wasm | Bin 97343 -> 97343 bytes .../fixtures/commit/dist/plugin.wasm.sources | 2 +- .../fixtures/detail-views/dist/plugin.wasm | Bin 105781 -> 105781 bytes .../detail-views/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/diagnostics/Cargo.lock | 333 ++++++++++++++++ .../tests/fixtures/diagnostics/Cargo.toml | 24 ++ .../tests/fixtures/diagnostics/README.md | 6 + .../fixtures/diagnostics/dist/plugin.wasm | Bin 0 -> 97692 bytes .../diagnostics/dist/plugin.wasm.sources | 1 + .../tests/fixtures/diagnostics/plugin.toml | 23 ++ .../tests/fixtures/diagnostics/src/lib.rs | 169 +++++++++ .../tests/fixtures/endpoints/dist/plugin.wasm | Bin 78636 -> 78636 bytes .../endpoints/dist/plugin.wasm.sources | 2 +- .../fixtures/file-templates/dist/plugin.wasm | Bin 68048 -> 68048 bytes .../file-templates/dist/plugin.wasm.sources | 2 +- .../fixtures/grouped-views/dist/plugin.wasm | Bin 89154 -> 89160 bytes .../grouped-views/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/hello/dist/plugin.wasm | Bin 141562 -> 141555 bytes .../fixtures/hello/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/hover/dist/plugin.wasm | Bin 86785 -> 86790 bytes .../fixtures/hover/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/indexer/dist/plugin.wasm | Bin 79926 -> 79921 bytes .../fixtures/indexer/dist/plugin.wasm.sources | 2 +- .../fixtures/inlay-hints/dist/plugin.wasm | Bin 88686 -> 88694 bytes .../inlay-hints/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/jobs/dist/plugin.wasm | Bin 147779 -> 147773 bytes .../fixtures/jobs/dist/plugin.wasm.sources | 2 +- .../misbehave/dist/plugin.wasm.sources | 2 +- .../fixtures/path-events/dist/plugin.wasm | Bin 91110 -> 91105 bytes .../path-events/dist/plugin.wasm.sources | 2 +- .../fixtures/semantic-tokens/dist/plugin.wasm | Bin 88860 -> 88868 bytes .../semantic-tokens/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/storage/dist/plugin.wasm | Bin 71114 -> 71114 bytes .../fixtures/storage/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/symbols/dist/plugin.wasm | Bin 103940 -> 103950 bytes .../fixtures/symbols/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/tables/dist/plugin.wasm | Bin 116494 -> 116488 bytes .../fixtures/tables/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/web-log/dist/plugin.wasm | Bin 69007 -> 69075 bytes .../fixtures/web-log/dist/plugin.wasm.sources | 2 +- .../tests/fixtures/web-pty/dist/plugin.wasm | Bin 68026 -> 68022 bytes .../fixtures/web-pty/dist/plugin.wasm.sources | 2 +- plugins/README.md | 50 ++- .../official/ai-completion/dist/plugin.wasm | Bin 169568 -> 169576 bytes .../ai-completion/dist/plugin.wasm.sources | 2 +- plugins/official/checkstyle/dist/plugin.wasm | Bin 166523 -> 166480 bytes .../checkstyle/dist/plugin.wasm.sources | 2 +- plugins/official/csv-editor/dist/plugin.wasm | Bin 130591 -> 130591 bytes .../csv-editor/dist/plugin.wasm.sources | 2 +- plugins/official/git-toolbox/dist/plugin.wasm | Bin 108493 -> 108501 bytes .../git-toolbox/dist/plugin.wasm.sources | 2 +- plugins/official/graphviz/dist/plugin.wasm | Bin 126104 -> 126078 bytes .../graphviz/dist/plugin.wasm.sources | 2 +- .../official/key-promoter/dist/plugin.wasm | Bin 97364 -> 97368 bytes .../key-promoter/dist/plugin.wasm.sources | 2 +- .../official/license-header/dist/plugin.wasm | Bin 150770 -> 150728 bytes .../license-header/dist/plugin.wasm.sources | 2 +- plugins/official/mybatis/dist/plugin.wasm | Bin 166698 -> 166698 bytes .../official/mybatis/dist/plugin.wasm.sources | 2 +- .../official/regex-tester/dist/plugin.wasm | Bin 932819 -> 932228 bytes .../regex-tester/dist/plugin.wasm.sources | 2 +- plugins/official/solidity/dist/plugin.wasm | Bin 105046 -> 105054 bytes .../solidity/dist/plugin.wasm.sources | 2 +- .../official/string-tools/dist/plugin.wasm | Bin 162792 -> 162808 bytes .../string-tools/dist/plugin.wasm.sources | 2 +- sdk/rust/openidea-plugin/README.md | 17 + sdk/rust/openidea-plugin/src/diagnostics.rs | 46 +++ sdk/rust/openidea-plugin/src/host.rs | 71 ++-- sdk/rust/openidea-plugin/src/lib.rs | 40 ++ sdk/rust/openidea-plugin/src/mock.rs | 26 ++ .../tests/diagnostics_exports.rs | 45 +++ sdk/rust/openidea-plugin/wit/diagnostics.wit | 15 + sdk/rust/openidea-plugin/wit/plugin.wit | 11 + .../plugins/__tests__/plugins.test.tsx | 9 + src/features/plugins/bridge.ts | 9 +- wit/diagnostics.wit | 15 + wit/plugin.wit | 11 + 87 files changed, 1858 insertions(+), 104 deletions(-) create mode 100644 crates/ide-host/src/plugins/diagnostics.rs create mode 100644 crates/ide-host/tests/plugin_diagnostics.rs create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/Cargo.lock create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/Cargo.toml create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/README.md create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm.sources create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/plugin.toml create mode 100644 crates/ide-plugin/tests/fixtures/diagnostics/src/lib.rs create mode 100644 sdk/rust/openidea-plugin/src/diagnostics.rs create mode 100644 sdk/rust/openidea-plugin/tests/diagnostics_exports.rs create mode 100644 sdk/rust/openidea-plugin/wit/diagnostics.wit create mode 100644 wit/diagnostics.wit diff --git a/crates/ide-host/src/lib.rs b/crates/ide-host/src/lib.rs index 56147fcf5..2244cd7a4 100644 --- a/crates/ide-host/src/lib.rs +++ b/crates/ide-host/src/lib.rs @@ -223,6 +223,7 @@ impl Host { self.cancel_request(request); } let project = self.projects.write().remove(window)?; + project.plugin_diagnostics.close(); if let Some(plugins) = plugins::editor_plugin_host() { plugins.invalidate_client_navigation(&project.root, Some(window), None); plugins.set_active_file(window, None); @@ -373,6 +374,7 @@ impl Host { self.terminals.kill_all(); let projects: Vec<_> = self.projects.write().drain().map(|(_, p)| p).collect(); for project in &projects { + project.plugin_diagnostics.close(); if let Some(bridge) = &project.kotlin_bridge { bridge.stop(); } diff --git a/crates/ide-host/src/plugins/diagnostics.rs b/crates/ide-host/src/plugins/diagnostics.rs new file mode 100644 index 000000000..14470f56a --- /dev/null +++ b/crates/ide-host/src/plugins/diagnostics.rs @@ -0,0 +1,245 @@ +//! Versioned, project-scoped diagnostics for unsaved editor buffers. +use super::{PluginHost, ProviderKind, editor_plugin_host}; +use ide_core::{CancellationToken, Diagnostic, DocId, IdeEvent, SharedSink}; +use ide_plugin::ProviderDocument; +use ide_text::AppliedChange; +use ide_workspace::documents::DocumentObserver; +use ide_workspace::{DocumentInfo, Documents}; +use parking_lot::Mutex; +use std::collections::{HashMap, HashSet}; +use std::path::Path; +use std::sync::{Arc, Weak}; +use std::time::Duration; + +const DEBOUNCE: Duration = Duration::from_millis(300); + +struct Document { + snapshot: ProviderDocument, + cancel: CancellationToken, + sources: HashSet, +} + +#[derive(Default)] +pub(super) struct State { + closed: bool, + documents: HashMap, + generations: HashMap, +} + +/// One incarnation of one project's documents, shared by all its editors. +pub(crate) struct Diagnostics { + state: Arc>, + sink: SharedSink, + runtime: tokio::runtime::Handle, + documents: Weak, + root: std::path::PathBuf, +} + +impl Diagnostics { + pub fn new( + sink: SharedSink, + runtime: tokio::runtime::Handle, + documents: &Arc, + root: &Path, + ) -> Arc { + Arc::new(Self { + state: Arc::default(), + sink, + runtime, + documents: Arc::downgrade(documents), + root: root.to_path_buf(), + }) + } + + fn emit(&self, path: &Path, plugin: &str, items: Vec) { + self.sink.emit(IdeEvent::Diagnostics { + path: path.to_path_buf().into(), + source: format!("plugin-provider:{plugin}"), + items, + }); + } + + fn clear_document(&self, doc: &Document) { + doc.cancel.cancel(); + for plugin in &doc.sources { + self.emit(&doc.snapshot.path, plugin, Vec::new()); + } + } + + pub fn close(&self) { + let mut state = self.state.lock(); + state.closed = true; + for (_, doc) in state.documents.drain() { + self.clear_document(&doc); + } + } + + fn schedule(&self, id: DocId, state: &mut State) { + let Some(doc) = state.documents.get_mut(&id) else { return }; + doc.cancel.cancel(); + doc.cancel = CancellationToken::new(); + let Some(host) = editor_plugin_host() else { return }; + if host.providers.plugins_for(ProviderKind::Diagnostics, &doc.snapshot.language).is_empty() { + return; + } + // Register only once per project incarnation; no project is retained by the host. + let weak = Arc::downgrade(&self.state); + { + let mut projects = host.diagnostic_projects.lock(); + projects.retain(|(state, _)| state.strong_count() > 0); + if !projects.iter().any(|(state, _)| state.ptr_eq(&weak)) { + projects.push((weak.clone(), self.sink.clone())); + } + } + let root = self.root.clone(); + let (mut snapshot, cancel, sink, documents) = + (doc.snapshot.clone(), doc.cancel.clone(), self.sink.clone(), self.documents.clone()); + let lifecycle_generations = state.generations.clone(); + self.runtime.spawn(async move { + tokio::time::sleep(DEBOUNCE).await; + if cancel.is_cancelled() || weak.strong_count() == 0 { + return; + } + let _ = tokio::task::spawn_blocking(move || { + let Some(documents) = documents.upgrade() else { return }; + let Ok(current) = documents.snapshot(id) else { return }; + if u64::from(current.version) != snapshot.version + || current.path.0 != snapshot.path + || current.language.as_str() != snapshot.language + || cancel.is_cancelled() + { + return; + } + snapshot.text = current.text; + drop(documents); + + let generations = host.providers.diagnostic_generations(&snapshot.language); + let results = if snapshot.text.len() <= super::navigation::MAX_DOCUMENT_BYTES { + host.provide_project_diagnostics(Some(&root), &snapshot, &cancel) + } else { + Vec::new() + }; + let Some(state) = weak.upgrade() else { return }; + let mut state = state.lock(); + if state.closed || cancel.is_cancelled() { + return; + } + let matching: HashSet<_> = host + .diagnostic_plugins(Some(&root), &snapshot.language) + .into_iter() + .map(|p| p.id().to_owned()) + .filter(|p| lifecycle_generations.get(p) == state.generations.get(p)) + .collect(); + let latest = host.providers.diagnostic_generations(&snapshot.language); + let Some(doc) = state.documents.get_mut(&id) else { return }; + if doc.snapshot.version != snapshot.version || doc.snapshot.path != snapshot.path { + return; + } + let mut current = HashSet::new(); + for (plugin, items) in results { + if !matching.contains(&plugin) + || !generations.get(&plugin).is_some_and(|seq| latest.get(&plugin) == Some(seq)) + { + continue; + } + current.insert(plugin.clone()); + sink.emit(IdeEvent::Diagnostics { + path: snapshot.path.clone().into(), + source: format!("plugin-provider:{plugin}"), + items, + }); + } + for plugin in doc.sources.difference(¤t) { + sink.emit(IdeEvent::Diagnostics { + path: snapshot.path.clone().into(), + source: format!("plugin-provider:{plugin}"), + items: Vec::new(), + }); + } + doc.sources = current; + }) + .await; + }); + } +} + +impl DocumentObserver for Diagnostics { + fn opened(&self, info: &DocumentInfo) { + let mut state = self.state.lock(); + if state.closed { + return; + } + if let Some(old) = state.documents.remove(&info.id) { + self.clear_document(&old); + } + if info.large || info.uri.is_some() { + return; + } + state.documents.insert( + info.id, + Document { + snapshot: ProviderDocument { + path: info.path.0.clone(), + language: info.language.to_string(), + version: u64::from(info.version), + text: String::new(), + }, + cancel: CancellationToken::new(), + sources: HashSet::new(), + }, + ); + self.schedule(info.id, &mut state); + } + + fn changed(&self, id: DocId, path: &Path, version: u32, _: &[AppliedChange], _text: &dyn Fn() -> String) { + let mut state = self.state.lock(); + if state.closed { + return; + } + let Some(doc) = state.documents.get_mut(&id) else { return }; + if doc.snapshot.path != path { + self.clear_document(doc); + doc.sources.clear(); + } + doc.snapshot.path = path.to_path_buf(); + doc.snapshot.version = u64::from(version); + self.schedule(id, &mut state); + } + + fn closed(&self, id: DocId, _: &Path) { + if let Some(doc) = self.state.lock().documents.remove(&id) { + self.clear_document(&doc); + } + } +} + +impl Drop for Diagnostics { + fn drop(&mut self) { + self.close(); + } +} + +pub(super) type ProjectState = (Weak>, SharedSink); + +impl PluginHost { + pub(super) fn clear_provider_diagnostics(&self, plugin: &str) { + // Clone before taking a project's state lock (edits register in the other order). + let projects = self.diagnostic_projects.lock().clone(); + for (state, sink) in projects { + if let Some(state) = state.upgrade() { + let mut state = state.lock(); + // A completed answer can still be waiting for another provider. + *state.generations.entry(plugin.to_owned()).or_default() += 1; + for doc in state.documents.values_mut() { + if doc.sources.remove(plugin) { + sink.emit(IdeEvent::Diagnostics { + path: doc.snapshot.path.clone().into(), + source: format!("plugin-provider:{plugin}"), + items: Vec::new(), + }); + } + } + } + } + } +} diff --git a/crates/ide-host/src/plugins/mod.rs b/crates/ide-host/src/plugins/mod.rs index e83aadb03..ad113fd45 100644 --- a/crates/ide-host/src/plugins/mod.rs +++ b/crates/ide-host/src/plugins/mod.rs @@ -17,6 +17,7 @@ mod api; pub mod commit; +pub(crate) mod diagnostics; pub mod endpoints; mod event_paths; mod hover; @@ -327,6 +328,7 @@ pub struct PluginHost { navigation: Mutex, endpoints: Mutex, web_ptys: Mutex>>, + diagnostic_projects: Mutex>, /// Validated UI declarations of installed packages (start-up reuses them). index: Arc, ledger: Mutex, @@ -419,6 +421,7 @@ impl PluginHost { navigation: Mutex::default(), endpoints: Mutex::default(), web_ptys: Mutex::default(), + diagnostic_projects: Mutex::default(), index, plugins: RwLock::default(), state: Mutex::new(state), @@ -1942,6 +1945,7 @@ impl PluginHost { /// whose activation event already fired. fn start(&self, plugin: &Arc) { self.registry.dispose_plugin(plugin.id()); + self.clear_provider_diagnostics(plugin.id()); if plugin.source == PluginSource::Installed && let Some(reason) = self.revoked_reason(plugin.id(), &plugin.manifest().version, plugin.dir()) { @@ -2124,6 +2128,7 @@ impl PluginHost { /// A trap dropped the plugin's instance: restart it on next use after a /// backoff, or stop it for the session after too many crashes in a row. fn crashed(&self, plugin: &LoadedPlugin, error: &str, client: Option<&str>) { + self.clear_provider_diagnostics(plugin.id()); let failures = { let mut meta = plugin.meta.lock(); meta.failures += 1; @@ -2191,6 +2196,7 @@ impl PluginHost { actor.stop(true); } self.registry.dispose_plugin(plugin.id()); + self.clear_provider_diagnostics(plugin.id()); self.shared.clear_plugin(plugin.id(), true); self.queues.lock().retain(|(id, _), _| id != plugin.id()); } @@ -2200,6 +2206,7 @@ impl PluginHost { self.clear_plugin_endpoints(plugin.id()); tracing::warn!(plugin = %plugin.id(), "{error}"); self.registry.dispose_plugin(plugin.id()); + self.clear_provider_diagnostics(plugin.id()); let mut meta = plugin.meta.lock(); meta.status = PluginStatus::Failed; meta.error = Some(error); @@ -2568,6 +2575,70 @@ impl ide_language::ExternalSyntax for PluginSyntax { mod tests { use super::*; + #[test] + fn host_panics_stop_actor_and_reply_on_every_call_path() { + let tmp = tempfile::tempdir().unwrap(); + let host = + PluginHost::new(tmp.path().join("plugins"), Arc::new(|_: Option<&str>, _| {}), Limits::default()).unwrap(); + let fixture = Path::new(env!("CARGO_MANIFEST_DIR")).join("../ide-plugin/tests/fixtures/diagnostics"); + host.install_from_dir(&fixture, &Consent::all()).unwrap(); + let plugin = host.get("test.diagnostics").unwrap(); + for mode in 0..5 { + let (actor, _) = host.ensure_active(&plugin, None).unwrap(); + let cancel = ide_core::CancellationToken::new(); + let next_actor = actor.clone(); + let (queued_tx, queued_rx) = std::sync::mpsc::channel(); + let panic = move |_: &mut Runtime| -> Result<(), CallError> { + let pending = next_actor.submit(None, |_| Ok("must not run")).unwrap(); + queued_tx.send(pending).unwrap(); + panic!("host call panic") + }; + let result = match mode { + 0 => actor.call(None, panic), + 1 => actor.call_cancellable(&cancel, Duration::ZERO, panic), + 2 => actor.call_edit_cancellable(&cancel, Duration::ZERO, Duration::from_secs(5), panic), + _ => { + let (tx, rx) = std::sync::mpsc::channel(); + if mode == 3 { + actor.post(panic, move |result| { + let _ = tx.send(result); + }); + } else { + actor.post( + |_| Ok(()), + move |result| { + let _ = tx.send(result); + panic!("completion callback panic"); + }, + ); + } + rx.recv_timeout(Duration::from_secs(5)).expect("actor must reply") + } + }; + if mode < 4 { + let queued = queued_rx.recv_timeout(Duration::from_secs(5)).unwrap(); + assert!(matches!(queued.wait(), Err(ActorError::Stopped)), "poisoned runtime must not run queued work"); + } + actor.stop(true); + if mode < 4 { + assert!( + matches!(result, Err(ActorError::Call(CallError::Trap(ref message))) if message.contains("host call panic")), + "{result:?}" + ); + } + assert!(!actor.is_alive()); + assert!(!actor.is_busy()); + assert!(matches!(actor.call(None, |_| Ok(())), Err(ActorError::Stopped))); + let crash = actor.take_crash().expect("supervisor must see the panic"); + assert!(crash.contains(if mode == 4 { "completion callback panic" } else { "host call panic" })); + assert!(actor.take_crash().is_none()); + cancel.cancel(); + // Re-enable to reset the supervisor before testing the next call path. + host.set_enabled("test.diagnostics", false).unwrap(); + host.set_enabled("test.diagnostics", true).unwrap(); + } + } + #[test] fn globs() { assert!(glob_match("**/*Mapper.xml", "src/main/UserMapper.xml")); diff --git a/crates/ide-host/src/plugins/providers.rs b/crates/ide-host/src/plugins/providers.rs index ea7ceacd3..ad1d590f9 100644 --- a/crates/ide-host/src/plugins/providers.rs +++ b/crates/ide-host/src/plugins/providers.rs @@ -22,6 +22,7 @@ use ide_extension::{Disposable, ExtensionPoint, Package, Placement, Prepared, UiDecl, decode, validate_item_id}; use parking_lot::RwLock; use serde::{Deserialize, Serialize}; +use std::collections::{HashMap, HashSet}; use std::sync::Arc; use std::sync::atomic::{AtomicU64, Ordering}; @@ -40,6 +41,7 @@ pub enum ProviderKind { SemanticTokens, Hover, InlayHints, + Diagnostics, } #[derive(Clone, Debug, Deserialize)] @@ -73,13 +75,26 @@ impl Providers { /// Plugins providing `kind` for `language`, in declaration order. pub fn plugins_for(&self, kind: ProviderKind, language: &str) -> Vec { - let mut out: Vec = Vec::new(); - for (_, plugin, kinds, languages) in self.items.read().iter() { - if kinds.contains(&kind) && languages.iter().any(|l| l == "*" || l == language) && !out.contains(plugin) { - out.push(plugin.clone()); - } - } - out + self.matching::>(kind, language).into_iter().map(|(plugin, _)| plugin).collect() + } + + /// One coherent declaration snapshot, preserving the first match per plugin. + fn matching>(&self, kind: ProviderKind, language: &str) -> T { + let items = self.items.read(); + let mut seen = HashSet::new(); + items + .iter() + .filter(|(_, plugin, kinds, languages)| { + kinds.contains(&kind) + && languages.iter().any(|l| l == "*" || l == language) + && seen.insert(plugin.as_str()) + }) + .map(|(seq, plugin, ..)| (plugin.clone(), *seq)) + .collect() + } + + pub(super) fn diagnostic_generations(&self, language: &str) -> HashMap { + self.matching(ProviderKind::Diagnostics, language) } /// Whether any plugin provides `kind` (for any language). @@ -118,6 +133,9 @@ impl ExtensionPoint for ProvidersPoint { if d.kinds.contains(&ProviderKind::SemanticTokens) { pkg.manifest.needs_api("contributes.providers: semantic-tokens", 3)?; } + if d.kinds.contains(&ProviderKind::Diagnostics) { + pkg.manifest.needs_api("contributes.providers: diagnostics", 3)?; + } if d.kinds.contains(&ProviderKind::Hover) { pkg.manifest.needs_api("contributes.providers: hover", 3)?; } @@ -202,7 +220,7 @@ pub(crate) fn editor_plugin_host() -> Option> { impl PluginHost { /// Usable plugins declaring `kind` for `language`. - fn provider_plugins(&self, kind: ProviderKind, language: &str) -> Vec> { + pub(super) fn provider_plugins(&self, kind: ProviderKind, language: &str) -> Vec> { self.providers .plugins_for(kind, language) .into_iter() @@ -360,6 +378,59 @@ impl PluginHost { .collect() } + pub fn provide_diagnostics( + &self, + doc: &ProviderDocument, + cancel: &CancellationToken, + ) -> Vec<(String, Vec)> { + self.provide_project_diagnostics(None, doc, cancel) + } + + pub(super) fn diagnostic_plugins( + &self, + project: Option<&std::path::Path>, + language: &str, + ) -> Vec> { + self.provider_plugins(ProviderKind::Diagnostics, language) + .into_iter() + .filter(|p| p.dev_root.is_none() || p.dev_root.as_deref() == project) + .collect() + } + + pub(super) fn provide_project_diagnostics( + &self, + project: Option<&std::path::Path>, + doc: &ProviderDocument, + cancel: &CancellationToken, + ) -> Vec<(String, Vec)> { + std::thread::scope(|scope| { + let calls: Vec<_> = self + .diagnostic_plugins(project, &doc.language) + .into_iter() + .map(|p| { + scope.spawn(move || { + if cancel.is_cancelled() { + return None; + } + let (actor, activated) = self.ensure_active(&p, None).ok()?; + if activated { + self.changed(); + } + let (d, timeout) = (doc.clone(), self.limits.edit_hard); + let started = Instant::now(); + let result = + actor.call_edit_cancellable(cancel, CANCEL_GRACE, self.limits.edit_soft, move |rt| { + rt.provide_diagnostics(&d, timeout) + }); + let items = self.finish_provider_call(&p, &actor, started, result)?; + (!cancel.is_cancelled()).then(|| (p.id().to_owned(), items)) + }) + }) + .collect(); + calls.into_iter().filter_map(|call| call.join().ok().flatten()).collect() + }) + } + pub fn provide_hover(&self, doc: &ProviderDocument, at: ide_core::Pos) -> Vec { let d = Arc::new(doc.clone()); self.edit_calls(ProviderKind::Hover, &doc.language, move |rt, timeout| rt.provide_hover(&d, at, timeout)) @@ -406,3 +477,41 @@ impl PluginHost { None } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn provider_snapshots_preserve_order_first_generation_and_language_matching() { + let providers = Arc::new(Providers::default()); + let declare = |plugin: &str, kind, language: &str| { + providers.add(plugin.into(), Decl { kinds: vec![kind], languages: vec![language.into()] }) + }; + let mut declarations = Vec::new(); + declarations.push(declare("unrelated", ProviderKind::Hover, "*")); + declarations.push(declare("other-language", ProviderKind::Diagnostics, "rust")); + for i in 0..256 { + let plugin = format!("plugin-{i}"); + declarations.push(declare(&plugin, ProviderKind::Diagnostics, "text")); + declarations.push(declare(&plugin, ProviderKind::Diagnostics, "*")); + } + let expected: Vec<_> = (0..256).map(|i| format!("plugin-{i}")).collect(); + assert_eq!(providers.plugins_for(ProviderKind::Diagnostics, "text"), expected); + let before = providers.diagnostic_generations("text"); + assert_eq!(before.len(), 256); + assert_eq!(before["plugin-0"], 2); + assert_eq!(providers.diagnostic_generations("rust").len(), 257); + assert_eq!(providers.plugins_for(ProviderKind::Hover, "text"), ["unrelated"]); + // Removing the first matching declaration must invalidate its generation, + // even while a second declaration still provides the same language. + drop(declarations.remove(2)); + let after = providers.diagnostic_generations("text"); + assert_eq!(after["plugin-0"], 3); + assert_ne!(before["plugin-0"], after["plugin-0"]); + drop(declarations); + assert!(providers.diagnostic_generations("text").is_empty()); + let _reloaded = declare("plugin-0", ProviderKind::Diagnostics, "text"); + assert_ne!(providers.diagnostic_generations("text")["plugin-0"], after["plugin-0"]); + } +} diff --git a/crates/ide-host/src/project.rs b/crates/ide-host/src/project.rs index 92e1485e2..f99b4ff5e 100644 --- a/crates/ide-host/src/project.rs +++ b/crates/ide-host/src/project.rs @@ -27,6 +27,7 @@ pub struct Project { pub languages: Arc, pub settings: Arc, pub documents: Arc, + pub(crate) plugin_diagnostics: Arc, pub history: Arc, /// Undo stack of file move / rename refactorings. pub moves: FileMoves, @@ -519,7 +520,11 @@ impl Host { sink.clone(), ); ide_agent::registry::maintain(crate::ops::agent::registry_paths(self)); + let plugin_diagnostics = + crate::plugins::diagnostics::Diagnostics::new(sink.clone(), self.runtime.clone(), &documents, &root); + documents.add_observer(plugin_diagnostics.clone()); let project = Arc::new(Project { + plugin_diagnostics, trusted, root, sink, @@ -665,7 +670,11 @@ impl Host { self.local_data_dir.join("notebook-runtime").join(uuid::Uuid::new_v4().to_string()), sink.clone(), ); + let plugin_diagnostics = + crate::plugins::diagnostics::Diagnostics::new(sink.clone(), self.runtime.clone(), &documents, &dir); + documents.add_observer(plugin_diagnostics.clone()); let project = Arc::new(Project { + plugin_diagnostics, trusted: Arc::new(AtomicBool::new(false)), sink, languages, diff --git a/crates/ide-host/tests/plugin_diagnostics.rs b/crates/ide-host/tests/plugin_diagnostics.rs new file mode 100644 index 000000000..379296785 --- /dev/null +++ b/crates/ide-host/tests/plugin_diagnostics.rs @@ -0,0 +1,354 @@ +//! Real Wasm provider dispatch and the document-edit path used locally and over RPC. +use ide_core::{CancellationToken, ChangeSet, Diagnostic, IdeEvent, Pos, Range, TextChange}; +use ide_host::plugins::{Consent, HostWorkspace, PluginHost, set_editor_providers}; +use ide_host::{Host, HostConfig, ops}; +use ide_plugin::{Invocation, Limits, ProviderDocument}; +use parking_lot::Mutex; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::time::{Duration, Instant}; + +const ID: &str = "test.diagnostics"; +const SOURCE: &str = "plugin-provider:test.diagnostics"; + +fn fixture() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("../ide-plugin/tests/fixtures/diagnostics") +} + +fn plugins(dir: &Path, limits: Limits) -> Arc { + let host = Arc::new(PluginHost::new(dir.join("plugins"), Arc::new(|_: Option<&str>, _| {}), limits).unwrap()); + host.install_from_dir(&fixture(), &Consent::all()).unwrap(); + host +} + +fn generous() -> Limits { + Limits { edit_soft: Duration::from_secs(5), edit_hard: Duration::from_secs(10), ..Limits::default() } +} + +fn doc(root: &Path, language: &str, text: &str) -> ProviderDocument { + ProviderDocument { path: root.join("a.txt"), language: language.into(), version: 42, text: text.into() } +} + +#[test] +fn declared_languages_receive_versioned_text_and_utf16_ranges() { + let tmp = tempfile::tempdir().unwrap(); + let host = plugins(tmp.path(), generous()); + let result = host.provide_diagnostics(&doc(tmp.path(), "text", "😀BAD\nBAD"), &CancellationToken::new()); + assert_eq!(result.len(), 1); + assert_eq!(result[0].0, ID); + let items = &result[0].1; + assert_eq!(items.len(), 2); + assert_eq!(items[0].range, Range::new(Pos::new(0, 2), Pos::new(0, 5))); + assert_eq!(items[1].range, Range::new(Pos::new(1, 0), Pos::new(1, 3))); + assert_eq!(items[0].message, "BAD in text at version 42"); + assert_eq!(items[0].code.as_deref(), Some("bad-word")); + assert_eq!(items[0].server.as_deref(), Some(ID)); + assert!(host.provide_diagnostics(&doc(tmp.path(), "rust", "BAD"), &CancellationToken::new()).is_empty()); +} + +#[test] +fn provider_diagnostics_have_the_same_bounds_and_tags_as_manual_publish() { + let tmp = tempfile::tempdir().unwrap(); + let host = plugins(tmp.path(), generous()); + let result = host.provide_diagnostics(&doc(tmp.path(), "text", "limits"), &CancellationToken::new()); + let items = &result[0].1; + assert_eq!(items.len(), 5000); + assert_eq!(items[0].message.len(), 4096); + assert_eq!(items[0].source.as_ref().unwrap().len(), 128); + assert_eq!(items[0].code.as_ref().unwrap().len(), 128); + assert!(items[0].unnecessary && items[0].deprecated); +} + +#[test] +fn the_export_does_not_need_project_read_permission() { + let tmp = tempfile::tempdir().unwrap(); + let package = tmp.path().join("no-capability"); + std::fs::create_dir_all(package.join("dist")).unwrap(); + std::fs::copy(fixture().join("dist/plugin.wasm"), package.join("dist/plugin.wasm")).unwrap(); + let manifest = std::fs::read_to_string(fixture().join("plugin.toml")).unwrap(); + std::fs::write(package.join("plugin.toml"), manifest.replace("[capabilities]\nrequired = [\"project.read\"]", "")) + .unwrap(); + let host = PluginHost::new(tmp.path().join("plugins"), Arc::new(|_: Option<&str>, _| {}), generous()).unwrap(); + host.install_from_dir(&package, &Consent::default()).unwrap(); + assert_eq!(host.provide_diagnostics(&doc(tmp.path(), "text", "BAD"), &CancellationToken::new()).len(), 1); + assert!(host.run_command(ID, "publish", Some("/project/a.txt"), Invocation::default()).is_err()); +} + +#[test] +fn diagnostics_is_an_api_1_3_addition() { + let tmp = tempfile::tempdir().unwrap(); + let package = tmp.path().join("old"); + std::fs::create_dir_all(package.join("dist")).unwrap(); + std::fs::copy(fixture().join("dist/plugin.wasm"), package.join("dist/plugin.wasm")).unwrap(); + let manifest = std::fs::read_to_string(fixture().join("plugin.toml")).unwrap(); + std::fs::write(package.join("plugin.toml"), manifest.replace("^1.3", "^1.0")).unwrap(); + let host = PluginHost::new(tmp.path().join("plugins"), Arc::new(|_: Option<&str>, _| {}), generous()).unwrap(); + assert!(host.install_from_dir(&package, &Consent::all()).unwrap_err().message.contains("new in plugin API 1.3")); +} + +#[test] +fn late_and_cancelled_answers_are_dropped_without_disabling_the_plugin() { + let tmp = tempfile::tempdir().unwrap(); + let host = plugins(tmp.path(), Limits { edit_soft: Duration::from_millis(10), ..generous() }); + assert!(host.provide_diagnostics(&doc(tmp.path(), "text", "slow BAD"), &CancellationToken::new()).is_empty()); + let cancel = CancellationToken::new(); + cancel.cancel(); + assert!(host.provide_diagnostics(&doc(tmp.path(), "text", "BAD"), &cancel).is_empty()); + assert_eq!(host.run_command(ID, "calls", None, Invocation::default()).unwrap().as_deref(), Some("1")); +} + +#[test] +fn cancelling_a_queued_provider_does_not_interrupt_another_windows_command() { + let tmp = tempfile::tempdir().unwrap(); + let host = plugins(tmp.path(), generous()); + host.run_command(ID, "calls", None, Invocation::default()).unwrap(); + let waiter = { + let host = host.clone(); + std::thread::spawn(move || host.run_command(ID, "wait", None, Invocation::default())) + }; + std::thread::sleep(Duration::from_millis(50)); + let cancel = CancellationToken::new(); + let canceller = { + let cancel = cancel.clone(); + std::thread::spawn(move || { + std::thread::sleep(Duration::from_millis(30)); + cancel.cancel(); + }) + }; + assert!(host.provide_diagnostics(&doc(tmp.path(), "text", "BAD"), &cancel).is_empty()); + canceller.join().unwrap(); + assert_eq!(waiter.join().unwrap().unwrap().as_deref(), Some("finished")); + assert_eq!(host.run_command(ID, "calls", None, Invocation::default()).unwrap().as_deref(), Some("0")); +} + +#[test] +fn editor_requests_expire_in_the_queue_without_running_after_a_command() { + let tmp = tempfile::tempdir().unwrap(); + let host = plugins(tmp.path(), Limits { edit_soft: Duration::from_millis(10), ..generous() }); + host.run_command(ID, "calls", None, Invocation::default()).unwrap(); + let waiter = { + let host = host.clone(); + std::thread::spawn(move || host.run_command(ID, "wait", None, Invocation::default())) + }; + std::thread::sleep(Duration::from_millis(50)); + assert!(host.provide_diagnostics(&doc(tmp.path(), "text", "BAD"), &CancellationToken::new()).is_empty()); + assert_eq!(waiter.join().unwrap().unwrap().as_deref(), Some("finished")); + assert_eq!(host.run_command(ID, "calls", None, Invocation::default()).unwrap().as_deref(), Some("0")); + assert_eq!(host.info_of(ID).unwrap().stats.slow_calls, 1); +} + +#[test] +fn typing_on_cancels_a_running_provider_before_its_hard_deadline() { + let tmp = tempfile::tempdir().unwrap(); + let host = plugins(tmp.path(), Limits { fuel: u64::MAX, ..generous() }); + host.run_command(ID, "calls", None, Invocation::default()).unwrap(); + let cancel = CancellationToken::new(); + let canceller = { + let cancel = cancel.clone(); + std::thread::spawn(move || { + std::thread::sleep(Duration::from_millis(30)); + cancel.cancel(); + }) + }; + let started = Instant::now(); + assert!(host.provide_diagnostics(&doc(tmp.path(), "text", "spin BAD"), &cancel).is_empty()); + assert!(started.elapsed() < Duration::from_secs(2)); + canceller.join().unwrap(); +} + +// This executable has one edit-path test because editor providers are installed once per process. +type Events = Arc>>; + +fn runtime_host(base: &Path, events: Events) -> Arc { + Arc::new(Host::new(HostConfig { + config_dir: base.join("config"), + data_dir: base.join("data"), + local_data_dir: base.join("data"), + languages: Arc::new(ide_language::LanguageRegistry::load(None).unwrap()), + syntax: Arc::default(), + sink_for: Box::new(move |window| { + let (events, window) = (events.clone(), window.to_owned()); + Arc::new(move |event: IdeEvent| events.lock().push((window.clone(), event))) + }), + owner: |w| w, + runtime: tokio::runtime::Handle::current(), + project_environment: false, + })) +} + +fn latest(events: &Events, window: &str, source: &str) -> Option> { + events.lock().iter().rev().find_map(|(w, e)| match e { + IdeEvent::Diagnostics { source: s, items, .. } if w == window && s == source => Some(items.clone()), + _ => None, + }) +} + +async fn wait_for(events: &Events, window: &str, predicate: impl Fn(&[Diagnostic]) -> bool) { + wait_for_source(events, window, SOURCE, predicate).await; +} + +async fn wait_for_source(events: &Events, window: &str, source: &str, predicate: impl Fn(&[Diagnostic]) -> bool) { + let start = Instant::now(); + loop { + if latest(events, window, source).is_some_and(|items| predicate(&items)) { + return; + } + assert!(start.elapsed() < Duration::from_secs(5), "missing diagnostics for {window}"); + tokio::time::sleep(Duration::from_millis(10)).await; + } +} + +fn replace(host: &Host, window: &str, info: &ide_workspace::DocumentInfo, text: &str) -> u32 { + let project = host.project(window).unwrap(); + let snapshot = project.documents.snapshot(info.id).unwrap(); + let len = snapshot.text.encode_utf16().count() as u32; + ops::doc::edit( + host, + window, + info.id, + snapshot.version, + ChangeSet { changes: vec![TextChange { from: 0, to: len, insert: text.into() }] }, + ) + .unwrap() +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn typing_is_debounced_versioned_and_scoped_to_document_project_and_window_lifetimes() { + let tmp = tempfile::tempdir().unwrap(); + let root = dunce::canonicalize(tmp.path()).unwrap(); + let path = root.join("a.txt"); + std::fs::write(&path, "clean").unwrap(); + let events: Events = Arc::default(); + let host = runtime_host(&root.join("app"), events.clone()); + let plugins = plugins(&root, generous()); + plugins.set_workspace(Some(Arc::new(HostWorkspace(Arc::downgrade(&host))))); + set_editor_providers(Some(&plugins)); + let left = host.open_light("left", &path).unwrap(); + host.open_light("right", &path).unwrap(); + let a = ops::doc::open(&host, "left", path.clone()).await.unwrap(); + let b = ops::doc::open(&host, "right", path.clone()).await.unwrap(); + let second_tab = ops::doc::open(&host, "right", path.clone()).await.unwrap(); + assert_eq!(b.id, second_tab.id); + wait_for(&events, "left", |items| items.is_empty()).await; + wait_for(&events, "right", |items| items.is_empty()).await; + + let calls: u64 = plugins.run_command(ID, "calls", None, Invocation::default()).unwrap().unwrap().parse().unwrap(); + events.lock().clear(); + replace(&host, "left", &a, "BAD"); + tokio::time::sleep(Duration::from_millis(100)).await; + let version = replace(&host, "left", &a, "😀BAD"); + tokio::time::sleep(Duration::from_millis(150)).await; + assert!(latest(&events, "left", SOURCE).is_none(), "300ms after the latest edit"); + wait_for(&events, "left", |items| !items.is_empty()).await; + assert_eq!( + latest(&events, "left", SOURCE).unwrap()[0].message, + format!("BAD in {} at version {version}", a.language) + ); + assert!(latest(&events, "right", SOURCE).is_none(), "other window has its own buffer"); + assert_eq!(std::fs::read_to_string(&path).unwrap(), "clean", "no save required"); + let after: u64 = plugins.run_command(ID, "calls", None, Invocation::default()).unwrap().unwrap().parse().unwrap(); + assert_eq!(after, calls + 1, "the edit burst was coalesced"); + + plugins.run_command(ID, "publish", path.to_str(), Invocation::default()).unwrap(); + let manual_window = events.lock().iter().find_map(|(window, event)| matches!(event, IdeEvent::Diagnostics { source, items, .. } if source == "plugin:test.diagnostics" && !items.is_empty()).then(|| window.clone())).unwrap(); + assert_eq!(latest(&events, &manual_window, "plugin:test.diagnostics").unwrap()[0].message, "Manual problem"); + replace(&host, "left", &a, "clean again"); + wait_for(&events, "left", |items| items.is_empty()).await; + assert_eq!(latest(&events, &manual_window, "plugin:test.diagnostics").unwrap()[0].message, "Manual problem"); + + events.lock().clear(); + replace(&host, "left", &a, "slow BAD"); + tokio::time::sleep(Duration::from_millis(350)).await; + replace(&host, "left", &a, "latest clean"); + wait_for(&events, "left", |items| items.is_empty()).await; + assert!( + !events.lock().iter().any(|(_, e)| matches!(e, IdeEvent::Diagnostics { items, .. } if !items.is_empty())), + "superseded in-flight answers never publish" + ); + + replace(&host, "right", &b, "BAD right"); + wait_for(&events, "right", |items| !items.is_empty()).await; + ops::doc::close(&host, "right", b.id).unwrap(); + assert!(!latest(&events, "right", SOURCE).unwrap().is_empty(), "another pane still owns this document"); + ops::doc::close(&host, "right", second_tab.id).unwrap(); + wait_for(&events, "right", |items| items.is_empty()).await; + replace(&host, "left", &a, "BAD left"); + wait_for(&events, "left", |items| !items.is_empty()).await; + plugins.set_enabled(ID, false).unwrap(); + wait_for(&events, "left", |items| items.is_empty()).await; + plugins.set_enabled(ID, true).unwrap(); + + events.lock().clear(); + replace(&host, "left", &a, "slow BAD closing"); + tokio::time::sleep(Duration::from_millis(350)).await; + host.close_project("left"); + // Keep the old Project alive deliberately: window reuse must still cancel it. + assert_eq!(left.documents.snapshot(a.id).unwrap().text, "slow BAD closing"); + host.open_light("left", &path).unwrap(); + let reopened = ops::doc::open(&host, "left", path.clone()).await.unwrap(); + wait_for(&events, "left", |items| items.is_empty()).await; + assert!(!events.lock().iter().any(|(_, e)| matches!(e, IdeEvent::Diagnostics { items, .. } if !items.is_empty()))); + // Project plugins receive only snapshots from the project that owns their declaration. + let project_package = root.join(ide_host::plugins::DEV_PLUGINS_DIR).join("diagnostics"); + std::fs::create_dir_all(project_package.join("dist")).unwrap(); + std::fs::copy(fixture().join("dist/plugin.wasm"), project_package.join("dist/plugin.wasm")).unwrap(); + let manifest = std::fs::read_to_string(fixture().join("plugin.toml")).unwrap(); + std::fs::write(project_package.join("plugin.toml"), manifest.replace(ID, "project.diagnostics")).unwrap(); + plugins.set_project_policy(Arc::new(|_| true)); + plugins.sync_project(&root); + plugins.grant("project.diagnostics", &Consent::all()).unwrap(); + replace(&host, "left", &reopened, "BAD in project"); + wait_for(&events, "left", |items| !items.is_empty()).await; + let project_source = "plugin-provider:project.diagnostics"; + wait_for_source(&events, "left", project_source, |items| !items.is_empty()).await; + let elsewhere = root.join("other"); + std::fs::create_dir_all(&elsewhere).unwrap(); + let other_path = elsewhere.join("other.txt"); + std::fs::write(&other_path, "BAD outside").unwrap(); + host.open_light("elsewhere", &other_path).unwrap(); + ops::doc::open(&host, "elsewhere", other_path).await.unwrap(); + wait_for(&events, "elsewhere", |items| !items.is_empty()).await; + assert!(latest(&events, "elsewhere", project_source).is_none()); + plugins.restrict_project(&root); + assert!(latest(&events, "left", project_source).unwrap().is_empty()); + // A completed answer may still be waiting for a sibling when its plugin crashes. + let sibling = root.join("slow-sibling"); + std::fs::create_dir_all(sibling.join("dist")).unwrap(); + std::fs::copy(fixture().join("dist/plugin.wasm"), sibling.join("dist/plugin.wasm")).unwrap(); + let manifest = std::fs::read_to_string(fixture().join("plugin.toml")).unwrap(); + std::fs::write( + sibling.join("plugin.toml"), + manifest.replace(ID, "test.slow").replace("[\"text\", \"plaintext\"]", "[\"plaintext\"]"), + ) + .unwrap(); + plugins.install_from_dir(&sibling, &Consent::all()).unwrap(); + plugins.run_command("test.slow", "calls", None, Invocation::default()).unwrap(); + let calls = plugins.run_command(ID, "calls", None, Invocation::default()).unwrap(); + events.lock().clear(); + replace(&host, "left", &reopened, "BAD completed before crash"); + tokio::time::sleep(Duration::from_millis(200)).await; + let waiter = { + let plugins = plugins.clone(); + std::thread::spawn(move || plugins.run_command("test.slow", "wait", None, Invocation::default())) + }; + let started = Instant::now(); + while plugins.run_command(ID, "calls", None, Invocation::default()).unwrap() == calls { + assert!(started.elapsed() < Duration::from_secs(5)); + tokio::time::sleep(Duration::from_millis(5)).await; + } + assert!( + latest(&events, "left", SOURCE).is_none_or(|items| items.is_empty()), + "the sibling still holds the result: {:?}", + latest(&events, "left", SOURCE) + ); + assert!(plugins.provide_diagnostics(&doc(&root, "text", "panic"), &CancellationToken::new()).is_empty()); + waiter.join().unwrap().unwrap(); + wait_for_source(&events, "left", "plugin-provider:test.slow", |items| !items.is_empty()).await; + assert!( + latest(&events, "left", SOURCE).is_none_or(|items| items.is_empty()), + "a crash invalidates completed answers" + ); + ops::doc::close(&host, "left", reopened.id).unwrap(); + host.shutdown().await; + set_editor_providers(None); +} diff --git a/crates/ide-plugin/src/actor.rs b/crates/ide-plugin/src/actor.rs index e95a7e0bb..fc678f125 100644 --- a/crates/ide-plugin/src/actor.rs +++ b/crates/ide-plugin/src/actor.rs @@ -13,6 +13,7 @@ //! idle reclaim ends it. use crate::runtime::{CallCancel, CallError, Runtime}; +use std::panic::{AssertUnwindSafe, catch_unwind}; use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; use std::sync::{Arc, Mutex, mpsc}; use std::thread::JoinHandle; @@ -20,6 +21,17 @@ use std::time::{Duration, Instant}; type Job = Box) + Send>; +fn catch_call(f: impl FnOnce() -> Result) -> Result { + catch_unwind(AssertUnwindSafe(f)).unwrap_or_else(|panic| { + let message = panic + .downcast_ref::() + .map(String::as_str) + .or_else(|| panic.downcast_ref::<&str>().copied()) + .unwrap_or("unknown panic"); + Err(CallError::Trap(format!("plugin actor panicked: {message}"))) + }) +} + /// Why an [`Actor::call`] produced no result. #[derive(Debug)] pub enum ActorError { @@ -85,15 +97,24 @@ impl Actor { let cancel = runtime.cancel_handle(); let alive = Arc::new(AtomicBool::new(true)); let busy = Arc::new(AtomicBool::new(false)); + let crash = Arc::new(Mutex::new(None)); let last_used = Arc::new(AtomicU64::new(0)); let epoch = Instant::now(); let thread = { - let (alive, busy, last_used) = (alive.clone(), busy.clone(), last_used.clone()); + let (alive, busy, last_used, crash) = (alive.clone(), busy.clone(), last_used.clone(), crash.clone()); std::thread::Builder::new().name(format!("plugin:{name}")).spawn(move || { let mut slot = Some(runtime); while let Ok(job) = rx.recv() { busy.store(true, Ordering::Release); - job(&mut slot); + // A completion callback may panic too; never leave a dead thread marked alive. + if let Err(CallError::Trap(error)) = catch_call(|| { + job(&mut slot); + Ok(()) + }) { + *crash.lock().unwrap_or_else(|e| e.into_inner()) = Some(error); + alive.store(false, Ordering::Release); + slot = None; + } last_used.store(epoch.elapsed().as_millis() as u64, Ordering::Release); busy.store(false, Ordering::Release); if slot.is_none() { @@ -113,7 +134,7 @@ impl Actor { thread: Mutex::new(Some(thread)), cancel, alive, - crash: Arc::default(), + crash, busy, last_used, epoch, @@ -148,7 +169,7 @@ impl Actor { return; } let Some(rt) = slot.as_mut() else { return }; - let outcome = f(rt); + let outcome = catch_call(|| f(rt)); if let Err(CallError::Trap(e)) = &outcome { *crash.lock().unwrap_or_else(|e| e.into_inner()) = Some(e.clone()); // Before the reply: the caller sees the actor dead. @@ -174,21 +195,59 @@ impl Actor { cancel: &ide_core::CancellationToken, grace: Duration, f: impl FnOnce(&mut Runtime) -> Result + Send + 'static, + ) -> Result { + self.call_cancellable_before(cancel, grace, None, f) + } + + /// A cancellable editor call: queued work expires after `soft`, and a + /// successful answer produced later is dropped. Running work still has + /// its runtime hard deadline and can be cancelled by further typing. + pub fn call_edit_cancellable( + &self, + cancel: &ide_core::CancellationToken, + grace: Duration, + soft: Duration, + f: impl FnOnce(&mut Runtime) -> Result + Send + 'static, + ) -> Result { + self.call_cancellable_before(cancel, grace, Some(Instant::now() + soft), f) + } + + fn call_cancellable_before( + &self, + cancel: &ide_core::CancellationToken, + grace: Duration, + deadline: Option, + f: impl FnOnce(&mut Runtime) -> Result + Send + 'static, ) -> Result { let (reply, result) = mpsc::sync_channel(1); let (crash, alive) = (self.crash.clone(), self.alive.clone()); let skip = cancel.clone(); + let running = Arc::new(Mutex::new(false)); + let in_job = running.clone(); let job: Job = Box::new(move |slot| { - if skip.is_cancelled() { - return; - } let Some(rt) = slot.as_mut() else { return }; - let outcome = f(rt); + { + let mut running = in_job.lock().unwrap_or_else(|e| e.into_inner()); + if skip.is_cancelled() { + return; + } + if deadline.is_some_and(|t| Instant::now() >= t) { + let _ = reply.send(Err(ActorError::SoftTimeout)); + return; + } + *running = true; + } + let outcome = catch_call(|| f(rt)); + *in_job.lock().unwrap_or_else(|e| e.into_inner()) = false; if let Err(CallError::Trap(e)) = &outcome { *crash.lock().unwrap_or_else(|e| e.into_inner()) = Some(e.clone()); alive.store(false, Ordering::Release); *slot = None; } + let outcome = match outcome { + Ok(_) if deadline.is_some_and(|t| Instant::now() > t) => Err(ActorError::SoftTimeout), + other => other.map_err(ActorError::Call), + }; let _ = reply.send(outcome); }); { @@ -203,25 +262,34 @@ impl Actor { drop(outcome); return Err(ActorError::Cancelled); } - Ok(outcome) => return outcome.map_err(ActorError::Call), + Ok(outcome) => return outcome, Err(mpsc::RecvTimeoutError::Disconnected) => { return Err(if cancel.is_cancelled() { ActorError::Cancelled } else { ActorError::Stopped }); } Err(mpsc::RecvTimeoutError::Timeout) => {} } if !cancel.is_cancelled() { + if deadline.is_some_and(|t| Instant::now() >= t) && !*running.lock().unwrap_or_else(|e| e.into_inner()) + { + return Err(ActorError::SoftTimeout); + } continue; } match cancelled_at { None => { cancelled_at = Some(Instant::now()); - if self.is_busy() { - self.cancel.cancel_soft(); + let running = running.lock().unwrap_or_else(|e| e.into_inner()); + if !*running { + return Err(ActorError::Cancelled); } + self.cancel.cancel_soft(); } Some(at) if at.elapsed() >= grace => { // Did not return in time: interrupt it (the instance is rebuilt). - self.cancel(); + let running = running.lock().unwrap_or_else(|e| e.into_inner()); + if *running { + self.cancel(); + } return Err(ActorError::Cancelled); } Some(_) => {} @@ -239,7 +307,7 @@ impl Actor { let (crash, alive) = (self.crash.clone(), self.alive.clone()); let job: Job = Box::new(move |slot| { let Some(rt) = slot.as_mut() else { return done(Err(ActorError::Stopped)) }; - let outcome = f(rt); + let outcome = catch_call(|| f(rt)); if let Err(CallError::Trap(e)) = &outcome { *crash.lock().unwrap_or_else(|e| e.into_inner()) = Some(e.clone()); alive.store(false, Ordering::Release); diff --git a/crates/ide-plugin/src/runtime.rs b/crates/ide-plugin/src/runtime.rs index 8c075a7c8..763913116 100644 --- a/crates/ide-plugin/src/runtime.rs +++ b/crates/ide-plugin/src/runtime.rs @@ -632,6 +632,7 @@ struct Exports { views: Option, semantic: Option, details: Option, + diagnostics: Option, hover: Option, commit_checks: Option, inlay: Option, @@ -719,6 +720,8 @@ impl Runtime { let view_indices = wit_view::GuestIndices::new(&pre).ok(); let semantic_indices = wit_sem::GuestIndices::new(&pre).ok(); let detail_indices = wit_detail::GuestIndices::new(&pre).ok(); + use crate::wit_host::diagnostics_bindings::exports::openidea::plugin::diagnostics_provider as wit_diag; + let diagnostics_indices = wit_diag::GuestIndices::new(&pre).ok(); let hover_indices = wit_hover::GuestIndices::new(&pre).ok(); let commit_check_indices = wit_cc::GuestIndices::new(&pre).ok(); let inlay_indices = wit_inlay::GuestIndices::new(&pre).ok(); @@ -753,6 +756,10 @@ impl Runtime { Some(indices) => Some(indices.load(&mut store, &instance).map_err(api_hint)?), None => None, }; + let diagnostics = match diagnostics_indices { + Some(i) => Some(i.load(&mut store, &instance).map_err(api_hint)?), + None => None, + }; let hover = match hover_indices { Some(indices) => Some(indices.load(&mut store, &instance).map_err(api_hint)?), None => None, @@ -779,6 +786,7 @@ impl Runtime { indexer, semantic, details, + diagnostics, hover, commit_checks, inlay, @@ -1075,6 +1083,27 @@ impl Runtime { .collect()) } + pub fn provide_diagnostics( + &mut self, + doc: &ProviderDocument, + timeout: Duration, + ) -> Result, CallError> { + use crate::wit_host::diagnostics_bindings::exports::openidea::plugin::diagnostics_provider as w; + if self.exports.diagnostics.is_none() { + return Err(CallError::missing_export("diagnostics-provider")); + } + let d = w::Document { + path: to_ipc(&doc.path), + language: doc.language.clone(), + version: doc.version, + text: doc.text.clone(), + }; + let items = self.call(Invocation::default(), timeout, |e, store| { + e.diagnostics.as_ref().expect("checked").call_diagnostics(store, &d) + })?; + Ok(crate::wit_host::diagnostics_from_wit(items, &self.store.data().plugin_id)) + } + pub fn provide_hover( &mut self, doc: &ProviderDocument, diff --git a/crates/ide-plugin/src/wit_host.rs b/crates/ide-plugin/src/wit_host.rs index a0f080273..10370a481 100644 --- a/crates/ide-plugin/src/wit_host.rs +++ b/crates/ide-plugin/src/wit_host.rs @@ -922,26 +922,7 @@ impl diagnostics::Host for StoreData { if let Err(e) = self.require(Capability::ProjectRead) { return Ok(Err(e)); } - let source = self.plugin_id.clone(); - let items = items - .into_iter() - .take(MAX_DIAGNOSTICS) - .map(|d| ide_core::Diagnostic { - range: ide_core::Range::new(pos(d.range.start), pos(d.range.end)), - severity: match d.severity { - diagnostics::Severity::Error => ide_core::Severity::Error, - diagnostics::Severity::Warning => ide_core::Severity::Warning, - diagnostics::Severity::Info => ide_core::Severity::Info, - diagnostics::Severity::Hint => ide_core::Severity::Hint, - }, - message: clip(d.message, 4096), - source: Some(d.source.map_or_else(|| source.clone(), |s| clip(s, 128))), - code: d.code.map(|c| clip(c, 128)), - unnecessary: d.tags.iter().any(|t| t == "unnecessary"), - deprecated: d.tags.iter().any(|t| t == "deprecated"), - server: Some(source.clone()), - }) - .collect(); + let items = diagnostics_from_wit(items, &self.plugin_id); Ok(self.host.publish_diagnostics(Path::new(&path), items).map_err(to_wit)) } } @@ -1397,3 +1378,35 @@ mod project_ui_tests { assert!(validate_ui_path(&format!("/{}", "x".repeat(8192))).is_err()); } } + +pub(crate) mod diagnostics_bindings { + wasmtime::component::bindgen!({ + world: "editor-diagnostics", path: "../../wit", + with: { + "openidea:plugin/types": super::bindings::openidea::plugin::types, + "openidea:plugin/diagnostics": super::bindings::openidea::plugin::diagnostics, + }, + }); +} + +pub(crate) fn diagnostics_from_wit(items: Vec, source: &str) -> Vec { + items + .into_iter() + .take(MAX_DIAGNOSTICS) + .map(|d| ide_core::Diagnostic { + range: ide_core::Range::new(pos(d.range.start), pos(d.range.end)), + severity: match d.severity { + diagnostics::Severity::Error => ide_core::Severity::Error, + diagnostics::Severity::Warning => ide_core::Severity::Warning, + diagnostics::Severity::Info => ide_core::Severity::Info, + diagnostics::Severity::Hint => ide_core::Severity::Hint, + }, + message: clip(d.message, 4096), + source: Some(d.source.map_or_else(|| source.to_owned(), |s| clip(s, 128))), + code: d.code.map(|c| clip(c, 128)), + unnecessary: d.tags.iter().any(|t| t == "unnecessary"), + deprecated: d.tags.iter().any(|t| t == "deprecated"), + server: Some(source.to_owned()), + }) + .collect() +} diff --git a/crates/ide-plugin/tests/api_compat.rs b/crates/ide-plugin/tests/api_compat.rs index 9f27c96a1..7926dae3f 100644 --- a/crates/ide-plugin/tests/api_compat.rs +++ b/crates/ide-plugin/tests/api_compat.rs @@ -30,6 +30,7 @@ fn components() -> Vec { repo().join("crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm"), repo().join("crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm"), repo().join("crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm"), + repo().join("crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm"), repo().join("crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm"), repo().join("crates/ide-plugin/tests/fixtures/symbols/dist/plugin.wasm"), ]; diff --git a/crates/ide-plugin/tests/fixtures/commit/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/commit/dist/plugin.wasm index 5b8ede3d68966f96333b81be5843b045eee5dad6..bc98cc38dbd1638cbbebc5353fe75ec806104876 100644 GIT binary patch delta 864 zcmbV|T}abW7{<^0|8M#qo4WD?KTtP^_%Y}FTvlqVVmU1|F+-eQ6iAH}q_T{xK_p3C z^=g~556G4uSu>9$1fgY^Xo43~)J4t|LL7CYG;wLi(S_c4(Yg4&JkNX1!^0W&h=)Dm zeoat>OaLK32oyL$5V*}F<#_<$01ZJY{=kgDT>@-SDBFs~@>ZB;#Zn0R1!cT7lGh^Z=yu>VDp!S60J5~@U ziMQ`zTSd%O7h+xV;7-MI)dx6qrz&tUO&QqbD?;=l{RokJ@N^*ZxEvKX1Rg6SIVX?Ttk+7|XRWoc~~oouFxF>wvY61U542f#0iYY#_EbPOJ&{ue(1X2uD zx4b?Lt8$X5ZeJ%4ee`SIr~q^L&`=9=RCc5W;02y9_`$47V+lN?eMS!tFRA0$I6yD0 zE4E6hq%t007PY20aM4mzB5*vx%T;5Lgd2}S(ODgW`PG$vBBCJDa;$F&qqEgDJba^u zQ_EsD_Me&J;XRd{yCZ=aymzq#+-R{y3^e@lhgMu~I_%SV)N<{01m_*cjiy83rWV@@ zzzl7$mjig|R7W8|D-C~8d`rIcwsckdX0fPw?RM?TLdVacOYxASveE)jXm~=%w7;Cl k*nGkfqS~VGGOgUATdm##a9X>Ja8=A!q;Dvt5P~!Q0+6^!TmS$7 delta 907 zcmbVHYe26NYQMyS{aqZ)C3j*gEwG}vG9x39&~ow2x6^x z>m0U3#8{mf3q$(13l^(8PDFJ8BAl*Jf)j1weFB;dRnU$T1{L1atMIcSQ_vD3F2OVG zh^P~OYcw`ui(c*Ra3^O>B9oKhT{vvK5YV+LIbS=ij73FMgn#0eh)HDOU(oo2Z6J8B zL>dM3k7^a1hoZ)CTA!e9-#k@V0tvtV=ZIh16b%->9V5dQBgFg;sLJvJ3a}J;vI}c|{d)+py$$+^rAvF3(D+?WTHg1H2Iee6O z9pmJa6KPwa5JdRp#y;2g_IR2_U2`kjv^c`S^mfF(+Ty(0%4A4Lo4^!{(0fSfHTpk>& zsSf2omTB+5AGmPrIj}KE6cLrG3Thd10%9DBZ?y@7if7;&eVK|tOCs& z1zJ80jB7UUUDdPO%06 DCh)G{ delta 402 zcmdnGi*4&Jwhehwk`rHboqh4Fd%I|>0<$JFhtt`u?N?u1`*omkbGwuf6CUYJGS`^# zNH0`a%OsC#xCFxR`qq{JUdG9c(n_2Am1SA*m~&L!fe~4n5yg>{3$(l^XKKDfR)OY? z0xh2g#uc0QuIk}r+%ef}O911A&9k?NaWMXv{QjB?&Dj6XJ?xxFG+Kyd4#PBZ;H(X+P}c5Qpr*tosLlQBh1 zv6+d1L79Pp;Sieu0}qfc1o9P;_{G~f6BxxAr>i6~R&WBv8G!N(0^1iRGET7u01>pZ A3IG5A diff --git a/crates/ide-plugin/tests/fixtures/detail-views/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/detail-views/dist/plugin.wasm.sources index dc9bf4212..81b1b8dba 100644 --- a/crates/ide-plugin/tests/fixtures/detail-views/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/detail-views/dist/plugin.wasm.sources @@ -1 +1 @@ -41cf712d387210fea3e102f3f590b05c69b56814b742504a40c53f160874e926 +833c378fabd0c3ec71e5c372e51049cb4fcd8d58e4992199eaf6090b3c1235d8 diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/Cargo.lock b/crates/ide-plugin/tests/fixtures/diagnostics/Cargo.lock new file mode 100644 index 000000000..0e18d38a4 --- /dev/null +++ b/crates/ide-plugin/tests/fixtures/diagnostics/Cargo.lock @@ -0,0 +1,333 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "log" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" + +[[package]] +name = "macro-string" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7b3a5bbb2f63aaa223a671ea1bd0e7bc16bd30ce387324cf63995deaddbbd2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "openidea-plugin" +version = "0.1.0" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "openidea-test-diagnostics" +version = "0.1.0" +dependencies = [ + "openidea-plugin", +] + +[[package]] +name = "prettyplease" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfe0f4c752e450fc2faf62654f1c134747922825d5b04ca717b8874f41a40c0" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "wasm-encoder" +version = "0.262.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4495a6f85dd94c411c749303efcbc5defade0b0cbdbc0541495241ab917a9b5a" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.262.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86ff6668190d9fb70372b306b4f9fe8930f0e2f57ce72e4922bf2f117900949" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.262.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "974d643b125b272607e2fff8012ea14a8328acd7621e4bafa7afb32500052b1b" +dependencies = [ + "bitflags", + "hashbrown", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b85a987ab61d365382d25c7d47e26edd48941b3bf6e3fbf76eff918bc71dab06" +dependencies = [ + "bitflags", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e122e390603abfacd548027016cd0113a6e2bf2f8ce6bdd3658b013456ea8" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84e26e13b9d972026778d2ffb7985736de116026fdc8d9464f966e12df2eb240" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a008a0d6b4840677326beb4edbeb210a2f1b7d0183fb7cc33f466b90fd7fb6" +dependencies = [ + "anyhow", + "macro-string", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.262.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078def49fdb49cab405c3006e05793b3fdaf7069126ba6b9c97d01ec8c98fe4c" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.262.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00f0dc051466ffe46787721fca3d088536f158ae400be044f1b1c386ba9397ad" +dependencies = [ + "anyhow", + "hashbrown", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-ident", + "wasmparser", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/Cargo.toml b/crates/ide-plugin/tests/fixtures/diagnostics/Cargo.toml new file mode 100644 index 000000000..3a1db6261 --- /dev/null +++ b/crates/ide-plugin/tests/fixtures/diagnostics/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "openidea-test-diagnostics" +version = "0.1.0" +edition = "2024" +publish = false + +[workspace] + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +diagnostics-first = [] +diagnostics-last = [] + +[dependencies] +openidea-plugin = { path = "../../../../../sdk/rust/openidea-plugin" } + +[profile.release] +opt-level = "s" +lto = true +strip = true +codegen-units = 1 +panic = "abort" diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/README.md b/crates/ide-plugin/tests/fixtures/diagnostics/README.md new file mode 100644 index 000000000..0b0214013 --- /dev/null +++ b/crates/ide-plugin/tests/fixtures/diagnostics/README.md @@ -0,0 +1,6 @@ +# Diagnostics provider fixture + +Build with `plugins/build.sh crates/ide-plugin/tests/fixtures/diagnostics`. +Used by `cargo test -p ide-host --test plugin_diagnostics` for real Wasm dispatch, +UTF-16 ranges, debouncing, cancellation, window/project lifecycle and coexistence +with manually published diagnostics. Not a marketplace plugin. diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7473062ba5d7eefaf1acd1afcaf4a3d0119fb08b GIT binary patch literal 97692 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

74gRTEm&xA%(Jm$S2Ud}n;#o4e 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 literal 0 HcmV?d00001 diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm.sources new file mode 100644 index 000000000..703a871f7 --- /dev/null +++ b/crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm.sources @@ -0,0 +1 @@ +f757407f530839b8c43697e310926c5b141231bd8f2781ac92eee3a9de3f0f30 diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/plugin.toml b/crates/ide-plugin/tests/fixtures/diagnostics/plugin.toml new file mode 100644 index 000000000..e2c6cb522 --- /dev/null +++ b/crates/ide-plugin/tests/fixtures/diagnostics/plugin.toml @@ -0,0 +1,23 @@ +id = "test.diagnostics" +name = "Diagnostics fixture" +version = "0.1.0" +engines.openidea = "^1.3" +wasm = "dist/plugin.wasm" +[capabilities] +required = ["project.read"] + +[[contributes.providers]] +kinds = ["diagnostics"] +languages = ["text", "plaintext"] + +[[contributes.commands]] +id = "publish" +title = "Publish fixture diagnostic" + +[[contributes.commands]] +id = "calls" +title = "Diagnostics fixture call count" + +[[contributes.commands]] +id = "wait" +title = "Wait for diagnostics fixture" diff --git a/crates/ide-plugin/tests/fixtures/diagnostics/src/lib.rs b/crates/ide-plugin/tests/fixtures/diagnostics/src/lib.rs new file mode 100644 index 000000000..98cba1505 --- /dev/null +++ b/crates/ide-plugin/tests/fixtures/diagnostics/src/lib.rs @@ -0,0 +1,169 @@ +use openidea_plugin::diagnostics::{DiagnosticsProvider, Document}; +use openidea_plugin::{Diagnostic, Error, Invocation, Plugin, Range, Severity, host, register_plugin, text}; +use std::time::Duration; + +#[derive(Default)] +struct Fixture { + calls: u64, +} + +impl Plugin for Fixture { + fn run_command(&mut self, id: &str, _: &Invocation, arg: Option<&str>) -> Result, Error> { + match id { + "wait" => { + std::thread::sleep(Duration::from_millis(400)); + Ok(Some("finished".into())) + } + "calls" => Ok(Some(self.calls.to_string())), + "publish" => host::publish_diagnostics( + arg.unwrap_or_default(), + &[Diagnostic::new(Range::default(), Severity::Info, "Manual problem")], + ) + .map(|()| None), + _ => Err(Error::NotFound(id.into())), + } + } +} + +impl DiagnosticsProvider for Fixture { + fn diagnostics(&mut self, doc: &Document) -> Vec { + self.calls += 1; + if doc.text == "limits" { + let mut diagnostic = Diagnostic::new(Range::default(), Severity::Hint, "m".repeat(5000)); + diagnostic.source = Some("s".repeat(200)); + diagnostic.code = Some("c".repeat(200)); + diagnostic.unnecessary = true; + diagnostic.deprecated = true; + return vec![diagnostic; 5001]; + } + if doc.text.starts_with("slow") { + std::thread::sleep(Duration::from_millis(200)); + } + if doc.text.starts_with("spin") { + loop { + std::hint::spin_loop(); + } + } + if doc.text.starts_with("panic") { + panic!("diagnostics fixture failed"); + } + doc.text + .match_indices("BAD") + .map(|(offset, _)| { + Diagnostic::new( + Range { start: text::position(&doc.text, offset), end: text::position(&doc.text, offset + 3) }, + Severity::Warning, + format!("BAD in {} at version {}", doc.language, doc.version), + ) + .code("bad-word") + }) + .collect() + } +} + +impl openidea_plugin::hover::HoverProvider for Fixture { + fn hover(&mut self, _: &Document, _: openidea_plugin::Position) -> Option { + None + } +} + +impl openidea_plugin::inlay_hints::InlayHints for Fixture { + fn inlay_hints(&mut self, _: &Document, _: Range) -> Vec { + Vec::new() + } +} + +impl openidea_plugin::providers::Providers for Fixture {} + +impl openidea_plugin::endpoints::EndpointsProvider for Fixture { + fn endpoints(&mut self, _: &Invocation) -> Result, Error> { + Ok(Vec::new()) + } +} + +impl openidea_plugin::views::Views for Fixture { + fn render( + &mut self, + _: &str, + _: Option, + _: &Invocation, + ) -> Result { + Ok(openidea_plugin::views::View::message("")) + } +} + +impl openidea_plugin::indexing::DocumentIndexer for Fixture { + fn index(&mut self, _: &openidea_plugin::indexing::Document) -> openidea_plugin::indexing::Edges { + openidea_plugin::indexing::Edges::default() + } +} + +impl openidea_plugin::syntax::SyntaxProvider for Fixture { + fn highlights(&mut self, _: &str, _: &str) -> Vec { + Vec::new() + } +} + +impl openidea_plugin::semantic_tokens::SemanticTokens for Fixture { + fn semantic_tokens(&mut self, _: &Document) -> Vec { + Vec::new() + } +} + +impl openidea_plugin::details::Details for Fixture { + fn detail(&mut self, _: &str, _: &str, _: &Invocation) -> Result, Error> { + Ok(Vec::new()) + } +} + +impl openidea_plugin::commit::CommitChecks for Fixture { + fn check( + &mut self, + _: &str, + _: &openidea_plugin::CommitDraft, + _: &Invocation, + ) -> Result, Error> { + Ok(Vec::new()) + } +} + +impl openidea_plugin::file_actions::FileActions for Fixture { + fn file_actions(&mut self, _: &Document, _: Range) -> Vec { + Vec::new() + } +} + +#[cfg(feature = "diagnostics-first")] +register_plugin!( + Fixture, + diagnostics, + endpoints, + views, + indexing, + syntax, + semantic_tokens, + hover, + providers, + inlay_hints, + details, + commit_checks, + file_actions +); +#[cfg(all(feature = "diagnostics-last", not(feature = "diagnostics-first")))] +register_plugin!( + Fixture, + file_actions, + commit_checks, + details, + inlay_hints, + providers, + hover, + semantic_tokens, + syntax, + indexing, + views, + endpoints, + diagnostics +); +#[cfg(not(any(feature = "diagnostics-first", feature = "diagnostics-last")))] +register_plugin!(Fixture, diagnostics); diff --git a/crates/ide-plugin/tests/fixtures/endpoints/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/endpoints/dist/plugin.wasm index 752d3d658e2d976d08aa90b82655252c37414748..36143132cc92b4a21aa6ac45bf5d1abcb2237ccf 100644 GIT binary patch delta 638 zcmaJ;PiT^19R8l~`!t)vC)o@q<)7(Nv465)6^q#{NLVzgjV^gB7at*`>YbPJvdiyzpZEFwp7(j*x3HiV7SzX= zG@~rbZ3-X*plg~}*1$8`qS{frGO<{EJ)cV@E;|*!V%V3PEx&vDJ^w@Hr|T{9Dms0% zKEWHly`c)!C~ga&#*?-@kfwh79;7*8KegKY^d=oz?9p;OIUK)RLzAnJh64kO=l4#L}PbHe;}rCs2cCaU4> zBOb9zO2$b*p^GOh6m{=Mj;^~mBF~T9*_GQJ^@P?m4NRb)omNhJ8bFa#T{`evUjc2I zrkfJ3NYoqbplqNA8EyoIfGq6{9v5{Ym_mWqZSm`b-@Lb-219o7V)4)&Jsz@gR}b)j zBfFOsOmXktSHOMN_f0G0hy;|A;s>j4D^>ds@xjPvgYe!laCI$8G&^({71oBW1}srm zEP@JY!!{m|HEgK=+o187hd-S!10}vYDpJ+?*H{!-;=T(MH`iV$?^F6CDZgXu=;^7t s${)U!EUt_!Nu81;ZPS@0lfWB-yZ+-hsr+Z|)>(|{gdmw_meC#h3n6dq9smFU delta 590 zcmaJ*Ur1AN82z1lH=9nnBbzcW<-J~)xfaz>Sj9ry2oeH&NC|?`lMw7ddMS*y(%wcr zd<20MW!?Vh7HeOtJ>`qgf`XzA6k-o%7DQkVkw{oSpISW#ALrwIhwq$|S#o5S9Jw*g z-JmLf94HE1)%*%HE@)pIt%cRumrOq^`V~X%QeB597aza+cBinAPV)1uP09v3EjB;H zd!A@{2b3w{3!uz5d{cl;QT-rnPU^!O{pYtkQEQKXm0_ROpG>LNk7^>{aov0@M7q(+T$pAZduc?lT^n z-WYqO(VCH!m@$t?95Hpcxx6!rhRnK+q4vEN6bZJH9S9@C)xaQ-rJmqPiPwUcF~wVU zcRA&!*6F3=Azh{=LO1JhpWXYzz&(x~SW)qaBZo@BU9RiRtF#aureZX}M`NE|xXt^H zrR$NS7lQ*Ru{PA~!ZPiM$50||$j9UHstTU{;7{j^K#p&X$~JTS<3c~M%)J*W z;pvHd4^MoU*4y*D<~LVn)BN%4(~VTTque8sn>G9_6@SlMAH}(Pc@$C< KuEGksLw^96V&ixK diff --git a/crates/ide-plugin/tests/fixtures/endpoints/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/endpoints/dist/plugin.wasm.sources index 52a837bcc..607ce0ede 100644 --- a/crates/ide-plugin/tests/fixtures/endpoints/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/endpoints/dist/plugin.wasm.sources @@ -1 +1 @@ -cdd58d817f507452ed192e3a19071bd56740efc70c4a965b0d48e5b224fff1d4 +99cba883e8030d7679db366a4b18b8c456afccbcbc949e0d7411adc6411f2e00 diff --git a/crates/ide-plugin/tests/fixtures/file-templates/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/file-templates/dist/plugin.wasm index 4e214ba7318c0629853fd5e6b5a06b214f30d4e2..7ab317e3eaeeecfe5521d490b10332333614c515 100644 GIT binary patch delta 416 zcmcaGndQP{mJQat9864H%#4gojGLW#Q&^-H^|ijewf@~Au2uzRO=b?K&VxIaJ(>UP z{>u8z2L*GO@X5Q2ureacGotFBTqou=d4uQ{WF=@;0F`7ICt|oscgp0hO+#OjPoWt z%0)8H+dNy&hLv&Q<{QcujEoC53#yi|FfQ5Lrg?&qasFn1?E((QFPje-_i!?{O!l=6 zV4Smgo~;-MeIXNIfWwW{4E=k5U2*J$(33nJ7TQ=(^g)uU&+1!%s z#mIPM^ZAsJOaUeLg==efx^i_YoOAg%WBfx&L7eD^P;r&SsHEd(;8T$e`;0 delta 466 zcmaJ)ODIHP82!(kI~lJU8Z)k&@lHb|62(k;N69Rtl!dVID9;5J-11o2=vxrYjAs-| zeWYYDc9cO@78Z# znQ&-S?{s6Hy-uqMe%i09#5{SO3b|X;xv2V3!RC+1?$#SXi|DrbToFF z#Y>jGHn`}@33v)!8@-)eaK03qG9d|(CWN?>%_2(2ex0X;@IiXL_0injaJViC-4xes I2_9vB0-=qrkN^Mx diff --git a/crates/ide-plugin/tests/fixtures/file-templates/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/file-templates/dist/plugin.wasm.sources index 6d3cc157b..ffe9e0945 100644 --- a/crates/ide-plugin/tests/fixtures/file-templates/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/file-templates/dist/plugin.wasm.sources @@ -1 +1 @@ -44da806d4e0d4d370534d108bd90406bcc475bac17cf69d0d323d341b79deb9a +afcf583238dddd20d0d709ce7619fada0e60916f9e3c039569d37dec75354471 diff --git a/crates/ide-plugin/tests/fixtures/grouped-views/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/grouped-views/dist/plugin.wasm index 5db3f2dc76cb7644b8ed009640a51cd7f8dbe446..aeb1692c699749c8774b12d0dcf48cf37be476d0 100644 GIT binary patch delta 908 zcmaKpe@IhN6vyAW?@gzh`i8aTBz>Dovz(cf7!*0_r$P=>Lo71Oq03ev45GpXDh1QT z6D~wkdT#bZ(Yj?SLBEis7(oaHrCF`a{KE*0{wVBiD{B2AT<+m~@8^Ecx#vC{mW>a~ z1`jHsmsThRnSv0aU|AM`05++NQ4mE41Xm29k5%a$+{JIpZ7`3O>Ta!fQEcmeFmdYz z(;%>^tUPz*^P{ibjU6`zXoAK=z>8yX?MqOYpwZCt+EfsaXv%QHs_T%qwB=2ak4#g2ObJ@|CzqB7tlu%=|`I!>prMOohdv_GQK zs^|EIGyaA+zCI9xWS}9|l;N-0oVQyJvp89J6lQ7u9t*%Vyje6ON$tgExJu`Wzq8O! zeWl|79@<}af@5oeL*4CI%qfrOUk4v&AWEG~0Dcm4sWfXw(!`skFU5crRwZZi_2hfnlSRW2bcLq+RJ7CvC2tpwhoUD{uv z*Y*V7(2K{mgu?`VX?I3|4=WvJ_<;pt9DU~a87@uAdvi@SiN`Sf;l?#c*Q_(z6xS>J%nMB7>0Sy@r+W6tx~T0 aC%@pTNro<0cnX}7Nk`14JI)js%K8OxOi@|@ delta 839 zcmZ`!ZAepL6u#%ZcRAU_yJV9sboXwP+{_PzWb`MLqMCoyQjjbyaQTt9k3slRG>X8` zpgf=!EUoEorGfB*iD_y`Nd$fUsWe+zS%OIv;SZtS^`oW`yquTk<2>h_sUgk%AQW;0q-US*BISVY4ypA00Hc> zCFAQPBVLxu*O;S5<9gXg+6fx!O&E}yqK&X>N6fe9<0+dA?JT%0+PC@^<~vMZIwl2B zG2oQ2aleG4&N8@(7FQD7qHb3&Flja|8&qo8R10JyheyjzxMbf&`u#Xzb!$b{@Aq@@ zI>x)O$6+FBgtvf>Hl>RIx3M*&l+}BOw$rrCEj;v4Z}u>OUMg>1GDKo`i~;oHvz@>6 zf086V*HI&?tRWM1o_%b5wa5Bb%8E!8HCc4hldOeloGYq>XD~q*hUYk)4+Jc1NkGN5L3|TgTq3DNFKZ+aXR)rr25;%bigg0K zW55!ds^kzYlip+4TSCRket-`+>b1c~8uk`}IKMjKbEFB&s%S!zWBp zN?;C8vO0q=lt&PzSC4Fsfv0r#L~AUBvDRMz%XGwV(n2?i!ELaNBYra~K?f~9KWv8P zeGhBYpqnnLd#c4;;dI9M__$Q6AM=ImU8-7WfCTw0;W#_TanA*j h)3g5=!*Ue%bsTpSGzrF`0AUX-k2@oZsf_K*9h3 diff --git a/crates/ide-plugin/tests/fixtures/grouped-views/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/grouped-views/dist/plugin.wasm.sources index fedec7ba4..1944ef030 100644 --- a/crates/ide-plugin/tests/fixtures/grouped-views/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/grouped-views/dist/plugin.wasm.sources @@ -1 +1 @@ -6d61b436c76c26b7edf444c89c8e71091ca7c5bccfba9ae79e770f70f8b9013d +a1ce41144630be398bb63cffca26005955de0511a17c71dc286e7762b19e9cab diff --git a/crates/ide-plugin/tests/fixtures/hello/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/hello/dist/plugin.wasm index 046be405603b52a2588a4eb65c96b39e65592ae5..515fdea7d50bbcd1fd398b4363b49133617c2b36 100644 GIT binary patch delta 512 zcmex$k>m44jtvz8jQclN3Vh*VytO$`)>MM2lX>#P*CLbu`>9WUVA?9VY}ViQMSXW? zRJJNGYcg{Ar`>prT;UwY%5;c%dOT z%Q+eMOxF4oz<6bI^(Qe7#y`_z#Ti`~uS~A~B)R#+uN)c1CrBcbKm1bJeqWq%2P5O2 z?K319!x$N#Y=1As=*7tRXSl4zjtvz8jK?-t3Vh*Ve7HGJ)>MM2i+S?HXCjk-`>9WUVA?8mXIanl*;`jE z?5b~7VAf>jaO!{j;`yU3Z(rAJt}_$iWST&%^2v2(Vw;;Ce3=-3PQK{08=t{To#R+p z4l^^dOkbeNC^orYmTj_&smx@1&lYrD5=hRupRY1N)c`Lk#r~LRE=g(UpmXSUjMWG z_C7{OdBtWX1_osY28L;z0t`Grx)8`$MB*23x4p+G&NMyZ0pkizpg03ioqEwO F?f^vI?g#(? diff --git a/crates/ide-plugin/tests/fixtures/hello/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/hello/dist/plugin.wasm.sources index 2d8db8996..c4aef7756 100644 --- a/crates/ide-plugin/tests/fixtures/hello/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/hello/dist/plugin.wasm.sources @@ -1 +1 @@ -b4fedecefcc934cd6ddc49c3ffe948468a7603930a47c3594be85f5f01758fab +bbfc134f2121f301bbbcb0f0d596d7b3cc059455bba5ca78992e8bfa6630ce42 diff --git a/crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm index 70d531824aa51b487901e626262a7c6090c5b114..46b0d989153cb7939af786fbaaa4516355b350f7 100644 GIT binary patch delta 602 zcmaJ*T}YE*6n>xY+jN@4xe624{IT98q) zqwFrHZL14G;{;kpMi`bz=0$dqlviD($VwrhtlqkEU34za;o?nwUOjZP2Rd7Cp=WuH4Ah*Pla5aQfbwj43LTKN`l~?(1y;YVEd!B7{Q- i5y>`*Jb9xM+ZN&0*qj3&W22=Q(Mw8LdJ|66t@{mAv+q4IY-@=v6B&VCEGchj<$-zK_ApCw+c}gLn6rxBBKk7Aj7DeJg!<; zgTgZ@-Y=2h~0emhh0=8w^;4Z7rwlC9Q~RI z@#j?qOw+UFM-7j;CAJa6ADXekkWm;q1 zil7Mcodrv1l)B}6bfh*>Y%#g&5htI^ByvsV5` zHGiP;_p9Pb@@QD!MK^qI&|AL^h|+u@2;8EET`eL~bh#;N)IVow3n9zVYo-3SLIpJ5 z*RgZK@DUC?u?lljTYq%@Z yGBbGr*y~Ww3ye7#W8n&!RqFMmuGRnasn`!EKE!gh$QX5-=`pLGykCcd>;3{K80(<` diff --git a/crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm.sources index 242254d86..dab679e29 100644 --- a/crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/hover/dist/plugin.wasm.sources @@ -1 +1 @@ -e593cd53d3757c3a738121ec2fcc3840a9d1c0dcc6ea1e17134c9d53ef695ebc +b7f45420859ce9540e0aae1fd803eee13529ef63d0a2f0b6ba9e43a5958eb457 diff --git a/crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm index f4c49c9cb2c3b7e01b8deebf5206807dbab595e7..e4b6a360d195f3b2fe562e442591a6a1f962e6f6 100644 GIT binary patch delta 653 zcmZ`zUr1AN6u#fRSG-qeTdu9GKf2Y$t>w&>W)ub05}HI2Bn^7lL(oVJEQ}t42Bt!+ zhdi1>LQQ9;m2RA2QlJn7L8}KrkRAdNdMKzt^yi_XpRR}b;CVQ|-*?V;zVDmLsp*`W zn$)nsDeaAFmPM5)fDBPG_*Pk|iWhWu{UyxPSL;UFQr_XX{k}W>_Z?sCbSXO&?a16x zay*+D%s6 zf^=7V0c~|KK?{*;b+hbFgABtZdn8Jqw9%pJWN{)Ei%I6v6&&%~$m+KvL9^AH>6kx& z1W#-`12Iqy7X^)Tcti-%7=gBOYm)QFGd_D>%!HmQJ7ub3cue)4HawwG&r#7o zi~f{$d6)lJy!DviG4D=USj_uQi&%k1dg=FLh;sfghB#DnLcuT%1j738azvMMxR#n~ zeQfN$13meFR7Vd2n`mKA1Cng1(-e%evmslCQT`a*2R!7;#$O61*%5jTjPPPpZwY?$ z)#kX4I4O}+NKz{5ZwD@XnhP9%WonB$xc$4=>Q2g%v|W-UqsSte#M>jVy8!q0&uF;cAJ%cbNUWsu K&pzllTk{VmQt!k7 delta 630 zcmaKlT}YE*7>2+5`xbq3lQrjNi<)ykwbiDKvVy>a{DD^F=s;Qo4uTp)(aM9sqQSC6 zI(yV56lqJ%%>D30D3q6kdzq=SCOI*2SHdc%YAAmQbDdG6=pxpQUB-LfW| zQSpwm>JyEjLXiRS{y>&x?yJ;k@Q4PD$MKpOdD5GgaX4>Yt;HbC*p^6G(nj62M}<=|*{EdmQNX@y znbPjsAkW%gf}O4qkfJWPozf1w<}#qr<0B@Tbhl!ZzPQ(6j1B8Yp{C;TxTKeLG~=+4 z!Dn8%7=S_>ETr+oag%yHF-*`mPqW|-Z!>PuIl&2<_BLXYzk4^yNU__u5A@veK$P}5 z+XP=Y_blGh^;4vwl^**2n4*vVuwYYD19#Qi6r_m)VWjzUU>e9!ZgUtJ)@@N0jC1w2 zr%69ILBVY{1&hE4&+hK8zyilQE@{zAzdA!0=Jtq1MUf6iTQE%R5i1v> zb5>;k22_Z;*qyis^zz*K4j{{o7lJ^M;}_?T8O9EDjtm_-Q?v2P*{Q-_BcJ%{G1Vnx qNpeb(4Nvx$v{;d}K>wg0(!0#yl diff --git a/crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm.sources index 4165bb01d..c1d45840b 100644 --- a/crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/indexer/dist/plugin.wasm.sources @@ -1 +1 @@ -3f49e3bb7f523103f70a39087e96500b5cd806ab60de60fceb480ca54ad4aa1d +041aa03873ff1d8133f181e86aab2ad3fda41e46503886754114f3abef3643da diff --git a/crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm index 4b3f14ace642698d0e024c8008901e9cd9dadf93..ecce5ea2439be79edf7c5343dc09b731de668e89 100644 GIT binary patch delta 2697 zcmaKu3s6*57{~8-?=HLUf?}eBz~*J41Ozh>@&V?i>7XNQ4;Qm|n5Kj}X;>M))&gOy z5#ykSyD5*Ahpm7daM!{@!UwuMCP~f5jFn?F*+a&hZ7S?L?A>*loMvZ!_ulh8&i{Ph zIrr|b&GLKA^2P=w)X_%eRoMt$r2qkd2U_Yk2ez4e+Bo$#PG^y>&C+$ZbnTO_KFsNw z^kD3D1*zDe+5@L#-m}kT_G1>KG*~Ld{4G6?WX29^81=Rgw6pb_uKXX(7n2G^S)>s7 z%)sY8cdz_#X7DmcZ#@#F@U{z)g3{X_71Rm;XZH({53|GYcoMA{{GV_%FQB^~J<1bx zgp)oUIs@Pk&C^cip_bHzYp|wg!siN9h#Un_NybFI1eJ7cR3dxgc`bG>NJ3A zdL-T{z+qZF{VYHgePia^Bf(5>B`*T7(y0rh1?V8lQi73NQeJ{Kaw#PqoYXIM9zZ|& zNFPex(g*YTon*0Iq)qy#d9c%g=a2HxODu~s!AfKXEh?I5SPs9F4-E0hlZHGfB8h21 zP(;(xd;wioEYV}O(aXlu?j;F;v&ffz54&mq(&u^jo6Jn#1RoJw`g~|5_tV4hJ}hG| zILK!i3ouHanK-Jyr_IRa=wJrNiJa~%(Pu{T#&cv-X3S%?=a|X=PovSuiGq$}F1*e= zfX9HY%t6>q99eUrpN?L3Nx)V7v?3XB!nl>r(dC^i$2>nSY&%P%E2oL8f&ea)wCuBR znToGhz<+&6&l?)@Th2nbL1wN_1UuQddQDjGkkA;8bLY~6&NU_uDFdB@D%N}raD!f1 zd-LI0b1>tKbp)=F?sd5#jv;OS``<%hoLW?hf+$EbZ%Doq~XoY z50PrjO(J4$>VGZNn0rBv4U*?!qu+fJJ|;EqrVl+g;C)Np3%v6T>B^cj)V(D7!KRfc zoeXS#4tnX_Ee61?V%oX@u(r3hoe%1F^+M7bjJ=YS_R{mlVz$#>&ey}o)S5pQ@S(jR z5zdnP1#gWp_p%0fl}%?Rg*)a$IqBIEjQn}WOytBu#^r^f$b!P`heeeX#iB8;C>+Y^ zlA8!n<@G%aLiTC69*^+uoA5#~> zb6UY2pq1$?L|GP&nPbXUA@`ImLjF)z?CZ**m5a<}>wcV;T-=|4^fSdH=a`;D?lDb3 zwwPui@0yk(Q_XQISE#5EN01x!<4C1B0uATQnsIJjGOg-aKagZO=%5)-mxHJeyok&? za2h%BU=Fh6;K4w5j1r{?$!_5~2T3kpgD%I)A4gs|U{ds;4ZH&Y`KWSL&Ql_cnKw z)Fff_teRa9lBzK2f?}?>SrSZ8?po3`UB^Cr7mrV^B4lW z4Obi9#JH5kbI9>WS=QvEtw^6HHuLl*HnXj1DxRdFWs*jeVM?4}7)PA-90 zj>6r6pMm?Z&}&V1?6K~7Wn^|!AenPK9YZUQ&p=)~-U*JX>d)}&NNPUc`fw%FTO-kR zd252lJghcHT8q(~bmA4{{u8W1uYG~y=$**xSyE;B03_xbc-Mi3#tm9UA1h4%UxMKsY9MdTIjlg zRYF{IHw*ALNnaXYQ6?R}e3zk0GT@s{GL#b4y%(UAWZVnn^SkNBdn{9>N zN+sOfH&zB$q0e?l2K{_UWh#$<%Z&IR?aR5UjF#kSxz?nC>!e;Y;h!b8KNOIlh2DM9 zQ4kYq;W;jhr)MS&XjZJz|@5jf7For|z(qhTU|-nJkHf_d0r KTloYiC;bavF(yp_ delta 2697 zcmaKu3s6+o8OQH;?=HJxSzQx!kVn0{U=;+DfNY|oaf{KSBM@U2V~Sw4N{DGxOk(i0 z*6=WK#POg4yDAIFOXPJH7E?@sUM(oEsZO<3r?hpf9n&^C#Mw@L^gHa`b(uJso%x-6 z@Ao+W^L^*syAK`8e>;@TO=_^yX7vrl3;rq)0C?bOu{II*77ulCn!TLKCXWsBSSXME z^61B$uF5wqdGu!wHC}utKR$Zgom0y!u0i+B!D06}DmzVJ#!hOU_=ynQ-G1@bp~GEv zW1gsp6oP(sX8+@&>wmeI@7PQ4ycnhOwF{Ag+SeWx+y_5q*M=&`*>VpQ|T&07(f->7CxJY8e*Rw2DS8?>5B#OhTcVm$cX^;ksl>u2?;p_*==^E$w3dN$rAKpm}~+Y3-ZKbrr^1Sp|*l2!nwnX^1vfKIY5IRv>o z`Ca6-&`P@X$;jtZd<-msGuz0aZj{Hb6OW<7%Vg`EdZdOY*?KNx5=b+Q|aJpBR~gHuK61j(z|O`@-Rx~r|*OV#F@Sn z9OP+wI9`XZJq8l_YV9(dUYU_Fab&2=!eyIa9>@(tiIU?AfO93=gji{Un%wC< z6E+0{43o61UKpn0`*!%D4;lI>jQl5iIb0|6KS+RPvg3oz;k{!*V>r%}%K#?#GjU8A zm?Wy&{0D&R^v@sOety<$%s6igfvaS2OHQaXrcGD&8x+QAM71c0f-LhkN#7cbb=|Rb zI~M$3TeFbnZM&W$)snM-h&d@gv`|aV6(#mknX4xsfA%UICN-a>kKH%nbzAP+{OIq= zKxX1t_ZHAEcWy-K!} z&r{(rZTNgL;7w0n0(6n5c^|)2Jj@#4Q#MmEDac<6C1fZ+1bHuiK5|9@B_7=hb+bz!L=?xF{W-a{rArGZ4Ni}w3Xt{t0fCLd$~PnS%!bm6fRe2nBZ z@mh{wB&)YwW$I?~oI&se7!)QOQI|$w=9tn=$fKnzkbf^N3UKEzC`IP7rwpehe=IX1 zwbpoKqV+B0QR_5hn{^>_)VcG#h!r=d=7Gzlx zePYAYB@xZZRmjYf7m+hgWh0NAIu+!JQKJ+g$s^n(k)-m?=+a*PQ{=7kD5TmR8|Yo+ zn_gENNw!Y`&pN-bXH50v><|nJ^z&9oB78+GCW@~Rk>-k2jH;`i%_A0WnF%EgHaS<}8DJ#&U zKWM2>>f)w2uOZOaaHDA(#w9mjLQZXAS(92ik$$ag=DDqGW@qahJW1cS;`c}*{*G|u zYzK2)>$rf7Xj`b3D+FXh2iw7~b%c@Twu9a&$7xAzXJ@0Joo$?bJ%Pyc?dy=!oc}jSB>`YXV$ z*8FzQ^Oel)j6~Pr>T487kA7`om6+1Sl)8FC$uGO= z@G792o$ck_?5R#-1yGU`-8;Ow#}y&6hZP~S=UEYs^{^tidRP%ge&~1C)D#^`q&6QjPx)+6LCJkD6{M+P{B*y|wTybdxR_`d+}N30JcDM}xHXN=_Jj zOG5A0Aul3rbjyQHLR`Zj3(#5RFHL}`kPqLZu}r#3*?@00*>I5fKYSbC{c9fv@s9@R zj)xm~=%lw?!)$2$-$pguJU&?gH=y5nUjcXd(6SVsGg&P7m+YIxCTq(*3zuj-V|u#p zaiiAZ{9Xk{1N0t`j)EBdexBpPIgZOw>9_zKx8l9t=RU`o8wDCTeqa`qDAC46IHRIr V2EfmqD`Oypht1AkzYOYG{|68D9f1G< diff --git a/crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm.sources index 8c1c7456b..d29297306 100644 --- a/crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/inlay-hints/dist/plugin.wasm.sources @@ -1 +1 @@ -f3290c6ef1e794c95d3e8993aacecd58566e2ba690f966f52613a2dbdfa21dd5 +edcad61ab8e71cff2297edd9b902359d76ef04446bdfc42aae34420ced4d7f26 diff --git a/crates/ide-plugin/tests/fixtures/jobs/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/jobs/dist/plugin.wasm index 2400a63005fa5a537cb881ac4548deefadd4edaf..db5abfe117b9bc37f3c89c20b53fb0eb58c763d9 100644 GIT binary patch delta 1256 zcmbW1e@v8h9LJyc_j}wucSm^#hzEi`hs_<0Thu7XfH)Q?KbnUalL=wDWU<-W`h&98 zE`Hb~w#*NBiAa)yFi6k7#||X~&8ZnA7M8<5vf8o`94tu3u=PE43;w7-`tI51v-kUX zeZJ50{d~XA^JSH>zsl$vv*M<>X1%Ri+5G_v=Nw>A>6hpX2TY9N{-sL5#9;^npmK%5 zU{JXVn1fQ}Ef3crm&#T)gw8hVeVi%g7C8+acSMMAEf+XQFWL)mQuypIbL=Lpw*TKK z%2#JIG|^GV>8QbToqvj{s=JZ38jt5{<~YsP)lKYaNEW-|`xt%@SqXaJDCIlT@P(*z zPH=RK%E#k4&eK5Ba+Ard8C(~X3d?yhkYv^20$om7D&vima!k|ur~Uu&gxED9h&lG2 z$D?R^S44#jsTCS`?V~}DQsGi9K1zS)8or_E)M|W9EvX;Ln3z^4oxZdZ2w_XtA;KT5 zH_O`VsCdL9hhpxd#Aka~EMA%IpOw|txE}(2uqIB#XB-N_8FH`FXfmt*-`|ud`(5-= z*xK%e3>Ni^uCA?=jCLz7pfbD%g;RUU#KX!sdDkxMSfHSKKzpbgRH16WuB(p$&yzX^aFc?sCChwL4jFiZnG9;42VNKsyDX2zj=W!z<>k&VkydVot}Z+$M88~4+PcjOTs+ikMo4I1olhHJ3wyLSSZgN52dq->(UI--q9 zuRX<7srHNfR=o}ff+lTmQ_(`rM~cKyTX*n_2$G2p$X3yOWCJXR7SDEAGI3}V_RdVk zxFTNa8VsRI|D)z5vOgLeOtE|>5{~C_y-phD7rfJPuv1D;61Dp?@j3nOcgkHFnJg1S zJr8r5?%#-?>C#mj{n7g?`o-9ZWjc{{stov)+6Id73C+v+F%=G8M6+0Nx)JCT{xeff zsoJLMjp(K)=G-{z{gEL`G|$~NV8YwP@Epztq;)$AqYq?|NDCClq8I26gsnsoFdBGO zgZvdt1pId7@3LfUy_jBYo{JpMDQ(@7=SU7%x}fHGV`iW^^@^fAX|O1vG9PA&vTA|e hBei{jZt%V`gMjzo40PU@S-cq{?<+Nd1G8w)`x`Tt$^rlY delta 1297 zcmbVLe@vBC82+AfF7VxZoqSh*c)6r}7mQs>D5o_|h^`Vp)m_o(mxSfYjVa}9ty;31 zBooK-$_u-e2AHB4g;x*m3L;)|CQ%tQpdYlUH9|Jquwgo4+PPR8_(y+q_U%1;p7(v; zv-jEio!M?Yx83Ob$%5-*&~j6?Xq)=*Jgwehc-P#3pPBVNfGUkT@pHW_N8rnof z@->bo@y3F9jvne*6l*e>^)P3bQmplejzty&dZ}k|l#IVE-iSYF)smL~dLs6*5TKdt zOKmttsY?g(Jy}!B&`0}I_sE!%wo5XtY3p!8L_cmoq+^D>I(x#dyJ?Ua&! z>fSf3Q^vTH-W|fuF}hr3qoF7F+*>+jV%nWq%Gw#Z))zMlvyb9%(}d@JA)rnPdNJY-tCj!K^LN+Ptt5+tloPsDv4 zY@#bpPgSREqcfdp9g`Gu8j7`V#KLFZVN&6Hj)9K5*5Er4vRVcD$&(*TuQ}&ZR(_>8 z@q9Rp1CuiDe3$~C*l6_N{Z!aEiw(GGOJjz3vCzz@fECT(a`7MhHdnr)18GA*_d#?arQO%BFNo^~4p<7%mzr}G;T-enGTo9hh zTrL-2aQ7{__kA9d7Qz+9yw%%Vf=KFajET^peK_eHbFdlq5DE8D+<|!P7t0QW8c-{N z&FCn3l&LaRCpI<6Kk)#)dL$kn)24<3x_V?nJ2bsPLr_CAkE%E1T40PioVePB|T1E5cqsh{iy3tA_8fpHx3jwihJX*z7 zZ|{A`K!CQ5$9Nx_gL(dFjpZ?^AT{_j( diff --git a/crates/ide-plugin/tests/fixtures/jobs/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/jobs/dist/plugin.wasm.sources index ef1c5a1f9..20511645d 100644 --- a/crates/ide-plugin/tests/fixtures/jobs/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/jobs/dist/plugin.wasm.sources @@ -1 +1 @@ -7e95ef2102982c48740d664cf050c86d2f7015d438e30376c35c5a97c2fb8c1b +aad3a25c3522fbff6f48c0c1e9de23b6d0d5361ba6658b744ad1590e9fdbe255 diff --git a/crates/ide-plugin/tests/fixtures/misbehave/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/misbehave/dist/plugin.wasm.sources index 2c433f90d..8f1030378 100644 --- a/crates/ide-plugin/tests/fixtures/misbehave/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/misbehave/dist/plugin.wasm.sources @@ -1 +1 @@ -58bcfb533bf386c0f0179e6775be834aa2d30f1b5e88e7ca00ad662bdd35699e +cfb432ea8943bf9b7e2f3ad3708df35260eebd04b3ac059c7643b378a35cd036 diff --git a/crates/ide-plugin/tests/fixtures/path-events/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/path-events/dist/plugin.wasm index 85c41c4771a277da34a842eddad278c7ea2af28d..bedbb1f3760f1010ea26d96e3d0f99498de1ddf5 100644 GIT binary patch delta 618 zcmaKmT}V@L7{<@@KiipY3(v(q`*KHzZZ5Vl#Pq@n38#rAQIZil3|dza5=2C_Vy7&F zz;|O(PzYuh+sgW{EQDAWVNhK}P#EhAYEiHjOt3D3PINPGx_Mrn=l#7O#RdJx1^sNd z5i0L7c1lLZm`Mbf2ujLsCL8#?d{D$js<%vFhVEJpqe507=~Y2+`htw4s1_Cb`Wyw^&{?c>$B=oM?K@C}Z*PM2p8DQe$DLspqe>$?BL z?_BR@+WMn)n>FQiJuJ!S{eX=ut`pT$SaF3ODO>5Q%g1II?SH$5g37UKc;!nP{1_R2 zu3pt)kybZ(G;M7P(W1vi5q}wn`0U&xS-#bSaP^sw2+M}6NJR|B;`mXg6iWO+Gg1vuA-MkLJgLv3xqEk4!$ zQ$&tm?sx*+2jCSzInfuTVIO79Afge$~1514VY)+L+eUYJiBl{%Z zrBp^5{n9vh%8a<8Ofx}f5Cox1k_EF?Cp52A`9#X?$LrLx9|^tI63lan0Cu(f0dNxT A0ssI2 delta 642 zcmaJ-T}YE*6#ky?oBM~pVAHLPeV+~X+h#gqU8o`AGz%;&kf4D^yNCqoCc0_p7F0sA z!!knqxd?-~TD~)b3KEhHY8Q3mD$sUOL4kP@{ZY{icCl`}Ifv&t&+{D4sT6A77iw}{ zMqFUs#&)gIB#D41K@=%1J4Kz$9?HihG*g2mg$&JEhVX@)*7TO_ucu!h&wY3sNGckS zWNR-i{aGC=ly9#H?4@-Vz{pV7FRqFt_gUz4-NkBy2kCcVqe z>rPjb<~*RGlgI3A(cKJW>4!(5L6<^yZy)Z`kT-xFoATa*J{yn61+!=(N2isd{#xBS z0b2IevXq}cWYqO!o!swr&N*pZP3;P+S(hk-IXk=zTcvHR!pNqI->i{;GJ zLZFmcDTN0PMCZ?#kx_*wt} diff --git a/crates/ide-plugin/tests/fixtures/path-events/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/path-events/dist/plugin.wasm.sources index 3af778b65..ab0768e5b 100644 --- a/crates/ide-plugin/tests/fixtures/path-events/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/path-events/dist/plugin.wasm.sources @@ -1 +1 @@ -12e92a08e3493a282b811592d1f044f293d6296b36b4c8e3b25ef80c5aca022f +82f53a3f36f965c76575a08609439e0bc9cea37f1aef7cc1671e9ec72a17f120 diff --git a/crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm index 126b88723e227dbd6c48347b0712e0af13ffe660..45c9f6afa462650a19bb64eb76be9277ae2ae31f 100644 GIT binary patch delta 2805 zcmaKueNa@_6~Nzl@3E|W1Y&3eVTZT77+3^@UyQYAd9lK1Dx&zUKx|B=d9G7jAzk+&*y z4`y^jne-{+BqsE7qgN4^myfLVVVXY0(XgU?s*Ju&*`U5RVrr$E{Bne#zW&bogO=w# zF$X2VAgJH?w)gv6U)&ySE1?6Em#SW%P6@gLFHpw@tH!BeoO7~6^CmHe*k0gZhvqjT zNz_ZEErO`3j7B5pM-ES$Lb42zP(@-4!76X>4*^87AU}{k)6M~uhU+D<3_u|5aj%eE z{o>GCwoc;Y-dk-(E>q$q-v5+S#LHr)e;s|IuV(9trp-dOOnVIHX!&d5JhdDA04$^< za{VNW(_WBc$XBmNl2z0H0rhlVRQ@D5ORvtI2T(%?V}}H2p#PrV0Z>itaf3dPPaBsk z12{(iyEF=QBr+)&nUJ&|YKb{%F7(pRlM(`a=?gP>z}|7y|7^=4^N4hngh>?F*T9Zm#W9-{?y}OBOjzK#eBNb;`|&=|1!+y zSnI4LDBS>kWKsHzX-Dp|$o|7hOE_l1%VX_%v_GEy0}PQrzV!?Am%A>A#N>q0DVt9S zSlz`fOITlr-x+$jsFV3h@a2@$i>SxesQ_(6%IJVL`gKMn{Md$6WM)7I5x2#GnaJC= z>+Q~5qdCsyM+fqVOmb!ivW+^nJpkySRXd(e>`_B5?OcXlg)9O$NNLt??1p#t)R2eH z4E<039y`lG(2NaXByVSqGcXCOm&?VBLghF!%IN*BuXk?ST_g6yiX#Z$T&LPa7wCq~}cIvx-4dC(FlDibJ$&GoRO?8ZHifJUx zVB9k$Njp7eEMccFEI*kycGEri0f4hV9E<}i={We?fc$Q@1!I~g=XaA81qqrWr$Q%0 z@S={Ba8M_@`YRU^TfxtuhzvLxRj9@1q{57eo!u#%iR$6PFeswhqH+~>w&n0fNE!7!ev*&2xmCO`$Hyym6@S6fj^H_+;98&)zS^5sJ*MSctq@u>l!qnvMLW zDRGYCK$N&xK0p#BRV=UedC6Nz#+9O|^IGf+E+PGs39q4zJUqDyX*hKYIdCcyx$*Sr zK-U^IW+g0f)gar*Wb<}3$uqx(tT9I-@0({$ch|evZR!%KwW1Fwsf_7CN@aSGD~Mgt ziMY_+JsbI~au$02p;AJIo=Jvcl65BGRhPY0(28S>JI@rLK}yv=G~)xI%+;y{ z*RI>hf@-sCH$}-Cck}D&HJC|!jR7;vteF|$4!YdkC>v?42|}aWH4BiQXAh5h@Inuj zXB$wQRLdH2p!Rpj=e6^Yv+BB#Q2#12u)Yv!u74frsDFg4KgaAJpWBbz*bt5Uu;DRs z>&MKd^y7!f?dRF~F`th|esw;>om=4OO|p^H#@TK~z*vQ)aTl(eV!eZWVr5<@UuZ?% zyTBsz7g=QE#W{F|E?v~HgVs&;$p27g8g9FZ{Km!(bJQi29JOo6-b=;qP~&n4YGRim zxrv>I?4|%@LDObrU(>&kj%Mfj3Vbx#HOMP=mcci6b{;Y>&qr2Yz74jjomT*NA*&^K z;wXHp0ZpS?W8La;_3mjcLAC1YCgj^!S=BQ>!N4@_6CCbHo z)yg5_i1m5|iXL6pkj?G;-R{TL_^h4PXt*|7WBN5#WBWB$W8HP;{n7P`P{k+U4fpfr z<0X*)2XBr!OXLPC{?-jv{Gywz{qNoMP~&Gl_wEMvU3=6O<<;t7Zzp`)bW*>2JpxMm zA7ny5UEBSx26{;6Kpk?=w{=iVrDt1(siynP-u;#FkwoPs(oZVC3xr{E<+~K*OM`*v zBz*849)C4H8gj59?fYM=p|kX+0Dpzn=1LLz_>e;@c}_MO@gMKggpAmf)zUvN$7B!u z?Y(7xIZ)DE?Fq4Zu$T5kLbTSxbDW;zxGkRkoDYsiajqRRKh_*M9d<)$c@&r?p`1fK accgiKG=$?HM)R*`KrjzI&ABmfD)RrseL^Gv delta 2758 zcmaKu4Nz3q702IsZ&_AY0y7g!MRMON<$t6~C*DJmi#)@VwmCbd)2Nm}A0luT*bbK&g@3F8d&d+*+J z?m7Q+?!9lZ)p``ydf01paGBb54>ew10uO+Hz|#+W=0j$Gdjsd4$w^rqgU{pYvqznG zsACW2RId&mtIttv(#ws9>U3e@U@SeeJXQmJry9G|rw=pQboT~btu(z~u*Z?N>TWY0sEN+UJ;;2i}I~n4^NU!^|)&IN4@+l~{uv&k3;2 z@TP|T(-aR-PUf0L^1vvPWOD+XCG}yv7bM#-cngPnFGrCs~GOby-7~m-V@1h6+Y$QA`2pJo<7HN%}0T1bexLAN@Vu+81 zCrBerkDtp!0lm8H0uOewZDlg#lDjKSaG3P0d>z`zid8d^M^^0(?(S%ixm1h588t$T zsF|0!)Q1l_z+_6@R9vkGaFEC~@z6pu)+_S;}i_H7=BFTpI16FI4p1SVVHF`1t{`NhL`S!Ta}wIv+$;H9Dd zJo=wV{t><-f7tMAXdxME0?CwgGaa|_q=403+_VrdZ~q&8qvaMBE7pforOVV~^LPL! z5mTDMNxw=dfuH-3qSO>>h zj2zKGE^S|oQH31@>Ph~NUDyrpwDG|$0}B04y^WpayhW|(DSE16TZokQ7Ic%^v=roo zo%=?Rs_e`iadtM%-gUwQ_qcVBk<8gMmG8St()J__Ow_PJ=H6wvPwxKFDd|U0Ke@VZ zDLAOl{#5{7bW_G6z$VvZ-WlIKxGBYhGJ|l>RFQUiT+U;s&zu#{_jS0hL?CjO|*CWT}tp%L zPR>B;ioC$EP(V;3~p{oW-A!Dpt(IwM55m{jkN48t1 zO>)=!irdvSr88>uph_9igXJa3fvzM@!KA^3?(Qk%PRTTk{9}oToKPAMS!73P>{yq- zT`+2fIJcB$qr>vDedyd)wgEZS#)Ku^oL1F}gzB-#fa)Bi zwfZGwTlFJk^*QGM`MLeb^-3i29p!W6<`0=q{)hLGThFueV?7^({Nj9yTU)@ho1~D$ zn(1zX|4@UiW+$#2XTOd7($1oexloV1cY$T*FS5+?#h394UAkys2d$HaApcF7YpCNU z@*4*`%n_Gx<^!jJ?75WdPBlzJU@f~0@wMzUq}BQ(vuigZyKDcBY^xhsUxcs4P6P6a zlPUPd$<9OS^$@c;Hjlc5!a^wrW0T?8-_YEHZ<9M&HjXje7^BWyB<=+(G&)}#l z(LgsJ{Pr@QlVlnHar-#7|INVqrdxAIAB$<-`|dv~O6$r!Au0sy`CZ`_tEJwDTLY#cJ)RTn-9c0qng1Qd9njmxc@7YU&N_PW%`5X8g%y6h=%I{g0_iZCqz diff --git a/crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm.sources index 2b0fb51d6..d6ad006c7 100644 --- a/crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/semantic-tokens/dist/plugin.wasm.sources @@ -1 +1 @@ -eb481d1624b5d96488925f15dfa773a74c38cde490bc0c43b9a8caf6631168ce +a8d40f2224246e81e015d576a5fa70e83779af9fade614d61212b33fbb0961e9 diff --git a/crates/ide-plugin/tests/fixtures/storage/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/storage/dist/plugin.wasm index acb7a86ff3db4f41debf6a87a864d9defdabdde4..88b217dd15dca617efa1a21f66357506ec210075 100644 GIT binary patch delta 455 zcmaKkODIHf6vqGGojZ)YZeHVdTO~>Zr*(c z>!uA`rOnZ>dmLK`&b;2gvzasYpIzomL2?^^+SIMK&|Kkua^mm4mFOprW{^`Sgeamn zS$A01kj`hS50)s@40#!_k*_tEhBU9f5eNi?A?m|hCjsF%BtueGevniz`;|?;(l(JA z`X(6?#dIev73Cwu(V{+Zwvi2lNq2Q2%;T;aJJ$K2+ykufTg9l1E$(rj1FKwBeU*tR zM$K#*Oq%nyBgzSHfdkj{(b|Y8CA=zkv^}Ue`UTX{R>tw(L%`%gePW@T}j%c$EQ7-f1a>ghUn+K HmxIbL!yBsO delta 426 zcmX@Ln&s4LmJN)29Nf%IjEqc-Oq)6RidZB+er$dw|4G3^r-3S z^yizW2$kcLRuN}oMAprSqI+_*r1#`Li7m(~P|XLb$k}{fDu9u3;ba3Dg~`Vy6($GB z#4s+NyjDh*amnV>GD|^Hg>pvh3mY057b2g-?UJ|O4MIQhBcWS~^FlpBzAkdkKP z-pr>Uz{t34vbeAT6;f{R}fZgW@2DaW?*2j nXBA-J0n&v)z9JI8c=D51>nBftUBL+yWB^JsWNa3BvrQ8Kww0FgUW9j&-LSd!`rzuRp z!SNRX?h#g25(z88Rba0Q{#a9CQfI8z$)>5HX0jZssW3(oF-+Pfe;88_>mA0h#vHM zS|t@~!G`@7C)8tg*mXFDj_~EsM30B(i>9m9m&$|!WsGc84&sc6u>T2IH=!1K@pri` z;&5}#+ubckzWzYiDQl*PV;8m_{m6Bp-{om2#mkXMc8U0h9EMw>4*ruVjf%Dbyn)$r zJ3RQ;xbIqz6FyDX%SfLIz^#x6mTQJHRL z-V^Xq>?oyyGaYi%&KRRcX*=_}T z)H+59vRX{x#@O<}?tRLsp3yK)Z{vbQi|u=^X_;o`+I>z{k1?G7hUJMC$0M#8m=?;l z-8JgdF}SkCX%(kxoY9=tajIc-6sKC z2>9V%8EN_w)=T~Ac59%QWI-_%#DLVUo|Ozz2Rk%@!MFm+gUd6XVYclVN!TFW_nd8BTkW>p@=t^2_J{|DaD*6J+8yISs|NW%4s67B0{vb)4V}v-SmI;Hs z(S@;d@307lc{%2;0XIeZD}v%jf66?3Yu;{VGJSq2TfJ@m9yXqvyu@%mU@l5t+?)IZ zV=t#!~@r#42v6X1f<w_}N7jZ2aA#t9UeP77bl|j|86_$U(Uzp!K!!_-l0%oTN`@ zHM3w8ve%1-wm}1XK;M;<1Z`NpA%kjij{|gI`*H_#(BQl$04T0m;Q&g{t|$OFMdO~# z*MO65bJ)Q&a89DKT0N2rt7J0=#S9EAAbIG$RS5u{G;(#n2BI$7G zSN803e@=Yf!z*8|d8(l^B@H@thQjAJ$f@#{jYX~pi{V6P>k?=TaV=X3vP~2O;el2X nOzeJ?2tw?Txs%PUL*@rubt|FKH8UT!X_+Jxcb>_I$5a0VUMm6v delta 2089 zcmdUvdrTBp6vpSw?6SM=qNB1rYAv&XTAo_P0xG)c)?+F~Q*Xx0l ziFsPE;)uBl%CX%0D!9<$lMcs8n@^@-dQ{Qt$<0FH%LFLFDbPEO)vQ*Ho= z=L?kr#Ix#|lY??aRX6tk_Z!>`mvB7XH90IydkO;)d#K5}c#3ISN*su=lhh?CJPhKI zrOt%w<;vQ$%#}SXW|NOGkS26;@(`nXO1&Aq%czl3GowG@re)^vVWufp%w^i|jA|*J z!{`%iU1oNSGfkOUWLmMhS7;uk&n!j{GpeC8NI8TI*yw zgVB?i9%*)*VVW|Bo@r+pHBhQ!w3|^Sy9cAaj4IDZ%jk9Np?SV$nsSA}w7ZNdcfd1x z4`I0(ekMN49|InVsfK!dWyKn=GwPDk%KBWfT^(vfH70d4W#_%Qx3ZCscz z1nsy!QMsdE6VK7{(bYwC9FR1KVNuC6)VooUmML4OPn~A!*1>C0uTyVubQGS5Mmma) zNutMnG4rwAzLd;c^BWI6XtHNP4|&sm9KcPCDcJ(_;*L}YJ(g@;O=hOG0bIfEbcgne zG6g!f$+&5)iR7#k0QzzJdWWH3om-HX;81D^dAvRvz(pc9WNHA(0Y@a5CXx#BM!KJI zAWQOMVE6M4E(xNWJj)6LI7=3791-9g3EE62K-`lZ22JEd_6WcQ(wcLUry=dz76|Y; z+43j6cjK|r zqw8h{Krfm3l^x&?aSYwd7h^KI=XgCG{l;%)RLe(K1MFRE;-E`cr%Q%2hP>@tC9Cvy zPJY+9WH{ytLS0%01O`9Sikyk#xDR=b3#4aO@1nJ3QvFU{O9mXPOUQ)x4HR=!=5}`V IX2M$QU;az*VgLXD diff --git a/crates/ide-plugin/tests/fixtures/symbols/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/symbols/dist/plugin.wasm.sources index 4173f7d66..36454c216 100644 --- a/crates/ide-plugin/tests/fixtures/symbols/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/symbols/dist/plugin.wasm.sources @@ -1 +1 @@ -be318451a7ea7653bfd40a5624aa0951b4fb814c8c39a494ed3066c7ac8ef35e +5cadc40061284bd5573f8323b02fb7ea7be18eb4323978b3f0b39337a9896774 diff --git a/crates/ide-plugin/tests/fixtures/tables/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/tables/dist/plugin.wasm index d54eaa4eb33ec4901252a26adba9761e1d8327b8..4f1227e4b005498b05b745c16d98acfc90e0c2d6 100644 GIT binary patch delta 1217 zcmaJ=e@s(X6n^JEYKy#$hoc<@l(v)zlLothjF?5cp<85gE<+XnO$1-DNu128tRq3t@|i%Muh9m$_Lf+d$=qcJ~$H;1756a?ZKu zeD{9mJGsy4RMtC{-JNkzO#^YD5C~gKd7cL#fZvD(8act1QVFaEbKj$csuFJUkcktC zAHyfKSzXAJHXegtCF0E_sy%=H+S${6_uj14@maj;nV{>BI>&dv*(Nx8N_z~zhovb8 zVj={1Jbmaf{4*u+KPS3VB?UWSHkj38k|c4uC6-anDjv1TF)!Z21BMZDf%mp$Ln2z! zgDV!1CoLeaJ+$Q!z!l34wA6TpushRM)V1sjP^&Ll$|y^(V+hBbX6SBGP{rO=HsTDw-6zaR;Vnj4%D6iRr^;Vv;8!cs z9+XzI60NS-tRgiw{OO%a=IHu&%K*N>&-VW=C!4BXf)n&=)mH{u>^?>SVDMMveM*!g1*w$L&ywoWQ)B?ez=xA9=SnLD)Oo V1To%17Yr&`o%{Brx*4YO{sm0&>D2%L delta 1274 zcmaJ>ZA?>V6u#%ZKyPg~FAh4PXfLG>SVvkGN-BoAGP584K#3a*lVSG5B7|t1P8Vag zOIspKSt*{7I{6sPElgTee3yV91SV!7j4ZmDCH@%TST++UMPZXpg}uEMCtKpp&3o>7 z&U4Rs-sio!^*)u)r#chVKs^mAdK%De~ugFAr1|`>6ha!_%x-&%6l{O-Lo!ORq*;e~<`c`9uxy7o zV?M~3v8DxP3x565?q&4lhA{eOT9;EnXlm}|IHqaBCgGGt!bMv-^k8}Z8aPD{<$oEK zE7@OG1!Y<0v~bj}qkHT&FwaDD3B;D#Xe5p+T(yZoGN(!ABu-T566erXi$P4XI!UjL z9qa5utgupph3<8D!>T7i8DD)tPY2eE0B7<0f-?14r8DoaA~-Ygtqpz%)0-Q1Cc{^> zxa2&6lT`giIFZR3@>?*=IfjFN72bCaKrf!F+{g|rQaP9uo6kE;Z2lAdvT$x!IeWFF z%AkFWGYUOiRV@ zo)rMM>8EuU;uY^My3*ME>#oaeZFld0XXi2P%9qEz+S1k@Trl=DR zdy7#^9(;!% zby--TXS!Y^YeQp0GFL6my4WYfX(W({6ep1kHd^K!t(e%oZSBSXQxYCi8mOzg28djX zGr>3EA-*0eg}<;ZGzx#yT|EmtT%nb{4QiOgx$|3L9y^CqXvKwxD(JxS;Y~14JBRP3 zKz%G>)k3Nt?+2Kq*CtAV{g2EyHUo6f1HX(M5d*~*Pb9K!&v6RFm;p diff --git a/crates/ide-plugin/tests/fixtures/tables/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/tables/dist/plugin.wasm.sources index 1ee2e8c2d..ca8391d43 100644 --- a/crates/ide-plugin/tests/fixtures/tables/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/tables/dist/plugin.wasm.sources @@ -1 +1 @@ -9b4b83d13abbfaf88b04dff3ecc1beca7f12805fa651b53f1087b6e4ff2f0e38 +5377825f5801850d6ed7ec989f6e954fae477d81cd3ce0d5a2b8baeb9febcf74 diff --git a/crates/ide-plugin/tests/fixtures/web-log/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/web-log/dist/plugin.wasm index dba2d159cf1d688e047a889dd6138c84928dc639..b1bf544b18d4b2b443c1e350a5b85f6a810a5ded 100644 GIT binary patch delta 3742 zcmb7HX;f5K5`On~vuLxl+O!~acr=J}zS%hZ%p(WjC*@0U zc8CJ*Dk5zBGk%*tZ%3jlu?DUtFBr*hFhYq(n0xgL+=akyZ)LepK6)zf`Ba?tk~<+au)uc_sS%I(Mmdl};)8&Rgw%ygwm^(tS-ZE~1&%mWtORl!V?af+bPj;1)HDT!O_>xugfKN2#5km03JpgPRe< zz$bdR>(x?=z=wAb^hSt{_HfgIMe+rQqJm~v5xsnPnTd&lB%E5>+hT&D1ip>-rDZ1g zPqd2S%4c#2HI_ia*_Px=ZMRgDNrcHVB0Jj1eDXwS(t|N3!qrf0 zp=~8R6)r$eOe;l2O>8Z#Z302KN!v^iFl83`7~Y=JNZU(b#A`EXKtvosp5oyK=T_>5SsLZ+H>%Gn6N&$rJc6 z!GPC`6MM)5n3dEvfIYa)Nh6)Gc}^7F*9=GJtn=?_Wj=#B&h8bT4ptd&Ns0(&m@@Yu zdcQgM4f;MnNV1BSl|o{20M(U(E_gT;C+Cw+(PQ3iGBBeLj9M@oSvM`ncROb-{3X^u z$Bi&};VQR!tLRfEYB9ol3%z_USQ3>#$LB0QZh1%EiFdN)d;!FT+2kIKUbGr<_o6KW zar&kd4J?ile@>}%pl#SSsXVkT3&DE*uxzPSV8TUD>RfD?0nZAw(*wkF%U2OhC3s~L zJ=!ShR?frz62I2IPVj{N(mGvQtT*FGY=+O^ewrtG7M)hllhB41cynC>?J$WStWyxS zJi9)UHnjlVkgYgw>9anEARITrt_|_X^yLO`#QPf}5rfhhYSaA?^V3%kyiJl3g6go0 z06deFjQx(Zr3IdBN?}vd=J_~@#?3j79^Dqo(bQ8->?bdDL+n>)^-qG?W}P|Q%)_hJ5Wo7E*Pu}z?(>;OGDhNn~iu!SL$N*p?2VziEjG> z6o0cl9ML@|3^6Vz32|?ZFXFMB$%s#LQV^4JUqQ^vord^Du1aYSMXDYgXMddu=Jp*f z1PxsCk`b5ZokI-TxfZcvXN{+Qi!+i-X4pd&%rG;5J(_gn2O?h2AA>l!AXL$tR$Q-X z7bF%ai9IuY!CPK-pB)ml6zzIzVg_kpC_0)@$RjQ+OvGKr!g##yDO4aj?AnPE{jM!| zJ*a3I;@YAyDyui%F`OQi$Y`wf&sJqK94TTu&lOD~=5oD{tpdDLIF;MJL)4Cf8AA0z z=y{3W3vD;+Ywh)x@-m?d)W!2r{JUaiQePZ0&K|xzp*Kfc3>LR|x5?J}*&i}ype50` zJ+`Feh1bF8^{*u@D9$fs34dJr4q|B8M8tJv7ki8DqL%WK*)LciX?H%FT-~if98`W4 z@m4u=poFc66%dSg2EIeAtzb6Y6;}`qdsrJ>-4lyAqH?vuo`C1HKCUY(U+GmS`YOJw z%*1_(d(R_!?_*wP?mLd?yq_^g?q|#&?SGY+#RvOUtdU%*{1L}jG1FyLXAuLdCp+6p zL_l6M8by<8RM1|n@1^V)%bWwOw+j#Oy&bDiJNAv~)PYnq@H_Y;;-DHvG^wV_*G9pG zQ)hSV1bpZGLT2_!@lg$nIIx!WPkn6!;`gb@1rKIC`>9^gkKxg1Xf6g@}JUKMQf<=X!d; zAfEgDHA*Y$L3WYHkEpR1gAnImd=;_i;$g(_OCu4NT+$%wFI9S1SiTko2YDX*!grVP z#CD_aH$ZgvSf6vjloND1{1@bpBbS9HWxRdn{)x#GQa0!QGrCL6>rSVz=W+~Ozv3h= z{>n@iYUX8WGqW_QnQOAM*Jv^_SEOp*$;e!nwJ~*tHcOMSQJcPIr8YHq70NWJo3dAD zWNKFiugS{Vqzw+46c(zxhX6Ah3Urio6^>#i_`!7E)`GzWv894GfrHaRL-ryxq)(=f1hc8tfr z9Oc{?)GKhHDd(b)b6-Hp?IOQ<=rIK)zBpWQq)Du-W020W2FE)qg5-nboDXV;<6uAL zW4wo)+d$-8GG1T9!K|I3{7wvVUcOUG6%MfC?((2x=r9pgY`X)FsW{?r#N((|%DK~W PIrj;Uv*Lrhb%Fl{Zt#fH delta 3598 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 E0OKq-LjV8( diff --git a/crates/ide-plugin/tests/fixtures/web-log/dist/plugin.wasm.sources b/crates/ide-plugin/tests/fixtures/web-log/dist/plugin.wasm.sources index 7276e0e76..4fc2bc467 100644 --- a/crates/ide-plugin/tests/fixtures/web-log/dist/plugin.wasm.sources +++ b/crates/ide-plugin/tests/fixtures/web-log/dist/plugin.wasm.sources @@ -1 +1 @@ -74acb8ab9079c558a120c145319f01b54294cbf6fa4cbd33907a0d58e1ef2906 +e1414e522a45066616475fae229c4dade82ba16eedef49aac8d4c014522a0684 diff --git a/crates/ide-plugin/tests/fixtures/web-pty/dist/plugin.wasm b/crates/ide-plugin/tests/fixtures/web-pty/dist/plugin.wasm index 2255d557915ec9bb3d6cfced40b539fca776eac9..56833ae13a2f2c0fa94148e366ed54ed1571f62f 100644 GIT binary patch delta 484 zcmdlrnPuB#mJP)mOn-N5F6B7J!okGE#mvaa#JJg+H=3F8_2l^id5qU4^9jzB`gCdE zibZ{AuiRv4RbbX+=5V?-W&W}KCmXNjZ$2b=o{@1bP?h-PmBQ6{R8F=RDPoz%#K=7P zPpQP@vm)gvY8g>Xog6Qk%{UEg=t&Xd$)aK&D2h>?095QX`H-06BO}Y?1}Di);>I9nngErQNW?HMntV}0mT~ds_YzA%!c(P;*ylDhG%)Zm zPBxGd+x$ezpK-IcEI%XTyvf#bk&N>;PnEM_Wn8%VlClLOQJjUyjCkl&CRuycL z{x^5Y^~)cY{{F+zs=%zt%;EHO*Y1gjwy$h{%CPyM;CV*Ic|fI;@F|;YD^kQbeewno zR8@?qhE0wU%?7HPC@eSmoQTe3Au$iUX2ytmP2MM_$kNHk$TGRcNpiD@gfS!I{K+1Y z3X|`PDNN3gjFDg1(9po3z~DGx>464@ECnV7CV@F%AtpzbEP+LvA4@J}5Drk*c5_z34o1cgo0XHo7#U}5u1fY|WZba%Xi7+? zz(2m1R;|;&)ui6lQ`)nXEp@Zzxd}pw%}fjo$_xw)mskWCcz|>vkgtfuFP?ns!Tia! U4=Xr Vec { + // doc.path is absolute; doc.language is the editor language id. + // doc.version identifies this snapshot; doc.text includes unsaved edits. + check(&doc.text) + } +} +``` + +The optional WIT export is `diagnostics-provider.diagnostics(document) -> +list` in worlds `plugin-diagnostics` / `editor-diagnostics`. It uses the +same diagnostic record as `diagnostics.publish`, including 0-based UTF-16 +ranges. The export-only world uses `editor-diagnostics` because `diagnostics` +already names the released host interface. The provider declaration supplies the current document without an +additional capability; host imports keep their usual capability checks +(`publish` still requires `project.read`). Providers run without an interactive +invocation, so they cannot open prompts or write to the active editor. + +The host requests diagnostics about 300 ms after opening a document or after +its latest edit, under the editor-provider budget (normally 50 ms soft / +500 ms hard). It snapshots the buffer in the background, cancels superseded +requests, and drops older document versions. Documents over 2 MiB and virtual +library documents are excluded. Return an empty list to remove provider +problems. At most 5,000 diagnostics are retained per provider and document; +messages are limited to 4 KiB, source/code to 128 bytes. + +Provider problems and manually published problems use separate producers, +`plugin-provider:` and `plugin:`, and both appear alongside +language-server diagnostics. Each producer replaces only its own results. +Closing the document/project or disabling, uninstalling, reloading or failing +the plugin clears provider results. A reclaimed idle instance keeps its results +until the next request. Requests and results stay with the originating project +and window, including when two windows edit the same path differently. Project +plugins receive documents only from the project where they were granted. + +Native plugin tests can use `MockHost::refresh_diagnostics(&mut provider)` to +check the current versioned mock editor and `provider_diagnostics()` to inspect +its answers separately from `diagnostics()` (manual publishing). The mock call +is explicit; debounce and cancellation are exercised by the real Wasm host tests. + #### Inlay hints The `inlay-hints` kind (API 1.3) shows short labels inside the code of diff --git a/plugins/official/ai-completion/dist/plugin.wasm b/plugins/official/ai-completion/dist/plugin.wasm index 867eac614d36dd6ab9764532da97726e3d397c01..9c757fa7000ff72fd4db15f0bdf2dcbd61b81b3e 100644 GIT binary patch delta 4279 zcmaJ^3s_WT8lLw*!*EyBVFi_%8CVpQ^@6gBHzvhf8X;c5T@^2dky@LYTN(`PmfD)2 z2lzp5V;v2ZggE3OxrCKUYUGx--5115FkMChWcTIV%oqnzF+!lvc+rJc zRoE)_3Y~IdaF<{jw{6NTjF;m>zZZryoO)|E{7t7;N25zn`~$gyZs4ws{DA#o=%m{4HMgpv)jyycmA+P7Z4# zl5i(^NMveXxez7z{FIPb6ERgjGu-$K9gn0n9a~h`FLXTo$Z64=8DzPARJpNFI(@^* zPmkSmCpT&+F*Ek-J}%HVnKaRikRFjWo_}Z8pIv?#kK#r~GZ!gTPzj3da?q zX64+EH)Wo4Q$V|%|8yI0QcT-18%^SY9d&3H7wx=6&*)vN*r8l8=yI?a6hBa|-}P5- zVxJVFT4NwJ9{5g6md;)u+T>P5PxdRLrr_}oc4G=h%)nF1=lW6{P?ro0=A=?o>x zz&M!udljk4@Rf-O<8u2AZvysjmdwBP3j7NhKIR_a) z72h)#Qz#gLRk=P_^?OqpH6JfCl6`g`R^mFJmP8ei_^KqVK^s4ngb4(t zD8XPg3JDhDJ=w{D%yq7HD0^uG0QtNk8TX?~=}JZtm?MuTq@WX5726^#WN6}BmS7vM z@$MyTOn_ z!9A77(=i07<$G754YkU$)i{7(s_}reSO+KHvX)9(&+FD=eR!3Yb&SEFd$Ymb%UQH6 zVV4y919%s3D&`D){(szt@yLg;fP8O$2qN{=Cli~nn{Us=kYUxmlP^}62wl@Ai?_ww zm3cL<%fx2t*6@cZvo@apFt*<&@38gQeS3PU^6h#Qc~KXqZ-SNAJchCOfOkHI<-Jr5 zjk-1=1r45M4GB=47t2wDNLxhOGFiQe9c-w{OZqMg*H z$IKR^#YAUUKtKIv)AKdj{1OA@@oEK)bC#Q(|Ze3SU(Vw@&mCCDV$P=d-3-Oz_} z6z1x)vP(Q-Kh~4d-u;LqXxNWvf`9DCxRLHEB)Zjg%ExMS-?pBWd7u<4L-kM%g3U;# z?y5@s(^Bf0#DmIUAsAami=~I>mSNVfbemeiYV7WnE3+Q-OUQH87;yB56{sOc92q?gwX_-C45NGbWrotbr4U{ zXu~1I5R@Lmrvy*DsA(R45f^EcRi&-7x+)~l=-*XX=bk{wY>zOH97e2LV)m3AKa9u7 zH0lV>65KeVd5<`XCK`1f)$%Y`YkBOeri)5a&Qv2zU726JL^p%PeUE7tlaApOjeb0) z?Sg4F8o99shuu;8?H66gzEV|8AF!%Ro2^K-$2CltqwwXLrF0REYiuGMB zuK4u&un0V+5utoV4f>OW;)e0jb;zRM$Lc6uiJ!02rt)K*w(hpeh$m8!@fM^PbL#0| zBrV%lkahcP&BtkdNPOCH#JLsv6mjQqdR38lh=Sh}Y*DmYCN!u;P#$f7L#KPL9$KZLT8d~ql{tV9iA7h>p$ZAlye|tH-!NnR6ct7kEZ8d()SA1IZ2Rlran0aP>thHHBr+i&JX~ OdxtJiC4Vuyknlg%`1@S| delta 4293 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 diff --git a/plugins/official/ai-completion/dist/plugin.wasm.sources b/plugins/official/ai-completion/dist/plugin.wasm.sources index b33b8927d..45a3177f5 100644 --- a/plugins/official/ai-completion/dist/plugin.wasm.sources +++ b/plugins/official/ai-completion/dist/plugin.wasm.sources @@ -1 +1 @@ -f5d442002dd3315f14ed7ebe873a7d1c858fa31a2840aebc7876366269d5fd6c +61aaa8563701c6d4c147eaef87363ac0600c79fd9ef2ee8c8c1cc9c7e56794ed diff --git a/plugins/official/checkstyle/dist/plugin.wasm b/plugins/official/checkstyle/dist/plugin.wasm index bbd70c1ae2ee762b31ef7578cef34ae36853981d..7ee505e91f3268d3ef99e9c929dccdd14e8c41ba 100644 GIT binary patch delta 11663 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 M*|j)H`myEz015lvx&QzG delta 11921 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 diff --git a/plugins/official/checkstyle/dist/plugin.wasm.sources b/plugins/official/checkstyle/dist/plugin.wasm.sources index cb4c66f56..1d3b7f8d1 100644 --- a/plugins/official/checkstyle/dist/plugin.wasm.sources +++ b/plugins/official/checkstyle/dist/plugin.wasm.sources @@ -1 +1 @@ -0bebf24cc46dd2dac9c51fffcd4b9186f7e575c2d552e8d600c02fa5fe8fa9b0 +ab0a7b4daf59fda5938b10c42628bb141c94bc0d82464254a6b0157d74e98477 diff --git a/plugins/official/csv-editor/dist/plugin.wasm b/plugins/official/csv-editor/dist/plugin.wasm index 0212da99240ba1f413269a1385b868d73970cca6..73d269c441dddee573f6b5d29cf26deef16fea8f 100644 GIT binary patch delta 1003 zcmaKpTTE0}6o${g&jAi$21gm0>4;@UfkBZ#tD+sj3!yc!ts0|4YcmmmA)V8hR6K8tT*w`b3PxSqg&7~=xI<{Md!0;hOG zc0JHe1706m$>Yny37Y21MwBakE5-k`A-BiRe~(`xWYmJZz1qJ^6FZ86g5fX11T~S* zos=`2%RfrsG~g5f{n8+8cnImqgcF{ z#>LC!m_CRXYKH)oe(ZBL_HO5&di|j7y>IfP^9(f6w-WuCUqAYdT~Dpj{bakD0&e3`1$hlys&#imF=DlC%vSYltPnl;XjQ1cO*xNh4!vQdA<2 z>R4M8vDI*<{ku#TT?mQWAU@IX@uCAHk~AX5@2H}~fIzH`rV&n@pUmG_tePh>g-a6XorGN+@4Oj$#rvn%UdxSI#r;}PT^*=s?w(ubp- zHl)u-9orl#-TUPTa^>ZE^Gk;Y~0~D;R=@*d5yS2=8`vZ z|4=eQQgH_shLtskQw^wNzyETaP!-AvOt6;i3|ApW2(z<~16Ds(1?_Yypy4QA2pA1G zE{Q~(;AcVk(N6tVKh$U_r)NPA&DDFXr+WuD6LyI*Zp#pw40o0bYu$pH>(|S);~It< zxu8iCG_PqC`);2xP(h1Z4x*tYl@eP#)ZV;;rr)1R*IMUr@%?1*w^jx!sOq5yC#laP z5023CN3A%<$&cTf5n{`WxxhnS_R?WMI~TT>M4^+S-Y-Bg=e>{B5TK1+(`-$5G*O s?iPwNOi`3?npH8&bECx02)w!M`z?Gd>uiEQO45pym09|MW*o}=1<}NFFaQ7m diff --git a/plugins/official/csv-editor/dist/plugin.wasm.sources b/plugins/official/csv-editor/dist/plugin.wasm.sources index b4b5ddbaf..a614ca79b 100644 --- a/plugins/official/csv-editor/dist/plugin.wasm.sources +++ b/plugins/official/csv-editor/dist/plugin.wasm.sources @@ -1 +1 @@ -a4179ed839602e1d1697d738689d8936d22889b0d4e09ff953d6354a6d91f368 +5813b46ce5ec12b9ca4bdfe61d49c63ed1af736238398a1c2e03ca7c3633469c diff --git a/plugins/official/git-toolbox/dist/plugin.wasm b/plugins/official/git-toolbox/dist/plugin.wasm index 74356cd811687eb9f7c74321c7e246481213865a..0c36535b3d42fec2be76ede035afb082746e91be 100644 GIT binary patch delta 1135 zcmbVKZA?>F7(UOrwIZeTW?IIF%0)g4qP3e~OkAltzku+eYn@}Fiy2v|(`-h=452Fg zFmVcd*}6Cd0JiUDE!0pbxJL(!V#iB&bAK1C)?(dh|JI^suloGA* zR!%=|nM6a+^z?={nRchW_g_22(?8)pPTI;i+LgX_3>9PLNz16_M@H4#Gq#MO|I3Y} z+i7#=Ai8N`)}PSQ;|MI3e5p;(E?^ko!AxZ4&!)4@$)~Gkz9)mI)Jj!$ielrH|Jn(wnw?^a_uyO2I9< zFnc|2iTQaS0w<^=|AuTe%_+qX;@X@|I-C@)dA|V1NwZrpLd)#i@t6kf#pt1=f{h4> zT?Ltn41onL;}RmLz#Yf&;@i375_79P;-jVYz(Z;(TuzR{l5i&E-}!dYSHNQtEG~l- zpHWh4>UnPTEZiE@Cv>7DL#qE#QVJPtW$`jlVR@s(VEI1T`fRz2%UeGG&N|u3ch*RE zerIw_`065OU?UyRHEIB6ek}PTI0nbW8lJB1@W!eZQR3 zx=JT*QeWjX{4K6j=7TFtOkBHIPoH|SX;oD^9tm&NZwj7@it5)P_IV5nZitQzMbYRI zBQ;Zi(_+%r_6Z15e|;&2g|Q(n3N3W6VCTa6HL-TYys9s6$H2f(#xt!IWxeMY;7O)$s2W=Cc*d9~N@X!Je#;q4 geWm_F)+w*l&AxaKuKFH$&^%6#SfICYJ?72*2LpSV7XSbN delta 1120 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 bZJzH;D1-yRjBDXjBd!U1ozvEWZ^Hip{BdQ? delta 8609 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 S2a?s$EU0zT7Ok&=CFft)m=@ju delta 739 zcmbV{T}YE*6vvl7EQ{7c2ANx436*3CeJCN=H(~Zl78w!f zAr{p|vCNOQQqRD!C^4paQA#W;(&2>{y9g^3k}&9*yT~r;qUYiqe*g17AJ2z{%o=S$=HzdLcS={VfL*QU1R9{6J# zwwj&zB-_Tj5(9r^|6?Gvn%e*fO_rSypgPOXI2_A8DB_#kV(3M+)dB&mvt**zx=Zja z>jV(h+nxdRQC^-$C8#0a4OnA0@aYk}V(*QoErpGuZJSsSmXde|$s8F}%vg z_;#6DICEWauVhQr`GQih*tsd3vecy2;N6-GlTLnl@$TL$zn{#&Ff|0F;sZEddr7$*Lk*74#KbZp& zBdqWRJz(@jJYdPX$Qd&-#@bUPmL_t&;H+hQ!e{Wph%e@avuYtTQD#d2q1`ZN`vo)m B8Grx) diff --git a/plugins/official/key-promoter/dist/plugin.wasm.sources b/plugins/official/key-promoter/dist/plugin.wasm.sources index f1891d7a6..d1dfe3ad8 100644 --- a/plugins/official/key-promoter/dist/plugin.wasm.sources +++ b/plugins/official/key-promoter/dist/plugin.wasm.sources @@ -1 +1 @@ -19c90c5f90d6a26be8f4762d42cbe2f9281e311acc61467bd104da7ec25e5545 +f5baecb3f80efee4244bc096039ae7ac926c8bc73eb08fdfe5ecf81a4e2c38c9 diff --git a/plugins/official/license-header/dist/plugin.wasm b/plugins/official/license-header/dist/plugin.wasm index 3a78025b9758afb1ac15ebe08cd24e5ba4bd027d..fa235c3047f22667ed9e43aca22b6db36c3406a7 100644 GIT binary patch delta 10968 zcmb7K34Be*_kU;Z%kuJGxFV4t;^rkGAtHz%vE)h>745IPt*y1ypcLJxCL*@lGnm%C z7DX*jJ+-fiJ)vsXYD|1O3f9Kx!2-^SW_oJP;b7tnu+0U7Iu6}9T`K4|7JEiF> zSNGBhw%SLOACyw1Nx`3hfB?S$hQEqUVMGDU{9~h13Mm03|1k7?XV^Qb#F+d~#S&G) z+R{W8OZkBESfetsDK@f^;!}zO$m$aiU<u}3F+yA#TJ zc2)VCzMx5TmZr0*Y#Lk3wkh-2H*7uomF;3<*%o$!on%|tDfT1V#(rX_**JEX{lI=< zyV*{b&kEQCwu2pIN7!-pGuy~Eu<`5OokWHFMpP=D+u@>D$#^_(O7l=OihVp7TH+U-}%y*I{rToG0xch-(m~@H*AA}hYyO64@jz;}X{ z2Rx>35Za0nd~)6GK}U?u25zhg&s2}{p2=ws88|8#aDA8Di0BZ%RWJGBgrsE{ zPpN;jx0hH0V(|2k6uH|wZD2B{O;WsYNtS6{etP{(r^U0u@(`#!!hz3Wd~k#4EU%3* z%`cXXr-wH8gT!Z_ z_TRdY!y88|dR8(Y8(+<9_mlD(J?4Y-xDPIASLRpgU^&npB3w|oXQrKrdbdT3Cvu(R1T!WhVoi_0ikL}PbMzByf7#6_Pdpx~u z)vU*sm|TTl(rJ!5?8!(S-SFYV-OqqN?O)a>48t8S4e>u?34?lOxvC9y$4}_rR^G&UKz&NUB zw6cyQvWlNdQF+&qj5_4lYpk;BFsFQ1x#wRZ+e1G2`!8&@6&mvjCL8{zF4+zkLk5fk zUOa|$@XAXG>LC*b&XM$D)f}Gp(zmplw|IG|M{n$*>>)GeQHTd96M`YMC*jtAfh#85 zj0-Z(JYm;f1Cng`z;5ASFTPU2!<8KMf8}?WdxuvCQa(TW>IwRduX?Q)<-44(Giqrv z?g{+oj>PK)TsHvmlE}bb>9mKx*sC0l@7^l`w1{45 z^zIGGp$tSdEdI@8aE)aS*{C|H#+==p4E9Wh$;t4ClX9fVCfW-!m#2A_KO^T_$T^P#{E>A5(}Pj4v2IQ+x(3PpyNjmijGMp2VZPJcZ~YWd8E z^7!D7da{JaJP=Zm7Yj4gKjD3-F!cI{Gt`GOocJUiBB(r|BHGjebE( z2q>XUr=RBAJkVmdYd)HN;EYYmGgrH>>VEt^%LQf+3qP;c^I z26{zlGbCq|)sxpE9nwO#OGWZmK5a%n@F}0317Sl3Mbk~!!a>&vo-{3MWLc9{GCYs; z>xQ4z&;Goz35T_&MJl-PeF4poe(0fLkUpMC$mtRg>AVCl#F=@6TLS-cgEP>I!M)J> z>UE%#&Za=ind(8FJGLj7yE0aW z$cS;#c9UdZ{#3{sbYV58vs1kYdik(N(DgDBfvxhu-UMtF8n1r;#$pn6UeJFsYMyn zknN=`>P^Xtx|?TB`UDERGbt|aoGe2lZJLiP7feSrKFzz0O%|p`z43szn%v4!asi(+ zxgLt#<7gl7Akmm|TrY}tMCV*fzG$Q1-6C;XFfX1O7?3YEXM+J>Rf1wM(RSKuwCeO~ zMjOmum>%pmMcy_7t$ghC2tH!^dziU3U9Qz;$hPGSxpwA^$__vMw@2t^8sObCnqg9% zSqJSiGe1MSZDvE7k~d54jGMIz?T@qK(b{KANYd;?wB2S)NZ#x>(O#L|&S!@XiWEbtX`M}qIvc_X7u5uz@6BtqlU5TU#RGj)sW z+`RhaL4e>P?+Ecj|AKU2&sZ=Lk2;4J#G-w$;1lSLZp6A~FPy@Vgc~j%6A+zt+$LjzLSzgXhal0 z!w)aZKphvgyaS!)*~_0rTd=$f7FJ&oXF%%kODoI9NjoxCZPn$sX$*?q-x~pq_aQ%A z9k#EKIP5Ej0Y~1-M>xuPc(v-9lr>`#IkJY!l zcz394*ZSI2YrZ6)w7oR)hK7WoE-=SsJY!8!7n%@RO5kGjwJUz3FM+H&n-Udrxw>vm zfq%MYZd*^K#uIL2o(xiC;R!oq`Gg(iDl15psD<}R3UOOg5SH%-Sfrt$CXHnL%IdNX zWIby#l9!z1;|gx$4Q#|tjn=vr?QAU{#BS~C>rtiWUT3$b@|yQ6mJsvw-F2S2usy|f zoe~?W?Flb2dSOqPH3zKn-g_p{W=?yZ{#zu)_G!eaQ7~_^w>Cukztzi)_Pvc7nf6xT z8~6G9Z#U4*^`c8utf&q`_8$e>;{CdsZ^{QMjr4(_3wV=4BqrXua3O8t_M*AQ>0!K} zXm(jir;P4iW3Ve0{?UOxbjo$^Kn}|qu8{4K9(p*LnaMS(VQDIpY%FUSX_Z}lc~UG( ziu9FTVx%8*f_zTuTIp;I_e%-)+-DgA2F}EDq%mtm1iWOhFcg&L!f3M^%3^pO!Ajf( zA72@bhh3TH{bi>kS~EQ$nPq4!3an>aoB{goshhJcnaQjL?8KI0c?K)&$v`ec#U{^O zLyY`WEcG?kR2C~*J(dXH0ohE(hTDU)vmhIbK`g3Xr@w~dVp%X!VWxV=kTJ|G#gd_+ zqLL?BG@oRKvR3nzC*ch*nKeYm;+R7|>ER2zlbOE>3#*4B%z$ahEZ&4g8zjhe@yV>d zW|fBR>V5bJ#)FPW1Wu8%Y!-=Iqt*Vlm=Hw4eDksLyzjADyy5XQ6ikDThtXkP>-uZ_ z;_(=0Ip{h=%jPQ$y&OYr?5Q>2IBW8mrJ5e)*T-So-m=gLuK& zYW&8pk@OP}JtOd@zU<6Y`jNLf`zgP2c42_qkR22|h0p!%W7^>g|Gh*U$0N-!-tpXI zgq&OFYKLAlgd{_a$K{Mqyf&W?ewaHjH_X-Xd{ZCV@0wfu2GKrFm#YPAFwW7Ldd^k% za?4SL)#ih*bqDzuuGOGoLkgE5h0bLz8|V9&xAr0noMhhh4u(WN zN9i{D#(uQzZ%%+@{=7LxN@n2gN@%~ltwDHeZzq&+>MOTp=+*9op>1%d1zqDgcRC~6 zpS^R5PVgW8`T%HK{rwFM<$wJhZoS6HmzU{L&Xs$p83lXGC^&@?W~Carb|Nb8aGXI* zEPv^63@>-L7<%xzm*P1UuQ0sDz0nDG93cOSM8fK1YYSnzyEt7(&3gu5qr3${cjMK!lLFAk? zh=QLS)2&JSDS`N;dz2C~Lk16AG(eg<$^2d@V^TTMndo`?Qmi0qh_0CEcbiuTKH@TP zPgW?j(qy@ZrD;BR$k$2Mdie5}4RVo4Qs^1lBtB6nF6c{1mD2}z7b8OWsB^_Cg;tVF zykn(i^qp90rACf<5+ABF+$l!8Z(6AoJp{p@M+?=L-gq4Hi7%zo9I?TdUM*j8w?yQS zuP`w5xuUus;g_;_N=pjR*h*5t{+6>VmbS#Gx>=5g1l;VHU zm{jw{eH&GzTcSb$C8K*WfIdT46hIj*OnGD5Y3sv$td25;smsWmZ8c+>zWIneKrJu{ z2!_y&I~rsMBJYTBkJ`V804n}DTdslmP!*6XG#u` zKuj4KKlCBD$SO!(DW{wYgaG=kAKNU2H&a|ysWZ&x)iP9rMv5V2C?&|t5B8YSnjs3y zP-DkLL*TN`fIiCyQ3K7ZPg4abG4T4WE6q`cT6Jq*^_FN22QCOhIcLJpEED}LwsWp8gI+mrHL5t*0jYawx>v8xJF}o}^r-|Zx zS$NeqqJA*dh*@mlhlxtfc(Sr$hYJx9E|IKT>@|%XA!YygI8V<*Tbkjoe?$4(`)E*%hOP3F`xo%q$^@q1!{>UWh;_1S{QbS z-0F{eA37^uP_IZBh`>7r?wKH>ZAD6h=B8An+UWLG1hQq~<#0Mim)$igQ5~X-qEiF} zbwMnOplCWT_D4{5h{s>#+lRl@6#@hl)ul3>qkNH}QEkT|Q{d8O4!S?r=vjh94n*QK zA?C(YJ<-w$b6z8QIAM3U!~`ep#Tjo#8Ap8;WgN993UuU)`O(;QOZ*m1wd;8z1&Rjz zO62k3HKrMQY4X+lG`}aN#0xPH+A%RAhN9rlOJb-!trq@O0K6^qDimDln55Uv&8K^v zNdwhY`G3ob>IG4{szKMrYao=OWk9^p>QvYr6j`eOq?8w>eXl%x`^r& zFMg~>P0a7fOyr0QLqW&Dc&Z8*8&UFm6;2EWc*JX{h zVoM!LZaznD(X%q3ccxF2KON&y%V^ZOa!UPHwg4DYSfH*q06>8>1am~Es>ej*Bzg`C z9+`w#wnKcCL`}i?`6Q%(vpM|a@bWOp+I6V|{pKE57xaXetks^1)kVpW{YBwZk1C^! zsR!pDEBe(VoyLoA>(MB>CiMDnkLzMoeMoq)fUj!yOVT6k_Ir#R^2d#^fJpedwA$<; z;`s&yVT#WhPz(A>6f_`bMKg{N;vd%e$j3S#!`$dT80~CG^C?%n*N9%Ap<-hrMAKp7 zVk2r5I$VlRUciu^f{~#jeeHPZxGkP$Cns?^P-KY=o0V3JB0Ws=Q*TQ$aD7m8 zmdwJ<6~P!GoXem5)ggvj{NTHb8&k_>cMPhtB7GhH5`T`Il>yUOYfK{8LUjOW5<_gJ znk&}?S{zn{6x?^?)th2k6ABYAHi2r5?^kJ&xY~rA=t9!qev3qdGz6AKZajylDzscI zN=KozSQMpGdeBva0!xcPVre?*!RlfW^9()vPjIXc6%(JKM7k<=psRjM?zOWtgG8r{ zwaDQmfmSc@FQK7=47h7-FmgrXW|UZZgyh8uN#QcU)W5}`X7pOZ=MosnkW-_Cyawqh z(1V^;+OCc?XJkQxJ&+iFbQJLW+!sd4nP!1ZhFynx-{6TNjpB!-*hic5BL$m0O)Ttu4Ia1d=(WNqq>)>Lex`GUVrQ_v-}L5!X+UT%XdHeal1LzU1SZbNPD^Cg-{KRlJpcc-+a zA-=TGz40x&=TBd|*LNpWd<#TCAF7A0X&>50OWo@G)LkjPRPNL8+5xgjT_A?{N8JC~ zy|X{zNdv=yNQTSAo`IBy(VL&r0i?#nLG&iNaf7H0g2lN(FsxM~{4*4WE>Zt8s%!H+ z`>1Qgho4aa6^q7MG=Nr$@3N3nSBf&()DFO&*_4XW!ffQ!mEu7*Vn?xPJ(x0_-U?g6 z?bWOZy!F6hQ#xmjAHzk_V0if|ad$A~1$y@A&@Yns)EtDaeD{_dP>Lw0(ui=+rt(m_CwWbDZAN*e`yfy<(m#fn(q$y9K6#HqT48VN4wmEC(tKEyWM~1Q7vDvU*k*KrcjZ%GL6Eh$Q>}9@OpdL-DMVq5*-l(XCwC= z5%F`Nha>LpbLhMkvo9^6ZVDBOHDA*rbe$K|`>1&jEr#tBxE)LA9i@Ud>pL`WNq_E? z6q{No#w^28h2pDa^m2tlkHDW^<}SOOUNpq8f+FdZ7`}q8VAm%r=_N2+%7q|vYBlOP znMeGxG$`ue4+xeVgsE(H)bPMwO=%L zUH2zzmiRfI%8G*$lKMOm^6c(E;)C zR*bH>!?uyr3i4A6U}#s|Zxv7`f#KadX(^p_f4qzEKylK2csI0*RW0_?sPF^waAcTi zg$55kGN!|RWjH+GzO+{sraMH`e#E~^qVIk~IKPDI4br@o(b?bfGnw=SLfck3$3+@Jv>?MLzzqi#^PJL)HzT`_VVvsj`m7Ry9` n)#5;(hjCpfaE`hoaz7gzK}Ok87lI> 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 ScN>~5=(eo(Tz^34yZj&i|J#26 diff --git a/plugins/official/license-header/dist/plugin.wasm.sources b/plugins/official/license-header/dist/plugin.wasm.sources index 6b9d7a3ea..e10cba55a 100644 --- a/plugins/official/license-header/dist/plugin.wasm.sources +++ b/plugins/official/license-header/dist/plugin.wasm.sources @@ -1 +1 @@ -a9bf8c6074ffb5d5335f07d6e5f1af6108faec0ca6e282a85684b991995baefc +e4f62cf323d7186dcdc2972b0330086bc6279dcdc884d1997a84c1a589e739f8 diff --git a/plugins/official/mybatis/dist/plugin.wasm b/plugins/official/mybatis/dist/plugin.wasm index b17ee3ee317644e1eb869c57b78cba4377c70516..2141ea7bb423e68522d0e053af4c09b3b906981c 100644 GIT binary patch delta 1642 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 delta 37462 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 delta 2879 zcmai$e^gXe9>CxCy_o@-L1s5peu(>KkS#P=eyk`;9v-V;CWWb(hM2jVF57lak(+I% zqb6bz5EmFZ+JXva1rx!G4xL6Ik6UQuijFu445%cDsH2gKh`Qg){BS6?{pWMv{r&Z%+ z{)BxmXU0wTjn%%6VL}flzPF3ZKehR)n8w;++kDVzTlR$EvT2(r1PktQ*A1V4{_XBZd3qY|-7NnFJqh>rreS{mZvW5bUCp5PPi=f$ z&iOcMIs8=bng`5KjMT%3Jc%ay(J#28`Z>C7=DTjP9RM=2tH75;{^1UMM!uZ4ogAFg z3zcN&T#-DKL{d99yn64jh?it(>S`JpUk2#Xnh=3h&8q=Q zznm8aa0KH`r@`~9fJ}-bic03=MLH8EkkfHf_(~ngiSq*`H9w~YFpz5tmW?qChZUqS zQnGLgU6&Xuz+v*nOF^_P31m>i9tpo>DOA$sOP&zm0Da@7iE=nZKUy&Z;2=GbIv~JN zdhFFkfC`%NN3#ZfR%ZAk-^*AACUQPw8e~%C_ITh2E|A>g>_YenH=kJ zEqPua47p^zJ~XJdm1)#Po3U@AAaTrsmt5_6wEsr`5K76ZopUe^sxE2~u#leJ&jKD8 z{*QrQRhe0kcuy`6!{|7viq0(d185{mN*d8}(w;r=a~pDI?^>{u=zTG0__uwp2Q~~R z8NzXnI9iZwGI2O9kc?DbdKSP+&1K!AM+_jn|4hWFGxihcBTf6$p`FB*`|(3&l2Y!= zmUqh2VJEp>z81N-V#6qTU8=|$Rr(D5;y|GsXCxffko4+s*iXu;R}AkD;WItF2xnpI z5soT`?x3$>uEbii5V~pHkz{}@T6A{1k)&PE}X=cXa0a|<<&ug9dOwGT-`u!BoVH%Da?IL%LOa)4t zP|GT^6`k3-($|qkt)P_+=kG`*?_z}3rVQbXf+Ty>Q_hORI{C*37|G&`N!Y})i}B8i zssxS9r3uiMfd-jv8!%0I`zy%T+F8nUqqcN@hT^SV5y+!m?;t}j%|NcXblS&pf=VkBg~Z3F zki^T|(d7K)-y!8!T9KVsSb$%5zmLrA4nfv+cOZ9v$84IuGa>g}W!LBY)mY^Cp0(bN z@IDDHq4RnooeFPPMQhJn=(pheQ^*O|Sk#1TMx?BlojkploqVMC_h6*Gy#eh0x%UMk zpYCI(DSiJ!YHzT+yy^y%d~&1QdCrIgp1;Xnk!?3c=VZOL3fDxwxVZ`q0&exV+uJRW zq`6c^u~iM)9GBpCOV-T|Cw*$*2> z&u4mnFq*FFk8-Lbka*(wkb?|?-Ab*gx;O<}#(sJJxZx=pS46&LUhuB2!53#pp{R1|U zgAe5HU^GxUEXQ9h{a816+M~Ojz3TXF>Nm`BgLVPs8YQGbzadKrZwJ5!dI*McTn@0M z#;{}xtP$XZ{#Xe3_~mynXZ7(dIvvL;Mf}9sU-?q~tq@q`S2|L!a_aL9DWUKu9!!Sg zVQ_}6BoYpJOw3E=IZ3C(e~JH|pLMG9Khfg!E!STTz0f@rq&K9_hWH?;(wD7<5Y1Me z;{rL3Q@g1-6|QgMUgNS)H~g>~s9az1XIL*s9cMI5O@k)^x(ti{0{8JBh2e$2f>+3Y E0Y&(c`~Uy| diff --git a/plugins/official/solidity/dist/plugin.wasm.sources b/plugins/official/solidity/dist/plugin.wasm.sources index 956a79eb4..11794ff4d 100644 --- a/plugins/official/solidity/dist/plugin.wasm.sources +++ b/plugins/official/solidity/dist/plugin.wasm.sources @@ -1 +1 @@ -674e164012c93a106a0c3977b1066d5a49524f8f8426fb09404e3b7a7340a629 +6d5d5b09fd48e9b48891a91b3dd13f9d0d2f1771685a549c683295370233ae17 diff --git a/plugins/official/string-tools/dist/plugin.wasm b/plugins/official/string-tools/dist/plugin.wasm index 647a81967f943815c50cae9f2b8c5bd59c4456fd..6ec0dd65ae10204de4a529fa6d7543335c8395a2 100644 GIT binary patch delta 3421 zcmcInc~n%_8GpY!10suHWm7?C24YaaG$5muC5(netqbB(72Fz^QhPwu;0l8%qO!@G za9P}H#F9h>8QMp!6i^gQvBxypm=jG+;zF97o@id8jkNZAj~Rp$n?HI^`Q!cGz2Eo! zzV+QZbUzyW_|f3{_nmRpdd+#GqqBzoT(p1&;@qM8he9*N0RjLo<^>3@%=(X^(THoT zY7<;?1XH^W{glNhT`VT2+)$$N!gS=)wv0O#1VXvQD$JD9{{UcbgE>#N>+hI;F2-$o6Nin)IJ|M{8j z|B#4Qj>_vL@)VaF+*Gpv*IT;(2$|3D)efr(JQ^8ft82xMTfd(i;qi#oWlUA2Jd{qB6n7BT)mjFpyeY z5i?!1MC(a2H*%EN92HU)llVil))g@kUgDtnI_~`fMv7Qe?$}~Bn+11q)>!F^&FN2TwL)l6Au3GT^+}v1Ad>TlFbL3AirS zz4jX@v&5IKdp^rs{DBev7 z$W;cz^jPYNqJ-G4YVI3@4npaZ7#zj-6?s)0{CQn0W}t~biA5Aj`6Lt81>CMuC_@Fo zPHKRucTcCr3DZrf!-QL)n$%3io&Um}Mzjv`5Yfmhiu zAl)Ea?CpGN0ya|Pni8;1&x!kVA_||s9W511L%9RB@#<_Ei`dzC8DH_t*+}i( zs-u;84w7-zR#T&7Jx=<^*rh&mH*6q{E0?l#{&40w0r?9 z3;9QfO*A`S?_t*iJq@ z6_Et_1Oc6@wt;3Ph&h>%W@Jvvt5z?#*y_{C@1$bwb7_|?MHms4Ekz(YC21)t9jWd~ ztFVON)G91QqvWs}d5&H;R5wA)*8qEeO*f=N>u`wq$bB;ACa_qW+b*7zPRVugHR;4I z^TKqjA&}GQGnM(243xO`8X6pQT2mLll|k-g9XCmCW*NDbsFn?t?okTQBK_nZu0sh{0Lao6$&JDJB zWhr%o@-fRiZ6oFpv~0vBg8WTLBY3b0M+gqQ4sU|m*RhVkD+^-?qOvfKU`-ang1e3= zgBrvHiqT#P+m@4F>k3;}3`)wj%6y)MWy9?;HE9f5H9dP+e8pyJlFTiep(FV1W*VF> z?zjckly=BeA@XY;2UWMm%pG#pJbFWH8%Bm43;vOtqLTkoi`4}#3!--e_1W@~jWlzGl} z`dDQC*X?w+b(QbH%j50&d(7^un=M+^9W~M=O>eKL%$MyzG!Y!yf#PS(&cr-18z)I{ zCtEF=PY$wZRg!~A1f4nfv#;Het3j*N%zWmIpEhF;DH(I=`k}Jr;zNSiohr|Uo!CLE z2Rji;FglNpF`54>Pt^?Fg=@58yAe)c+>Ka*tle1aX?NwD(9g}+q}M0$>@S&|k4!Q> zm5+A`Ht$i{Yxm$BtyUGNaa0tjad_{=1iJEO?1jHFu)o+xmx;`a_Nf-l`*4v~dHWIL zWGf-~8IIvRzZmW$dAJ{M^+hlswz@*~M>=3InR>Dx!oG4vI)2_@}5Av)!VUMv^TsD+SwBu2!n1T&>hExq5oM z&DG8HD!Sj?3+YEm569*{9|P)CP@&eTrJ{eGzNt{_w6GHQ$;B&GcD8C-xl~i9WInc9 z?P5x``elAtt#)z9K{R;NJ=fL%KUk!X8*s*r&fU^hI?T|{zi2~<^UVt7RH1Y7OG$qo zaa!76bBWHSgVJ9v;k!{Nl&;*xRYrKY8;_jmMk#-Qk4T*P5b+u+=&WxM&!2vSS@=?- zcP|I@@YkN;sRBKeOrccWgZCT^f2aZzOlC9vNAYw&oCQIsd^`8s$nM;g)+G(qO&2^< zrDDb&#?j4~o5=M1L?Y8c$1fzZWc_g_2mxgAiIa!mN?1l~eZRFunmCQQFdj35bq%I{ cf#iZ&a{noNk$yu-6K9eT=cK8#Sxv})0B*U$4*&oF delta 3423 zcmcInX;f9$6~5oO4B-31{7i)a7b1iYK$miP>_J4qJoHA z;2==N3dSZTMW1@D3nN$*wK!xISItnX307@xU24-v)Yk5M-yo*?r)!lT?|XYZ-`RVg za~_=!U%CD8m4-jM;zLWjYlgF{n?VFbh@vP@>rvQ4gr^e(0KHf*Kw$2cyFH>1d!VXW zaLX0UjW+btgaGX$Q2V%UQ`g$C(}sgIV_vm2wpL!=(`R(0P1>=mNzXV!b7|UXbvbM^ z*4QvYGuCmd@w%nC=bzvjcN{11DUKpu{&lZCsJBe;F)|#sEc87rqE24tXZ)W()BGP$ zqPGL`t%PEyZSs&g?uJiEYaV32W$Zhxj}jKCz!q7F$ux?*PwN} zqE>#8atO6@{hPUHmitea<96LQV@b{Ws63n$l&3VESiAl`sBVEPJh9zDtmZs_T zppb<#hIeb$^zM)`!$&?cqkz&y&1~gg2cw_-d2$6gEl-JK&3W>al)iA|vm)`jWz4Kn z;H-RU_Dr0$gr;tbN4u=-eHZPP{&fq1Q*u%LEmCFdOG1<7^u7!OPFqHObQU;i5kJnH zFN%V|*LdI#U+9TtxT#$6#7TxLN_h{Qa5CgGIPt^@@a5&c@I?pz#1})*psx;3*g5V)o z%V!k4YHVd{VAjLq)-85Mw06xZJ58%+|X7O5h;419g1h zU?icD8>ga=QZX2jpy&%j@HHBghM}0o(8k4ZWaA*u4M#kRcxyOaS<5Yzq3p))VB57V2EZx^I_($5sV_rBk*t5Q7T8z z8p+!tiJ(p_O7R(qDv>sSa1?K37%WBu7tK`P%{<18r9oGJ+#eInR-L4ig}Gh1WX7LCh52|qI$o02pP!7Swl{E( zIGX7Ld`}!!`qfxBe^j3mH_1g3CDGQ1Mm{v2NH_Ay@yMXIHpLUOt2{ITYhS?oXab5} ztd3GjCZfU#wft%#j65L`!*H8tC1Q?M^;?oQCn1@&b*-*KZQn~f;-{x!D(aNp$(Rnb zDa%r*t2Fw*dlP@?d#qeaG3!E4!wnjG;^kpNV2^m`=^2VLGPtoDF(i>Ud}> z)ptK%n2J?B8};GnGXLgAem52I{!O~UB!)19iAE!Yxx_nK+Qg^L!Duw`Vk?}V10zZ5 z94vle!bNj2oa|L|5lkob+V^2r zdBb~HN>2Wn7(g%~6F((L%f#?7$G&47?sk=n(clgni>|e}pNV-CK6N#E6Z~>D^+Dw| zt057bSWQ#W!adg@&d1KCK{Og1byoS3HP}Qh_t#)81uVc zrSh18sIP3k5Y5%mYT?b<=tC=gnT=X|?+lU~ z^{!woodlI%TdTXd~A; zNfOV+YXp~bagktm9()Ln=AnQfdL6wsRDyN*oFHMn9+$lyIVAnC9)k#8&8KTf?Lo3zcza-w$h8B^75^E#ObX#O;TZ@KH29Bb>*&N`17ZnURJ*% z6gbv@j+s)VpOd>qkR0vyHaT~t7`%<1R+VqshFb*7itV|pNgB1C*rIWV>=$9`IVkzE#F@@SvYPZVImm<>P@LY|&Wo##hIvJ@1DAP;TR;KY# zo|GX^D@RU+PHWyy`0;ZU_zkI6azwk>CQ;y@6`~JcRE6$j$*i&#CdaYfb2TZc)N9gO z`SP0lt5UBCEqBYl1pDz4)wb(I0^K6r-B^qS^HWUjGRMQJ^|JkJ`z29E-; zLAi1hml@%{+j!_gufneT_>#<74-hA6NARCi#tseQl$!5x$$; Vec; +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{Range, Severity, host, mock::MockHost}; + + struct Provider; + impl DiagnosticsProvider for Provider { + fn diagnostics(&mut self, doc: &Document) -> Vec { + vec![Diagnostic::new( + Range::default(), + Severity::Warning, + format!("{}:{}:{}", doc.language, doc.version, doc.text), + )] + } + } + + #[test] + fn the_mock_uses_unsaved_versioned_text_and_keeps_manual_problems() { + let mock = MockHost::install(); + mock.open_editor("/project/a.txt", "text", "a", &[]); + host::publish_diagnostics("/project/a.txt", &[Diagnostic::new(Range::default(), Severity::Info, "manual")]) + .unwrap(); + mock.type_in_editor("😀"); + mock.refresh_diagnostics(&mut Provider); + assert_eq!(mock.provider_diagnostics()["/project/a.txt"][0].message, "text:2:a😀"); + assert_eq!(mock.diagnostics()["/project/a.txt"][0].message, "manual"); + } + + #[test] + fn a_provider_needs_no_extra_capability_but_publishing_still_does() { + let mock = MockHost::install().with_capabilities(&[]); + mock.open_editor("/project/a.txt", "text", "unsaved", &[]); + mock.refresh_diagnostics(&mut Provider); + assert_eq!(mock.provider_diagnostics()["/project/a.txt"][0].message, "text:1:unsaved"); + assert!(host::publish_diagnostics("/project/a.txt", &[]).is_err()); + } +} diff --git a/sdk/rust/openidea-plugin/src/host.rs b/sdk/rust/openidea-plugin/src/host.rs index 8f84d945a..3e5f06ec3 100644 --- a/sdk/rust/openidea-plugin/src/host.rs +++ b/sdk/rust/openidea-plugin/src/host.rs @@ -377,39 +377,40 @@ mod imp { wit::fs::write_bytes(path, bytes).map_err(error) } - pub fn publish_diagnostics(path: &str, items: &[Diagnostic]) -> Result<(), Error> { + pub fn diagnostic_to(d: &Diagnostic) -> wit::diagnostics::Diagnostic { use wit::diagnostics::{Diagnostic as D, RelatedInformation as R, Severity as S}; - let items: Vec = items - .iter() - .map(|d| D { - range: range_out(d.range), - severity: match d.severity { - Severity::Error => S::Error, - Severity::Warning => S::Warning, - Severity::Info => S::Info, - Severity::Hint => S::Hint, - }, - message: d.message.clone(), - code: d.code.clone(), - source: d.source.clone(), - tags: [(d.unnecessary, "unnecessary"), (d.deprecated, "deprecated")] - .into_iter() - .filter(|(on, _)| *on) - .map(|(_, tag)| tag.to_owned()) - .collect(), - related: d - .related - .iter() - .map(|r| R { - location: wit::types::Location { - path: r.location.path.clone(), - range: range_out(r.location.range), - }, - message: r.message.clone(), - }) - .collect(), - }) - .collect(); + D { + range: range_out(d.range), + severity: match d.severity { + Severity::Error => S::Error, + Severity::Warning => S::Warning, + Severity::Info => S::Info, + Severity::Hint => S::Hint, + }, + message: d.message.clone(), + code: d.code.clone(), + source: d.source.clone(), + tags: [(d.unnecessary, "unnecessary"), (d.deprecated, "deprecated")] + .into_iter() + .filter(|(on, _)| *on) + .map(|(_, tag)| tag.to_owned()) + .collect(), + related: d + .related + .iter() + .map(|r| R { + location: wit::types::Location { + path: r.location.path.clone(), + range: range_out(r.location.range), + }, + message: r.message.clone(), + }) + .collect(), + } + } + + pub fn publish_diagnostics(path: &str, items: &[Diagnostic]) -> Result<(), Error> { + let items: Vec<_> = items.iter().map(diagnostic_to).collect(); wit::diagnostics::publish(path, &items).map_err(error) } @@ -1141,3 +1142,9 @@ pub fn notify_with_actions( ) -> Result<(), Error> { imp::notify_with_actions(level, title, body, actions) } + +#[cfg(target_arch = "wasm32")] +#[doc(hidden)] +pub fn __diagnostic_to(d: &Diagnostic) -> crate::bindings::openidea::plugin::diagnostics::Diagnostic { + imp::diagnostic_to(d) +} diff --git a/sdk/rust/openidea-plugin/src/lib.rs b/sdk/rust/openidea-plugin/src/lib.rs index 03c8e24a6..8518a3a4c 100644 --- a/sdk/rust/openidea-plugin/src/lib.rs +++ b/sdk/rust/openidea-plugin/src/lib.rs @@ -41,6 +41,7 @@ pub mod commit; pub mod details; +pub mod diagnostics; pub mod endpoints; pub mod file_actions; pub mod host; @@ -160,6 +161,20 @@ pub mod semantic_bindings { }); } +#[cfg(target_arch = "wasm32")] +#[doc(hidden)] +pub mod diagnostics_bindings { + wit_bindgen::generate!({ + world: "editor-diagnostics", path: "wit", pub_export_macro: true, + export_macro_name: "__export_diagnostics_world", + default_bindings_module: "openidea_plugin::diagnostics_bindings", + with: { + "openidea:plugin/types@1.3.0": crate::bindings::openidea::plugin::types, + "openidea:plugin/diagnostics@1.3.0": crate::bindings::openidea::plugin::diagnostics, + }, + }); +} + #[cfg(target_arch = "wasm32")] #[doc(hidden)] pub mod hover_bindings { @@ -292,6 +307,9 @@ macro_rules! __optional_exports { (details, $plugin:ty, $component:ident) => { $crate::__details_exports!($plugin, $component); }; + (diagnostics, $plugin:ty, $component:ident) => { + $crate::__diagnostics_exports!($plugin, $component); + }; (hover, $plugin:ty, $component:ident) => { $crate::__hover_exports!($plugin, $component); }; @@ -533,6 +551,21 @@ macro_rules! __semantic_tokens_exports { }; } +#[doc(hidden)] +#[macro_export] +macro_rules! __diagnostics_exports { + ($plugin:ty, $component:ident) => { + impl $crate::diagnostics_bindings::exports::openidea::plugin::diagnostics_provider::Guest for $component { + fn diagnostics( + doc: $crate::diagnostics_bindings::exports::openidea::plugin::diagnostics_provider::Document, + ) -> ::std::vec::Vec<$crate::bindings::openidea::plugin::diagnostics::Diagnostic> { + $crate::__rt::diagnostics::<$plugin>(doc) + } + } + $crate::diagnostics_bindings::__export_diagnostics_world!($component with_types_in $crate::diagnostics_bindings); + }; +} + #[doc(hidden)] #[macro_export] macro_rules! __hover_exports { @@ -820,6 +853,13 @@ pub mod __rt { .collect() } + pub fn diagnostics( + d: crate::diagnostics_bindings::exports::openidea::plugin::diagnostics_provider::Document, + ) -> Vec { + let doc = crate::providers::Document { path: d.path, language: d.language, version: d.version, text: d.text }; + with::(|p| p.diagnostics(&doc)).iter().map(crate::host::__diagnostic_to).collect() + } + pub fn hover( d: crate::hover_bindings::exports::openidea::plugin::hover_provider::Document, pos: b::types::Position, diff --git a/sdk/rust/openidea-plugin/src/mock.rs b/sdk/rust/openidea-plugin/src/mock.rs index 5b7967c7e..7d2d1b50e 100644 --- a/sdk/rust/openidea-plugin/src/mock.rs +++ b/sdk/rust/openidea-plugin/src/mock.rs @@ -110,6 +110,7 @@ struct State { answers: VecDeque>>, revealed_views: Vec, diagnostics: BTreeMap>, + provider_diagnostics: BTreeMap>, secrets: BTreeMap, net: Option, requests: Vec, @@ -362,6 +363,31 @@ impl MockHost { self.state.borrow().diagnostics.clone() } + /// Runs a diagnostics provider against the current mock editor snapshot. + /// This explicit call replaces the real host's debounce; it needs no capability. + pub fn refresh_diagnostics(&self, provider: &mut impl crate::diagnostics::DiagnosticsProvider) { + let document = self.state.borrow().editor.as_ref().map(|e| crate::diagnostics::Document { + path: e.path.clone(), + language: e.language.clone(), + version: e.version, + text: e.text.clone(), + }); + if let Some(document) = document { + let items = provider.diagnostics(&document); + let mut state = self.state.borrow_mut(); + if items.is_empty() { + state.provider_diagnostics.remove(&document.path); + } else { + state.provider_diagnostics.insert(document.path, items); + } + } + } + + /// Diagnostics returned by the provider, separate from manual publishing. + pub fn provider_diagnostics(&self) -> BTreeMap> { + self.state.borrow().provider_diagnostics.clone() + } + /// Views the plugin asked to refresh, in order. pub fn refreshed_views(&self) -> Vec { self.state.borrow().refreshed.clone() diff --git a/sdk/rust/openidea-plugin/tests/diagnostics_exports.rs b/sdk/rust/openidea-plugin/tests/diagnostics_exports.rs new file mode 100644 index 000000000..869e869d7 --- /dev/null +++ b/sdk/rust/openidea-plugin/tests/diagnostics_exports.rs @@ -0,0 +1,45 @@ +//! Inspect real components, including the two full export-order fixture features. +use std::collections::BTreeSet; +use std::path::{Path, PathBuf}; +use wit_parser::WorldItem; + +#[test] +fn diagnostics_registration_keeps_the_requested_interfaces() { + let path = std::env::var_os("OPENIDEA_DIAGNOSTICS_COMPONENT").map(PathBuf::from).unwrap_or_else(|| { + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../../crates/ide-plugin/tests/fixtures/diagnostics/dist/plugin.wasm") + }); + let wit_parser::decoding::DecodedWasm::Component(resolve, world) = + wit_parser::decoding::decode(&std::fs::read(&path).unwrap()).unwrap() + else { + panic!("expected a component") + }; + let actual: BTreeSet<_> = resolve.worlds[world] + .exports + .values() + .filter_map(|item| { + let WorldItem::Interface { id, .. } = item else { return None }; + let interface = &resolve.interfaces[*id]; + let package = &resolve.packages[interface.package?]; + (package.name.namespace == "openidea").then_some(interface.name.as_deref()).flatten() + }) + .collect(); + let mut expected = BTreeSet::from(["lifecycle", "commands", "event-handler", "diagnostics-provider"]); + if std::env::var_os("OPENIDEA_DIAGNOSTICS_COMBINED").is_some() { + expected.extend([ + "endpoints-provider", + "view-provider", + "document-indexer", + "syntax-provider", + "semantic-tokens-provider", + "hover-provider", + "providers", + "inlay-hints-provider", + "detail-provider", + "commit-checker", + "file-actions", + ]); + } + println!("{} exports {actual:?}", path.display()); + assert_eq!(actual, expected); +} diff --git a/sdk/rust/openidea-plugin/wit/diagnostics.wit b/sdk/rust/openidea-plugin/wit/diagnostics.wit new file mode 100644 index 000000000..c3bf18130 --- /dev/null +++ b/sdk/rust/openidea-plugin/wit/diagnostics.wit @@ -0,0 +1,15 @@ +package openidea:plugin@1.3.0; + +/// Optional diagnostics for the current, possibly unsaved document (API 1.3). +interface diagnostics-provider { + use diagnostics.{diagnostic}; + + record document { + path: string, + language: string, + version: u64, + text: string, + } + + diagnostics: func(doc: document) -> list; +} diff --git a/sdk/rust/openidea-plugin/wit/plugin.wit b/sdk/rust/openidea-plugin/wit/plugin.wit index 2f8afeb49..d619cba19 100644 --- a/sdk/rust/openidea-plugin/wit/plugin.wit +++ b/sdk/rust/openidea-plugin/wit/plugin.wit @@ -152,3 +152,14 @@ world plugin-endpoints { world endpoints { export endpoints-provider; } + +/// A plugin with diagnostics under `[[contributes.providers]]`. +world plugin-diagnostics { + include plugin; + export diagnostics-provider; +} + +/// `diagnostics` is already the released host interface name. +world editor-diagnostics { + export diagnostics-provider; +} diff --git a/src/features/plugins/__tests__/plugins.test.tsx b/src/features/plugins/__tests__/plugins.test.tsx index e00827d27..f8f2ed50d 100644 --- a/src/features/plugins/__tests__/plugins.test.tsx +++ b/src/features/plugins/__tests__/plugins.test.tsx @@ -135,6 +135,15 @@ afterEach(() => { }); describe("plugin actions", () => { + it("names manual and provider inspection producers after their plugin", async () => { + const { useProducerNames } = await import("@/platform/inspections"); + usePlugins.setState({ plugins: [plugin({ id: "a", name: "Alpha" })] }); + const stop = syncProjection(); + expect(useProducerNames.getState().names.get("plugin:a")).toBe("Alpha"); + expect(useProducerNames.getState().names.get("plugin-provider:a")).toBe("Alpha"); + stop(); + }); + it("projects command contributions to plugin.. actions", () => { const cmd = (pluginId: string, id: string, extra: Record = {}) => ({ pluginId, diff --git a/src/features/plugins/bridge.ts b/src/features/plugins/bridge.ts index 0a81aeb9a..a0fd057ce 100644 --- a/src/features/plugins/bridge.ts +++ b/src/features/plugins/bridge.ts @@ -53,7 +53,14 @@ export function syncProjection(): () => void { const s = usePlugins.getState(); syncUiContributions(localizeContributions(s.ui, usePluginCatalogs.getState().catalogs), s.plugins); // Their problems are listed by name in Settings › Inspections. - useProducerNames.setState({ names: new Map(s.plugins.map((p) => [`plugin:${p.id}`, p.name])) }); + useProducerNames.setState({ + names: new Map( + s.plugins.flatMap((p): [string, string][] => [ + [`plugin:${p.id}`, p.name], + [`plugin-provider:${p.id}`, p.name], + ]), + ), + }); }; const loadCatalogs = () => void loadPluginCatalogs(usePlugins.getState().ui, useI18n.getState().locale); apply(); diff --git a/wit/diagnostics.wit b/wit/diagnostics.wit new file mode 100644 index 000000000..c3bf18130 --- /dev/null +++ b/wit/diagnostics.wit @@ -0,0 +1,15 @@ +package openidea:plugin@1.3.0; + +/// Optional diagnostics for the current, possibly unsaved document (API 1.3). +interface diagnostics-provider { + use diagnostics.{diagnostic}; + + record document { + path: string, + language: string, + version: u64, + text: string, + } + + diagnostics: func(doc: document) -> list; +} diff --git a/wit/plugin.wit b/wit/plugin.wit index 2f8afeb49..d619cba19 100644 --- a/wit/plugin.wit +++ b/wit/plugin.wit @@ -152,3 +152,14 @@ world plugin-endpoints { world endpoints { export endpoints-provider; } + +/// A plugin with diagnostics under `[[contributes.providers]]`. +world plugin-diagnostics { + include plugin; + export diagnostics-provider; +} + +/// `diagnostics` is already the released host interface name. +world editor-diagnostics { + export diagnostics-provider; +}