mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-07 07:28:45 +00:00
TypeProxy changed to handle modifiers internally
This commit is contained in:
parent
5f8d5c5569
commit
fe6507ae12
7 changed files with 222 additions and 114 deletions
|
|
@ -8,11 +8,10 @@
|
|||
|
||||
namespace nodes {
|
||||
|
||||
// replace enum with structure ??
|
||||
enum class Modifier {
|
||||
IN, // <- x
|
||||
REF, // <> x
|
||||
CONST, // -- x (or nothing sometimes)
|
||||
CONST, // -- x (or x sometimes)
|
||||
OUT, // -> x
|
||||
//
|
||||
IN_OR_REF, // <-|<> x
|
||||
|
|
@ -37,9 +36,114 @@ enum class Modifier {
|
|||
|
||||
namespace utils {
|
||||
|
||||
inline bool is_suffix_modifier(nodes::Modifier modifier) {
|
||||
return modifier == nodes::Modifier::OPTIONAL ||
|
||||
modifier == nodes::Modifier::RESULT;
|
||||
inline bool is_suffix_modifier(Modifier modifier) {
|
||||
return modifier == Modifier::OPTIONAL || modifier == Modifier::RESULT;
|
||||
}
|
||||
|
||||
inline bool modifier_contains_IN(Modifier modifier) {
|
||||
return modifier == Modifier::IN || //
|
||||
modifier == Modifier::IN_OR_REF || //
|
||||
modifier == Modifier::IN_OR_CONST || //
|
||||
modifier == Modifier::IN_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_CONST_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST_OR_OUT; //
|
||||
}
|
||||
|
||||
inline bool modifier_contains_REF(Modifier modifier) {
|
||||
return modifier == Modifier::REF || //
|
||||
modifier == Modifier::IN_OR_REF || //
|
||||
modifier == Modifier::REF_OR_OUT || //
|
||||
modifier == Modifier::REF_OR_CONST || //
|
||||
modifier == Modifier::IN_OR_REF_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST || //
|
||||
modifier == Modifier::REF_OR_CONST_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST_OR_OUT; //
|
||||
}
|
||||
|
||||
inline bool modifier_contains_CONST(Modifier modifier) {
|
||||
return modifier == Modifier::CONST || //
|
||||
modifier == Modifier::IN_OR_CONST || //
|
||||
modifier == Modifier::CONST_OR_OUT || //
|
||||
modifier == Modifier::REF_OR_CONST || //
|
||||
modifier == Modifier::IN_OR_CONST_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST || //
|
||||
modifier == Modifier::REF_OR_CONST_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST_OR_OUT; //
|
||||
}
|
||||
|
||||
inline bool modifier_contains_OUT(Modifier modifier) {
|
||||
return modifier == Modifier::OUT || //
|
||||
modifier == Modifier::REF_OR_OUT || //
|
||||
modifier == Modifier::CONST_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_CONST_OR_OUT || //
|
||||
modifier == Modifier::REF_OR_CONST_OR_OUT || //
|
||||
modifier == Modifier::IN_OR_REF_OR_CONST_OR_OUT; //
|
||||
}
|
||||
|
||||
// possible casts:
|
||||
// <> => ->
|
||||
// <> => <-
|
||||
// <> => --
|
||||
inline bool can_cast_modifier(Modifier from, Modifier to) {
|
||||
if (is_suffix_modifier(from) || is_suffix_modifier(to) ||
|
||||
from == Modifier::NONE || to == Modifier::NONE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (from) {
|
||||
case Modifier::IN: // // <- x
|
||||
return modifier_contains_IN(to); //
|
||||
case Modifier::REF: // // <> x
|
||||
return true; //
|
||||
case Modifier::CONST: // // -- x (or x sometimes)
|
||||
return modifier_contains_CONST(to); //
|
||||
case Modifier::OUT: // // -> x
|
||||
return modifier_contains_OUT(to); //
|
||||
//
|
||||
case Modifier::IN_OR_REF: // // <-|<> x
|
||||
return modifier_contains_IN(to); //
|
||||
case Modifier::IN_OR_CONST: // // <-|-- x
|
||||
return modifier_contains_IN(to) && //
|
||||
modifier_contains_CONST(to); //
|
||||
case Modifier::REF_OR_OUT: // // <>|-> x
|
||||
return modifier_contains_OUT(to); //
|
||||
case Modifier::CONST_OR_OUT: // // --|-> x
|
||||
return modifier_contains_CONST(to) && //
|
||||
modifier_contains_OUT(to); //
|
||||
case Modifier::REF_OR_CONST: // // <>|-- x
|
||||
return modifier_contains_CONST(to); //
|
||||
case Modifier::IN_OR_OUT: // // <-|-> x
|
||||
return modifier_contains_IN(to) && //
|
||||
modifier_contains_OUT(to); //
|
||||
//
|
||||
case Modifier::IN_OR_REF_OR_OUT: // // <-|<>|-> x
|
||||
return modifier_contains_IN(to) && //
|
||||
modifier_contains_OUT(to); //
|
||||
case Modifier::IN_OR_CONST_OR_OUT: // // <-|--|-> x
|
||||
return modifier_contains_IN(to) && //
|
||||
modifier_contains_CONST(to) && //
|
||||
modifier_contains_OUT(to); //
|
||||
case Modifier::IN_OR_REF_OR_CONST: // // <-|<>|-- x
|
||||
return modifier_contains_IN(to) && //
|
||||
modifier_contains_CONST(to); //
|
||||
case Modifier::REF_OR_CONST_OR_OUT: // // <>|--|-> x
|
||||
return modifier_contains_CONST(to) && //
|
||||
modifier_contains_OUT(to); //
|
||||
//
|
||||
case Modifier::IN_OR_REF_OR_CONST_OR_OUT: // // <-|<>|--|-> x
|
||||
return modifier_contains_IN(to) && //
|
||||
modifier_contains_CONST(to) && //
|
||||
modifier_contains_OUT(to); //
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
error_handling::handle_general_error("Unreachable");
|
||||
exit(1); // unreachable
|
||||
}
|
||||
|
||||
} // namespace utils
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue