-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtype_parameters.rs
62 lines (53 loc) · 2.21 KB
/
type_parameters.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/// Parse type parameters for generic functions/structs ([T], [A, B], etc.)
fn parse_type_parameters(&mut self) -> Result<Vec<ast::Identifier>, Error> {
let mut type_parameters = Vec::new();
// The current token should be '['
if self.current_token != Token::LBracket {
return Err(Error::from_str(
&format!("Expected '[' to start type parameters, got {:?}", self.current_token)
));
}
// Move past '['
self.next_token()?;
// Empty type parameters case
if self.current_token == Token::RBracket {
self.next_token()?; // Consume ']'
return Ok(type_parameters);
}
// Parse first type parameter
if let Token::Identifier(param_name) = &self.current_token {
type_parameters.push(ast::Identifier {
token: self.current_token.token_literal(),
value: param_name.clone(),
});
self.next_token()?;
} else {
return Err(Error::from_str(
&format!("Expected identifier as type parameter, got {:?}", self.current_token)
));
}
// Parse remaining type parameters
while self.current_token == Token::Comma {
self.next_token()?; // Consume ','
if let Token::Identifier(param_name) = &self.current_token {
type_parameters.push(ast::Identifier {
token: self.current_token.token_literal(),
value: param_name.clone(),
});
self.next_token()?;
} else {
return Err(Error::from_str(
&format!("Expected identifier after comma in type parameters, got {:?}", self.current_token)
));
}
}
// Expect closing bracket
if self.current_token != Token::RBracket {
return Err(Error::from_str(
&format!("Expected ']' after type parameters, got {:?}", self.current_token)
));
}
// Move past ']'
self.next_token()?;
Ok(type_parameters)
}