mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

In preparation of splitting off the pin-init crate from the kernel crate, move all pin-init API code (including proc-macros) into `rust/pin-init`. Moved modules have their import path adjusted via the `#[path = "..."]` attribute. This allows the files to still be imported in the kernel crate even though the files are in different directories. Code that is moved out of files (but the file itself stays where it is) is imported via the `include!` macro. This also allows the code to be moved while still being part of the kernel crate. Note that this commit moves the generics parsing code out of the GPL-2.0 file `rust/macros/helpers.rs` into the Apache-2.0 OR MIT file `rust/pin_init/internal/src/helpers.rs`. I am the sole author of that code and it already is available with that license at [1]. The same is true for the entry-points of the proc-macros `pin_data`, `pinned_drop` and `derive_zeroable` in `rust/macros/lib.rs` that are moved to `rust/pin_data/internal/src/lib.rs`. Although there are some smaller patches that fix the doctests. Link: https://github.com/Rust-for-Linux/pinned-init [1] Signed-off-by: Benno Lossin <benno.lossin@proton.me> Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org> Reviewed-by: Fiona Behrens <me@kloenk.dev> Tested-by: Andreas Hindborg <a.hindborg@kernel.org> Link: https://lore.kernel.org/r/20250308110339.2997091-3-benno.lossin@proton.me Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
91 lines
2.7 KiB
Rust
91 lines
2.7 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
use proc_macro::{token_stream, Group, Ident, TokenStream, TokenTree};
|
|
|
|
pub(crate) fn try_ident(it: &mut token_stream::IntoIter) -> Option<String> {
|
|
if let Some(TokenTree::Ident(ident)) = it.next() {
|
|
Some(ident.to_string())
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
pub(crate) fn try_literal(it: &mut token_stream::IntoIter) -> Option<String> {
|
|
if let Some(TokenTree::Literal(literal)) = it.next() {
|
|
Some(literal.to_string())
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
pub(crate) fn try_string(it: &mut token_stream::IntoIter) -> Option<String> {
|
|
try_literal(it).and_then(|string| {
|
|
if string.starts_with('\"') && string.ends_with('\"') {
|
|
let content = &string[1..string.len() - 1];
|
|
if content.contains('\\') {
|
|
panic!("Escape sequences in string literals not yet handled");
|
|
}
|
|
Some(content.to_string())
|
|
} else if string.starts_with("r\"") {
|
|
panic!("Raw string literals are not yet handled");
|
|
} else {
|
|
None
|
|
}
|
|
})
|
|
}
|
|
|
|
pub(crate) fn expect_ident(it: &mut token_stream::IntoIter) -> String {
|
|
try_ident(it).expect("Expected Ident")
|
|
}
|
|
|
|
pub(crate) fn expect_punct(it: &mut token_stream::IntoIter) -> char {
|
|
if let TokenTree::Punct(punct) = it.next().expect("Reached end of token stream for Punct") {
|
|
punct.as_char()
|
|
} else {
|
|
panic!("Expected Punct");
|
|
}
|
|
}
|
|
|
|
pub(crate) fn expect_string(it: &mut token_stream::IntoIter) -> String {
|
|
try_string(it).expect("Expected string")
|
|
}
|
|
|
|
pub(crate) fn expect_string_ascii(it: &mut token_stream::IntoIter) -> String {
|
|
let string = try_string(it).expect("Expected string");
|
|
assert!(string.is_ascii(), "Expected ASCII string");
|
|
string
|
|
}
|
|
|
|
pub(crate) fn expect_group(it: &mut token_stream::IntoIter) -> Group {
|
|
if let TokenTree::Group(group) = it.next().expect("Reached end of token stream for Group") {
|
|
group
|
|
} else {
|
|
panic!("Expected Group");
|
|
}
|
|
}
|
|
|
|
pub(crate) fn expect_end(it: &mut token_stream::IntoIter) {
|
|
if it.next().is_some() {
|
|
panic!("Expected end");
|
|
}
|
|
}
|
|
|
|
/// Given a function declaration, finds the name of the function.
|
|
pub(crate) fn function_name(input: TokenStream) -> Option<Ident> {
|
|
let mut input = input.into_iter();
|
|
while let Some(token) = input.next() {
|
|
match token {
|
|
TokenTree::Ident(i) if i.to_string() == "fn" => {
|
|
if let Some(TokenTree::Ident(i)) = input.next() {
|
|
return Some(i);
|
|
}
|
|
return None;
|
|
}
|
|
_ => continue,
|
|
}
|
|
}
|
|
None
|
|
}
|
|
|
|
include!("../pin-init/internal/src/helpers.rs");
|