From 6e483e795ceea735e24b5987b8585a860831db79 Mon Sep 17 00:00:00 2001 From: Gusztav Szikszai Date: Sun, 3 Jun 2018 11:19:33 +0200 Subject: [PATCH] Only allow negating booleans. --- spec/formatters/negated_expression | 4 ++-- spec/type_checking/negated_expression | 11 +++++++++++ src/formatters/negated_expression.cr | 1 + src/messages/negated_expression_not_bool.cr | 11 +++++++++++ src/type_checkers/negated_expression.cr | 12 +++++++++++- 5 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 spec/type_checking/negated_expression create mode 100644 src/messages/negated_expression_not_bool.cr diff --git a/spec/formatters/negated_expression b/spec/formatters/negated_expression index adc51f1e1..655b8d39c 100644 --- a/spec/formatters/negated_expression +++ b/spec/formatters/negated_expression @@ -1,11 +1,11 @@ module Test { fun test : Bool { - !!!!!"fun" && !!!![1] && !1 + !!!!!true && !!!!false && !false } } -------------------------------------------------------------------------------- module Test { fun test : Bool { - !"fun" && !![1] && !1 + !true && !!false && !false } } diff --git a/spec/type_checking/negated_expression b/spec/type_checking/negated_expression new file mode 100644 index 000000000..5800cd1f4 --- /dev/null +++ b/spec/type_checking/negated_expression @@ -0,0 +1,11 @@ +module Test { + fun test : Bool { + !false + } +} +--------------------------------------------------------NegatedExpressionNotBool +module Test { + fun test : Bool { + !"asd" + } +} diff --git a/src/formatters/negated_expression.cr b/src/formatters/negated_expression.cr index 049986299..ec258b879 100644 --- a/src/formatters/negated_expression.cr +++ b/src/formatters/negated_expression.cr @@ -3,6 +3,7 @@ module Mint def format(node : Ast::NegatedExpression) : String expression = format node.expression + "#{node.negations}#{expression}" end end diff --git a/src/messages/negated_expression_not_bool.cr b/src/messages/negated_expression_not_bool.cr new file mode 100644 index 000000000..681521bd9 --- /dev/null +++ b/src/messages/negated_expression_not_bool.cr @@ -0,0 +1,11 @@ +message NegatedExpressionNotBool do + title "Type Error" + + block do + text "A negated expressions expression must evaluate to bool." + end + + was_expecting_type expected, got + + snippet node +end diff --git a/src/type_checkers/negated_expression.cr b/src/type_checkers/negated_expression.cr index a6f0745ab..9553afc60 100644 --- a/src/type_checkers/negated_expression.cr +++ b/src/type_checkers/negated_expression.cr @@ -1,7 +1,17 @@ module Mint class TypeChecker + type_error NegatedExpressionNotBool + def check(node : Ast::NegatedExpression) : Type - BOOL + expression = + check node.expression + + raise NegatedExpressionNotBool, { + "got" => expression, + "expected" => BOOL, + } unless Comparer.compare(BOOL, expression) + + expression end end end