added struct setters

This commit is contained in:
Andrew Segavac
2021-06-12 12:47:10 -06:00
parent 7b3fb9b88b
commit 972fbd064b
4 changed files with 16 additions and 7 deletions

View File

@@ -133,7 +133,7 @@ class LetStatement:
@dataclass @dataclass
class AssignmentStatement: class AssignmentStatement:
variable_name: str source: Union[VariableUsage, StructGetter]
type: TypeUsage type: TypeUsage
expression: Expression expression: Expression
@@ -228,7 +228,8 @@ boring_grammar = r"""
let_statement : "let" identifier "=" expression ";" let_statement : "let" identifier "=" expression ";"
| "let" identifier ":" type_usage "=" expression ";" | "let" identifier ":" type_usage "=" expression ";"
assignment_statement : identifier "=" expression ";" assignment_statement : variable_usage "=" expression ";"
| struct_getter "=" expression ";"
statement : let_statement statement : let_statement
| assignment_statement | assignment_statement
@@ -375,9 +376,9 @@ class TreeToBoring(Transformer):
) )
def assignment_statement(self, assignment_statement) -> AssignmentStatement: def assignment_statement(self, assignment_statement) -> AssignmentStatement:
(variable_name, expression) = assignment_statement (source, expression) = assignment_statement
return AssignmentStatement( return AssignmentStatement(
variable_name=variable_name, source=source,
type=UnknownTypeUsage(), type=UnknownTypeUsage(),
expression=expression, expression=expression,
) )

View File

@@ -182,10 +182,17 @@ class TypeChecker:
changed = False changed = False
if self.with_expression(ctx, assignment_statement.expression): if self.with_expression(ctx, assignment_statement.expression):
changed = True 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( if unify(
ctx, ctx,
assignment_statement, assignment_statement,
ctx.environment[assignment_statement.variable_name], assignment_statement.source,
): ):
changed = True changed = True
if unify(ctx, assignment_statement, assignment_statement.expression): if unify(ctx, assignment_statement, assignment_statement.expression):

View File

@@ -41,6 +41,7 @@ fn returns_user(): User {
fn get_user_id(): U64 { fn get_user_id(): U64 {
let user = returns_user(); let user = returns_user();
user.id = 5;
return user.id; return user.id;
} }

View File

@@ -37,11 +37,11 @@ TODO:
* ~Block expression~ * ~Block expression~
* ~Return keyword~ * ~Return keyword~
* ~Normal assignment~ * ~Normal assignment~
* Structs * ~Structs~
* ~Define~ * ~Define~
* ~Literal~ * ~Literal~
* ~Getter~ * ~Getter~
* Setter * ~Setter~
* Methods * Methods
* Traits * Traits
* Generics * Generics