Skip to content

Commit

Permalink
Add function_like_proc_macro_missing lint (#1021)
Browse files Browse the repository at this point in the history
Addresses a checkbox in #946

---------

Co-authored-by: Predrag Gruevski <[email protected]>
  • Loading branch information
malenaohl and obi1kenobi authored Dec 7, 2024
1 parent bcd001a commit f0d7df7
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 0 deletions.
42 changes: 42 additions & 0 deletions src/lints/function_like_proc_macro_missing.ron
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
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: None,
)
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()
}
14 changes: 14 additions & 0 deletions test_outputs/query_execution/function_like_proc_macro_missing.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
source: src/query.rs
expression: "&query_execution_results"
snapshot_kind: text
---
{
"./test_crates/function_like_proc_macro_missing/": [
{
"macro_name": String("make_answer"),
"span_begin_line": Uint64(4),
"span_filename": String("src/lib.rs"),
},
],
}

0 comments on commit f0d7df7

Please sign in to comment.