Skip to content
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

Add function_like_proc_macro_missing lint #1021

Merged
merged 9 commits into from
Dec 7, 2024
44 changes: 44 additions & 0 deletions src/lints/function_like_proc_macro_missing.ron
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
SemverQuery(
id: "function_like_proc_macro_missing",
human_readable_name: "function-like proc macro removed",
description: "A function-like procedural macro that previously existed has been removed.",
required_update: Major,
lint_level: Deny,
reference_link: Some("https://doc.rust-lang.org/reference/procedural-macros.html#function-like-procedural-macros"),
query: r#"
{
CrateDiff {
baseline {
item {
... on FunctionLikeProcMacro {
macro_name: name @output @tag
visibility_limit @filter(op: "=", value: ["$public"])

# Get span info from the baseline for error reporting
span_: span @optional {
filename @output
begin_line @output
}
}
}
}

current @fold @transform(op: "count") @filter(op: "=", value: ["$zero"]) {
item {
... on FunctionLikeProcMacro {
name @filter(op: "=", value: ["%macro_name"])
}
}
}
}
}"#,
arguments: {
"public": "public",
"zero": 0,
},
error_message: "A function-like procedural macro has been removed. Any code that invokes this macro will fail to compile.",
per_result_error_template: Some("macro {{macro_name}} in file {{span_filename}}:{{span_begin_line}}"),
witness: Some((
hint_template: r#"{{macro_name}}!(...);"#,
)),
obi1kenobi marked this conversation as resolved.
Show resolved Hide resolved
)
1 change: 1 addition & 0 deletions src/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,7 @@ add_lints!(
function_changed_abi,
function_const_removed,
function_export_name_changed,
function_like_proc_macro_missing,
function_missing,
function_must_use_added,
function_now_doc_hidden,
Expand Down
10 changes: 10 additions & 0 deletions test_crates/function_like_proc_macro_missing/new/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
publish = false
name = "function_like_proc_macro_missing"
version = "0.1.0"
edition = "2021"

[lib]
proc-macro = true

[dependencies]
20 changes: 20 additions & 0 deletions test_crates/function_like_proc_macro_missing/new/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use proc_macro::TokenStream;

// make_answer is removed

// Keep this to verify we don't have false positives
#[proc_macro]
pub fn another_macro(_item: TokenStream) -> TokenStream {
"fn other() -> u32 { 0 }".parse().unwrap()
}

// Keep other macro types to verify we don't detect their changes
#[proc_macro_derive(MyDerive)]
pub fn my_derive(_item: TokenStream) -> TokenStream {
TokenStream::new()
}

#[proc_macro_attribute]
pub fn my_attribute(_attr: TokenStream, _item: TokenStream) -> TokenStream {
TokenStream::new()
}
10 changes: 10 additions & 0 deletions test_crates/function_like_proc_macro_missing/old/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
publish = false
name = "function_like_proc_macro_missing"
version = "0.1.0"
edition = "2021"

[lib]
proc-macro = true

[dependencies]
23 changes: 23 additions & 0 deletions test_crates/function_like_proc_macro_missing/old/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use proc_macro::TokenStream;

#[proc_macro]
pub fn make_answer(_item: TokenStream) -> TokenStream {
"fn answer() -> u32 { 42 }".parse().unwrap()
}

// Will keep this one to ensure we don't have false positives
#[proc_macro]
pub fn another_macro(_item: TokenStream) -> TokenStream {
"fn other() -> u32 { 0 }".parse().unwrap()
}

// Other kinds of proc macros that should not trigger this lint
#[proc_macro_derive(MyDerive)]
pub fn my_derive(_item: TokenStream) -> TokenStream {
TokenStream::new()
}

#[proc_macro_attribute]
pub fn my_attribute(_attr: TokenStream, _item: TokenStream) -> TokenStream {
TokenStream::new()
}
obi1kenobi marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
source: src/query.rs
expression: "&query_execution_results"
---
{
"./test_crates/function_like_proc_macro_missing/": [
// TODO
]
}
Loading