forked from mirrors/linux
		
	 1fbde52bde
			
		
	
	
		1fbde52bde
		
	
	
	
	
		
			
			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");
 | |
|     }
 | |
| }
 |