From 75652b95cf90be2f5570bb412eba623058f40169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Fri, 13 Jan 2023 08:16:26 +0100 Subject: [PATCH] Interpreter - Store static methods inside classes --- src/interpreter/classes.rs | 8 +++++++- src/interpreter/interpretable.rs | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/interpreter/classes.rs b/src/interpreter/classes.rs index 4a23f90..e64c7a6 100644 --- a/src/interpreter/classes.rs +++ b/src/interpreter/classes.rs @@ -19,6 +19,7 @@ pub trait PropertyCarrier { pub struct Class { name: String, methods: HashMap, + static_methods: HashMap, fields: RefCell>, } @@ -47,10 +48,15 @@ fn bind_method(method: &Function, this_value: Value) -> Function { impl Class { /// Create a new class, specifying its name. - pub fn new(name: String, methods: HashMap) -> Self { + pub fn new( + name: String, + methods: HashMap, + static_methods: HashMap, + ) -> Self { Self { name, methods, + static_methods, fields: RefCell::new(HashMap::default()), } } diff --git a/src/interpreter/interpretable.rs b/src/interpreter/interpretable.rs index 4673387..10652e0 100644 --- a/src/interpreter/interpretable.rs +++ b/src/interpreter/interpretable.rs @@ -232,7 +232,11 @@ impl StmtNode { ClassMemberDecl::Method(method) => Some(method), _ => None, }); - let class = Class::new(decl.name.lexeme.clone(), methods); + let static_methods = self.extract_methods(es, decl, |member| match member { + ClassMemberDecl::StaticMethod(method) => Some(method), + _ => None, + }); + let class = Class::new(decl.name.lexeme.clone(), methods, static_methods); es.environment .borrow_mut() .assign(&decl.name, class.into())?;