diff --git a/ets2panda/checker/ets/typeCheckingHelpers.cpp b/ets2panda/checker/ets/typeCheckingHelpers.cpp index 82bbbc5041994459a9b64f7e29958402b2d1a631..b6cbcf86d58e4a57caba73631ce01377e4826724 100644 --- a/ets2panda/checker/ets/typeCheckingHelpers.cpp +++ b/ets2panda/checker/ets/typeCheckingHelpers.cpp @@ -1389,7 +1389,7 @@ void ETSChecker::CheckUnboxedSourceTypeWithWideningAssignable(TypeRelation *rela } } -static ir::AstNode *DerefETSTypeReference(ir::AstNode *node) +static ir::AstNode *DerefETSTypeReference(ir::AstNode *node, ETSChecker *checker) { ES2PANDA_ASSERT(node->IsETSTypeReference()); do { @@ -1397,6 +1397,25 @@ static ir::AstNode *DerefETSTypeReference(ir::AstNode *node) ES2PANDA_ASSERT(name->IsIdentifier()); auto *var = name->AsIdentifier()->Variable(); + if (name->AsIdentifier()->Name() == compiler::Signatures::ANY_TYPE_NAME) { + // Create union of Object | null | undefined + // Impossible to fix normally before fixing #22952 and #IC8LO3 + // Working with nodes blocks setting variable + ArenaVector anyTypes(checker->ProgramAllocator()->Adapter()); + // SUPPRESS_CSA_NEXTLINE(alpha.core.AllocatorETSCheckerHint) + anyTypes.push_back(checker->ProgramAllocNode(checker->ProgramAllocator())); + // SUPPRESS_CSA_NEXTLINE(alpha.core.AllocatorETSCheckerHint) + anyTypes.push_back(checker->ProgramAllocNode(checker->ProgramAllocator())); + auto objectId = checker->ProgramAllocNode(compiler::Signatures::BUILTIN_OBJECT_CLASS, + checker->ProgramAllocator()); + auto objectTypeRefPart = + checker->ProgramAllocNode(objectId, checker->ProgramAllocator()); + auto objectTypeRef = + checker->ProgramAllocNode(objectTypeRefPart, checker->ProgramAllocator()); + // SUPPRESS_CSA_NEXTLINE(alpha.core.AllocatorETSCheckerHint) + anyTypes.push_back(objectTypeRef); + return checker->ProgramAllocNode(std::move(anyTypes), checker->ProgramAllocator()); + } ES2PANDA_ASSERT(var != nullptr); auto *declNode = var->Declaration()->Node(); if (!declNode->IsTSTypeAliasDeclaration()) { @@ -1416,7 +1435,7 @@ bool ETSChecker::CheckLambdaAssignable(ir::Expression *param, ir::ScriptFunction return false; } if (typeAnn->IsETSTypeReference() && !typeAnn->AsETSTypeReference()->TsType()->IsETSArrayType()) { - typeAnn = DerefETSTypeReference(typeAnn); + typeAnn = DerefETSTypeReference(typeAnn, this); } if (!typeAnn->IsETSFunctionType()) { @@ -1442,7 +1461,7 @@ bool ETSChecker::CheckLambdaInfer(ir::AstNode *typeAnnotation, ir::ArrowFunction Type *const subParameterType) { if (typeAnnotation->IsETSTypeReference()) { - typeAnnotation = DerefETSTypeReference(typeAnnotation); + typeAnnotation = DerefETSTypeReference(typeAnnotation, this); } if (!typeAnnotation->IsETSFunctionType()) {