diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-17 07:20:28 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-17 07:20:28 +0000 |
commit | 6fcb5d772f16af0d1f62dad55fbde75072fb9e89 (patch) | |
tree | e4ddd896f9ca8ca1f99c346a49104b04bc4ca04c /crates/hir_def/src/body | |
parent | 83e6940efb42675226adb8d2856c095b8dce36c5 (diff) | |
parent | a79b5673e8f5d1f8d569bc7c984a293a972a7bb0 (diff) |
Merge #8048
8048: Fix missing unresolved macro diagnostic in function body r=edwin0cheng a=brandondong
This was an issue I found while working on https://github.com/rust-analyzer/rust-analyzer/pull/7970.
**Reproduction:**
1. Call a non-existent macro in a function body.
```
fn main() {
foo!();
}
```
2. No diagnostics are raised. An unresolved-macro-call diagnostic is expected.
3. If the macro call is instead outside of the function body, this works as expected.
I believe this worked previously and regressed in https://github.com/rust-analyzer/rust-analyzer/pull/7805.
**Behavior prior to https://github.com/rust-analyzer/rust-analyzer/pull/7805:**
- The unresolved-macro-call diagnostic did not exist. Instead, a macro-error diagnostic would be raised with the text "could not resolve macro [path]".
- This was implemented by adding an error to the error sink (https://github.com/rust-analyzer/rust-analyzer/pull/7805/files#diff-50a326c5ae465bd9b31ee4310186380aa06e4fa1f6b41dbc0aed5bcc656a3cb8L657).
- The error was propagated through https://github.com/rust-analyzer/rust-analyzer/blob/1a82af3527e476d52410ff4dfd2fb4c57466abcb/crates/hir_def/src/body.rs#L123 eventually reaching https://github.com/rust-analyzer/rust-analyzer/blob/1a82af3527e476d52410ff4dfd2fb4c57466abcb/crates/hir_def/src/body/lower.rs#L569.
**Behavior after:**
- Instead of writing to the error sink, an UnresolvedMacro error is now returned (https://github.com/rust-analyzer/rust-analyzer/pull/7805/files#diff-50a326c5ae465bd9b31ee4310186380aa06e4fa1f6b41dbc0aed5bcc656a3cb8R631).
- The parent caller throws away the error as its function signature is `Option<MacroCallId>` (https://github.com/rust-analyzer/rust-analyzer/pull/7805/files#diff-50a326c5ae465bd9b31ee4310186380aa06e4fa1f6b41dbc0aed5bcc656a3cb8R604).
- We instead now reach the warn condition (https://github.com/rust-analyzer/rust-analyzer/blob/1a82af3527e476d52410ff4dfd2fb4c57466abcb/crates/hir_def/src/body.rs#L124) and no diagnostics are created in https://github.com/rust-analyzer/rust-analyzer/blob/1a82af3527e476d52410ff4dfd2fb4c57466abcb/crates/hir_def/src/body/lower.rs#L575.
**Fix:**
- Make sure to propagate the UnresolvedMacro error. Report the error using the new unresolved-macro-call diagnostic.
Co-authored-by: Brandon <[email protected]>
Diffstat (limited to 'crates/hir_def/src/body')
-rw-r--r-- | crates/hir_def/src/body/diagnostics.rs | 6 | ||||
-rw-r--r-- | crates/hir_def/src/body/lower.rs | 15 | ||||
-rw-r--r-- | crates/hir_def/src/body/tests.rs | 12 |
3 files changed, 30 insertions, 3 deletions
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 @@ | |||
2 | 2 | ||
3 | use hir_expand::diagnostics::DiagnosticSink; | 3 | use hir_expand::diagnostics::DiagnosticSink; |
4 | 4 | ||
5 | use crate::diagnostics::{InactiveCode, MacroError, UnresolvedProcMacro}; | 5 | use crate::diagnostics::{InactiveCode, MacroError, UnresolvedMacroCall, UnresolvedProcMacro}; |
6 | 6 | ||
7 | #[derive(Debug, Eq, PartialEq)] | 7 | #[derive(Debug, Eq, PartialEq)] |
8 | pub(crate) enum BodyDiagnostic { | 8 | pub(crate) enum BodyDiagnostic { |
9 | InactiveCode(InactiveCode), | 9 | InactiveCode(InactiveCode), |
10 | MacroError(MacroError), | 10 | MacroError(MacroError), |
11 | UnresolvedProcMacro(UnresolvedProcMacro), | 11 | UnresolvedProcMacro(UnresolvedProcMacro), |
12 | UnresolvedMacroCall(UnresolvedMacroCall), | ||
12 | } | 13 | } |
13 | 14 | ||
14 | impl BodyDiagnostic { | 15 | impl BodyDiagnostic { |
@@ -23,6 +24,9 @@ impl BodyDiagnostic { | |||
23 | BodyDiagnostic::UnresolvedProcMacro(diag) => { | 24 | BodyDiagnostic::UnresolvedProcMacro(diag) => { |
24 | sink.push(diag.clone()); | 25 | sink.push(diag.clone()); |
25 | } | 26 | } |
27 | BodyDiagnostic::UnresolvedMacroCall(diag) => { | ||
28 | sink.push(diag.clone()); | ||
29 | } | ||
26 | } | 30 | } |
27 | } | 31 | } |
28 | } | 32 | } |
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs index 7052058f2..60b25db56 100644 --- a/crates/hir_def/src/body/lower.rs +++ b/crates/hir_def/src/body/lower.rs | |||
@@ -24,7 +24,7 @@ use crate::{ | |||
24 | body::{Body, BodySourceMap, Expander, LabelSource, PatPtr, SyntheticSyntax}, | 24 | body::{Body, BodySourceMap, Expander, LabelSource, PatPtr, SyntheticSyntax}, |
25 | builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint}, | 25 | builtin_type::{BuiltinFloat, BuiltinInt, BuiltinUint}, |
26 | db::DefDatabase, | 26 | db::DefDatabase, |
27 | diagnostics::{InactiveCode, MacroError, UnresolvedProcMacro}, | 27 | diagnostics::{InactiveCode, MacroError, UnresolvedMacroCall, UnresolvedProcMacro}, |
28 | expr::{ | 28 | expr::{ |
29 | dummy_expr_id, ArithOp, Array, BinaryOp, BindingAnnotation, CmpOp, Expr, ExprId, Label, | 29 | dummy_expr_id, ArithOp, Array, BinaryOp, BindingAnnotation, CmpOp, Expr, ExprId, Label, |
30 | LabelId, Literal, LogicOp, MatchArm, Ordering, Pat, PatId, RecordFieldPat, RecordLitField, | 30 | LabelId, Literal, LogicOp, MatchArm, Ordering, Pat, PatId, RecordFieldPat, RecordLitField, |
@@ -33,7 +33,7 @@ use crate::{ | |||
33 | item_scope::BuiltinShadowMode, | 33 | item_scope::BuiltinShadowMode, |
34 | path::{GenericArgs, Path}, | 34 | path::{GenericArgs, Path}, |
35 | type_ref::{Mutability, Rawness, TypeRef}, | 35 | type_ref::{Mutability, Rawness, TypeRef}, |
36 | AdtId, BlockLoc, ModuleDefId, | 36 | AdtId, BlockLoc, ModuleDefId, UnresolvedMacro, |
37 | }; | 37 | }; |
38 | 38 | ||
39 | use super::{diagnostics::BodyDiagnostic, ExprSource, PatSource}; | 39 | use super::{diagnostics::BodyDiagnostic, ExprSource, PatSource}; |
@@ -554,6 +554,17 @@ impl ExprCollector<'_> { | |||
554 | let macro_call = self.expander.to_source(AstPtr::new(&e)); | 554 | let macro_call = self.expander.to_source(AstPtr::new(&e)); |
555 | let res = self.expander.enter_expand(self.db, e); | 555 | let res = self.expander.enter_expand(self.db, e); |
556 | 556 | ||
557 | let res = match res { | ||
558 | Ok(res) => res, | ||
559 | Err(UnresolvedMacro) => { | ||
560 | self.source_map.diagnostics.push(BodyDiagnostic::UnresolvedMacroCall( | ||
561 | UnresolvedMacroCall { file: outer_file, node: syntax_ptr.cast().unwrap() }, | ||
562 | )); | ||
563 | collector(self, None); | ||
564 | return; | ||
565 | } | ||
566 | }; | ||
567 | |||
557 | match &res.err { | 568 | match &res.err { |
558 | Some(ExpandError::UnresolvedProcMacro) => { | 569 | Some(ExpandError::UnresolvedProcMacro) => { |
559 | self.source_map.diagnostics.push(BodyDiagnostic::UnresolvedProcMacro( | 570 | 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 | |||
@@ -175,6 +175,18 @@ fn f() { | |||
175 | } | 175 | } |
176 | 176 | ||
177 | #[test] | 177 | #[test] |
178 | fn unresolved_macro_diag() { | ||
179 | check_diagnostics( | ||
180 | r#" | ||
181 | fn f() { | ||
182 | m!(); | ||
183 | //^^^^ unresolved macro call | ||
184 | } | ||
185 | "#, | ||
186 | ); | ||
187 | } | ||
188 | |||
189 | #[test] | ||
178 | fn dollar_crate_in_builtin_macro() { | 190 | fn dollar_crate_in_builtin_macro() { |
179 | check_diagnostics( | 191 | check_diagnostics( |
180 | r#" | 192 | r#" |