mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	This crate contains all the procedural macros ("proc macros")
shared by all the kernel.
Procedural macros allow to create syntax extensions. They run at
compile-time and can consume as well as produce Rust syntax.
For instance, the `module!` macro that is used by Rust modules
is implemented here. It allows to easily declare the equivalent
information to the `MODULE_*` macros in C modules, e.g.:
    module! {
        type: RustMinimal,
        name: b"rust_minimal",
        author: b"Rust for Linux Contributors",
        description: b"Rust minimal sample",
        license: b"GPL",
    }
Co-developed-by: Alex Gaynor <alex.gaynor@gmail.com>
Signed-off-by: Alex Gaynor <alex.gaynor@gmail.com>
Co-developed-by: Finn Behrens <me@kloenk.de>
Signed-off-by: Finn Behrens <me@kloenk.de>
Co-developed-by: Adam Bratschi-Kaye <ark.email@gmail.com>
Signed-off-by: Adam Bratschi-Kaye <ark.email@gmail.com>
Co-developed-by: Wedson Almeida Filho <wedsonaf@google.com>
Signed-off-by: Wedson Almeida Filho <wedsonaf@google.com>
Co-developed-by: Sumera Priyadarsini <sylphrenadin@gmail.com>
Signed-off-by: Sumera Priyadarsini <sylphrenadin@gmail.com>
Co-developed-by: Gary Guo <gary@garyguo.net>
Signed-off-by: Gary Guo <gary@garyguo.net>
Co-developed-by: Matthew Bakhtiari <dev@mtbk.me>
Signed-off-by: Matthew Bakhtiari <dev@mtbk.me>
Co-developed-by: Björn Roy Baron <bjorn3_gh@protonmail.com>
Signed-off-by: Björn Roy Baron <bjorn3_gh@protonmail.com>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
		
	
			
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
 | 
						|
use proc_macro::{token_stream, 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_byte_string(it: &mut token_stream::IntoIter) -> Option<String> {
 | 
						|
    try_literal(it).and_then(|byte_string| {
 | 
						|
        if byte_string.starts_with("b\"") && byte_string.ends_with('\"') {
 | 
						|
            Some(byte_string[2..byte_string.len() - 1].to_string())
 | 
						|
        } 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_byte_string(it: &mut token_stream::IntoIter) -> String {
 | 
						|
    try_byte_string(it).expect("Expected byte string")
 | 
						|
}
 | 
						|
 | 
						|
pub(crate) fn expect_end(it: &mut token_stream::IntoIter) {
 | 
						|
    if it.next().is_some() {
 | 
						|
        panic!("Expected end");
 | 
						|
    }
 | 
						|
}
 |