Skip to content

Commit 744b1f1

Browse files
authored
Merge pull request #449 from Kloenk/refactor-macro
Move macro helpers into helpers submodule
2 parents d04e27c + 8afcbae commit 744b1f1

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)