aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/hir_def/src/db.rs3
-rw-r--r--crates/hir_def/src/nameres/collector.rs4
-rw-r--r--crates/hir_def/src/test_db.rs9
-rw-r--r--crates/ide_db/src/lib.rs1
-rw-r--r--crates/rust-analyzer/src/config.rs6
-rw-r--r--crates/rust-analyzer/src/global_state.rs9
-rw-r--r--crates/rust-analyzer/src/reload.rs6
-rw-r--r--docs/user/generated_config.adoc5
-rw-r--r--editors/code/package.json5
9 files changed, 44 insertions, 4 deletions
diff --git a/crates/hir_def/src/db.rs b/crates/hir_def/src/db.rs
index 7eadc8e0d..c977971cd 100644
--- a/crates/hir_def/src/db.rs
+++ b/crates/hir_def/src/db.rs
@@ -51,6 +51,9 @@ pub trait InternDatabase: SourceDatabase {
51 51
52#[salsa::query_group(DefDatabaseStorage)] 52#[salsa::query_group(DefDatabaseStorage)]
53pub trait DefDatabase: InternDatabase + AstDatabase + Upcast<dyn AstDatabase> { 53pub trait DefDatabase: InternDatabase + AstDatabase + Upcast<dyn AstDatabase> {
54 #[salsa::input]
55 fn enable_proc_attr_macros(&self) -> bool;
56
54 #[salsa::invoke(ItemTree::file_item_tree_query)] 57 #[salsa::invoke(ItemTree::file_item_tree_query)]
55 fn file_item_tree(&self, file_id: HirFileId) -> Arc<ItemTree>; 58 fn file_item_tree(&self, file_id: HirFileId) -> Arc<ItemTree>;
56 59
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs
index 874a4ebb1..b2ce739bd 100644
--- a/crates/hir_def/src/nameres/collector.rs
+++ b/crates/hir_def/src/nameres/collector.rs
@@ -1067,6 +1067,10 @@ impl DefCollector<'_> {
1067 } 1067 }
1068 } 1068 }
1069 1069
1070 if !self.db.enable_proc_attr_macros() {
1071 return true;
1072 }
1073
1070 // Not resolved to a derive helper, so try to resolve as a macro. 1074 // Not resolved to a derive helper, so try to resolve as a macro.
1071 match attr_macro_as_call_id( 1075 match attr_macro_as_call_id(
1072 ast_id, 1076 ast_id,
diff --git a/crates/hir_def/src/test_db.rs b/crates/hir_def/src/test_db.rs
index e840fe5e8..b20b066e2 100644
--- a/crates/hir_def/src/test_db.rs
+++ b/crates/hir_def/src/test_db.rs
@@ -30,12 +30,19 @@ use crate::{
30 crate::db::InternDatabaseStorage, 30 crate::db::InternDatabaseStorage,
31 crate::db::DefDatabaseStorage 31 crate::db::DefDatabaseStorage
32)] 32)]
33#[derive(Default)]
34pub(crate) struct TestDB { 33pub(crate) struct TestDB {
35 storage: salsa::Storage<TestDB>, 34 storage: salsa::Storage<TestDB>,
36 events: Mutex<Option<Vec<salsa::Event>>>, 35 events: Mutex<Option<Vec<salsa::Event>>>,
37} 36}
38 37
38impl Default for TestDB {
39 fn default() -> Self {
40 let mut this = Self { storage: Default::default(), events: Default::default() };
41 this.set_enable_proc_attr_macros(true);
42 this
43 }
44}
45
39impl Upcast<dyn AstDatabase> for TestDB { 46impl Upcast<dyn AstDatabase> for TestDB {
40 fn upcast(&self) -> &(dyn AstDatabase + 'static) { 47 fn upcast(&self) -> &(dyn AstDatabase + 'static) {
41 &*self 48 &*self
diff --git a/crates/ide_db/src/lib.rs b/crates/ide_db/src/lib.rs
index 1f900aef4..105607dca 100644
--- a/crates/ide_db/src/lib.rs
+++ b/crates/ide_db/src/lib.rs
@@ -93,6 +93,7 @@ impl RootDatabase {
93 db.set_crate_graph_with_durability(Default::default(), Durability::HIGH); 93 db.set_crate_graph_with_durability(Default::default(), Durability::HIGH);
94 db.set_local_roots_with_durability(Default::default(), Durability::HIGH); 94 db.set_local_roots_with_durability(Default::default(), Durability::HIGH);
95 db.set_library_roots_with_durability(Default::default(), Durability::HIGH); 95 db.set_library_roots_with_durability(Default::default(), Durability::HIGH);
96 db.set_enable_proc_attr_macros(Default::default());
96 db.update_lru_capacity(lru_capacity); 97 db.update_lru_capacity(lru_capacity);
97 db 98 db
98 } 99 }
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index c33cdb740..d1f3c1b06 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -126,6 +126,9 @@ config_data! {
126 /// and a blue icon in the `Problems Panel`. 126 /// and a blue icon in the `Problems Panel`.
127 diagnostics_warningsAsInfo: Vec<String> = "[]", 127 diagnostics_warningsAsInfo: Vec<String> = "[]",
128 128
129 /// Expand attribute macros.
130 experimental_procAttrMacros: bool = "false",
131
129 /// Controls file watching implementation. 132 /// Controls file watching implementation.
130 files_watcher: String = "\"client\"", 133 files_watcher: String = "\"client\"",
131 /// These directories will be ignored by rust-analyzer. 134 /// These directories will be ignored by rust-analyzer.
@@ -546,6 +549,9 @@ impl Config {
546 let path = self.data.procMacro_server.clone().or_else(|| std::env::current_exe().ok())?; 549 let path = self.data.procMacro_server.clone().or_else(|| std::env::current_exe().ok())?;
547 Some((path, vec!["proc-macro".into()])) 550 Some((path, vec!["proc-macro".into()]))
548 } 551 }
552 pub fn expand_proc_attr_macros(&self) -> bool {
553 self.data.experimental_procAttrMacros
554 }
549 pub fn files(&self) -> FilesConfig { 555 pub fn files(&self) -> FilesConfig {
550 FilesConfig { 556 FilesConfig {
551 watcher: match self.data.files_watcher.as_str() { 557 watcher: match self.data.files_watcher.as_str() {
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index ea9dbf7fc..582a89667 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -119,12 +119,12 @@ impl GlobalState {
119 119
120 let analysis_host = AnalysisHost::new(config.lru_capacity()); 120 let analysis_host = AnalysisHost::new(config.lru_capacity());
121 let (flycheck_sender, flycheck_receiver) = unbounded(); 121 let (flycheck_sender, flycheck_receiver) = unbounded();
122 GlobalState { 122 let mut this = GlobalState {
123 sender, 123 sender,
124 req_queue: ReqQueue::default(), 124 req_queue: ReqQueue::default(),
125 task_pool, 125 task_pool,
126 loader, 126 loader,
127 config: Arc::new(config), 127 config: Arc::new(config.clone()),
128 analysis_host, 128 analysis_host,
129 diagnostics: Default::default(), 129 diagnostics: Default::default(),
130 mem_docs: FxHashMap::default(), 130 mem_docs: FxHashMap::default(),
@@ -151,7 +151,10 @@ impl GlobalState {
151 151
152 fetch_build_data_queue: OpQueue::default(), 152 fetch_build_data_queue: OpQueue::default(),
153 latest_requests: Default::default(), 153 latest_requests: Default::default(),
154 } 154 };
155 // Apply any required database inputs from the config.
156 this.update_configuration(config);
157 this
155 } 158 }
156 159
157 pub(crate) fn process_changes(&mut self) -> bool { 160 pub(crate) fn process_changes(&mut self) -> bool {
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs
index 93b5ff55f..bd31d1d13 100644
--- a/crates/rust-analyzer/src/reload.rs
+++ b/crates/rust-analyzer/src/reload.rs
@@ -2,6 +2,7 @@
2use std::{mem, sync::Arc}; 2use std::{mem, sync::Arc};
3 3
4use flycheck::{FlycheckConfig, FlycheckHandle}; 4use flycheck::{FlycheckConfig, FlycheckHandle};
5use hir::db::DefDatabase;
5use ide::Change; 6use ide::Change;
6use ide_db::base_db::{CrateGraph, SourceRoot, VfsPath}; 7use ide_db::base_db::{CrateGraph, SourceRoot, VfsPath};
7use project_model::{BuildDataCollector, BuildDataResult, ProcMacroClient, ProjectWorkspace}; 8use project_model::{BuildDataCollector, BuildDataResult, ProcMacroClient, ProjectWorkspace};
@@ -47,6 +48,11 @@ impl GlobalState {
47 } else if self.config.flycheck() != old_config.flycheck() { 48 } else if self.config.flycheck() != old_config.flycheck() {
48 self.reload_flycheck(); 49 self.reload_flycheck();
49 } 50 }
51
52 // Apply experimental feature flags.
53 self.analysis_host
54 .raw_database_mut()
55 .set_enable_proc_attr_macros(self.config.expand_proc_attr_macros());
50 } 56 }
51 pub(crate) fn maybe_refresh(&mut self, changes: &[(AbsPathBuf, ChangeKind)]) { 57 pub(crate) fn maybe_refresh(&mut self, changes: &[(AbsPathBuf, ChangeKind)]) {
52 if !changes.iter().any(|(path, kind)| is_interesting(path, *kind)) { 58 if !changes.iter().any(|(path, kind)| is_interesting(path, *kind)) {
diff --git a/docs/user/generated_config.adoc b/docs/user/generated_config.adoc
index 7f405b4d7..4eec8455d 100644
--- a/docs/user/generated_config.adoc
+++ b/docs/user/generated_config.adoc
@@ -181,6 +181,11 @@ List of warnings that should be displayed with info severity.
181The warnings will be indicated by a blue squiggly underline in code 181The warnings will be indicated by a blue squiggly underline in code
182and a blue icon in the `Problems Panel`. 182and a blue icon in the `Problems Panel`.
183-- 183--
184[[rust-analyzer.experimental.procAttrMacros]]rust-analyzer.experimental.procAttrMacros (default: `false`)::
185+
186--
187Expand attribute macros.
188--
184[[rust-analyzer.files.watcher]]rust-analyzer.files.watcher (default: `"client"`):: 189[[rust-analyzer.files.watcher]]rust-analyzer.files.watcher (default: `"client"`)::
185+ 190+
186-- 191--
diff --git a/editors/code/package.json b/editors/code/package.json
index 4a5070d02..bffc1e05b 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -617,6 +617,11 @@
617 "type": "string" 617 "type": "string"
618 } 618 }
619 }, 619 },
620 "rust-analyzer.experimental.procAttrMacros": {
621 "markdownDescription": "Expand attribute macros.",
622 "default": false,
623 "type": "boolean"
624 },
620 "rust-analyzer.files.watcher": { 625 "rust-analyzer.files.watcher": {
621 "markdownDescription": "Controls file watching implementation.", 626 "markdownDescription": "Controls file watching implementation.",
622 "default": "client", 627 "default": "client",