13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2023 - 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#ifndef PANDA_GLOBALDECLTRANSFORMER_H
173af6ab5fSopenharmony_ci#define PANDA_GLOBALDECLTRANSFORMER_H
183af6ab5fSopenharmony_ci
193af6ab5fSopenharmony_ci#include "util/helpers.h"
203af6ab5fSopenharmony_ci#include "compiler/lowering/phase.h"
213af6ab5fSopenharmony_ci#include "ir/visitor/IterateAstVisitor.h"
223af6ab5fSopenharmony_ci
233af6ab5fSopenharmony_cinamespace ark::es2panda::compiler {
243af6ab5fSopenharmony_ci
253af6ab5fSopenharmony_ciclass GlobalDeclTransformer : public ir::visitor::CustomAstVisitor {
263af6ab5fSopenharmony_ci    const std::unordered_set<ir::AstNodeType> typeDecl_ = {
273af6ab5fSopenharmony_ci        ir::AstNodeType::CLASS_DECLARATION,         ir::AstNodeType::STRUCT_DECLARATION,
283af6ab5fSopenharmony_ci        ir::AstNodeType::TS_ENUM_DECLARATION,       ir::AstNodeType::TS_INTERFACE_DECLARATION,
293af6ab5fSopenharmony_ci        ir::AstNodeType::ETS_PACKAGE_DECLARATION,   ir::AstNodeType::ETS_IMPORT_DECLARATION,
303af6ab5fSopenharmony_ci        ir::AstNodeType::TS_TYPE_ALIAS_DECLARATION, ir::AstNodeType::EXPORT_ALL_DECLARATION,
313af6ab5fSopenharmony_ci        ir::AstNodeType::EXPORT_NAMED_DECLARATION,  ir::AstNodeType::REEXPORT_STATEMENT,
323af6ab5fSopenharmony_ci        ir::AstNodeType::NAMESPACE_DECLARATION,
333af6ab5fSopenharmony_ci    };
343af6ab5fSopenharmony_ci
353af6ab5fSopenharmony_ci    const std::unordered_set<ir::AstNodeType> propertiesDecl_ = {
363af6ab5fSopenharmony_ci        ir::AstNodeType::FUNCTION_DECLARATION,
373af6ab5fSopenharmony_ci        ir::AstNodeType::VARIABLE_DECLARATION,
383af6ab5fSopenharmony_ci    };
393af6ab5fSopenharmony_ci
403af6ab5fSopenharmony_cipublic:
413af6ab5fSopenharmony_ci    struct ResultT {
423af6ab5fSopenharmony_ci        explicit ResultT(ArenaAllocator *alloc) : classProperties(alloc->Adapter()), initStatements(alloc->Adapter()) {}
433af6ab5fSopenharmony_ci
443af6ab5fSopenharmony_ci        // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes)
453af6ab5fSopenharmony_ci        ArenaVector<ir::Statement *> classProperties;
463af6ab5fSopenharmony_ci        // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes)
473af6ab5fSopenharmony_ci        ArenaVector<ir::Statement *> initStatements;
483af6ab5fSopenharmony_ci    };
493af6ab5fSopenharmony_ci
503af6ab5fSopenharmony_ci    explicit GlobalDeclTransformer(ArenaAllocator *allocator) : allocator_(allocator), result_(allocator) {}
513af6ab5fSopenharmony_ci
523af6ab5fSopenharmony_ci    /**
533af6ab5fSopenharmony_ci     * Removes top level statements, global variable declarations, global function declarations
543af6ab5fSopenharmony_ci     * @param stmts
553af6ab5fSopenharmony_ci     */
563af6ab5fSopenharmony_ci    void FilterDeclarations(ArenaVector<ir::Statement *> &stmts);
573af6ab5fSopenharmony_ci
583af6ab5fSopenharmony_ci    /**
593af6ab5fSopenharmony_ci     * Creates ClassProperty for global variables and MethodFunction for global functions.
603af6ab5fSopenharmony_ci     * Copy top level statements to vector.
613af6ab5fSopenharmony_ci     * @param stmts top level statements
623af6ab5fSopenharmony_ci     * @param addInitializer $init$ should contain global variable initializers
633af6ab5fSopenharmony_ci     * @return pair (class properties, init statements)
643af6ab5fSopenharmony_ci     */
653af6ab5fSopenharmony_ci    ResultT TransformStatements(const ArenaVector<ir::Statement *> &stmts, bool addInitializer);
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_ci    void VisitFunctionDeclaration(ir::FunctionDeclaration *funcDecl) override;
683af6ab5fSopenharmony_ci    void VisitVariableDeclaration(ir::VariableDeclaration *varDecl) override;
693af6ab5fSopenharmony_ci    void HandleNode(ir::AstNode *node) override;
703af6ab5fSopenharmony_ci
713af6ab5fSopenharmony_ci    ir::Identifier *RefIdent(const util::StringView &name);
723af6ab5fSopenharmony_ci
733af6ab5fSopenharmony_ci    ir::ExpressionStatement *InitTopLevelProperty(ir::ClassProperty *classProperty);
743af6ab5fSopenharmony_ci
753af6ab5fSopenharmony_ciprivate:
763af6ab5fSopenharmony_ci    ArenaAllocator *allocator_;
773af6ab5fSopenharmony_ci    ResultT result_;
783af6ab5fSopenharmony_ci    bool addInitializer_ = true;
793af6ab5fSopenharmony_ci};
803af6ab5fSopenharmony_ci
813af6ab5fSopenharmony_ci}  // namespace ark::es2panda::compiler
823af6ab5fSopenharmony_ci#endif  // PANDA_GLOBALDECLTRANSFORMER_H
83