From ad48387aa0536cb40a3b2849363d90ef52f46aac Mon Sep 17 00:00:00 2001 From: JT Date: Sat, 24 Jul 2021 18:44:38 +1200 Subject: [PATCH] WIP --- src/eval.rs | 31 +++++++++++++++++++++++++++++++ src/main.rs | 2 +- src/parser.rs | 3 +++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/eval.rs b/src/eval.rs index 30bf276fc6..29d62824ab 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -103,6 +103,37 @@ fn eval_call(state: &State, stack: &mut Stack, call: &Call) -> Result { + if val { + let block = state.parser_state.get_block(then_block); + eval_block(state, stack, block) + } else if let Some(else_case) = else_case { + println!("{:?}", else_case); + if let Some(else_expr) = else_case.as_keyword() { + if let Some(block_id) = else_expr.as_block() { + let block = state.parser_state.get_block(block_id); + eval_block(state, stack, block) + } else { + eval_expression(state, stack, else_expr) + } + } else { + eval_expression(state, stack, else_case) + } + } else { + Ok(Value::Unknown) + } + } + _ => Err(ShellError::Mismatch("bool".into(), Span::unknown())), + } } else { Ok(Value::Unknown) } diff --git a/src/main.rs b/src/main.rs index ef90257728..04a4a07128 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,7 @@ fn main() -> std::io::Result<()> { .required("then_block", SyntaxShape::Block, "then block") .optional( "else", - SyntaxShape::Keyword(b"else".to_vec(), Box::new(SyntaxShape::Block)), + SyntaxShape::Keyword(b"else".to_vec(), Box::new(SyntaxShape::Expression)), "optional else followed by else block", ); working_set.add_decl(sig.into()); diff --git a/src/parser.rs b/src/parser.rs index 10bb480b67..d0bf685134 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -936,6 +936,9 @@ impl<'a> ParserWorkingSet<'a> { None, ) } else { + let name = self.get_span_contents(span).to_vec(); + // this seems okay to set it to unknown here, but we should double-check + let id = self.add_variable(name, Type::Unknown); ( Expression::garbage(span), Some(ParseError::VariableNotFound(span)),