Skip to content

Commit 34436c3

Browse files
came up with a new and simplier design that I might actually be able to impliment this time. This commit is just for record keeping incase I need to roll back
1 parent 213ff28 commit 34436c3

File tree

8 files changed

+399
-139
lines changed

8 files changed

+399
-139
lines changed

Cargo.lock

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ edition = "2021"
77

88
[dependencies]
99
clap = "4.5.4"
10+
itertools = "0.13.0"
1011
pub-fields = "0.1.1"
1112
strum = "0.26.2"
1213
strum_macros = "0.26.2"

src/ast/decl.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,14 @@ pub struct StructDecl {
8282
#[pub_fields]
8383
pub struct GenericDecl {
8484
name: Token, //Ident
85-
constraints: Vec<Type>,
85+
constraints: Vec<TraitType>,
86+
}
87+
88+
#[derive(Debug, Clone)]
89+
#[pub_fields]
90+
pub struct TraitType{
91+
name: Token, //Ident or Self
92+
generics: Vec<Type>,
8693
}
8794

8895
#[derive(Debug, Clone)]
@@ -94,11 +101,11 @@ pub struct FieldDecl {
94101

95102
#[derive(Debug, Clone)]
96103
pub enum Type{
97-
ActualType(SolidType),
104+
PhysicalType(SolidType),
98105
Unit,
99106
Array(SolidType),
100107
FP(FunctionPointer),
101-
DynamicType(Vec<SolidType>)
108+
DynamicType(Vec<TraitType>)
102109
}
103110

104111

@@ -336,7 +343,7 @@ impl Parsable for GenericDecl {
336343
let constraints = if tokens.peek_consume(TokenType::Colon).is_ok() {
337344
let mut temp = vec![];
338345
loop{
339-
temp.push(Type::parse(tokens)?);
346+
temp.push(TraitType::parse(tokens)?);
340347
if tokens.peek_consume(TokenType::Plus).is_err(){
341348
break;
342349
}
@@ -355,7 +362,7 @@ impl Parsable for GenericDecl {
355362
impl Parsable for Type {
356363
fn parse(tokens: &mut Peekable<Iter<Token>>) -> ParseResult<Self> {
357364
Ok(if tokens.peek().cannot_end().token_type == TokenType::LParen{
358-
let traits = tokens.list_parse::<SolidType>(TokenType::LParen, TokenType::Plus, TokenType::RParen)?;
365+
let traits = tokens.list_parse::<TraitType>(TokenType::LParen, TokenType::Plus, TokenType::RParen)?;
359366
if traits.is_empty(){
360367
Self::Unit
361368
}else{
@@ -369,7 +376,7 @@ impl Parsable for Type {
369376
tokens.consume(TokenType::RBrack)?;
370377
res
371378
}else{
372-
Self::ActualType(SolidType::parse(tokens)?)
379+
Self::PhysicalType(SolidType::parse(tokens)?)
373380
})
374381
}
375382
}
@@ -403,3 +410,18 @@ impl Parsable for SolidType{
403410
})
404411
}
405412
}
413+
414+
impl Parsable for TraitType{
415+
fn parse(tokens: &mut Peekable<Iter<Token>>)->Result<Self,ParseError> {
416+
let type_ = tokens.consume_multiple(vec![TokenType::Ident, TokenType::Self_])?;
417+
let generics = tokens.optional_list_parse::<Type>(
418+
TokenType::LArrow,
419+
TokenType::Comma,
420+
TokenType::RArrow,
421+
)?;
422+
Ok(Self {
423+
name: type_,
424+
generics,
425+
})
426+
}
427+
}
File renamed without changes.

0 commit comments

Comments
 (0)