support assignments
This commit is contained in:
parent
05ac6fa2c1
commit
a43c7b8d4f
15
src/main.rs
15
src/main.rs
@ -219,6 +219,21 @@ impl<'ctx> CodeGen<'ctx> {
|
|||||||
|
|
||||||
use ast::StatementType::*;
|
use ast::StatementType::*;
|
||||||
match &statement.node {
|
match &statement.node {
|
||||||
|
Assign { targets, value } => {
|
||||||
|
let value = self.compile_expression(value)?;
|
||||||
|
for target in targets.iter() {
|
||||||
|
self.set_source_location(target.location);
|
||||||
|
if let ast::ExpressionType::Identifier { name } = &target.node {
|
||||||
|
if let Some(existing) = self.namespace.insert(name.clone(), value) {
|
||||||
|
if existing.get_type() != value.get_type() {
|
||||||
|
return Err(self.compile_error(CompileErrorKind::IncompatibleTypes));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Err(self.compile_error(CompileErrorKind::Unsupported("assignment target must be an identifier")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Return { value: Some(value) } => {
|
Return { value: Some(value) } => {
|
||||||
if let Some(return_type) = return_type {
|
if let Some(return_type) = return_type {
|
||||||
let value = self.compile_expression(value)?;
|
let value = self.compile_expression(value)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user