From cbad2860c14f61ddde75c371510973d395d1393d Mon Sep 17 00:00:00 2001 From: Zelentsov Dmitry Date: Mon, 2 Jun 2025 18:31:44 +0300 Subject: [PATCH] Modify smart type inferring to preserve numeric types Signed-off-by: Zelentsov Dmitry --- ets2panda/checker/ets/helpers.cpp | 15 ++++++++------- ets2panda/checker/types/ets/etsUnionType.cpp | 8 ++------ .../test/ast/parser/ets/differentTypeCompare.ets | 2 +- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index f084c61fc..534263417 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -1011,9 +1011,15 @@ checker::Type *ETSChecker::GetExtensionAccessorReturnType(ir::MemberExpression * // Smart cast support //==============================================================================// -static checker::Type *MaybeReadonlyType(ETSChecker *checker, checker::Type *sourceType, checker::Type const *targetType) +static checker::Type *MaybeReadonlyType(ETSChecker *checker, checker::Type *sourceType, checker::Type *targetType) { - if (targetType->HasTypeFlag(TypeFlag::READONLY)) { + // For left-hand variable of builtin type leave it as is. + if (targetType->IsBuiltinNumeric()) { + return targetType; + } + + // Preserve 'Readonly' type flag in smart type if it exists in declared type + if (targetType->HasTypeFlag(TypeFlag::READONLY) && !sourceType->HasTypeFlag(TypeFlag::READONLY)) { sourceType = sourceType->Clone(checker); sourceType->AddTypeFlag(TypeFlag::READONLY); } @@ -1036,11 +1042,6 @@ checker::Type *ETSChecker::ResolveSmartType(checker::Type *sourceType, checker:: return sourceType; } - // For left-hand variable of builtin type leave it as is. - if (targetType->IsETSObjectType() && targetType->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::BUILTIN_TYPE)) { - return targetType; - } - // In case of Union left-hand type we try to select the proper type from the Union if (targetType->IsETSUnionType() && !sourceType->IsUnionType()) { auto *constituentType = targetType->AsETSUnionType()->GetAssignableType(this, sourceType, value); diff --git a/ets2panda/checker/types/ets/etsUnionType.cpp b/ets2panda/checker/types/ets/etsUnionType.cpp index 7e1743576..cb112121c 100644 --- a/ets2panda/checker/types/ets/etsUnionType.cpp +++ b/ets2panda/checker/types/ets/etsUnionType.cpp @@ -307,19 +307,15 @@ checker::Type *ETSUnionType::GetAssignableType(checker::ETSChecker *checker, che } } - if (!sourceType->IsETSObjectType()) { + if (!sourceType->IsBuiltinNumeric()) { return nullptr; } - auto *objectType = checker->GetNonConstantType(sourceType)->AsETSObjectType(); - - if (!objectType->IsBuiltinNumeric()) { - return sourceType; - } // NOTE (DZ): we still keep 'numericTypes` collection for possible processing cases like 'let x: short|double = 1` // Waiting for complete clearness in spec - now return the highest type in such a case or type itself. // Maybe 'value' will be used for this purpose std::map numericTypes {}; + auto *objectType = sourceType->AsETSObjectType(); if (auto *assignableType = GetAssignableBuiltinType(checker, objectType, numericTypes); assignableType != nullptr) { return assignableType; } diff --git a/ets2panda/test/ast/parser/ets/differentTypeCompare.ets b/ets2panda/test/ast/parser/ets/differentTypeCompare.ets index bc6decc66..a753a5268 100644 --- a/ets2panda/test/ast/parser/ets/differentTypeCompare.ets +++ b/ets2panda/test/ast/parser/ets/differentTypeCompare.ets @@ -23,4 +23,4 @@ function main(): void { foo(/* @@ label */a == b); } -/* @@@ label Error TypeError: Operator '==' cannot be applied to types 'String' and 'Int'. */ +/* @@@ label Error TypeError: Operator '==' cannot be applied to types '"alma"' and 'Int'. */ -- Gitee