about summary refs log tree commit diff
path: root/src/interpret/scope.rs
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2021-11-20 00:31:28 +0100
committerMel <einebeere@gmail.com>2021-11-20 00:31:28 +0100
commit395d086f0dce355ccdcf3da149c309826c539b48 (patch)
tree888ad59d8fcebcec0c04bcfd13364889c5047349 /src/interpret/scope.rs
parent334f70f5a2f63ec636ac1a8bc375ce51effba424 (diff)
downloadrabbithole-395d086f0dce355ccdcf3da149c309826c539b48.tar.zst
rabbithole-395d086f0dce355ccdcf3da149c309826c539b48.zip
Runtime types
Diffstat (limited to 'src/interpret/scope.rs')
-rw-r--r--src/interpret/scope.rs38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/interpret/scope.rs b/src/interpret/scope.rs
index 0db34c2..3813cab 100644
--- a/src/interpret/scope.rs
+++ b/src/interpret/scope.rs
@@ -1,5 +1,8 @@
-use super::value::Value;
-use crate::parse::ast::nodes::Identifier;
+use super::value::{Value, ValueVariant};
+use crate::{
+    parse::ast::nodes::Identifier,
+    types::{bag::TypeBag, TypeVariant},
+};
 use std::{cell::RefCell, collections::HashMap, rc::Rc};
 use thiserror::Error;
 
@@ -82,10 +85,10 @@ impl ScopeChain {
         }
     }
 
-    pub fn get_var(&self, ident: &str) -> Result<Value, ScopeError> {
+    pub fn get_var(&self, ident: &str, types: &TypeBag) -> Result<Value, ScopeError> {
         for scope in self.scopes.iter().rev() {
             if let Some(value) = scope.get(ident) {
-                return Ok(value.get_value());
+                return Ok(value.get_value(types));
             }
         }
         Err(ScopeError::UnknownIdentifier(ident.to_string()))
@@ -111,19 +114,32 @@ enum AssignedValue {
 }
 
 impl AssignedValue {
-    fn get_value(&self) -> Value {
+    fn get_value(&self, types: &TypeBag) -> Value {
         match self {
             Self::Mutable(value) => value.clone(),
-            Self::Constant(value) => match value {
-                Value::Array(reference) => {
+            Self::Constant(value) => match &value.variant {
+                ValueVariant::Array(reference) => {
                     let underlying_value = reference.borrow().clone();
-                    Value::Array(Rc::new(RefCell::new(underlying_value)))
+
+                    Value {
+                        variant: ValueVariant::Array(Rc::new(RefCell::new(underlying_value))),
+                        // FIXME: Give arrays actual type instead of void.
+                        typ: types.create_type(TypeVariant::Array(types.void())),
+                    }
                 }
-                Value::Fn(reference) => {
+                ValueVariant::Fn(reference) => {
                     let underlying_value = reference.borrow().clone();
-                    Value::Fn(Rc::new(RefCell::new(underlying_value)))
+
+                    Value {
+                        variant: ValueVariant::Fn(Rc::new(RefCell::new(underlying_value))),
+                        // FIXME: Give functions actual types.
+                        typ: types.create_type(TypeVariant::Fn {
+                            parameters: HashMap::new(),
+                            returns: types.void(),
+                        }),
+                    }
                 }
-                x => x.clone(),
+                _ => value.clone(),
             },
         }
     }