13af6ab5fSopenharmony_ci/**
23af6ab5fSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.Apache.Org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ci#include "helpers.h"
173af6ab5fSopenharmony_ci
183af6ab5fSopenharmony_ci#include "generated/signatures.h"
193af6ab5fSopenharmony_ci#include "varbinder/privateBinding.h"
203af6ab5fSopenharmony_ci#include "checker/types/ets/types.h"
213af6ab5fSopenharmony_ci#include "ir/astNode.h"
223af6ab5fSopenharmony_ci#include "ir/base/classDefinition.h"
233af6ab5fSopenharmony_ci#include "ir/base/classProperty.h"
243af6ab5fSopenharmony_ci#include "ir/base/methodDefinition.h"
253af6ab5fSopenharmony_ci#include "ir/base/property.h"
263af6ab5fSopenharmony_ci#include "ir/base/scriptFunction.h"
273af6ab5fSopenharmony_ci#include "ir/base/spreadElement.h"
283af6ab5fSopenharmony_ci#include "ir/expressions/arrayExpression.h"
293af6ab5fSopenharmony_ci#include "ir/expressions/assignmentExpression.h"
303af6ab5fSopenharmony_ci#include "ir/expressions/callExpression.h"
313af6ab5fSopenharmony_ci#include "ir/expressions/functionExpression.h"
323af6ab5fSopenharmony_ci#include "ir/expressions/identifier.h"
333af6ab5fSopenharmony_ci#include "ir/expressions/literals/numberLiteral.h"
343af6ab5fSopenharmony_ci#include "ir/expressions/literals/stringLiteral.h"
353af6ab5fSopenharmony_ci#include "ir/expressions/literals/booleanLiteral.h"
363af6ab5fSopenharmony_ci#include "ir/expressions/literals/nullLiteral.h"
373af6ab5fSopenharmony_ci#include "ir/expressions/objectExpression.h"
383af6ab5fSopenharmony_ci#include "ir/statements/returnStatement.h"
393af6ab5fSopenharmony_ci#include "ir/statements/variableDeclaration.h"
403af6ab5fSopenharmony_ci#include "ir/statements/variableDeclarator.h"
413af6ab5fSopenharmony_ci#include "ir/module/importSpecifier.h"
423af6ab5fSopenharmony_ci#include "ir/ets/etsImportDeclaration.h"
433af6ab5fSopenharmony_ci#include "ir/ts/tsParameterProperty.h"
443af6ab5fSopenharmony_ci#include "ir/ts/tsInterfaceDeclaration.h"
453af6ab5fSopenharmony_ci#include "ir/ts/tsEnumDeclaration.h"
463af6ab5fSopenharmony_ci#include "ir/ets/etsParameterExpression.h"
473af6ab5fSopenharmony_ci#include "ir/module/importDeclaration.h"
483af6ab5fSopenharmony_ci#include "lexer/token/letters.h"
493af6ab5fSopenharmony_ci#include "libpandabase/utils/utf.h"
503af6ab5fSopenharmony_ci#include "libpandabase/os/filesystem.h"
513af6ab5fSopenharmony_ci#include "ir/module/importDefaultSpecifier.h"
523af6ab5fSopenharmony_ci#include <iomanip>
533af6ab5fSopenharmony_ci
543af6ab5fSopenharmony_cinamespace ark::es2panda::util {
553af6ab5fSopenharmony_ci// Helpers
563af6ab5fSopenharmony_ci
573af6ab5fSopenharmony_cibool Helpers::IsGlobalIdentifier(const util::StringView &str)
583af6ab5fSopenharmony_ci{
593af6ab5fSopenharmony_ci    return (str.Is("NaN") || str.Is("undefined") || str.Is("Infinity"));
603af6ab5fSopenharmony_ci}
613af6ab5fSopenharmony_ci
623af6ab5fSopenharmony_cibool Helpers::ContainSpreadElement(const ArenaVector<ir::Expression *> &args)
633af6ab5fSopenharmony_ci{
643af6ab5fSopenharmony_ci    return std::any_of(args.begin(), args.end(), [](const auto *it) { return it->IsSpreadElement(); });
653af6ab5fSopenharmony_ci}
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_ciutil::StringView Helpers::LiteralToPropName(const ir::Expression *lit)
683af6ab5fSopenharmony_ci{
693af6ab5fSopenharmony_ci    switch (lit->Type()) {
703af6ab5fSopenharmony_ci        case ir::AstNodeType::IDENTIFIER: {
713af6ab5fSopenharmony_ci            return lit->AsIdentifier()->Name();
723af6ab5fSopenharmony_ci        }
733af6ab5fSopenharmony_ci        case ir::AstNodeType::STRING_LITERAL: {
743af6ab5fSopenharmony_ci            return lit->AsStringLiteral()->Str();
753af6ab5fSopenharmony_ci        }
763af6ab5fSopenharmony_ci        case ir::AstNodeType::NUMBER_LITERAL: {
773af6ab5fSopenharmony_ci            return lit->AsNumberLiteral()->Str();
783af6ab5fSopenharmony_ci        }
793af6ab5fSopenharmony_ci        case ir::AstNodeType::NULL_LITERAL: {
803af6ab5fSopenharmony_ci            return "null";
813af6ab5fSopenharmony_ci        }
823af6ab5fSopenharmony_ci        case ir::AstNodeType::UNDEFINED_LITERAL: {
833af6ab5fSopenharmony_ci            return "undefined";
843af6ab5fSopenharmony_ci        }
853af6ab5fSopenharmony_ci        default: {
863af6ab5fSopenharmony_ci            UNREACHABLE();
873af6ab5fSopenharmony_ci        }
883af6ab5fSopenharmony_ci    }
893af6ab5fSopenharmony_ci}
903af6ab5fSopenharmony_ci
913af6ab5fSopenharmony_cibool Helpers::IsIndex(double number)
923af6ab5fSopenharmony_ci{
933af6ab5fSopenharmony_ci    if (number >= 0 && number < static_cast<double>(INVALID_INDEX)) {
943af6ab5fSopenharmony_ci        auto intNum = static_cast<uint32_t>(number);
953af6ab5fSopenharmony_ci
963af6ab5fSopenharmony_ci        if (static_cast<double>(intNum) == number) {
973af6ab5fSopenharmony_ci            return true;
983af6ab5fSopenharmony_ci        }
993af6ab5fSopenharmony_ci    }
1003af6ab5fSopenharmony_ci
1013af6ab5fSopenharmony_ci    return false;
1023af6ab5fSopenharmony_ci}
1033af6ab5fSopenharmony_ci
1043af6ab5fSopenharmony_cistatic bool IsDigit(char c)
1053af6ab5fSopenharmony_ci{
1063af6ab5fSopenharmony_ci    return (c >= '0' && c <= '9');
1073af6ab5fSopenharmony_ci}
1083af6ab5fSopenharmony_ci
1093af6ab5fSopenharmony_ciint64_t Helpers::GetIndex(const util::StringView &str)
1103af6ab5fSopenharmony_ci{
1113af6ab5fSopenharmony_ci    const auto &s = str.Utf8();
1123af6ab5fSopenharmony_ci
1133af6ab5fSopenharmony_ci    if (s.empty() || (*s.begin() == '0' && s.length() > 1)) {
1143af6ab5fSopenharmony_ci        return INVALID_INDEX;
1153af6ab5fSopenharmony_ci    }
1163af6ab5fSopenharmony_ci
1173af6ab5fSopenharmony_ci    int64_t value = 0;
1183af6ab5fSopenharmony_ci    for (const auto c : s) {
1193af6ab5fSopenharmony_ci        if (!IsDigit(c)) {
1203af6ab5fSopenharmony_ci            return INVALID_INDEX;
1213af6ab5fSopenharmony_ci        }
1223af6ab5fSopenharmony_ci
1233af6ab5fSopenharmony_ci        constexpr auto MULTIPLIER = 10;
1243af6ab5fSopenharmony_ci        value *= MULTIPLIER;
1253af6ab5fSopenharmony_ci        value += (c - '0');
1263af6ab5fSopenharmony_ci
1273af6ab5fSopenharmony_ci        if (value >= INVALID_INDEX) {
1283af6ab5fSopenharmony_ci            return INVALID_INDEX;
1293af6ab5fSopenharmony_ci        }
1303af6ab5fSopenharmony_ci    }
1313af6ab5fSopenharmony_ci
1323af6ab5fSopenharmony_ci    return value;
1333af6ab5fSopenharmony_ci}
1343af6ab5fSopenharmony_ci
1353af6ab5fSopenharmony_cistd::string Helpers::ToString(double number)
1363af6ab5fSopenharmony_ci{
1373af6ab5fSopenharmony_ci    std::string str;
1383af6ab5fSopenharmony_ci
1393af6ab5fSopenharmony_ci    if (Helpers::IsInteger<int32_t>(number)) {
1403af6ab5fSopenharmony_ci        str = std::to_string(static_cast<int32_t>(number));
1413af6ab5fSopenharmony_ci    } else {
1423af6ab5fSopenharmony_ci        str = std::to_string(number);
1433af6ab5fSopenharmony_ci    }
1443af6ab5fSopenharmony_ci
1453af6ab5fSopenharmony_ci    return str;
1463af6ab5fSopenharmony_ci}
1473af6ab5fSopenharmony_ci
1483af6ab5fSopenharmony_ciutil::StringView Helpers::ToStringView(ArenaAllocator *allocator, double number)
1493af6ab5fSopenharmony_ci{
1503af6ab5fSopenharmony_ci    util::UString str(ToString(number), allocator);
1513af6ab5fSopenharmony_ci    return str.View();
1523af6ab5fSopenharmony_ci}
1533af6ab5fSopenharmony_ci
1543af6ab5fSopenharmony_ciutil::StringView Helpers::ToStringView(ArenaAllocator *allocator, uint32_t number)
1553af6ab5fSopenharmony_ci{
1563af6ab5fSopenharmony_ci    ASSERT(number <= static_cast<uint32_t>(std::numeric_limits<int32_t>::max()));
1573af6ab5fSopenharmony_ci    return ToStringView(allocator, static_cast<int32_t>(number));
1583af6ab5fSopenharmony_ci}
1593af6ab5fSopenharmony_ci
1603af6ab5fSopenharmony_ciutil::StringView Helpers::ToStringView(ArenaAllocator *allocator, int32_t number)
1613af6ab5fSopenharmony_ci{
1623af6ab5fSopenharmony_ci    util::UString str(ToString(number), allocator);
1633af6ab5fSopenharmony_ci    return str.View();
1643af6ab5fSopenharmony_ci}
1653af6ab5fSopenharmony_ci
1663af6ab5fSopenharmony_cibool Helpers::EndsWith(const std::string &str, const std::string &suffix)
1673af6ab5fSopenharmony_ci{
1683af6ab5fSopenharmony_ci    if (str.length() < suffix.length()) {
1693af6ab5fSopenharmony_ci        return false;
1703af6ab5fSopenharmony_ci    }
1713af6ab5fSopenharmony_ci    size_t expectPos = str.length() - suffix.length();
1723af6ab5fSopenharmony_ci    return str.find(suffix, expectPos) == expectPos;
1733af6ab5fSopenharmony_ci}
1743af6ab5fSopenharmony_ci
1753af6ab5fSopenharmony_ciconst ir::ScriptFunction *Helpers::GetContainingConstructor(const ir::AstNode *node)
1763af6ab5fSopenharmony_ci{
1773af6ab5fSopenharmony_ci    const ir::ScriptFunction *iter = GetContainingFunction(node);
1783af6ab5fSopenharmony_ci
1793af6ab5fSopenharmony_ci    while (iter != nullptr) {
1803af6ab5fSopenharmony_ci        if (iter->IsConstructor()) {
1813af6ab5fSopenharmony_ci            return iter;
1823af6ab5fSopenharmony_ci        }
1833af6ab5fSopenharmony_ci
1843af6ab5fSopenharmony_ci        if (!iter->IsArrow()) {
1853af6ab5fSopenharmony_ci            return nullptr;
1863af6ab5fSopenharmony_ci        }
1873af6ab5fSopenharmony_ci
1883af6ab5fSopenharmony_ci        iter = GetContainingFunction(iter);
1893af6ab5fSopenharmony_ci    }
1903af6ab5fSopenharmony_ci
1913af6ab5fSopenharmony_ci    return iter;
1923af6ab5fSopenharmony_ci}
1933af6ab5fSopenharmony_ci
1943af6ab5fSopenharmony_ciconst ir::TSEnumDeclaration *Helpers::GetContainingEnumDeclaration(const ir::AstNode *node)
1953af6ab5fSopenharmony_ci{
1963af6ab5fSopenharmony_ci    auto *iter = node;
1973af6ab5fSopenharmony_ci
1983af6ab5fSopenharmony_ci    while (iter != nullptr) {
1993af6ab5fSopenharmony_ci        if (iter->IsTSEnumDeclaration()) {
2003af6ab5fSopenharmony_ci            return iter->AsTSEnumDeclaration();
2013af6ab5fSopenharmony_ci        }
2023af6ab5fSopenharmony_ci
2033af6ab5fSopenharmony_ci        iter = iter->Parent();
2043af6ab5fSopenharmony_ci    }
2053af6ab5fSopenharmony_ci
2063af6ab5fSopenharmony_ci    return nullptr;
2073af6ab5fSopenharmony_ci}
2083af6ab5fSopenharmony_ci
2093af6ab5fSopenharmony_ciconst checker::ETSObjectType *Helpers::GetContainingObjectType(const ir::AstNode *node)
2103af6ab5fSopenharmony_ci{
2113af6ab5fSopenharmony_ci    const auto *iter = node;
2123af6ab5fSopenharmony_ci
2133af6ab5fSopenharmony_ci    while (iter != nullptr) {
2143af6ab5fSopenharmony_ci        if (iter->IsClassDefinition()) {
2153af6ab5fSopenharmony_ci            auto *ret = iter->AsClassDefinition()->TsType();
2163af6ab5fSopenharmony_ci            return ret != nullptr ? ret->AsETSObjectType() : nullptr;
2173af6ab5fSopenharmony_ci        }
2183af6ab5fSopenharmony_ci
2193af6ab5fSopenharmony_ci        if (iter->IsTSInterfaceDeclaration()) {
2203af6ab5fSopenharmony_ci            auto *ret = iter->AsTSInterfaceDeclaration()->TsType();
2213af6ab5fSopenharmony_ci            return ret != nullptr ? ret->AsETSObjectType() : nullptr;
2223af6ab5fSopenharmony_ci        }
2233af6ab5fSopenharmony_ci
2243af6ab5fSopenharmony_ci        if (iter->IsTSEnumDeclaration()) {
2253af6ab5fSopenharmony_ci            auto *ret = iter->AsTSEnumDeclaration()->TsType();
2263af6ab5fSopenharmony_ci            return ret != nullptr ? ret->AsETSObjectType() : nullptr;
2273af6ab5fSopenharmony_ci        }
2283af6ab5fSopenharmony_ci
2293af6ab5fSopenharmony_ci        iter = iter->Parent();
2303af6ab5fSopenharmony_ci    }
2313af6ab5fSopenharmony_ci
2323af6ab5fSopenharmony_ci    return nullptr;
2333af6ab5fSopenharmony_ci}
2343af6ab5fSopenharmony_ci
2353af6ab5fSopenharmony_ciconst ir::ClassDefinition *Helpers::GetContainingClassDefinition(const ir::AstNode *node)
2363af6ab5fSopenharmony_ci{
2373af6ab5fSopenharmony_ci    const auto *iter = node;
2383af6ab5fSopenharmony_ci
2393af6ab5fSopenharmony_ci    while (iter != nullptr) {
2403af6ab5fSopenharmony_ci        if (iter->IsClassDefinition()) {
2413af6ab5fSopenharmony_ci            return iter->AsClassDefinition();
2423af6ab5fSopenharmony_ci        }
2433af6ab5fSopenharmony_ci
2443af6ab5fSopenharmony_ci        iter = iter->Parent();
2453af6ab5fSopenharmony_ci    }
2463af6ab5fSopenharmony_ci
2473af6ab5fSopenharmony_ci    return nullptr;
2483af6ab5fSopenharmony_ci}
2493af6ab5fSopenharmony_ci
2503af6ab5fSopenharmony_ciconst ir::TSInterfaceDeclaration *Helpers::GetContainingInterfaceDeclaration(const ir::AstNode *node)
2513af6ab5fSopenharmony_ci{
2523af6ab5fSopenharmony_ci    const auto *iter = node;
2533af6ab5fSopenharmony_ci
2543af6ab5fSopenharmony_ci    while (iter != nullptr) {
2553af6ab5fSopenharmony_ci        if (iter->IsTSInterfaceDeclaration()) {
2563af6ab5fSopenharmony_ci            return iter->AsTSInterfaceDeclaration();
2573af6ab5fSopenharmony_ci        }
2583af6ab5fSopenharmony_ci
2593af6ab5fSopenharmony_ci        iter = iter->Parent();
2603af6ab5fSopenharmony_ci    }
2613af6ab5fSopenharmony_ci
2623af6ab5fSopenharmony_ci    return nullptr;
2633af6ab5fSopenharmony_ci}
2643af6ab5fSopenharmony_ci
2653af6ab5fSopenharmony_ciconst ir::MethodDefinition *Helpers::GetContainingClassMethodDefinition(const ir::AstNode *node)
2663af6ab5fSopenharmony_ci{
2673af6ab5fSopenharmony_ci    const auto *iter = node;
2683af6ab5fSopenharmony_ci
2693af6ab5fSopenharmony_ci    while (iter != nullptr) {
2703af6ab5fSopenharmony_ci        if (iter->IsMethodDefinition()) {
2713af6ab5fSopenharmony_ci            return iter->AsMethodDefinition();
2723af6ab5fSopenharmony_ci        }
2733af6ab5fSopenharmony_ci
2743af6ab5fSopenharmony_ci        if (iter->IsClassDefinition()) {
2753af6ab5fSopenharmony_ci            break;
2763af6ab5fSopenharmony_ci        }
2773af6ab5fSopenharmony_ci
2783af6ab5fSopenharmony_ci        iter = iter->Parent();
2793af6ab5fSopenharmony_ci    }
2803af6ab5fSopenharmony_ci
2813af6ab5fSopenharmony_ci    return nullptr;
2823af6ab5fSopenharmony_ci}
2833af6ab5fSopenharmony_ci
2843af6ab5fSopenharmony_ciconst ir::ClassStaticBlock *Helpers::GetContainingClassStaticBlock(const ir::AstNode *node)
2853af6ab5fSopenharmony_ci{
2863af6ab5fSopenharmony_ci    const auto *iter = node;
2873af6ab5fSopenharmony_ci
2883af6ab5fSopenharmony_ci    while (iter != nullptr) {
2893af6ab5fSopenharmony_ci        if (iter->IsClassStaticBlock()) {
2903af6ab5fSopenharmony_ci            return iter->AsClassStaticBlock();
2913af6ab5fSopenharmony_ci        }
2923af6ab5fSopenharmony_ci
2933af6ab5fSopenharmony_ci        if (iter->IsClassDefinition()) {
2943af6ab5fSopenharmony_ci            break;
2953af6ab5fSopenharmony_ci        }
2963af6ab5fSopenharmony_ci
2973af6ab5fSopenharmony_ci        iter = iter->Parent();
2983af6ab5fSopenharmony_ci    }
2993af6ab5fSopenharmony_ci
3003af6ab5fSopenharmony_ci    return nullptr;
3013af6ab5fSopenharmony_ci}
3023af6ab5fSopenharmony_ci
3033af6ab5fSopenharmony_ciconst ir::ScriptFunction *Helpers::GetContainingConstructor(const ir::ClassProperty *node)
3043af6ab5fSopenharmony_ci{
3053af6ab5fSopenharmony_ci    for (const auto *parent = node->Parent(); parent != nullptr; parent = parent->Parent()) {
3063af6ab5fSopenharmony_ci        if (parent->IsClassDefinition()) {
3073af6ab5fSopenharmony_ci            ASSERT(parent->AsClassDefinition()->Ctor() != nullptr);
3083af6ab5fSopenharmony_ci            return parent->AsClassDefinition()->Ctor()->Function();
3093af6ab5fSopenharmony_ci        }
3103af6ab5fSopenharmony_ci    }
3113af6ab5fSopenharmony_ci
3123af6ab5fSopenharmony_ci    return nullptr;
3133af6ab5fSopenharmony_ci}
3143af6ab5fSopenharmony_ci
3153af6ab5fSopenharmony_ciconst ir::ScriptFunction *Helpers::GetContainingFunction(const ir::AstNode *node)
3163af6ab5fSopenharmony_ci{
3173af6ab5fSopenharmony_ci    for (const auto *parent = node->Parent(); parent != nullptr; parent = parent->Parent()) {
3183af6ab5fSopenharmony_ci        if (parent->IsScriptFunction()) {
3193af6ab5fSopenharmony_ci            return parent->AsScriptFunction();
3203af6ab5fSopenharmony_ci        }
3213af6ab5fSopenharmony_ci    }
3223af6ab5fSopenharmony_ci
3233af6ab5fSopenharmony_ci    return nullptr;
3243af6ab5fSopenharmony_ci}
3253af6ab5fSopenharmony_ci
3263af6ab5fSopenharmony_ciconst ir::ClassDefinition *Helpers::GetClassDefiniton(const ir::ScriptFunction *node)
3273af6ab5fSopenharmony_ci{
3283af6ab5fSopenharmony_ci    ASSERT(node->IsConstructor());
3293af6ab5fSopenharmony_ci    ASSERT(node->Parent()->IsFunctionExpression());
3303af6ab5fSopenharmony_ci    ASSERT(node->Parent()->Parent()->IsMethodDefinition());
3313af6ab5fSopenharmony_ci    ASSERT(node->Parent()->Parent()->Parent()->IsClassDefinition());
3323af6ab5fSopenharmony_ci
3333af6ab5fSopenharmony_ci    return node->Parent()->Parent()->Parent()->AsClassDefinition();
3343af6ab5fSopenharmony_ci}
3353af6ab5fSopenharmony_ci
3363af6ab5fSopenharmony_cibool Helpers::IsSpecialPropertyKey(const ir::Expression *expr)
3373af6ab5fSopenharmony_ci{
3383af6ab5fSopenharmony_ci    if (!expr->IsStringLiteral()) {
3393af6ab5fSopenharmony_ci        return false;
3403af6ab5fSopenharmony_ci    }
3413af6ab5fSopenharmony_ci
3423af6ab5fSopenharmony_ci    auto *lit = expr->AsStringLiteral();
3433af6ab5fSopenharmony_ci    return lit->Str().Is("prototype") || lit->Str().Is("constructor");
3443af6ab5fSopenharmony_ci}
3453af6ab5fSopenharmony_ci
3463af6ab5fSopenharmony_cibool Helpers::IsConstantPropertyKey(const ir::Expression *expr, bool isComputed)
3473af6ab5fSopenharmony_ci{
3483af6ab5fSopenharmony_ci    switch (expr->Type()) {
3493af6ab5fSopenharmony_ci        case ir::AstNodeType::IDENTIFIER: {
3503af6ab5fSopenharmony_ci            return !isComputed;
3513af6ab5fSopenharmony_ci        }
3523af6ab5fSopenharmony_ci        case ir::AstNodeType::NUMBER_LITERAL:
3533af6ab5fSopenharmony_ci        case ir::AstNodeType::STRING_LITERAL:
3543af6ab5fSopenharmony_ci        case ir::AstNodeType::BOOLEAN_LITERAL:
3553af6ab5fSopenharmony_ci        case ir::AstNodeType::NULL_LITERAL: {
3563af6ab5fSopenharmony_ci            return true;
3573af6ab5fSopenharmony_ci        }
3583af6ab5fSopenharmony_ci        default:
3593af6ab5fSopenharmony_ci            break;
3603af6ab5fSopenharmony_ci    }
3613af6ab5fSopenharmony_ci
3623af6ab5fSopenharmony_ci    return false;
3633af6ab5fSopenharmony_ci}
3643af6ab5fSopenharmony_ci
3653af6ab5fSopenharmony_cicompiler::Literal Helpers::ToConstantLiteral(const ir::Expression *expr)
3663af6ab5fSopenharmony_ci{
3673af6ab5fSopenharmony_ci    switch (expr->Type()) {
3683af6ab5fSopenharmony_ci        case ir::AstNodeType::NUMBER_LITERAL: {
3693af6ab5fSopenharmony_ci            auto *lit = expr->AsNumberLiteral();
3703af6ab5fSopenharmony_ci            if (util::Helpers::IsInteger<uint32_t>(lit->Number().GetDouble())) {
3713af6ab5fSopenharmony_ci                return compiler::Literal(static_cast<uint32_t>(lit->Number().GetDouble()));
3723af6ab5fSopenharmony_ci            }
3733af6ab5fSopenharmony_ci            return compiler::Literal(lit->Number().GetDouble());
3743af6ab5fSopenharmony_ci        }
3753af6ab5fSopenharmony_ci        case ir::AstNodeType::STRING_LITERAL: {
3763af6ab5fSopenharmony_ci            auto *lit = expr->AsStringLiteral();
3773af6ab5fSopenharmony_ci            return compiler::Literal(lit->Str());
3783af6ab5fSopenharmony_ci        }
3793af6ab5fSopenharmony_ci        case ir::AstNodeType::BOOLEAN_LITERAL: {
3803af6ab5fSopenharmony_ci            auto *lit = expr->AsBooleanLiteral();
3813af6ab5fSopenharmony_ci            return compiler::Literal(lit->Value());
3823af6ab5fSopenharmony_ci        }
3833af6ab5fSopenharmony_ci        case ir::AstNodeType::NULL_LITERAL: {
3843af6ab5fSopenharmony_ci            return compiler::Literal::NullLiteral();
3853af6ab5fSopenharmony_ci        }
3863af6ab5fSopenharmony_ci        case ir::AstNodeType::UNDEFINED_LITERAL: {
3873af6ab5fSopenharmony_ci            return compiler::Literal::UndefinedLiteral();
3883af6ab5fSopenharmony_ci        }
3893af6ab5fSopenharmony_ci        default:
3903af6ab5fSopenharmony_ci            break;
3913af6ab5fSopenharmony_ci    }
3923af6ab5fSopenharmony_ci
3933af6ab5fSopenharmony_ci    return compiler::Literal();
3943af6ab5fSopenharmony_ci}
3953af6ab5fSopenharmony_ci
3963af6ab5fSopenharmony_cibool Helpers::IsBindingPattern(const ir::AstNode *node)
3973af6ab5fSopenharmony_ci{
3983af6ab5fSopenharmony_ci    return node->IsArrayPattern() || node->IsObjectPattern();
3993af6ab5fSopenharmony_ci}
4003af6ab5fSopenharmony_ci
4013af6ab5fSopenharmony_cibool Helpers::IsPattern(const ir::AstNode *node)
4023af6ab5fSopenharmony_ci{
4033af6ab5fSopenharmony_ci    return node->IsArrayPattern() || node->IsObjectPattern() || node->IsAssignmentPattern();
4043af6ab5fSopenharmony_ci}
4053af6ab5fSopenharmony_ci
4063af6ab5fSopenharmony_cistatic void CollectBindingName(ir::AstNode *node, std::vector<ir::Identifier *> *bindings)
4073af6ab5fSopenharmony_ci{
4083af6ab5fSopenharmony_ci    switch (node->Type()) {
4093af6ab5fSopenharmony_ci        case ir::AstNodeType::IDENTIFIER: {
4103af6ab5fSopenharmony_ci            if (!Helpers::IsGlobalIdentifier(node->AsIdentifier()->Name())) {
4113af6ab5fSopenharmony_ci                bindings->push_back(node->AsIdentifier());
4123af6ab5fSopenharmony_ci            }
4133af6ab5fSopenharmony_ci
4143af6ab5fSopenharmony_ci            break;
4153af6ab5fSopenharmony_ci        }
4163af6ab5fSopenharmony_ci        case ir::AstNodeType::OBJECT_PATTERN: {
4173af6ab5fSopenharmony_ci            for (auto *prop : node->AsObjectPattern()->Properties()) {
4183af6ab5fSopenharmony_ci                CollectBindingName(prop, bindings);
4193af6ab5fSopenharmony_ci            }
4203af6ab5fSopenharmony_ci            break;
4213af6ab5fSopenharmony_ci        }
4223af6ab5fSopenharmony_ci        case ir::AstNodeType::ARRAY_PATTERN: {
4233af6ab5fSopenharmony_ci            for (auto *element : node->AsArrayPattern()->Elements()) {
4243af6ab5fSopenharmony_ci                CollectBindingName(element, bindings);
4253af6ab5fSopenharmony_ci            }
4263af6ab5fSopenharmony_ci            break;
4273af6ab5fSopenharmony_ci        }
4283af6ab5fSopenharmony_ci        case ir::AstNodeType::ASSIGNMENT_PATTERN: {
4293af6ab5fSopenharmony_ci            CollectBindingName(node->AsAssignmentPattern()->Left(), bindings);
4303af6ab5fSopenharmony_ci            break;
4313af6ab5fSopenharmony_ci        }
4323af6ab5fSopenharmony_ci        case ir::AstNodeType::PROPERTY: {
4333af6ab5fSopenharmony_ci            CollectBindingName(node->AsProperty()->Value(), bindings);
4343af6ab5fSopenharmony_ci            break;
4353af6ab5fSopenharmony_ci        }
4363af6ab5fSopenharmony_ci        case ir::AstNodeType::REST_ELEMENT: {
4373af6ab5fSopenharmony_ci            CollectBindingName(node->AsRestElement()->Argument(), bindings);
4383af6ab5fSopenharmony_ci            break;
4393af6ab5fSopenharmony_ci        }
4403af6ab5fSopenharmony_ci        default:
4413af6ab5fSopenharmony_ci            break;
4423af6ab5fSopenharmony_ci    }
4433af6ab5fSopenharmony_ci}
4443af6ab5fSopenharmony_ci
4453af6ab5fSopenharmony_cistd::vector<ir::Identifier *> Helpers::CollectBindingNames(ir::AstNode *node)
4463af6ab5fSopenharmony_ci{
4473af6ab5fSopenharmony_ci    std::vector<ir::Identifier *> bindings;
4483af6ab5fSopenharmony_ci    CollectBindingName(node, &bindings);
4493af6ab5fSopenharmony_ci    return bindings;
4503af6ab5fSopenharmony_ci}
4513af6ab5fSopenharmony_ci
4523af6ab5fSopenharmony_civoid Helpers::CheckImportedName(const ArenaVector<ir::ImportSpecifier *> &specifiers,
4533af6ab5fSopenharmony_ci                                const ir::ImportSpecifier *specifier, const std::string &fileName)
4543af6ab5fSopenharmony_ci{
4553af6ab5fSopenharmony_ci    auto newIdentName = specifier->Imported()->Name();
4563af6ab5fSopenharmony_ci    auto newAliasName = specifier->Local()->Name();
4573af6ab5fSopenharmony_ci    std::stringstream message {};
4583af6ab5fSopenharmony_ci
4593af6ab5fSopenharmony_ci    for (auto *it : specifiers) {
4603af6ab5fSopenharmony_ci        auto savedIdentName = it->Imported()->Name();
4613af6ab5fSopenharmony_ci        auto savedAliasName = it->Local()->Name();
4623af6ab5fSopenharmony_ci        if (savedIdentName == savedAliasName && savedAliasName == newIdentName) {
4633af6ab5fSopenharmony_ci            message << "Warning: '" << newIdentName << "' has already imported ";
4643af6ab5fSopenharmony_ci            break;
4653af6ab5fSopenharmony_ci        }
4663af6ab5fSopenharmony_ci        if (savedIdentName == newIdentName && newAliasName != savedAliasName) {
4673af6ab5fSopenharmony_ci            message << "Warning: '" << newIdentName << "' is explicitly used with alias several times ";
4683af6ab5fSopenharmony_ci            break;
4693af6ab5fSopenharmony_ci        }
4703af6ab5fSopenharmony_ci    }
4713af6ab5fSopenharmony_ci
4723af6ab5fSopenharmony_ci    if (message.rdbuf()->in_avail() > 0) {
4733af6ab5fSopenharmony_ci        std::cerr << message.str() << "[" << fileName.c_str() << ":" << specifier->Start().line << ":"
4743af6ab5fSopenharmony_ci                  << specifier->Start().index << "]" << std::endl;
4753af6ab5fSopenharmony_ci    }
4763af6ab5fSopenharmony_ci}
4773af6ab5fSopenharmony_ci
4783af6ab5fSopenharmony_civoid Helpers::CheckDefaultImportedName(const ArenaVector<ir::ImportDefaultSpecifier *> &specifiers,
4793af6ab5fSopenharmony_ci                                       const ir::ImportDefaultSpecifier *specifier, const std::string &fileName)
4803af6ab5fSopenharmony_ci{
4813af6ab5fSopenharmony_ci    for (auto *it : specifiers) {
4823af6ab5fSopenharmony_ci        if (specifier->Local()->Name() != it->Local()->Name()) {
4833af6ab5fSopenharmony_ci            std::cerr << "Warning: default element is explicitly used with alias several times [" << fileName.c_str()
4843af6ab5fSopenharmony_ci                      << ":" << specifier->Start().line << ":" << specifier->Start().index << "]" << std::endl;
4853af6ab5fSopenharmony_ci            return;
4863af6ab5fSopenharmony_ci        }
4873af6ab5fSopenharmony_ci    }
4883af6ab5fSopenharmony_ci}
4893af6ab5fSopenharmony_ci
4903af6ab5fSopenharmony_civoid Helpers::CheckDefaultImport(const ArenaVector<ir::ETSImportDeclaration *> &statements)
4913af6ab5fSopenharmony_ci{
4923af6ab5fSopenharmony_ci    for (auto statement : statements) {
4933af6ab5fSopenharmony_ci        for (auto specifier : statement->Specifiers()) {
4943af6ab5fSopenharmony_ci            if (specifier->Type() == ir::AstNodeType::IMPORT_DEFAULT_SPECIFIER) {
4953af6ab5fSopenharmony_ci                auto fileName = statement->ResolvedSource()->Str();
4963af6ab5fSopenharmony_ci                std::cerr << "Warning: default element has already imported [" << fileName << ":"
4973af6ab5fSopenharmony_ci                          << specifier->Start().line << ":" << specifier->Start().index << "]" << std::endl;
4983af6ab5fSopenharmony_ci                return;
4993af6ab5fSopenharmony_ci            }
5003af6ab5fSopenharmony_ci        }
5013af6ab5fSopenharmony_ci    }
5023af6ab5fSopenharmony_ci}
5033af6ab5fSopenharmony_ci
5043af6ab5fSopenharmony_cistatic util::StringView FunctionNameFromParent(const ir::AstNode *parent, ArenaAllocator *allocator)
5053af6ab5fSopenharmony_ci{
5063af6ab5fSopenharmony_ci    switch (parent->Type()) {
5073af6ab5fSopenharmony_ci        case ir::AstNodeType::VARIABLE_DECLARATOR: {
5083af6ab5fSopenharmony_ci            const ir::VariableDeclarator *varDecl = parent->AsVariableDeclarator();
5093af6ab5fSopenharmony_ci
5103af6ab5fSopenharmony_ci            if (varDecl->Id()->IsIdentifier()) {
5113af6ab5fSopenharmony_ci                return varDecl->Id()->AsIdentifier()->Name();
5123af6ab5fSopenharmony_ci            }
5133af6ab5fSopenharmony_ci
5143af6ab5fSopenharmony_ci            break;
5153af6ab5fSopenharmony_ci        }
5163af6ab5fSopenharmony_ci        case ir::AstNodeType::METHOD_DEFINITION: {
5173af6ab5fSopenharmony_ci            const ir::MethodDefinition *methodDef = parent->AsMethodDefinition();
5183af6ab5fSopenharmony_ci
5193af6ab5fSopenharmony_ci            if (methodDef->Key()->IsIdentifier()) {
5203af6ab5fSopenharmony_ci                auto *ident = methodDef->Id();
5213af6ab5fSopenharmony_ci                ASSERT(ident != nullptr);
5223af6ab5fSopenharmony_ci
5233af6ab5fSopenharmony_ci                if (!ident->IsPrivateIdent()) {
5243af6ab5fSopenharmony_ci                    return ident->Name();
5253af6ab5fSopenharmony_ci                }
5263af6ab5fSopenharmony_ci
5273af6ab5fSopenharmony_ci                return util::UString(varbinder::PrivateBinding::ToPrivateBinding(ident->Name()), allocator).View();
5283af6ab5fSopenharmony_ci            }
5293af6ab5fSopenharmony_ci
5303af6ab5fSopenharmony_ci            break;
5313af6ab5fSopenharmony_ci        }
5323af6ab5fSopenharmony_ci        case ir::AstNodeType::ASSIGNMENT_EXPRESSION: {
5333af6ab5fSopenharmony_ci            const ir::AssignmentExpression *assignment = parent->AsAssignmentExpression();
5343af6ab5fSopenharmony_ci
5353af6ab5fSopenharmony_ci            if (assignment->Left()->IsIdentifier()) {
5363af6ab5fSopenharmony_ci                return assignment->Left()->AsIdentifier()->Name();
5373af6ab5fSopenharmony_ci            }
5383af6ab5fSopenharmony_ci
5393af6ab5fSopenharmony_ci            break;
5403af6ab5fSopenharmony_ci        }
5413af6ab5fSopenharmony_ci        case ir::AstNodeType::ASSIGNMENT_PATTERN: {
5423af6ab5fSopenharmony_ci            const ir::AssignmentExpression *assignment = parent->AsAssignmentPattern();
5433af6ab5fSopenharmony_ci
5443af6ab5fSopenharmony_ci            if (assignment->Left()->IsIdentifier()) {
5453af6ab5fSopenharmony_ci                return assignment->Left()->AsIdentifier()->Name();
5463af6ab5fSopenharmony_ci            }
5473af6ab5fSopenharmony_ci
5483af6ab5fSopenharmony_ci            break;
5493af6ab5fSopenharmony_ci        }
5503af6ab5fSopenharmony_ci        case ir::AstNodeType::PROPERTY: {
5513af6ab5fSopenharmony_ci            const ir::Property *prop = parent->AsProperty();
5523af6ab5fSopenharmony_ci
5533af6ab5fSopenharmony_ci            if (prop->Kind() != ir::PropertyKind::PROTO &&
5543af6ab5fSopenharmony_ci                Helpers::IsConstantPropertyKey(prop->Key(), prop->IsComputed())) {
5553af6ab5fSopenharmony_ci                return Helpers::LiteralToPropName(prop->Key());
5563af6ab5fSopenharmony_ci            }
5573af6ab5fSopenharmony_ci
5583af6ab5fSopenharmony_ci            break;
5593af6ab5fSopenharmony_ci        }
5603af6ab5fSopenharmony_ci        default:
5613af6ab5fSopenharmony_ci            break;
5623af6ab5fSopenharmony_ci    }
5633af6ab5fSopenharmony_ci
5643af6ab5fSopenharmony_ci    return util::StringView();
5653af6ab5fSopenharmony_ci}
5663af6ab5fSopenharmony_ci
5673af6ab5fSopenharmony_ciutil::StringView Helpers::FunctionName(ArenaAllocator *allocator, const ir::ScriptFunction *func)
5683af6ab5fSopenharmony_ci{
5693af6ab5fSopenharmony_ci    if (func->Id() != nullptr) {
5703af6ab5fSopenharmony_ci        return func->Id()->Name();
5713af6ab5fSopenharmony_ci    }
5723af6ab5fSopenharmony_ci
5733af6ab5fSopenharmony_ci    if (func->Parent()->IsFunctionDeclaration()) {
5743af6ab5fSopenharmony_ci        return "*default*";
5753af6ab5fSopenharmony_ci    }
5763af6ab5fSopenharmony_ci
5773af6ab5fSopenharmony_ci    const ir::AstNode *parent = func->Parent()->Parent();
5783af6ab5fSopenharmony_ci
5793af6ab5fSopenharmony_ci    if (func->IsConstructor()) {
5803af6ab5fSopenharmony_ci        parent = parent->Parent();
5813af6ab5fSopenharmony_ci        if (parent->AsClassDefinition()->Ident() != nullptr) {
5823af6ab5fSopenharmony_ci            return parent->AsClassDefinition()->Ident()->Name();
5833af6ab5fSopenharmony_ci        }
5843af6ab5fSopenharmony_ci
5853af6ab5fSopenharmony_ci        parent = parent->Parent()->Parent();
5863af6ab5fSopenharmony_ci    }
5873af6ab5fSopenharmony_ci
5883af6ab5fSopenharmony_ci    return FunctionNameFromParent(parent, allocator);
5893af6ab5fSopenharmony_ci}
5903af6ab5fSopenharmony_ci
5913af6ab5fSopenharmony_cistd::tuple<util::StringView, bool> Helpers::ParamName(ArenaAllocator *allocator, const ir::AstNode *param,
5923af6ab5fSopenharmony_ci                                                      uint32_t index)
5933af6ab5fSopenharmony_ci{
5943af6ab5fSopenharmony_ci    switch (param->Type()) {
5953af6ab5fSopenharmony_ci        case ir::AstNodeType::IDENTIFIER: {
5963af6ab5fSopenharmony_ci            return {param->AsIdentifier()->Name(), false};
5973af6ab5fSopenharmony_ci        }
5983af6ab5fSopenharmony_ci        case ir::AstNodeType::ASSIGNMENT_PATTERN: {
5993af6ab5fSopenharmony_ci            const auto *lhs = param->AsAssignmentPattern()->Left();
6003af6ab5fSopenharmony_ci            if (lhs->IsIdentifier()) {
6013af6ab5fSopenharmony_ci                return {param->AsAssignmentPattern()->Left()->AsIdentifier()->Name(), false};
6023af6ab5fSopenharmony_ci            }
6033af6ab5fSopenharmony_ci            break;
6043af6ab5fSopenharmony_ci        }
6053af6ab5fSopenharmony_ci        case ir::AstNodeType::REST_ELEMENT: {
6063af6ab5fSopenharmony_ci            if (param->AsRestElement()->Argument()->IsIdentifier()) {
6073af6ab5fSopenharmony_ci                return {param->AsRestElement()->Argument()->AsIdentifier()->Name(), false};
6083af6ab5fSopenharmony_ci            }
6093af6ab5fSopenharmony_ci            break;
6103af6ab5fSopenharmony_ci        }
6113af6ab5fSopenharmony_ci        case ir::AstNodeType::TS_PARAMETER_PROPERTY: {
6123af6ab5fSopenharmony_ci            return ParamName(allocator, param->AsTSParameterProperty()->Parameter(), index);
6133af6ab5fSopenharmony_ci        }
6143af6ab5fSopenharmony_ci        case ir::AstNodeType::ETS_PARAMETER_EXPRESSION: {
6153af6ab5fSopenharmony_ci            return {param->AsETSParameterExpression()->Ident()->Name(), false};
6163af6ab5fSopenharmony_ci        }
6173af6ab5fSopenharmony_ci        default:
6183af6ab5fSopenharmony_ci            break;
6193af6ab5fSopenharmony_ci    }
6203af6ab5fSopenharmony_ci
6213af6ab5fSopenharmony_ci    return {Helpers::ToStringView(allocator, index), true};
6223af6ab5fSopenharmony_ci}
6233af6ab5fSopenharmony_ci
6243af6ab5fSopenharmony_cistatic std::string GetEscapedCharacter(const unsigned char c)
6253af6ab5fSopenharmony_ci{
6263af6ab5fSopenharmony_ci    std::stringstream escapedStr;
6273af6ab5fSopenharmony_ci    escapedStr << '\\';
6283af6ab5fSopenharmony_ci    switch (c) {
6293af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_DOUBLE_QUOTE: {
6303af6ab5fSopenharmony_ci            escapedStr << '"';
6313af6ab5fSopenharmony_ci            break;
6323af6ab5fSopenharmony_ci        }
6333af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_BS: {
6343af6ab5fSopenharmony_ci            escapedStr << 'b';
6353af6ab5fSopenharmony_ci            break;
6363af6ab5fSopenharmony_ci        }
6373af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_TAB: {
6383af6ab5fSopenharmony_ci            escapedStr << 't';
6393af6ab5fSopenharmony_ci            break;
6403af6ab5fSopenharmony_ci        }
6413af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_LF: {
6423af6ab5fSopenharmony_ci            escapedStr << 'n';
6433af6ab5fSopenharmony_ci            break;
6443af6ab5fSopenharmony_ci        }
6453af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_VT: {
6463af6ab5fSopenharmony_ci            escapedStr << 'v';
6473af6ab5fSopenharmony_ci            break;
6483af6ab5fSopenharmony_ci        }
6493af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_FF: {
6503af6ab5fSopenharmony_ci            escapedStr << 'f';
6513af6ab5fSopenharmony_ci            break;
6523af6ab5fSopenharmony_ci        }
6533af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_CR: {
6543af6ab5fSopenharmony_ci            escapedStr << 'r';
6553af6ab5fSopenharmony_ci            break;
6563af6ab5fSopenharmony_ci        }
6573af6ab5fSopenharmony_ci        case lexer::LEX_CHAR_NULL: {
6583af6ab5fSopenharmony_ci            escapedStr << '0';
6593af6ab5fSopenharmony_ci            break;
6603af6ab5fSopenharmony_ci        }
6613af6ab5fSopenharmony_ci        default: {
6623af6ab5fSopenharmony_ci            escapedStr << 'u' << std::hex << std::setw(4U) << std::setfill('0') << static_cast<unsigned int>(c);
6633af6ab5fSopenharmony_ci            break;
6643af6ab5fSopenharmony_ci        }
6653af6ab5fSopenharmony_ci    }
6663af6ab5fSopenharmony_ci    return escapedStr.str();
6673af6ab5fSopenharmony_ci}
6683af6ab5fSopenharmony_ci
6693af6ab5fSopenharmony_cistd::string Helpers::CreateEscapedString(const std::string &str)
6703af6ab5fSopenharmony_ci{
6713af6ab5fSopenharmony_ci    std::string escapedStr;
6723af6ab5fSopenharmony_ci    for (const unsigned char c : str) {
6733af6ab5fSopenharmony_ci        // check if a given character is printable
6743af6ab5fSopenharmony_ci        // the cast is necessary to avoid undefined behaviour
6753af6ab5fSopenharmony_ci        if (LIKELY((std::isprint(c) != 0U || c >= lexer::LEX_ASCII_MAX_BITS) && c != lexer::LEX_CHAR_DOUBLE_QUOTE)) {
6763af6ab5fSopenharmony_ci            escapedStr += c;
6773af6ab5fSopenharmony_ci        } else {
6783af6ab5fSopenharmony_ci            escapedStr += GetEscapedCharacter(c);
6793af6ab5fSopenharmony_ci        }
6803af6ab5fSopenharmony_ci    }
6813af6ab5fSopenharmony_ci    return escapedStr;
6823af6ab5fSopenharmony_ci}
6833af6ab5fSopenharmony_ci
6843af6ab5fSopenharmony_cistd::string Helpers::UTF16toUTF8(const char16_t c)
6853af6ab5fSopenharmony_ci{
6863af6ab5fSopenharmony_ci    const utf::Utf8Char utf8Ch = utf::ConvertUtf16ToUtf8(c, 0, false);
6873af6ab5fSopenharmony_ci    return std::string(reinterpret_cast<const char *>(utf8Ch.ch.data()), utf8Ch.n);
6883af6ab5fSopenharmony_ci}
6893af6ab5fSopenharmony_ci
6903af6ab5fSopenharmony_cistd::pair<std::string_view, std::string_view> Helpers::SplitSignature(std::string_view signature)
6913af6ab5fSopenharmony_ci{
6923af6ab5fSopenharmony_ci    auto idx = signature.find_last_of(':');
6933af6ab5fSopenharmony_ci    auto stripped = signature.substr(0, idx);
6943af6ab5fSopenharmony_ci    idx = stripped.find_last_of('.');
6953af6ab5fSopenharmony_ci    auto fullClassName = stripped.substr(0, idx);
6963af6ab5fSopenharmony_ci    auto methodName = stripped.substr(idx + 1);
6973af6ab5fSopenharmony_ci    idx = fullClassName.find_last_of('.');
6983af6ab5fSopenharmony_ci    auto className = fullClassName.substr(idx + 1);
6993af6ab5fSopenharmony_ci    return {className, methodName};
7003af6ab5fSopenharmony_ci}
7013af6ab5fSopenharmony_ci
7023af6ab5fSopenharmony_cistd::vector<std::string> &Helpers::StdLib()
7033af6ab5fSopenharmony_ci{
7043af6ab5fSopenharmony_ci    static std::vector<std::string> stdlib {"std/core",       "std/math",  "std/containers",        "std/time",
7053af6ab5fSopenharmony_ci                                            "std/interop/js", "std/debug", "std/debug/concurrency", "std/testing",
7063af6ab5fSopenharmony_ci                                            "escompat"};
7073af6ab5fSopenharmony_ci    return stdlib;
7083af6ab5fSopenharmony_ci}
7093af6ab5fSopenharmony_ci
7103af6ab5fSopenharmony_cibool Helpers::IsStdLib(const parser::Program *program)
7113af6ab5fSopenharmony_ci{
7123af6ab5fSopenharmony_ci    auto stdlib = StdLib();
7133af6ab5fSopenharmony_ci
7143af6ab5fSopenharmony_ci    // NOTE(rsipka): early check: if program is not a package module then it is not part of the stdlib either
7153af6ab5fSopenharmony_ci    if (!program->IsPackageModule()) {
7163af6ab5fSopenharmony_ci        return false;
7173af6ab5fSopenharmony_ci    }
7183af6ab5fSopenharmony_ci
7193af6ab5fSopenharmony_ci    stdlib.emplace_back("std/math/consts");
7203af6ab5fSopenharmony_ci
7213af6ab5fSopenharmony_ci    auto fileFolder = program->ModuleName().Mutf8();
7223af6ab5fSopenharmony_ci    std::replace(fileFolder.begin(), fileFolder.end(), *compiler::Signatures::METHOD_SEPARATOR.begin(),
7233af6ab5fSopenharmony_ci                 *compiler::Signatures::NAMESPACE_SEPARATOR.begin());
7243af6ab5fSopenharmony_ci    return std::count(stdlib.begin(), stdlib.end(), fileFolder) != 0;
7253af6ab5fSopenharmony_ci}
7263af6ab5fSopenharmony_ci
7273af6ab5fSopenharmony_ci}  // namespace ark::es2panda::util
728