diff --git a/src/parser/rules.rs b/src/parser/rules.rs index c21a1fb..2b112d3 100644 --- a/src/parser/rules.rs +++ b/src/parser/rules.rs @@ -341,7 +341,12 @@ impl Parser { fn parse_field_access(&mut self, lhs: Expression) -> Result { self.match_token(TokenKind::Dot)?; let field = self.match_identifier()?; - Ok(Expression::FieldAccess(Box::new(lhs), field)) + let expr = Expression::FieldAccess(Box::new(lhs), field); + if self.peek_token(TokenKind::Dot).is_ok() { + self.parse_field_access(expr) + } else { + Ok(expr) + } } /// TODO: Cleanup diff --git a/tests/structs.sb b/tests/structs.sb index c9082c7..04f6913 100644 --- a/tests/structs.sb +++ b/tests/structs.sb @@ -42,9 +42,32 @@ fn test_field_access_on_function() { assert(user_stub().first_name == "Foo") } +struct Foo { + x: int, + bar: Bar +} + +struct Bar { + y: string +} + +fn test_nested_structs() { + let foo = new Foo { + x: 5, + bar: new Bar { + y: "Nested field" + } + } + + assert(foo.x == 5) + println(foo.bar.y) + assert(foo.bar.y == "Nested field") +} + fn main() { test_initialization() test_simple_field_access() test_field_access_in_function_call() test_field_access_on_function() + test_nested_structs() } \ No newline at end of file