Переглянути джерело

Make the local definition of variables works in function

Tamo 1 рік тому
батько
коміт
a0c3148857
2 змінених файлів з 18 додано та 15 видалено
  1. 1 1
      numbat/src/bytecode_interpreter.rs
  2. 17 14
      numbat/src/typechecker/mod.rs

+ 1 - 1
numbat/src/bytecode_interpreter.rs

@@ -324,7 +324,7 @@ impl BytecodeInterpreter {
 
             self.locals[current_depth].push(Local {
                 identifier: alias_name.clone(),
-                depth: 0,
+                depth: current_depth,
                 metadata: metadata.clone(),
             });
         }

+ 17 - 14
numbat/src/typechecker/mod.rs

@@ -294,17 +294,19 @@ impl TypeChecker {
             ast::Expression::Identifier(span, name) => {
                 let type_scheme = self.identifier_type(*span, name)?.clone();
 
-                let qt = type_scheme.instantiate(&mut self.name_generator);
+                let ty = match type_scheme {
+                    TypeScheme::Concrete(ty) => ty,
+                    TypeScheme::Quantified(_, _) => {
+                        let qt = type_scheme.instantiate(&mut self.name_generator);
 
-                for Bound::IsDim(t) in qt.bounds.iter() {
-                    self.constraints.add(Constraint::IsDType(t.clone())).ok();
-                }
+                        for Bound::IsDim(t) in qt.bounds.iter() {
+                            self.constraints.add(Constraint::IsDType(t.clone())).ok();
+                        }
+                        qt.inner
+                    }
+                };
 
-                typed_ast::Expression::Identifier(
-                    *span,
-                    name.clone(),
-                    TypeScheme::concrete(qt.inner),
-                )
+                typed_ast::Expression::Identifier(*span, name.clone(), TypeScheme::concrete(ty))
             }
             ast::Expression::UnitIdentifier(span, prefix, name, full_name) => {
                 let type_scheme = self.identifier_type(*span, name)?.clone();
@@ -1373,11 +1375,6 @@ impl TypeChecker {
                     ));
                 }
 
-                let mut typed_local_variables = vec![];
-                for local_variable in local_variables {
-                    typed_local_variables.push(self.elaborate_define_variable(local_variable)?);
-                }
-
                 let annotated_return_type = return_type_annotation
                     .as_ref()
                     .map(|annotation| typechecker_fn.type_from_annotation(annotation))
@@ -1419,6 +1416,12 @@ impl TypeChecker {
                     },
                 );
 
+                let mut typed_local_variables = vec![];
+                for local_variable in local_variables {
+                    typed_local_variables
+                        .push(typechecker_fn.elaborate_define_variable(local_variable)?);
+                }
+
                 let body_checked = body
                     .as_ref()
                     .map(|expr| typechecker_fn.elaborate_expression(expr))