added struct setters
This commit is contained in:
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user