diff --git a/src/evaluator/environment/mod.rs b/src/evaluator/environment/mod.rs index d14336c..05e24b0 100644 --- a/src/evaluator/environment/mod.rs +++ b/src/evaluator/environment/mod.rs @@ -32,16 +32,13 @@ impl Environment { self.variables.insert(identifier, value); } - pub(super) fn get>(&self, identifier: T) -> Object { + pub(super) fn get>(&self, identifier: T) -> Option { match self.variables.get(identifier.as_ref()) { - Some(value) => value.clone(), - None => { - if let Some(sub_environment) = &self.sub_environment { - return sub_environment.get(identifier); - } - - Object::Null - } + Some(value) => Some(value.clone()), + None => match &self.sub_environment { + Some(sub_environment) => sub_environment.get(identifier), + None => None, + }, } } } diff --git a/src/evaluator/expression/identifier/mod.rs b/src/evaluator/expression/identifier/mod.rs new file mode 100644 index 0000000..a43b024 --- /dev/null +++ b/src/evaluator/expression/identifier/mod.rs @@ -0,0 +1,14 @@ +use crate::evaluator::Evaluator; +use crate::evaluator::Object; + +impl Evaluator { + pub(super) fn evaluate_identifier_expression( + &self, + identifier: String, + ) -> anyhow::Result { + match self.environment.get(&identifier) { + Some(object) => Ok(object), + None => anyhow::bail!("Identifier not found: {}.", identifier), + } + } +} diff --git a/src/evaluator/expression/mod.rs b/src/evaluator/expression/mod.rs index d5e71e3..672ccc6 100644 --- a/src/evaluator/expression/mod.rs +++ b/src/evaluator/expression/mod.rs @@ -5,6 +5,7 @@ use crate::syntax_analysis::*; mod boolean; mod call; mod function; +mod identifier; mod if_expression; mod infix; mod integer; @@ -33,7 +34,9 @@ impl Evaluator { consequence, alternative, } => self.evaluate_if_expression(*condition, *consequence, *alternative), - Expression::Identifier { identifier } => Ok(self.environment.get(identifier)), + Expression::Identifier { identifier } => { + self.evaluate_identifier_expression(identifier) + } Expression::Function { parameters, block } => { self.evaluate_function_expression(parameters, *block) } diff --git a/src/tests/evaluation_error/identifier_not_found/mod.rs b/src/tests/evaluation_error/identifier_not_found/mod.rs new file mode 100644 index 0000000..3637c40 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/mod.rs @@ -0,0 +1,42 @@ +use super::*; + +#[template] +#[rstest( + code, + snapshot_name, + case("foobar;", "identifier_not_found_case_1"), + case("let is_directory = false;\nis_file", "identifier_not_found_case_2"), + case("let a = 5;\na + b", "identifier_not_found_case_3"), + case( + "let double = fn(x) { x * 2 };\ndoubel(5)", + "identifier_not_found_case_4" + ), + case( + "let double = fn(x) { x * multiplier };\ndouble(5)", + "identifier_not_found_case_5" + ), + case( + "let identity = fn(x) { x };\nidentity(1);\nx", + "identifier_not_found_case_6" + ), + case("if (unknown) { 1 } else { 2 };", "identifier_not_found_case_7"), + case("let a = b;", "identifier_not_found_case_8"), + case("return missing;", "identifier_not_found_case_9"), + case("!undefined_boolean;", "identifier_not_found_case_10") +)] +fn identifier_not_found_cases(code: &str, snapshot_name: &str) {} + +#[apply(identifier_not_found_cases)] +fn test_identifier_not_found_lexical_analysis(code: &str, snapshot_name: &str) { + assert_lexical_analysis!(code, snapshot_name); +} + +#[apply(identifier_not_found_cases)] +fn test_identifier_not_found_syntax_analysis(code: &str, snapshot_name: &str) { + assert_syntax_analysis!(code, snapshot_name); +} + +#[apply(identifier_not_found_cases)] +fn test_identifier_not_found_evaluation_error(code: &str, snapshot_name: &str) { + assert_evaluation_error!(code, snapshot_name); +} diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_evaluation_error.snap new file mode 100644 index 0000000..b09a82b --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: undefined_boolean.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_lexical_analysis.snap new file mode 100644 index 0000000..e86409c --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_lexical_analysis.snap @@ -0,0 +1,11 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Not, + Identifier { + literal: "undefined_boolean", + }, + SemiColon, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_syntax_analysis.snap new file mode 100644 index 0000000..a9e37b3 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_10_syntax_analysis.snap @@ -0,0 +1,13 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Expression { + expression: NotPrefix { + right_hand: Identifier { + identifier: "undefined_boolean", + }, + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_evaluation_error.snap new file mode 100644 index 0000000..35e8674 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: foobar.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_lexical_analysis.snap new file mode 100644 index 0000000..cf2bf6f --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_lexical_analysis.snap @@ -0,0 +1,10 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Identifier { + literal: "foobar", + }, + SemiColon, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_syntax_analysis.snap new file mode 100644 index 0000000..b4b7bfd --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_1_syntax_analysis.snap @@ -0,0 +1,11 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Expression { + expression: Identifier { + identifier: "foobar", + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_evaluation_error.snap new file mode 100644 index 0000000..d226f56 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: is_file.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_lexical_analysis.snap new file mode 100644 index 0000000..887e585 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_lexical_analysis.snap @@ -0,0 +1,16 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "is_directory", + }, + Assign, + False, + SemiColon, + Identifier { + literal: "is_file", + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_syntax_analysis.snap new file mode 100644 index 0000000..8b24d22 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_2_syntax_analysis.snap @@ -0,0 +1,19 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "is_directory", + expression: Boolean { + literal: false, + }, + }, + }, + Expression { + expression: Identifier { + identifier: "is_file", + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_evaluation_error.snap new file mode 100644 index 0000000..0c30430 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: b.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_lexical_analysis.snap new file mode 100644 index 0000000..3b92d2d --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_lexical_analysis.snap @@ -0,0 +1,22 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "a", + }, + Assign, + Integer { + literal: 5, + }, + SemiColon, + Identifier { + literal: "a", + }, + Plus, + Identifier { + literal: "b", + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_syntax_analysis.snap new file mode 100644 index 0000000..ba2b137 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_3_syntax_analysis.snap @@ -0,0 +1,25 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "a", + expression: Integer { + literal: 5, + }, + }, + }, + Expression { + expression: Infix { + left_hand: Identifier { + identifier: "a", + }, + operator: Plus, + right_hand: Identifier { + identifier: "b", + }, + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_evaluation_error.snap new file mode 100644 index 0000000..6c0c8cb --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: doubel.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_lexical_analysis.snap new file mode 100644 index 0000000..4fc62d5 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_lexical_analysis.snap @@ -0,0 +1,35 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "double", + }, + Assign, + Function, + OpeningRoundBracket, + Identifier { + literal: "x", + }, + ClosingRoundBracket, + OpeningCurlyBracket, + Identifier { + literal: "x", + }, + Multiply, + Integer { + literal: 2, + }, + ClosingCurlyBracket, + SemiColon, + Identifier { + literal: "doubel", + }, + OpeningRoundBracket, + Integer { + literal: 5, + }, + ClosingRoundBracket, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_syntax_analysis.snap new file mode 100644 index 0000000..5173177 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_4_syntax_analysis.snap @@ -0,0 +1,43 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "double", + expression: Function { + parameters: [ + "x", + ], + block: Block { + nodes: [ + Expression { + expression: Infix { + left_hand: Identifier { + identifier: "x", + }, + operator: Multiply, + right_hand: Integer { + literal: 2, + }, + }, + }, + ], + }, + }, + }, + }, + Expression { + expression: Call { + function: Identifier { + identifier: "doubel", + }, + arguments: [ + Integer { + literal: 5, + }, + ], + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_evaluation_error.snap new file mode 100644 index 0000000..869c623 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: multiplier.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_lexical_analysis.snap new file mode 100644 index 0000000..5aaaca3 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_lexical_analysis.snap @@ -0,0 +1,35 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "double", + }, + Assign, + Function, + OpeningRoundBracket, + Identifier { + literal: "x", + }, + ClosingRoundBracket, + OpeningCurlyBracket, + Identifier { + literal: "x", + }, + Multiply, + Identifier { + literal: "multiplier", + }, + ClosingCurlyBracket, + SemiColon, + Identifier { + literal: "double", + }, + OpeningRoundBracket, + Integer { + literal: 5, + }, + ClosingRoundBracket, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_syntax_analysis.snap new file mode 100644 index 0000000..ae2f01e --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_5_syntax_analysis.snap @@ -0,0 +1,43 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "double", + expression: Function { + parameters: [ + "x", + ], + block: Block { + nodes: [ + Expression { + expression: Infix { + left_hand: Identifier { + identifier: "x", + }, + operator: Multiply, + right_hand: Identifier { + identifier: "multiplier", + }, + }, + }, + ], + }, + }, + }, + }, + Expression { + expression: Call { + function: Identifier { + identifier: "double", + }, + arguments: [ + Integer { + literal: 5, + }, + ], + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_evaluation_error.snap new file mode 100644 index 0000000..1505d04 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: x.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_lexical_analysis.snap new file mode 100644 index 0000000..89b7142 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_lexical_analysis.snap @@ -0,0 +1,35 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "identity", + }, + Assign, + Function, + OpeningRoundBracket, + Identifier { + literal: "x", + }, + ClosingRoundBracket, + OpeningCurlyBracket, + Identifier { + literal: "x", + }, + ClosingCurlyBracket, + SemiColon, + Identifier { + literal: "identity", + }, + OpeningRoundBracket, + Integer { + literal: 1, + }, + ClosingRoundBracket, + SemiColon, + Identifier { + literal: "x", + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_syntax_analysis.snap new file mode 100644 index 0000000..4c71e54 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_6_syntax_analysis.snap @@ -0,0 +1,42 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "identity", + expression: Function { + parameters: [ + "x", + ], + block: Block { + nodes: [ + Expression { + expression: Identifier { + identifier: "x", + }, + }, + ], + }, + }, + }, + }, + Expression { + expression: Call { + function: Identifier { + identifier: "identity", + }, + arguments: [ + Integer { + literal: 1, + }, + ], + }, + }, + Expression { + expression: Identifier { + identifier: "x", + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_evaluation_error.snap new file mode 100644 index 0000000..172484b --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: unknown.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_lexical_analysis.snap new file mode 100644 index 0000000..0281724 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_lexical_analysis.snap @@ -0,0 +1,24 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + If, + OpeningRoundBracket, + Identifier { + literal: "unknown", + }, + ClosingRoundBracket, + OpeningCurlyBracket, + Integer { + literal: 1, + }, + ClosingCurlyBracket, + Else, + OpeningCurlyBracket, + Integer { + literal: 2, + }, + ClosingCurlyBracket, + SemiColon, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_syntax_analysis.snap new file mode 100644 index 0000000..8dd2cee --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_7_syntax_analysis.snap @@ -0,0 +1,33 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Expression { + expression: If { + condition: Identifier { + identifier: "unknown", + }, + consequence: Block { + nodes: [ + Expression { + expression: Integer { + literal: 1, + }, + }, + ], + }, + alternative: Some( + Block { + nodes: [ + Expression { + expression: Integer { + literal: 2, + }, + }, + ], + }, + ), + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_evaluation_error.snap new file mode 100644 index 0000000..0c30430 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: b.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_lexical_analysis.snap new file mode 100644 index 0000000..21fcfd6 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_lexical_analysis.snap @@ -0,0 +1,15 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Let, + Identifier { + literal: "a", + }, + Assign, + Identifier { + literal: "b", + }, + SemiColon, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_syntax_analysis.snap new file mode 100644 index 0000000..d4948cc --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_8_syntax_analysis.snap @@ -0,0 +1,14 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Let { + identifier: "a", + expression: Identifier { + identifier: "b", + }, + }, + }, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_evaluation_error.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_evaluation_error.snap new file mode 100644 index 0000000..1b34521 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_evaluation_error.snap @@ -0,0 +1,7 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: error +--- +Err( + "Identifier not found: missing.", +) diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_lexical_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_lexical_analysis.snap new file mode 100644 index 0000000..e059484 --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_lexical_analysis.snap @@ -0,0 +1,11 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: tokens +--- +[ + Return, + Identifier { + literal: "missing", + }, + SemiColon, +] diff --git a/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_syntax_analysis.snap b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_syntax_analysis.snap new file mode 100644 index 0000000..7297a2a --- /dev/null +++ b/src/tests/evaluation_error/identifier_not_found/snapshots/monkey_interpreter__tests__evaluation_error__identifier_not_found__test_identifier_not_found_case_9_syntax_analysis.snap @@ -0,0 +1,13 @@ +--- +source: src/tests/evaluation_error/identifier_not_found/mod.rs +expression: abstract_syntax_tree +--- +[ + Statement { + statement: Return { + expression: Identifier { + identifier: "missing", + }, + }, + }, +] diff --git a/src/tests/evaluation_error/mod.rs b/src/tests/evaluation_error/mod.rs index 355085a..5b1009e 100644 --- a/src/tests/evaluation_error/mod.rs +++ b/src/tests/evaluation_error/mod.rs @@ -4,6 +4,7 @@ use super::*; mod macros; mod division_by_zero_integer_infix_expression; +mod identifier_not_found; mod type_mismatch_boolean_infix_expression; mod type_mismatch_boolean_prefix_expression; mod type_mismatch_integer_infix_expression; diff --git a/src/tests/identifier_expression/mod.rs b/src/tests/identifier_expression/mod.rs index 7b34807..c806f68 100644 --- a/src/tests/identifier_expression/mod.rs +++ b/src/tests/identifier_expression/mod.rs @@ -20,7 +20,10 @@ use super::*; case("let a = 5;\na", "identifier_expression_case_5"), case("let a = 25;\nlet b = 91;\nb", "identifier_expression_case_6"), case("let is_file = true;\nis_file", "identifier_expression_case_7"), - case("let is_directory = false;\nis_file", "identifier_expression_case_8"), + case( + "let is_directory = false;\nis_directory", + "identifier_expression_case_8" + ), case( "\tlet file = \"/tmp/temp.txt\";\nfile", "identifier_expression_case_9" diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_evaluation.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_evaluation.snap index 337eea3..7ee1155 100644 --- a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_evaluation.snap +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_evaluation.snap @@ -2,4 +2,4 @@ source: src/tests/identifier_expression/mod.rs expression: evaluation --- -Null +False diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_lexical_analysis.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_lexical_analysis.snap index b049f05..de741db 100644 --- a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_lexical_analysis.snap +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_lexical_analysis.snap @@ -11,6 +11,6 @@ expression: tokens False, SemiColon, Identifier { - literal: "is_file", + literal: "is_directory", }, ] diff --git a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_syntax_analysis.snap b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_syntax_analysis.snap index 1ed2523..a788ba4 100644 --- a/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_syntax_analysis.snap +++ b/src/tests/identifier_expression/snapshots/monkey_interpreter__tests__identifier_expression__test_identifier_expression_case_8_syntax_analysis.snap @@ -13,7 +13,7 @@ expression: abstract_syntax_tree }, Expression { expression: Identifier { - identifier: "is_file", + identifier: "is_directory", }, }, ]