about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIshan Jain <contact@ishanjain.me>2024-06-12 11:03:04 +0530
committerIshan Jain <contact@ishanjain.me>2024-06-13 10:45:11 +0530
commite728026bc5cbbde6a7890c268d38efa55b192069 (patch)
tree8c90e8eb99aa3f081fcba9c03396c9eeb3af01d8
parenta97aef8466688d0d14fea1c311fa8db24173b5e1 (diff)
downloadrust-e728026bc5cbbde6a7890c268d38efa55b192069.tar.gz
rust-e728026bc5cbbde6a7890c268d38efa55b192069.zip
hir/semantics: Only allow expansion of specific built in macros
-rw-r--r--src/tools/rust-analyzer/crates/hir/src/semantics.rs32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/tools/rust-analyzer/crates/hir/src/semantics.rs b/src/tools/rust-analyzer/crates/hir/src/semantics.rs
index a38cef2fd5d..51510dd400d 100644
--- a/src/tools/rust-analyzer/crates/hir/src/semantics.rs
+++ b/src/tools/rust-analyzer/crates/hir/src/semantics.rs
@@ -19,8 +19,12 @@ use hir_def::{
     AsMacroCall, DefWithBodyId, FunctionId, MacroId, TraitId, VariantId,
 };
 use hir_expand::{
-    attrs::collect_attrs, db::ExpandDatabase, files::InRealFile, name::AsName, InMacroFile,
-    MacroCallId, MacroFileId, MacroFileIdExt,
+    attrs::collect_attrs,
+    builtin_fn_macro::{BuiltinFnLikeExpander, EagerExpander},
+    db::ExpandDatabase,
+    files::InRealFile,
+    name::AsName,
+    InMacroFile, MacroCallId, MacroFileId, MacroFileIdExt,
 };
 use itertools::Itertools;
 use rustc_hash::{FxHashMap, FxHashSet};
@@ -319,6 +323,30 @@ impl<'db> SemanticsImpl<'db> {
         } else {
             sa.expand(self.db, macro_call)?
         };
+        let macro_call = self.db.lookup_intern_macro_call(file_id.macro_call_id);
+
+        match macro_call.def.kind {
+            hir_expand::MacroDefKind::BuiltIn(
+                _,
+                BuiltinFnLikeExpander::Cfg
+                | BuiltinFnLikeExpander::StdPanic
+                | BuiltinFnLikeExpander::Stringify
+                | BuiltinFnLikeExpander::CorePanic,
+            )
+            | hir_expand::MacroDefKind::BuiltInEager(
+                _,
+                EagerExpander::Env
+                | EagerExpander::Concat
+                | EagerExpander::Include
+                | EagerExpander::OptionEnv
+                | EagerExpander::IncludeStr
+                | EagerExpander::ConcatBytes
+                | EagerExpander::IncludeBytes,
+            ) => {
+                // Do nothing and allow matching macros to be expanded
+            }
+            _ => return None,
+        }
 
         let node = self.parse_or_expand(file_id.into());
         Some(node)