From ed704b1a63c61eaca5d6c25084e6823e916c3ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Thu, 12 Jan 2023 08:54:01 +0100 Subject: [PATCH] Interpreter - Refactored method extraction --- src/interpreter/interpretable.rs | 49 +++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/src/interpreter/interpretable.rs b/src/interpreter/interpretable.rs index 0929386..4673387 100644 --- a/src/interpreter/interpretable.rs +++ b/src/interpreter/interpretable.rs @@ -197,26 +197,41 @@ impl StmtNode { Ok(InterpreterFlowControl::default()) } + /// Extract methods from a class declaration + fn extract_methods( + &self, + es: &mut InterpreterState, + decl: &ClassDecl, + filter: F, + ) -> HashMap + where + F: FnMut(&ClassMemberDecl) -> Option<&FunDecl>, + { + decl.members + .iter() + .filter_map(filter) + .map(|fdecl| { + ( + fdecl.name.lexeme.clone(), + Function::new( + Some(&fdecl.name), + &fdecl.params, + &fdecl.body, + es.environment.clone(), + fdecl.name.lexeme == "init", + ), + ) + }) + .collect::>() + } + /// Handle a class declaration fn on_class_decl(&self, es: &mut InterpreterState, decl: &ClassDecl) -> InterpreterResult { es.environment.borrow_mut().define(&decl.name, None)?; - let methods = decl - .members - .iter() - .filter_map(|member| match member { - ClassMemberDecl::Method(method) => Some(( - method.name.lexeme.clone(), - Function::new( - Some(&method.name), - &method.params, - &method.body, - es.environment.clone(), - method.name.lexeme == "init", - ), - )), - _ => None, - }) - .collect::>(); + let methods = self.extract_methods(es, decl, |member| match member { + ClassMemberDecl::Method(method) => Some(method), + _ => None, + }); let class = Class::new(decl.name.lexeme.clone(), methods); es.environment .borrow_mut()