diff --git a/boring/parse.py b/boring/parse.py index 4bcbf10..8ed1214 100644 --- a/boring/parse.py +++ b/boring/parse.py @@ -133,7 +133,7 @@ class LetStatement: @dataclass class AssignmentStatement: - variable_name: str + source: Union[VariableUsage, StructGetter] type: TypeUsage expression: Expression @@ -228,7 +228,8 @@ boring_grammar = r""" let_statement : "let" identifier "=" expression ";" | "let" identifier ":" type_usage "=" expression ";" - assignment_statement : identifier "=" expression ";" + assignment_statement : variable_usage "=" expression ";" + | struct_getter "=" expression ";" statement : let_statement | assignment_statement @@ -375,9 +376,9 @@ class TreeToBoring(Transformer): ) def assignment_statement(self, assignment_statement) -> AssignmentStatement: - (variable_name, expression) = assignment_statement + (source, expression) = assignment_statement return AssignmentStatement( - variable_name=variable_name, + source=source, type=UnknownTypeUsage(), expression=expression, ) diff --git a/boring/type_checking.py b/boring/type_checking.py index 9925a91..39c71a4 100644 --- a/boring/type_checking.py +++ b/boring/type_checking.py @@ -182,10 +182,17 @@ class TypeChecker: changed = False if self.with_expression(ctx, assignment_statement.expression): changed = True + if isinstance(assignment_statement.source, parse.VariableUsage): + self.with_variable_usage(ctx, assignment_statement.source) + elif isinstance(assignment_statement.source, parse.StructGetter): + self.with_struct_getter(ctx, assignment_statement.source) + else: + assert False + if unify( ctx, assignment_statement, - ctx.environment[assignment_statement.variable_name], + assignment_statement.source, ): changed = True if unify(ctx, assignment_statement, assignment_statement.expression): diff --git a/examples/math/main.bl b/examples/math/main.bl index eda8937..24e48b9 100644 --- a/examples/math/main.bl +++ b/examples/math/main.bl @@ -41,6 +41,7 @@ fn returns_user(): User { fn get_user_id(): U64 { let user = returns_user(); + user.id = 5; return user.id; } diff --git a/notes.txt b/notes.txt index de5ca01..7a11c61 100644 --- a/notes.txt +++ b/notes.txt @@ -37,11 +37,11 @@ TODO: * ~Block expression~ * ~Return keyword~ * ~Normal assignment~ -* Structs +* ~Structs~ * ~Define~ * ~Literal~ * ~Getter~ - * Setter + * ~Setter~ * Methods * Traits * Generics