mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-23 03:23:48 +00:00
[generator] Fixed ordering for many subtypes
Signed-off-by: Yannik Bloscheck <git@yannikbloscheck.com>
This commit is contained in:
@@ -362,9 +362,20 @@ void LeaveLongestTypes(std::vector<generator::TypeStrings> & matchedTypes)
|
||||
{
|
||||
// Prevents types, that either have subtypes or are subtypes, from being removed
|
||||
auto subtypes = ftypes::Subtypes::Instance();
|
||||
auto const hasSubtypeRelatedTypes = [subtypes](auto const & lhs, auto const & rhs)
|
||||
auto const areSubtypeRelatedTypes = [subtypes](auto const & lhs, auto const & rhs)
|
||||
{
|
||||
return subtypes.IsPathOfTypeWithSubtypesOrSubtype(lhs) || subtypes.IsPathOfTypeWithSubtypesOrSubtype(rhs);
|
||||
return subtypes.IsTypeWithSubtypesOrSubtype(lhs) && subtypes.IsTypeWithSubtypesOrSubtype(rhs);
|
||||
};
|
||||
auto const isBetterBecauseOfSubtypeRelation = [subtypes](auto const & lhs, auto const & rhs) -> std::optional<bool>
|
||||
{
|
||||
bool const lhsIsTypeWithSubtypesOrSubtype = subtypes.IsTypeWithSubtypesOrSubtype(lhs);
|
||||
bool const rhsIsTypeWithSubtypesOrSubtype = subtypes.IsTypeWithSubtypesOrSubtype(rhs);
|
||||
if (lhsIsTypeWithSubtypesOrSubtype && !rhsIsTypeWithSubtypesOrSubtype)
|
||||
return true;
|
||||
else if (!lhsIsTypeWithSubtypesOrSubtype && rhsIsTypeWithSubtypesOrSubtype)
|
||||
return false;
|
||||
|
||||
return subtypes.ComparisonResultBasedOnTypeRelation(lhs, rhs);
|
||||
};
|
||||
|
||||
auto const equalPrefix = [](auto const & lhs, auto const & rhs)
|
||||
@@ -373,8 +384,12 @@ void LeaveLongestTypes(std::vector<generator::TypeStrings> & matchedTypes)
|
||||
return equal(lhs.begin(), lhs.begin() + std::min(size_t(2), prefixSz), rhs.begin());
|
||||
};
|
||||
|
||||
auto const isBetter = [&equalPrefix](auto const & lhs, auto const & rhs)
|
||||
auto const isBetter = [&equalPrefix, &isBetterBecauseOfSubtypeRelation](auto const & lhs, auto const & rhs)
|
||||
{
|
||||
std::optional<bool> const isBetterBecauseOfSubtypeRelationResult = isBetterBecauseOfSubtypeRelation(lhs, rhs);
|
||||
if (isBetterBecauseOfSubtypeRelationResult.has_value())
|
||||
return isBetterBecauseOfSubtypeRelationResult.value();
|
||||
|
||||
if (equalPrefix(lhs, rhs))
|
||||
{
|
||||
// Longest type is better.
|
||||
@@ -385,17 +400,14 @@ void LeaveLongestTypes(std::vector<generator::TypeStrings> & matchedTypes)
|
||||
return lhs < rhs;
|
||||
};
|
||||
|
||||
// `true` means it will be deleted, because being equal means it isn't unique
|
||||
auto const isEqual = [&equalPrefix, &hasSubtypeRelatedTypes](auto const & lhs, auto const & rhs)
|
||||
// `true` means the second one will be removed, because being equal means it isn't unique and the first one is more important
|
||||
auto const isEqual = [&equalPrefix, &areSubtypeRelatedTypes](auto const & lhs, auto const & rhs)
|
||||
{
|
||||
if (hasSubtypeRelatedTypes(lhs, rhs))
|
||||
return false;
|
||||
|
||||
if (equalPrefix(lhs, rhs))
|
||||
{
|
||||
// Keep longest type only, so return equal is true.
|
||||
// Keep longest type only
|
||||
if (lhs.size() != rhs.size())
|
||||
return true;
|
||||
return !areSubtypeRelatedTypes(lhs, rhs);
|
||||
|
||||
return lhs == rhs;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user