added struct setters
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -41,6 +41,7 @@ fn returns_user(): User {
|
||||
|
||||
fn get_user_id(): U64 {
|
||||
let user = returns_user();
|
||||
user.id = 5;
|
||||
return user.id;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user