1/**
2 * Copyright (c) 2021 - 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "program.h"
17
18#include "varbinder/varbinder.h"
19#include "varbinder/ETSBinder.h"
20#include "ir/astDump.h"
21#include "ir/base/classDefinition.h"
22#include "ir/statements/blockStatement.h"
23
24namespace ark::es2panda::parser {
25
26std::string Program::Dump() const
27{
28    ir::AstDumper dumper {ast_, SourceCode()};
29    return dumper.Str();
30}
31
32void Program::DumpSilent() const
33{
34    [[maybe_unused]] ir::AstDumper dumper {ast_, SourceCode()};
35    ASSERT(!dumper.Str().empty());
36}
37
38varbinder::ClassScope *Program::GlobalClassScope()
39{
40    return globalClass_->Scope()->AsClassScope();
41}
42
43const varbinder::ClassScope *Program::GlobalClassScope() const
44{
45    return globalClass_->Scope()->AsClassScope();
46}
47
48varbinder::GlobalScope *Program::GlobalScope()
49{
50    ASSERT(ast_->Scope()->IsGlobalScope() || ast_->Scope()->IsModuleScope());
51    return static_cast<varbinder::GlobalScope *>(ast_->Scope());
52}
53
54const varbinder::GlobalScope *Program::GlobalScope() const
55{
56    ASSERT(ast_->Scope()->IsGlobalScope() || ast_->Scope()->IsModuleScope());
57    return static_cast<const varbinder::GlobalScope *>(ast_->Scope());
58}
59
60void Program::SetDeclarationModuleInfo()
61{
62    bool onlyDeclarations = true;
63    for (auto stmt : ast_->Statements()) {
64        if (stmt->IsDeclare() || stmt->IsTSTypeAliasDeclaration()) {
65            continue;
66        }
67        onlyDeclarations = false;
68        break;
69    }
70    moduleInfo_.isDeclModule = onlyDeclarations;
71}
72
73void Program::AddNodeToETSNolintCollection(const ir::AstNode *node, const std::set<ETSWarnings> &warningsCollection)
74{
75    ArenaSet<ETSWarnings> tmp(allocator_->Adapter());
76    tmp.insert(warningsCollection.begin(), warningsCollection.end());
77    etsnolintCollection_.insert({node, tmp});
78}
79
80bool Program::NodeContainsETSNolint(const ir::AstNode *node, ETSWarnings warning)
81{
82    auto nodeEtsnolints = etsnolintCollection_.find(node);
83    if (nodeEtsnolints == etsnolintCollection_.end()) {
84        return false;
85    }
86
87    return nodeEtsnolints->second.find(warning) != nodeEtsnolints->second.end();
88}
89
90}  // namespace ark::es2panda::parser
91