From 0103f5df8fff2ccdbfb03adfe432b69c7840cf42 Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 16 Mar 2021 00:46:57 -0700 Subject: Fix missing unresolved macro diagnostic in function body --- crates/hir_def/src/body/diagnostics.rs | 6 +++++- crates/hir_def/src/body/lower.rs | 15 +++++++++++++-- crates/hir_def/src/body/tests.rs | 12 ++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) (limited to 'crates/hir_def/src/body') diff --git a/crates/hir_def/src/body/diagnostics.rs b/crates/hir_def/src/body/diagnostics.rs index 1de7d30e2..f6992c9a8 100644 --- a/crates/hir_def/src/body/diagnostics.rs +++ b/crates/hir_def/src/body/diagnostics.rs @@ -2,13 +2,14 @@ use hir_expand::diagnostics::DiagnosticSink; -use crate::diagnostics::{InactiveCode, MacroError, UnresolvedProcMacro}; +use crate::diagnostics::{InactiveCode, MacroError, UnresolvedMacroCall, UnresolvedProcMacro}; #[derive(Debug, Eq, PartialEq)] pub(crate) enum BodyDiagnostic { InactiveCode(InactiveCode), MacroError(MacroError), UnresolvedProcMacro(UnresolvedProcMacro), + UnresolvedMacroCall(UnresolvedMacroCall), } impl BodyDiagnostic { @@ -23,6 +24,9 @@ impl BodyDiagnostic { BodyDiagnostic::UnresolvedProcMacro(diag) => { sink.push(diag.clone()); } + BodyDiagnostic::UnresolvedMacroCall(diag) => { + sink.push(diag.clone()); + } } } } diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs index 8934ae6c9..08f0c32f4 100644 --- a/crates/hir_def/src/body/lower.rs +++ b/crates/hir_def/src/body/lower.rs @@ -24,7 +24,7 @@ use crate::{ body::{Body, BodySourceMap, Expander, LabelSource, PatPtr, SyntheticSyntax}, builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint}, db::DefDatabase, - diagnostics::{InactiveCode, MacroError, UnresolvedProcMacro}, + diagnostics::{InactiveCode, MacroError, UnresolvedMacroCall, UnresolvedProcMacro}, expr::{ dummy_expr_id, ArithOp, Array, BinaryOp, BindingAnnotation, CmpOp, Expr, ExprId, Label, LabelId, Literal, LogicOp, MatchArm, Ordering, Pat, PatId, RecordFieldPat, RecordLitField, @@ -33,7 +33,7 @@ use crate::{ item_scope::BuiltinShadowMode, path::{GenericArgs, Path}, type_ref::{Mutability, Rawness, TypeRef}, - AdtId, BlockLoc, ModuleDefId, + AdtId, BlockLoc, ModuleDefId, UnresolvedMacro, }; use super::{diagnostics::BodyDiagnostic, ExprSource, PatSource}; @@ -542,6 +542,17 @@ impl ExprCollector<'_> { let macro_call = self.expander.to_source(AstPtr::new(&e)); let res = self.expander.enter_expand(self.db, e); + let res = match res { + Ok(res) => res, + Err(UnresolvedMacro) => { + self.source_map.diagnostics.push(BodyDiagnostic::UnresolvedMacroCall( + UnresolvedMacroCall { file: outer_file, node: syntax_ptr.cast().unwrap() }, + )); + collector(self, None); + return; + } + }; + match &res.err { Some(ExpandError::UnresolvedProcMacro) => { self.source_map.diagnostics.push(BodyDiagnostic::UnresolvedProcMacro( diff --git a/crates/hir_def/src/body/tests.rs b/crates/hir_def/src/body/tests.rs index 991a32b15..f8e6f70e8 100644 --- a/crates/hir_def/src/body/tests.rs +++ b/crates/hir_def/src/body/tests.rs @@ -174,6 +174,18 @@ fn f() { ); } +#[test] +fn unresolved_macro_diag() { + check_diagnostics( + r#" +fn f() { + m!(); + //^^^^ unresolved macro call +} + "#, + ); +} + #[test] fn dollar_crate_in_builtin_macro() { check_diagnostics( -- cgit v1.2.3