Repository navigation
Move lint validation to attribute parsing - #164918
JonathanBrouwer wants to merge 2 commits into
Conversation
| /// - `custom_tool::blah::bleh` -> `blah::bleh` | ||
| pub lint_name: Symbol, | ||
| /// For example, `single_use_lifetime` is changed to `single_use_lifetimes`. | ||
| pub lint_name_normalized: Symbol, |
There was a problem hiding this comment.
My goal for a follow-up PR is to change this field from a Symbol that needs to be looked up in LintStore to a LintId. I think this should be possible, but encoding and decoding will be a challenge. I think this PR is already a good step forwards regardless.
| pub use attributes::util::{is_builtin_attr, parse_version}; | ||
| pub use context::ShouldEmit; | ||
| pub use diagnostics::ParsedDescription; | ||
| pub use diagnostics::{ParsedDescription, RenamedLintSuggestion, UnknownLintSuggestion}; |
There was a problem hiding this comment.
I'm not sure if people find it cursed to export diagnostic structs such that they can be re-used. I like it
There was a problem hiding this comment.
I don't, it can hide unused diagnostics 😅
| CRATE_NODE_ID, | ||
| Some(self.features), | ||
| ShouldEmit::ErrorsAndLints { recovery: Recovery::Allowed }, | ||
| None, |
There was a problem hiding this comment.
This was wrong before! Oops!
There was a problem hiding this comment.
Can you add a test that would've caught this?
There was a problem hiding this comment.
Wait, is this actually a bug? I m pretty sure we didnt access this before.
There was a problem hiding this comment.
Yeah I don't think this is observable
| ), | ||
| }; | ||
|
|
||
| let lint_name_normalized = if let Some((_lint_ids, new_lint_name)) = |
There was a problem hiding this comment.
Note that we already have the lint_ids here! We just need to figure out how to encode & decode them in a follow-up PR!
|
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Move lint validation to attribute parsing
|
Some changes occurred in compiler/rustc_attr_parsing Some changes occurred in compiler/rustc_attr_ir
cc @rust-lang/clippy Some changes occurred in compiler/rustc_passes/src/check_attr.rs |
1a9e5b3 to
cb8338e
Compare
This comment has been minimized.
This comment has been minimized.
|
Finished benchmarking commit (00e2c28): comparison URL. Overall result: ✅ improvements - no action neededBenchmarking means the PR may be perf-sensitive. Consider adding rollup=never if this change is not fit for rolling up. @bors rollup=iffy rustc-perf Instruction countOur most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.
Max RSS (memory usage)Results (primary -0.5%, secondary -0.7%)A less reliable metric. May be of interest, but not used to determine the overall result above.
CyclesResults (primary 0.4%, secondary 0.6%)A less reliable metric. May be of interest, but not used to determine the overall result above.
Binary sizeThis perf run didn't have relevant results for this metric. Bootstrap: 487.351s -> 486.11s (-0.25%) |
This comment has been minimized.
This comment has been minimized.
cb8338e to
5a6079c
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
We will need the `lint_tools` in the next commits
This is a lot of code being moved around, but not much of the logic changes. I changed some stuff though, so I recommend reviewing the logic side by side.
5a6079c to
62ff266
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
There was a problem hiding this comment.
I don't think this change is correct, it means lowering ast to hir depends on what lints have been registered. Does this mean cargo clippy and cargo check could produce different artefacts? What happens when rust-analyzer decides to implement its own lints? (it's possible, it's a pregistered tool).
Can you talk to people more knowledgeable about this and get them to sign off on this? The people that are working on sharing cargo build caches probably have opinions about this.
@rustbot author
|
Discussion started in #t-compiler > What session state is hashed for incremental? @ 💬 |
|
Thanks for bringing that up, while I had considered quickly whether accessing the lint store during ast lowering is fine, I did not have a correct understanding of how this part of incremental worked. I assumed the lint store was tracked, but it's not and that's also fine. When tools will start sharing artifacts, we should track the lint store. Bjorn confirmed this behavior in the linked thread. |
| pub tool: Option<Ident>, | ||
| /// The lint's name, minus the tool name if any. | ||
| /// The full normalized lint name of an existing lint, including the tool name. | ||
| /// This may not be what we user wrote down, in case of renamed lints the new lint name is here. |
There was a problem hiding this comment.
Until #164607 this can also recover unknown lint names to a clippy lint even when it is not registered as renamed.
| pub use attributes::util::{is_builtin_attr, parse_version}; | ||
| pub use context::ShouldEmit; | ||
| pub use diagnostics::ParsedDescription; | ||
| pub use diagnostics::{ParsedDescription, RenamedLintSuggestion, UnknownLintSuggestion}; |
There was a problem hiding this comment.
I don't, it can hide unused diagnostics 😅
| @@ -45,13 +45,12 @@ | |||
| pub struct LintCheck { | |||
| /// The lint's tool name, if present. | |||
| pub tool: Option<Ident>, | |||
| /// Like mentioned above, multiple lint attributes and multiple lints | ||
| /// inside one attribute are all smooshed and flattened together, so | ||
| /// multiple `LintCheck`s can have the same `attr_span`. | ||
| pub attr_span: Span, |
| }; | ||
|
|
||
| let lint_name_normalized = if let Some((_lint_ids, new_lint_name)) = | ||
| Self::check_lint_name(lint_name, tool, p.span(), cx) |
There was a problem hiding this comment.
| Self::check_lint_name(lint_name, tool, p.span(), cx) | |
| LintParser::check_lint_name(lint_name, tool, p.span(), cx) |
Avoid using Self in non generic contexts
| } | ||
| } | ||
|
|
||
| fn check_lint_check(&self, hir_id: HirId, lints: &[LintCheck]) { |
There was a problem hiding this comment.
I wonder if this check can be in attribute parsing as well (didn't touch it during the initial port)
| &self, | ||
| lint_name: &str, | ||
| tool_name: Option<Symbol>, | ||
| registered_tools: &RegisteredTools, |
There was a problem hiding this comment.
| registered_tools: &RegisteredTools, | |
| lint_tools: &RegisteredTools, |
| new_lint_name | ||
| } else { | ||
| // Discard lint attributes with unknown lints in them | ||
| continue; |
There was a problem hiding this comment.
Please cover this in a test, I think it would be best to have a hir pretty test showing that unknown lints and lints whose tool is inactive are dropped.
| })) | ||
| } | ||
|
|
||
| fn check_lint_name( |
There was a problem hiding this comment.
| fn check_lint_name( | |
| fn check_attribute_lint_name( |
this looks a bit recursive, would be nice to have different names (or have check_lint_name inlined here).
| // We only want to emit these lints once, on the HIR. | ||
| // On the AST `target_span` will be `DUMMY_SP`, which we use to detect which instance we are. | ||
| // #164898 will fix this, after that PR this check can be removed | ||
| let should_lint = cx.target_span != DUMMY_SP; |
There was a problem hiding this comment.
I don't think this is a good idea:
- I would not accept this as a standalone PR (instead demanding a more rigorous fix)
- Try to keep behavior changes to a minimum during refactors
|
I also don't understand why this ought to block #164607 I still think we should store a |
|
This PR is a breaking change, it now correctly rejects unknown tool lints Consider the following code: macro_rules! wat {
() => {
#[allow(unused_attributes)]
{
#[allow(unregistered_tool::lint)]
println!("boo");
}
};
}
fn main() {
wat!();
}Behavior on current Rust (all channels) With this pr: |
|
Right, that's a fun one I didn't think about! |
|
☔ The latest upstream changes (presumably #165056) made this pull request unmergeable. Please resolve the merge conflicts by rebasing. |
View all comments
This is an alternative approach to #164607
This can be reviewed commit by commit, each commit passes tests.
My goal is for a follow-up to remove
lint_name_normalizedcompletely and replace it by aLintIdr? @mejrs