part of expected type type check process modification: fixes, check function

This commit is contained in:
ProgramSnail 2024-01-04 00:13:19 +03:00
parent ffa9c47107
commit 3907da619e
2 changed files with 73 additions and 39 deletions

View file

@ -15,74 +15,74 @@ namespace type_check {
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_expression(const nodes::Expression &expression, type_check_expression(const nodes::Expression &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
// --- flow control // --- flow control
nodes::TypeCheckResult type_check_match(const nodes::Match &expression, nodes::TypeCheckResult type_check_match(const nodes::Match &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult type_check_condition(const nodes::Condition &expression, nodes::TypeCheckResult type_check_condition(const nodes::Condition &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult type_check_loop(const nodes::Loop &expression, nodes::TypeCheckResult type_check_loop(const nodes::Loop &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
// --- containers // --- containers
nodes::TypeCheckResult type_check_container(const nodes::Container &expression, nodes::TypeCheckResult type_check_container(const nodes::Container &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
// --- modifiers // --- modifiers
nodes::TypeCheckResult type_check_return(const nodes::Return &expression, nodes::TypeCheckResult type_check_return(const nodes::Return &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_name_definition(const nodes::NameDefinition &expression, type_check_name_definition(const nodes::NameDefinition &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult type_check_access(const nodes::Access &expression, nodes::TypeCheckResult type_check_access(const nodes::Access &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_loop_control(const nodes::LoopControl &expression, type_check_loop_control(const nodes::LoopControl &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_modifier_expression(const nodes::ModifierExpression &expression, type_check_modifier_expression(const nodes::ModifierExpression &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
// --- other // --- other
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_name_expression(const nodes::NameExpression &expression, type_check_name_expression(const nodes::NameExpression &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_constructor(const nodes::Constructor &expression, type_check_constructor(const nodes::Constructor &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
nodes::TypeCheckResult type_check_lambda(const nodes::Lambda &expression, nodes::TypeCheckResult type_check_lambda(const nodes::Lambda &expression,
SourcesManager &sources_manager, SourcesManager &sources_manager,
State &state, State &state,
const Arguments &arguments = {}); const Arguments &arguments);
} // namespace type_check } // namespace type_check

View file

@ -12,6 +12,25 @@
namespace type_check { namespace type_check {
nodes::TypeCheckResult type_same_to_expected(
nodes::TypeProxy type, nodes::MaybeTypeProxy expected_type,
const nodes::Node &node, error_handling::ErrorLog &error_log,
const std::string &message = "Different type with expected one") {
if (!expected_type.has_value()) {
return nodes::TypeCheckResult{type};
}
if (type != expected_type.value()) {
error_log.add_error(error_handling::ErrorLog::ErrorMessage(
node, message, error_handling::ErrorType::TYPE_CHECK));
return nodes::TypeCheckResult::construct_invalid_result();
}
// TODO: use 'can cast to' (for modifiers), instead '=='
return nodes::TypeCheckResult{
expected_type.value()}; // TODO: retern type or expected type ??
}
nodes::TypeCheckResult nodes::TypeCheckResult
type_check_expression(const nodes::Expression &expression, type_check_expression(const nodes::Expression &expression,
SourcesManager &sources_manager, State &state, SourcesManager &sources_manager, State &state,
@ -38,7 +57,7 @@ type_check_expression(const nodes::Expression &expression,
case 5: // NameDefinition case 5: // NameDefinition
return type_check_name_definition( return type_check_name_definition(
*expression.get<nodes::NameDefinition>().value(), sources_manager, *expression.get<nodes::NameDefinition>().value(), sources_manager,
state); state, arguments);
case 6: // Access case 6: // Access
return type_check_access(*expression.get<nodes::Access>().value(), return type_check_access(*expression.get<nodes::Access>().value(),
sources_manager, state, arguments); sources_manager, state, arguments);
@ -111,10 +130,13 @@ nodes::TypeCheckResult type_check_loop(const nodes::Loop &expression,
switch (expression.get_type()) { switch (expression.get_type()) {
case nodes::Loop::LOOP: case nodes::Loop::LOOP:
// TODO
break; break;
case nodes::Loop::WHILE: case nodes::Loop::WHILE:
condition_result = type_check_expression( condition_result = type_check_expression(
*expression.get_condition().value(), sources_manager, state); *expression.get_condition().value(), sources_manager, state,
Arguments{{sources_manager.get_type_storage()->primitive_type(
builtin::types::Type::BOOL)}});
if (condition_result.value().is_invalid()) { if (condition_result.value().is_invalid()) {
return condition_result.value(); return condition_result.value();
@ -175,9 +197,9 @@ nodes::TypeCheckResult type_check_loop(const nodes::Loop &expression,
// TODO: modifier checks ??, modifiers ?? // TODO: modifier checks ??, modifiers ??
return nodes::TypeCheckResult( return type_same_to_expected(
sources_manager.get_type_storage()->add_array_of( sources_manager.get_type_storage()->add_array_of(expression_result.get()),
expression_result.get())); arguments.expected_type, expression, *sources_manager.get_error_log());
} // IN PROGRESS } // IN PROGRESS
// --- containers // --- containers
@ -214,9 +236,10 @@ nodes::TypeCheckResult type_check_array(const nodes::Container &expression,
return nodes::TypeCheckResult::construct_invalid_result(); return nodes::TypeCheckResult::construct_invalid_result();
} }
return nodes::TypeCheckResult( return type_same_to_expected(sources_manager.get_type_storage()->add_array_of(
sources_manager.get_type_storage()->add_array_of( last_expression_result.value().get()),
last_expression_result.value().get())); arguments.expected_type, expression,
*sources_manager.get_error_log());
} // IN PROGRESS } // IN PROGRESS
// TODO // TODO
@ -234,8 +257,8 @@ nodes::TypeCheckResult type_check_container(const nodes::Container &expression,
case nodes::Container::ARRAY: case nodes::Container::ARRAY:
return type_check_array(expression, sources_manager, state, arguments); return type_check_array(expression, sources_manager, state, arguments);
case nodes::Container::BLOCK: case nodes::Container::BLOCK:
return type_check_block(expression, sources_manager, return type_check_block(expression, sources_manager, state,
state, arguments); // TODO: check that expression brought arguments); // TODO: check that expression brought
// type are same, -> brought_type // type are same, -> brought_type
} }
} // IN PROGRESS } // IN PROGRESS
@ -274,9 +297,10 @@ nodes::TypeCheckResult type_check_return(const nodes::Return &expression,
break; break;
} }
return nodes::TypeCheckResult( return type_same_to_expected(
sources_manager.get_type_storage()->primitive_type( sources_manager.get_type_storage()->primitive_type(
builtin::types::Type::UNIT)); builtin::types::Type::UNIT),
arguments.expected_type, expression, *sources_manager.get_error_log());
} }
// TODO // TODO
@ -322,8 +346,9 @@ nodes::TypeCheckResult type_check_array_access(const nodes::Access &expression,
// TODO: modifier checks ?? // TODO: modifier checks ??
return nodes::TypeCheckResult( return type_same_to_expected(value_result.get().get()->get_parameter_proxy(0),
value_result.get().get()->get_parameter_proxy(0)); arguments.expected_type, expression,
*sources_manager.get_error_log());
} }
nodes::TypeCheckResult type_check_tuple_access(const nodes::Access &expression, nodes::TypeCheckResult type_check_tuple_access(const nodes::Access &expression,
@ -353,8 +378,9 @@ nodes::TypeCheckResult type_check_tuple_access(const nodes::Access &expression,
// TODO: modifier checks ?? // TODO: modifier checks ??
return nodes::TypeCheckResult( return type_same_to_expected(
value_result.get().get()->get_parameter_proxy(index)); value_result.get().get()->get_parameter_proxy(index),
arguments.expected_type, expression, *sources_manager.get_error_log());
} }
nodes::TypeCheckResult type_check_access(const nodes::Access &expression, nodes::TypeCheckResult type_check_access(const nodes::Access &expression,
@ -363,19 +389,22 @@ nodes::TypeCheckResult type_check_access(const nodes::Access &expression,
const Arguments &arguments) { const Arguments &arguments) {
switch (expression.get_type()) { switch (expression.get_type()) {
case nodes::Access::ARRAY: case nodes::Access::ARRAY:
return type_check_array_access(expression, sources_manager, state); return type_check_array_access(expression, sources_manager, state,
arguments);
case nodes::Access::TUPLE: case nodes::Access::TUPLE:
return type_check_tuple_access(expression, sources_manager, state); return type_check_tuple_access(expression, sources_manager, state,
arguments);
} }
} }
nodes::TypeCheckResult type_check_loop_control(const nodes::LoopControl &, nodes::TypeCheckResult
SourcesManager &sources_manager, type_check_loop_control(const nodes::LoopControl &expression,
State &, SourcesManager &sources_manager, State &,
const Arguments &arguments) { const Arguments &arguments) {
return nodes::TypeCheckResult( return type_same_to_expected(
sources_manager.get_type_storage()->primitive_type( sources_manager.get_type_storage()->primitive_type(
builtin::types::Type::UNIT)); builtin::types::Type::UNIT),
arguments.expected_type, expression, *sources_manager.get_error_log());
} }
nodes::TypeCheckResult nodes::TypeCheckResult
@ -385,6 +414,10 @@ type_check_modifier_expression(const nodes::ModifierExpression &expression,
auto modified_result = type_check_expression(*expression.get_expression(), auto modified_result = type_check_expression(*expression.get_expression(),
sources_manager, state); sources_manager, state);
if (modified_result.is_invalid()) {
return nodes::TypeCheckResult::construct_invalid_result();
}
if (nodes::utils::is_suffix_modifier( if (nodes::utils::is_suffix_modifier(
expression.get_modifier())) { // optional, result expression.get_modifier())) { // optional, result
// '?' - open optional / result in -> (execute or not execute pattern // '?' - open optional / result in -> (execute or not execute pattern
@ -411,7 +444,8 @@ type_check_modifier_expression(const nodes::ModifierExpression &expression,
modified_result.get(), expression.get_modifier())); modified_result.get(), expression.get_modifier()));
} }
return modified_result; return type_same_to_expected(modified_result.get(), arguments.expected_type,
expression, *sources_manager.get_error_log());
} // IN PROGRESS } // IN PROGRESS
// --- other // --- other