-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix incorrect diagnostics for failing built in macros #7970
Fix incorrect diagnostics for failing built in macros #7970
Conversation
Thanks, this looks good! Can you add a test to check_diagnostics(
r#"
#[rustc_builtin_macro]
macro_rules! include { () => {} }
include!("doesntexist");
//^^^^^^^^^^^^^^^^^^^^^^^ <text of diagnostic>
"#,
); |
Just to clarify, the behavior before my changes is that an incorrect unresolved-macro-call diagnostic would be raised in this scenario. No macro-error diagnostic on the other hand would be raised. This is because in collector:resolve_macros, directive.legacy is None since eager expansion failed in collector:collect_macro_call. The macro_call_as_call_id fails to resolve since we're retrying in module scope. Therefore, collect_macro_expansion is not called for the macro and no macro-error diagnostic is generated. I believe that even if the code did make it there successfully, it would stop in collector:collect_macro_expansion because of the FIXME to handle eager macros. My change only removes the incorrect unresolved-macro-call diagnostic. I can create a test to assert no diagnostics if that is desired. I am assuming the optimal behavior of the system would be something like:
I could try implementing the first bullet point as well but it appears to be a much more involved change. |
Hmm, I see. I'm not entirely sure what the best fix here is – it's a bit complicated with eager expansion happening effectively during macro resolution. |
b03e5e6
to
2df637f
Compare
I took a look at the missing macro-error diagnostic issue. I believe I have a better understanding of the code now and redid the fix. If you could take another look, that would be greatly appreciated. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, thanks! Left one minor nit.
Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
bors r+ |
8048: Fix missing unresolved macro diagnostic in function body r=edwin0cheng a=brandondong This was an issue I found while working on #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 #7805. **Behavior prior to #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 <brandondong604@hotmail.com>
changelog fix |
Reproduction:
lib.rs
Root cause for incorrect unresolved-macro-call diagnostic:
Root cause for missing macro-error diagnostic:
Fix: