From 7c945b9332e3488278135b61bc11dbd10992f154 Mon Sep 17 00:00:00 2001 From: Vsevolod Pukhov Date: Tue, 13 Feb 2024 16:20:22 +0300 Subject: [PATCH] Adjustments after nullability changes Signed-off-by: Vsevolod Pukhov --- ets2panda/checker/ETSAnalyzer.cpp | 3 +- ets2panda/checker/ets/helpers.cpp | 11 +++-- ets2panda/checker/types/ets/etsObjectType.cpp | 42 +++++++++---------- ets2panda/checker/types/ets/etsUnionType.cpp | 13 +++--- ets2panda/compiler/core/ETSCompiler.cpp | 2 +- ets2panda/compiler/core/ETSGen.cpp | 1 + .../compiler/lowering/ets/unionLowering.cpp | 3 +- ets2panda/ir/statements/returnStatement.cpp | 3 +- .../test-lists/parser/parser-js-ignored.txt | 8 +--- 9 files changed, 37 insertions(+), 49 deletions(-) diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index 3ec7df078b..f1156ea1b2 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -2506,8 +2506,7 @@ checker::Type *ETSAnalyzer::Check(ir::TSAsExpression *expr) const auto *const sourceType = expr->Expr()->Check(checker); - if (targetType->HasTypeFlag(checker::TypeFlag::ETS_PRIMITIVE) && - sourceType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT | checker::TypeFlag::TYPE_PARAMETER)) { + if (targetType->HasTypeFlag(checker::TypeFlag::ETS_PRIMITIVE) && sourceType->IsETSReferenceType()) { auto *const boxedTargetType = checker->PrimitiveTypeAsETSBuiltinType(targetType); if (!checker->Relation()->IsIdenticalTo(sourceType, boxedTargetType)) { expr->Expr()->AddAstNodeFlags(ir::AstNodeFlags::CHECKCAST); diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index ac3b09f01e..81ad0e1e30 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -191,8 +191,8 @@ bool Type::PossiblyETSString() const bool Type::IsETSReferenceType() const { - return HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT) || IsETSNullType() || IsETSUndefinedType() || - IsETSStringType() || IsETSTypeParameter() || IsETSUnionType() || IsETSNonNullishType() || IsETSBigIntType(); + return IsETSObjectType() || IsETSArrayType() || IsETSNullType() || IsETSUndefinedType() || IsETSStringType() || + IsETSTypeParameter() || IsETSUnionType() || IsETSNonNullishType() || IsETSBigIntType(); } bool Type::IsETSUnboxableObject() const @@ -962,12 +962,11 @@ Type *ETSChecker::HandleBooleanLogicalOperators(Type *leftType, Type *rightType, void ETSChecker::ResolveReturnStatement(checker::Type *funcReturnType, checker::Type *argumentType, ir::ScriptFunction *containingFunc, ir::ReturnStatement *st) { - if (funcReturnType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT) || - argumentType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + if (funcReturnType->IsETSReferenceType() || argumentType->IsETSReferenceType()) { // function return type should be of reference (object) type Relation()->SetFlags(checker::TypeRelationFlag::NONE); - if (!argumentType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + if (!argumentType->IsETSReferenceType()) { argumentType = PrimitiveTypeAsETSBuiltinType(argumentType); if (argumentType == nullptr) { ThrowTypeError("Invalid return statement expression", st->Argument()->Start()); @@ -975,7 +974,7 @@ void ETSChecker::ResolveReturnStatement(checker::Type *funcReturnType, checker:: st->Argument()->AddBoxingUnboxingFlags(GetBoxingFlag(argumentType)); } - if (!funcReturnType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + if (!funcReturnType->IsETSReferenceType()) { funcReturnType = PrimitiveTypeAsETSBuiltinType(funcReturnType); if (funcReturnType == nullptr) { ThrowTypeError("Invalid return function expression", st->Start()); diff --git a/ets2panda/checker/types/ets/etsObjectType.cpp b/ets2panda/checker/types/ets/etsObjectType.cpp index 8368bd2f7e..f23ea959e8 100644 --- a/ets2panda/checker/types/ets/etsObjectType.cpp +++ b/ets2panda/checker/types/ets/etsObjectType.cpp @@ -285,7 +285,10 @@ void ETSObjectType::ToString(std::stringstream &ss, bool precise) const { if (HasObjectFlag(ETSObjectFlags::FUNCTIONAL)) { GetFunctionalInterfaceInvokeType()->ToString(ss, precise); - } else if (precise) { + return; + } + + if (precise) { ss << assemblerName_; // NOTE(gogabr): need full qualified name } else { ss << name_; @@ -347,8 +350,7 @@ void ETSObjectType::Identical(TypeRelation *relation, Type *other) if (typeArguments_[idx]->IsWildcardType() || otherTypeArguments[idx]->IsWildcardType()) { continue; } - typeArguments_[idx]->Identical(relation, otherTypeArguments[idx]); - if (!relation->IsTrue()) { + if (!relation->IsIdenticalTo(typeArguments_[idx], otherTypeArguments[idx])) { return; } } @@ -417,8 +419,7 @@ bool ETSObjectType::CastNumericObject(TypeRelation *const relation, Type *const TypeFlag::FLOAT | TypeFlag::DOUBLE | TypeFlag::ETS_BOOLEAN)) { return false; } - Identical(relation, target); - if (relation->IsTrue()) { + if (relation->IsIdenticalTo(this, target)) { return true; } if (this->HasObjectFlag(ETSObjectFlags::BUILTIN_BYTE)) { @@ -542,11 +543,6 @@ bool ETSObjectType::DefaultObjectTypeChecks(const ETSChecker *const etsChecker, return true; } - if (source->IsETSTypeParameter()) { - IsSupertypeOf(relation, source->AsETSTypeParameter()->GetConstraintType()); - return true; - } - if (!source->IsETSObjectType() || !source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::CLASS | ETSObjectFlags::INTERFACE)) { return true; @@ -558,7 +554,7 @@ bool ETSObjectType::DefaultObjectTypeChecks(const ETSChecker *const etsChecker, return true; } - Identical(relation, source); + IdenticalUptoTypeArguments(relation, source); if (relation->IsTrue() && HasTypeFlag(TypeFlag::GENERIC)) { IsGenericSupertypeOf(relation, source); } @@ -616,19 +612,19 @@ void ETSObjectType::IsGenericSupertypeOf(TypeRelation *relation, Type *source) auto *typeParam = typeParams[idx]; relation->Result(false); + if (typeArg->IsWildcardType() || sourceTypeArg->IsWildcardType()) { + continue; + } + if (typeParam->IsOut()) { + relation->IsSupertypeOf(typeArg, sourceTypeArg); + } else if (typeParam->IsIn()) { + relation->IsSupertypeOf(sourceTypeArg, typeArg); + } else { + relation->IsIdenticalTo(typeArg, sourceTypeArg); + } - if (!(typeArg->IsWildcardType() || sourceTypeArg->IsWildcardType())) { - if (typeParam->IsOut()) { - typeArg->IsSupertypeOf(relation, sourceTypeArg); - } else if (typeParam->IsIn()) { - sourceTypeArg->IsSupertypeOf(relation, typeArg); - } else { - typeArg->Identical(relation, sourceTypeArg); - } - - if (!relation->IsTrue()) { - return; - } + if (!relation->IsTrue()) { + return; } } diff --git a/ets2panda/checker/types/ets/etsUnionType.cpp b/ets2panda/checker/types/ets/etsUnionType.cpp index a180bb8c35..751f5f83a1 100644 --- a/ets2panda/checker/types/ets/etsUnionType.cpp +++ b/ets2panda/checker/types/ets/etsUnionType.cpp @@ -362,8 +362,7 @@ Type *ETSUnionType::FindTypeIsCastableToThis(ir::Expression *node, TypeRelation // Prioritize object to object conversion auto it = std::find_if(constituentTypes_.begin(), constituentTypes_.end(), [relation, source](Type *target) { relation->IsCastableTo(source, target); - return relation->IsTrue() && source->HasTypeFlag(TypeFlag::ETS_ARRAY_OR_OBJECT) && - target->HasTypeFlag(TypeFlag::ETS_ARRAY_OR_OBJECT); + return relation->IsTrue() && source->IsETSReferenceType() && target->IsETSReferenceType(); }); if (it != constituentTypes_.end()) { if (nodeWasSet) { @@ -403,11 +402,11 @@ Type *ETSUnionType::FindTypeIsCastableToSomeType(ir::Expression *node, TypeRelat return r->IsTrue(); }; // Prioritize object to object conversion - auto it = std::find_if( - constituentTypes_.begin(), constituentTypes_.end(), [relation, target, &isCastablePred](Type *source) { - return isCastablePred(relation, source, target) && source->HasTypeFlag(TypeFlag::ETS_ARRAY_OR_OBJECT) && - target->HasTypeFlag(TypeFlag::ETS_ARRAY_OR_OBJECT); - }); + auto it = std::find_if(constituentTypes_.begin(), constituentTypes_.end(), + [relation, target, &isCastablePred](Type *source) { + return isCastablePred(relation, source, target) && source->IsETSReferenceType() && + target->IsETSReferenceType(); + }); if (it != constituentTypes_.end()) { if (nodeWasSet) { relation->SetNode(nullptr); diff --git a/ets2panda/compiler/core/ETSCompiler.cpp b/ets2panda/compiler/core/ETSCompiler.cpp index bbbf61b396..a71082b6f6 100644 --- a/ets2panda/compiler/core/ETSCompiler.cpp +++ b/ets2panda/compiler/core/ETSCompiler.cpp @@ -147,7 +147,7 @@ void ETSCompiler::Compile([[maybe_unused]] const ir::ETSScript *node) const void ETSCompiler::Compile(const ir::ETSClassLiteral *expr) const { ETSGen *etsg = GetETSGen(); - if (expr->expr_->TsType()->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + if (expr->expr_->TsType()->IsETSReferenceType()) { expr->expr_->Compile(etsg); etsg->GetType(expr, false); } else { diff --git a/ets2panda/compiler/core/ETSGen.cpp b/ets2panda/compiler/core/ETSGen.cpp index d06bacd2a9..4266865513 100644 --- a/ets2panda/compiler/core/ETSGen.cpp +++ b/ets2panda/compiler/core/ETSGen.cpp @@ -894,6 +894,7 @@ void ETSGen::InternalCheckCast(const ir::AstNode *node, const es2panda::checker: // optimized specialization for object and [] targets void ETSGen::CheckedReferenceNarrowingObject(const ir::AstNode *node, const checker::Type *target) { + ASSERT(target->IsETSObjectType() || target->IsETSArrayType()); const RegScope rs(this); const auto srcReg = AllocReg(); StoreAccumulator(node, srcReg); diff --git a/ets2panda/compiler/lowering/ets/unionLowering.cpp b/ets2panda/compiler/lowering/ets/unionLowering.cpp index ce7cb9be2a..7509a71f84 100644 --- a/ets2panda/compiler/lowering/ets/unionLowering.cpp +++ b/ets2panda/compiler/lowering/ets/unionLowering.cpp @@ -452,8 +452,7 @@ bool UnionLowering::Postcondition(public_lib::Context *ctx, const parser::Progra auto *objType = checker->GetApparentType(checker->GetNonNullishType(ast->AsMemberExpression()->Object()->TsType())); auto *parent = ast->Parent(); - if (parent != nullptr && // #15040 - !(parent->IsCallExpression() && + if (!(parent->IsCallExpression() && parent->AsCallExpression()->Signature()->HasSignatureFlag(checker::SignatureFlags::TYPE))) { return false; } diff --git a/ets2panda/ir/statements/returnStatement.cpp b/ets2panda/ir/statements/returnStatement.cpp index 57fd127384..d637554d08 100644 --- a/ets2panda/ir/statements/returnStatement.cpp +++ b/ets2panda/ir/statements/returnStatement.cpp @@ -76,8 +76,7 @@ void ReturnStatement::SetReturnType(checker::ETSChecker *checker, checker::Type returnType_ = type; if (argument_ != nullptr) { checker::Type *argumentType = argument_->Check(checker); - if (type->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT) && - !argumentType->HasTypeFlag(checker::TypeFlag::ETS_ARRAY_OR_OBJECT)) { + if (type->IsETSReferenceType() && !argumentType->IsETSReferenceType()) { auto *const relation = checker->Relation(); relation->SetNode(argument_); relation->SetFlags(checker::TypeRelationFlag::NONE); diff --git a/ets2panda/test/test-lists/parser/parser-js-ignored.txt b/ets2panda/test/test-lists/parser/parser-js-ignored.txt index f43d7fb014..13275afcf5 100644 --- a/ets2panda/test/test-lists/parser/parser-js-ignored.txt +++ b/ets2panda/test/test-lists/parser/parser-js-ignored.txt @@ -61,7 +61,7 @@ parser/ets/dynamic_import_tests/dynamic_decl_import.ets parser/ets/dynamic_import_tests/dynamic_func_decl_import_bad.ets parser/ets/dynamic_import_tests/dynamic_iface_decl_bad.ets -# Disabled temporarily #11468 +# Requires smart casts parser/ets/null-coalesc-negative.ets # Lambda tests, disabled because crash during compiler @@ -89,13 +89,9 @@ compiler/ets/tuple_types_7.ets compiler/ets/tuple_types_9_neg.ets parser/ets/tuple_type_1.ets -# 15642 broken ast varbinder scopes in etsglobal +# 15771 broken ast varbinder scopes in etsglobal parser/ets/optional-chaining-array.ets parser/ets/optional_chaining_invalid_property.ets parser/ets/optional_chaining_nested_property.ets parser/ets/optional_chaining_object_property.ets -# 15642 -compiler/ets/etsObjectToString4.ets -compiler/ets/etsObjectToString5.ets -compiler/ets/generic_variance_1.ets -- Gitee