Skip to content

Commit aa7e48e

Browse files
committed
Added experimental shorthand generics syntax for when only specifying a single type argument
1 parent f369606 commit aa7e48e

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

Diff for: src/lexer/mod.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ impl<T: Text + Send> Lexer<T> {
4242
State::String(_) => self.feed_string(),
4343
State::Number(_) => self.feed_number(),
4444
State::HexNumber(_) => self.feed_hex_number(),
45+
State::ShortGeneric => self.feed_short_generic(),
4546
}
4647
}
4748

@@ -378,7 +379,7 @@ impl<T: Text + Send> Lexer<T> {
378379
}
379380
_ => {
380381
let token = state.finalize();
381-
self.state = State::Idle;
382+
self.state = State::ShortGeneric;
382383
Has(token)
383384
}
384385
}
@@ -517,6 +518,16 @@ impl<T: Text + Send> Lexer<T> {
517518
Has(token)
518519
}
519520
}
521+
522+
fn feed_short_generic(&mut self) -> FeedResult<Token> {
523+
self.state = State::Idle;
524+
525+
if let Ok(source) = self.characters.eat_remember('-') {
526+
FeedResult::Has(TokenKind::ShortGeneric.at(source))
527+
} else {
528+
self.feed_idle()
529+
}
530+
}
520531
}
521532

522533
impl<T: Text + Send> InflowStream for Lexer<T> {

Diff for: src/lexer/state.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub enum State {
1414
String(StringState),
1515
Number(NumberState),
1616
HexNumber(HexNumberState),
17+
ShortGeneric,
1718
}
1819

1920
impl State {

Diff for: src/parser/parse_type.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
6262
pub fn parse_type_args(&mut self) -> Result<Vec<TypeArg>, ParseError> {
6363
let mut generics = vec![];
6464

65+
if self.input.eat(TokenKind::ShortGeneric) {
66+
return Ok(vec![self.parse_type_arg()?]);
67+
}
68+
6569
if !self.input.eat(TokenKind::OpenAngle) {
6670
return Ok(generics);
6771
}
@@ -79,16 +83,20 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
7983
return Err(self.unexpected_token_is_next());
8084
}
8185

82-
generics.push(if self.input.peek().could_start_type() {
83-
TypeArg::Type(self.parse_type(None::<&str>, Some("for compile time argument"))?)
84-
} else {
85-
TypeArg::Expr(self.parse_expr_primary()?)
86-
});
86+
generics.push(self.parse_type_arg()?);
8787
}
8888

8989
Ok(generics)
9090
}
9191

92+
pub fn parse_type_arg(&mut self) -> Result<TypeArg, ParseError> {
93+
Ok(if self.input.peek().could_start_type() {
94+
TypeArg::Type(self.parse_type(None::<&str>, Some("for compile time argument"))?)
95+
} else {
96+
TypeArg::Expr(self.parse_expr_primary()?)
97+
})
98+
}
99+
92100
pub fn parse_type_from_parts(
93101
&mut self,
94102
name: Name,

Diff for: src/token.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ pub enum TokenKind {
136136
StaticMember,
137137
Extend,
138138
FatArrow,
139+
ShortGeneric,
139140
}
140141

141142
impl Display for TokenKind {
@@ -231,6 +232,7 @@ impl Display for TokenKind {
231232
TokenKind::StaticMember => f.write_str("'::'"),
232233
TokenKind::Extend => f.write_str("'..'"),
233234
TokenKind::FatArrow => f.write_str("'=>'"),
235+
TokenKind::ShortGeneric => f.write_str("short generic '-'"),
234236
}
235237
}
236238
}
@@ -324,7 +326,8 @@ impl TokenKind {
324326
| TokenKind::Dereference
325327
| TokenKind::StaticMember
326328
| TokenKind::Extend
327-
| TokenKind::FatArrow => 0,
329+
| TokenKind::FatArrow
330+
| TokenKind::ShortGeneric => 0,
328331
}
329332
}
330333

0 commit comments

Comments
 (0)