Skip to content

Commit dbc0f0b

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]>
1 parent bc33ea8 commit dbc0f0b

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(crate) 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(crate) 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(crate) 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(crate) fn expect_ident(it: &mut token_stream::IntoIter) -> String {
32+
try_ident(it).expect("Expected Ident")
33+
}
34+
35+
pub(crate) 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(crate) fn expect_literal(it: &mut token_stream::IntoIter) -> String {
44+
try_literal(it).expect("Expected Literal")
45+
}
46+
47+
pub(crate) 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(crate) fn expect_byte_string(it: &mut token_stream::IntoIter) -> String {
56+
try_byte_string(it).expect("Expected byte string")
57+
}
58+
59+
pub(crate) fn expect_end(it: &mut token_stream::IntoIter) {
60+
if it.next().is_some() {
61+
panic!("Expected end");
62+
}
63+
}
64+
65+
pub(crate) 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(crate) 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)