Skip to content

Commit 8afcbae

Browse files
committed
Move macro helpers into helpers submodule
This is in preperation for new marcos which are for example used for netlink related functions, and therefore having one big macro file is not practicable anymore. Signed-off-by: Finn Behrens <[email protected]> Signed-off-by: Finn Behrens <[email protected]>
1 parent d04e27c commit 8afcbae

File tree

3 files changed

+81
-75
lines changed

3 files changed

+81
-75
lines changed

rust/macros/helpers.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
3+
use proc_macro::{token_stream, Group, TokenTree};
4+
5+
pub fn try_ident(it: &mut token_stream::IntoIter) -> Option<String> {
6+
if let Some(TokenTree::Ident(ident)) = it.next() {
7+
Some(ident.to_string())
8+
} else {
9+
None
10+
}
11+
}
12+
13+
pub fn try_literal(it: &mut token_stream::IntoIter) -> Option<String> {
14+
if let Some(TokenTree::Literal(literal)) = it.next() {
15+
Some(literal.to_string())
16+
} else {
17+
None
18+
}
19+
}
20+
21+
pub fn try_byte_string(it: &mut token_stream::IntoIter) -> Option<String> {
22+
try_literal(it).and_then(|byte_string| {
23+
if byte_string.starts_with("b\"") && byte_string.ends_with('\"') {
24+
Some(byte_string[2..byte_string.len() - 1].to_string())
25+
} else {
26+
None
27+
}
28+
})
29+
}
30+
31+
pub fn expect_ident(it: &mut token_stream::IntoIter) -> String {
32+
try_ident(it).expect("Expected Ident")
33+
}
34+
35+
pub fn expect_punct(it: &mut token_stream::IntoIter) -> char {
36+
if let TokenTree::Punct(punct) = it.next().expect("Reached end of token stream for Punct") {
37+
punct.as_char()
38+
} else {
39+
panic!("Expected Punct");
40+
}
41+
}
42+
43+
pub fn expect_literal(it: &mut token_stream::IntoIter) -> String {
44+
try_literal(it).expect("Expected Literal")
45+
}
46+
47+
pub fn expect_group(it: &mut token_stream::IntoIter) -> Group {
48+
if let TokenTree::Group(group) = it.next().expect("Reached end of token stream for Group") {
49+
group
50+
} else {
51+
panic!("Expected Group");
52+
}
53+
}
54+
55+
pub fn expect_byte_string(it: &mut token_stream::IntoIter) -> String {
56+
try_byte_string(it).expect("Expected byte string")
57+
}
58+
59+
pub fn expect_end(it: &mut token_stream::IntoIter) {
60+
if it.next().is_some() {
61+
panic!("Expected end");
62+
}
63+
}
64+
65+
pub fn get_literal(it: &mut token_stream::IntoIter, expected_name: &str) -> String {
66+
assert_eq!(expect_ident(it), expected_name);
67+
assert_eq!(expect_punct(it), ':');
68+
let literal = expect_literal(it);
69+
assert_eq!(expect_punct(it), ',');
70+
literal
71+
}
72+
73+
pub fn get_byte_string(it: &mut token_stream::IntoIter, expected_name: &str) -> String {
74+
assert_eq!(expect_ident(it), expected_name);
75+
assert_eq!(expect_punct(it), ':');
76+
let byte_string = expect_byte_string(it);
77+
assert_eq!(expect_punct(it), ',');
78+
byte_string
79+
}

rust/macros/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
//! Crate for all kernel procedural macros.
44
5+
mod helpers;
56
mod module;
67

78
use proc_macro::TokenStream;

rust/macros/module.rs

Lines changed: 1 addition & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -2,59 +2,7 @@
22

33
use proc_macro::{token_stream, Delimiter, Group, Literal, TokenStream, TokenTree};
44

5-
fn try_ident(it: &mut token_stream::IntoIter) -> Option<String> {
6-
if let Some(TokenTree::Ident(ident)) = it.next() {
7-
Some(ident.to_string())
8-
} else {
9-
None
10-
}
11-
}
12-
13-
fn try_literal(it: &mut token_stream::IntoIter) -> Option<String> {
14-
if let Some(TokenTree::Literal(literal)) = it.next() {
15-
Some(literal.to_string())
16-
} else {
17-
None
18-
}
19-
}
20-
21-
fn try_byte_string(it: &mut token_stream::IntoIter) -> Option<String> {
22-
try_literal(it).and_then(|byte_string| {
23-
if byte_string.starts_with("b\"") && byte_string.ends_with('\"') {
24-
Some(byte_string[2..byte_string.len() - 1].to_string())
25-
} else {
26-
None
27-
}
28-
})
29-
}
30-
31-
fn expect_ident(it: &mut token_stream::IntoIter) -> String {
32-
try_ident(it).expect("Expected Ident")
33-
}
34-
35-
fn expect_punct(it: &mut token_stream::IntoIter) -> char {
36-
if let TokenTree::Punct(punct) = it.next().expect("Reached end of token stream for Punct") {
37-
punct.as_char()
38-
} else {
39-
panic!("Expected Punct");
40-
}
41-
}
42-
43-
fn expect_literal(it: &mut token_stream::IntoIter) -> String {
44-
try_literal(it).expect("Expected Literal")
45-
}
46-
47-
fn expect_group(it: &mut token_stream::IntoIter) -> Group {
48-
if let TokenTree::Group(group) = it.next().expect("Reached end of token stream for Group") {
49-
group
50-
} else {
51-
panic!("Expected Group");
52-
}
53-
}
54-
55-
fn expect_byte_string(it: &mut token_stream::IntoIter) -> String {
56-
try_byte_string(it).expect("Expected byte string")
57-
}
5+
use crate::helpers::*;
586

597
#[derive(Clone, PartialEq)]
608
enum ParamType {
@@ -88,28 +36,6 @@ fn expect_type(it: &mut token_stream::IntoIter) -> ParamType {
8836
}
8937
}
9038

91-
fn expect_end(it: &mut token_stream::IntoIter) {
92-
if it.next().is_some() {
93-
panic!("Expected end");
94-
}
95-
}
96-
97-
fn get_literal(it: &mut token_stream::IntoIter, expected_name: &str) -> String {
98-
assert_eq!(expect_ident(it), expected_name);
99-
assert_eq!(expect_punct(it), ':');
100-
let literal = expect_literal(it);
101-
assert_eq!(expect_punct(it), ',');
102-
literal
103-
}
104-
105-
fn get_byte_string(it: &mut token_stream::IntoIter, expected_name: &str) -> String {
106-
assert_eq!(expect_ident(it), expected_name);
107-
assert_eq!(expect_punct(it), ':');
108-
let byte_string = expect_byte_string(it);
109-
assert_eq!(expect_punct(it), ',');
110-
byte_string
111-
}
112-
11339
struct ModInfoBuilder<'a> {
11440
module: &'a str,
11541
counter: usize,

0 commit comments

Comments
 (0)