aboutsummaryrefslogtreecommitdiff
path: root/helix-view
diff options
context:
space:
mode:
authorkyfanc2024-02-13 10:58:53 +0000
committerGitHub2024-02-13 10:58:53 +0000
commitfe869e5dc7a8cd6c2c2e3945816bd890956eef3a (patch)
treead0b899b482df976caf3cc2f079dc7d0d8a3769f /helix-view
parent7934ac77143e69068420556b043dde035255340b (diff)
fix lsp config reload (#9415)
`syn_loader` was replaced rather than interior value being replace, old value was still being referenced and not updated after `:config-refresh`. By using `ArcSwap` like for `config`, each `.load()` call will return the most updated value. Co-authored-by: kyfan <kyfan@email>
Diffstat (limited to 'helix-view')
-rw-r--r--helix-view/src/document.rs20
-rw-r--r--helix-view/src/editor.rs11
2 files changed, 19 insertions, 12 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index 33137c6c..4e7b1de9 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -681,7 +681,7 @@ impl Document {
pub fn open(
path: &Path,
encoding: Option<&'static Encoding>,
- config_loader: Option<Arc<syntax::Loader>>,
+ config_loader: Option<Arc<ArcSwap<syntax::Loader>>>,
config: Arc<dyn DynAccess<Config>>,
) -> Result<Self, Error> {
// Open the file if it exists, otherwise assume it is a new file (and thus empty).
@@ -922,10 +922,11 @@ impl Document {
}
/// Detect the programming language based on the file type.
- pub fn detect_language(&mut self, config_loader: Arc<syntax::Loader>) {
+ pub fn detect_language(&mut self, config_loader: Arc<ArcSwap<syntax::Loader>>) {
+ let loader = config_loader.load();
self.set_language(
- self.detect_language_config(&config_loader),
- Some(config_loader),
+ self.detect_language_config(&loader),
+ Some(Arc::clone(&config_loader)),
);
}
@@ -1059,10 +1060,12 @@ impl Document {
pub fn set_language(
&mut self,
language_config: Option<Arc<helix_core::syntax::LanguageConfiguration>>,
- loader: Option<Arc<helix_core::syntax::Loader>>,
+ loader: Option<Arc<ArcSwap<helix_core::syntax::Loader>>>,
) {
if let (Some(language_config), Some(loader)) = (language_config, loader) {
- if let Some(highlight_config) = language_config.highlight_config(&loader.scopes()) {
+ if let Some(highlight_config) =
+ language_config.highlight_config(&(*loader).load().scopes())
+ {
self.syntax = Syntax::new(self.text.slice(..), highlight_config, loader);
}
@@ -1078,9 +1081,10 @@ impl Document {
pub fn set_language_by_language_id(
&mut self,
language_id: &str,
- config_loader: Arc<syntax::Loader>,
+ config_loader: Arc<ArcSwap<syntax::Loader>>,
) -> anyhow::Result<()> {
- let language_config = config_loader
+ let language_config = (*config_loader)
+ .load()
.language_config_for_language_id(language_id)
.ok_or_else(|| anyhow!("invalid language id: {}", language_id))?;
self.set_language(Some(language_config), Some(config_loader));
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 0fa6d67c..68b74cf0 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -50,7 +50,10 @@ use helix_stdx::path::canonicalize;
use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
-use arc_swap::access::{DynAccess, DynGuard};
+use arc_swap::{
+ access::{DynAccess, DynGuard},
+ ArcSwap,
+};
fn deserialize_duration_millis<'de, D>(deserializer: D) -> Result<Duration, D::Error>
where
@@ -918,7 +921,7 @@ pub struct Editor {
pub debugger_events: SelectAll<UnboundedReceiverStream<dap::Payload>>,
pub breakpoints: HashMap<PathBuf, Vec<Breakpoint>>,
- pub syn_loader: Arc<syntax::Loader>,
+ pub syn_loader: Arc<ArcSwap<syntax::Loader>>,
pub theme_loader: Arc<theme::Loader>,
/// last_theme is used for theme previews. We store the current theme here,
/// and if previewing is cancelled, we can return to it.
@@ -1029,7 +1032,7 @@ impl Editor {
pub fn new(
mut area: Rect,
theme_loader: Arc<theme::Loader>,
- syn_loader: Arc<syntax::Loader>,
+ syn_loader: Arc<ArcSwap<syntax::Loader>>,
config: Arc<dyn DynAccess<Config>>,
handlers: Handlers,
) -> Self {
@@ -1190,7 +1193,7 @@ impl Editor {
}
let scopes = theme.scopes();
- self.syn_loader.set_scopes(scopes.to_vec());
+ (*self.syn_loader).load().set_scopes(scopes.to_vec());
match preview {
ThemeAction::Preview => {