From 05729fd3c4aa542d162b54e7352c0d4bade62684 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 28 Feb 2021 14:12:11 +0300 Subject: For unresolved macros, hightlight only the last segment --- crates/hir_def/src/lib.rs | 114 +++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 58 deletions(-) (limited to 'crates/hir_def/src/lib.rs') diff --git a/crates/hir_def/src/lib.rs b/crates/hir_def/src/lib.rs index b50923747..6802bc250 100644 --- a/crates/hir_def/src/lib.rs +++ b/crates/hir_def/src/lib.rs @@ -57,8 +57,10 @@ use std::{ use base_db::{impl_intern_key, salsa, CrateId}; use hir_expand::{ - ast_id_map::FileAstId, eager::expand_eager_macro, hygiene::Hygiene, AstId, HirFileId, InFile, - MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, + ast_id_map::FileAstId, + eager::{expand_eager_macro, ErrorEmitted}, + hygiene::Hygiene, + AstId, HirFileId, InFile, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, }; use la_arena::Idx; use nameres::DefMap; @@ -592,8 +594,15 @@ impl AsMacroCall for InFile<&ast::MacroCall> { error_sink(mbe::ExpandError::Other("malformed macro invocation".into())); } - AstIdWithPath::new(ast_id.file_id, ast_id.value, path?) - .as_call_id_with_errors(db, krate, resolver, error_sink) + macro_call_as_call_id( + &AstIdWithPath::new(ast_id.file_id, ast_id.value, path?), + db, + krate, + resolver, + error_sink, + ) + .ok()? + .ok() } } @@ -610,61 +619,50 @@ impl AstIdWithPath { } } -impl AsMacroCall for AstIdWithPath { - fn as_call_id_with_errors( - &self, - db: &dyn db::DefDatabase, - krate: CrateId, - resolver: impl Fn(path::ModPath) -> Option, - error_sink: &mut dyn FnMut(mbe::ExpandError), - ) -> Option { - let def: MacroDefId = resolver(self.path.clone()).or_else(|| { - error_sink(mbe::ExpandError::Other(format!("could not resolve macro `{}`", self.path))); - None - })?; - - if let MacroDefKind::BuiltInEager(_) = def.kind { - let macro_call = InFile::new(self.ast_id.file_id, self.ast_id.to_node(db.upcast())); - let hygiene = Hygiene::new(db.upcast(), self.ast_id.file_id); - - Some( - expand_eager_macro( - db.upcast(), - krate, - macro_call, - def, - &|path: ast::Path| resolver(path::ModPath::from_src(path, &hygiene)?), - error_sink, - ) - .ok()? - .into(), - ) - } else { - Some(def.as_lazy_macro(db.upcast(), krate, MacroCallKind::FnLike(self.ast_id)).into()) - } - } +struct UnresolvedMacro; + +fn macro_call_as_call_id( + call: &AstIdWithPath, + db: &dyn db::DefDatabase, + krate: CrateId, + resolver: impl Fn(path::ModPath) -> Option, + error_sink: &mut dyn FnMut(mbe::ExpandError), +) -> Result, UnresolvedMacro> { + let def: MacroDefId = resolver(call.path.clone()).ok_or(UnresolvedMacro)?; + + let res = if let MacroDefKind::BuiltInEager(_) = def.kind { + let macro_call = InFile::new(call.ast_id.file_id, call.ast_id.to_node(db.upcast())); + let hygiene = Hygiene::new(db.upcast(), call.ast_id.file_id); + + expand_eager_macro( + db.upcast(), + krate, + macro_call, + def, + &|path: ast::Path| resolver(path::ModPath::from_src(path, &hygiene)?), + error_sink, + ) + .map(MacroCallId::from) + } else { + Ok(def.as_lazy_macro(db.upcast(), krate, MacroCallKind::FnLike(call.ast_id)).into()) + }; + Ok(res) } -impl AsMacroCall for AstIdWithPath { - fn as_call_id_with_errors( - &self, - db: &dyn db::DefDatabase, - krate: CrateId, - resolver: impl Fn(path::ModPath) -> Option, - error_sink: &mut dyn FnMut(mbe::ExpandError), - ) -> Option { - let def: MacroDefId = resolver(self.path.clone()).or_else(|| { - error_sink(mbe::ExpandError::Other(format!("could not resolve macro `{}`", self.path))); - None - })?; - - Some( - def.as_lazy_macro( - db.upcast(), - krate, - MacroCallKind::Attr(self.ast_id, self.path.segments().last()?.to_string()), - ) - .into(), +fn item_attr_as_call_id( + item_attr: &AstIdWithPath, + db: &dyn db::DefDatabase, + krate: CrateId, + resolver: impl Fn(path::ModPath) -> Option, +) -> Result { + let def: MacroDefId = resolver(item_attr.path.clone()).ok_or(UnresolvedMacro)?; + let last_segment = item_attr.path.segments().last().ok_or(UnresolvedMacro)?; + let res = def + .as_lazy_macro( + db.upcast(), + krate, + MacroCallKind::Attr(item_attr.ast_id, last_segment.to_string()), ) - } + .into(); + Ok(res) } -- cgit v1.2.3