• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 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 #ifndef ES2PANDA_UTIL_IMPORT_PATH_MANAGER_H
17 #define ES2PANDA_UTIL_IMPORT_PATH_MANAGER_H
18 
19 #if defined PANDA_TARGET_MOBILE
20 #define USE_UNIX_SYSCALL
21 #endif
22 
23 #include "util/arktsconfig.h"
24 #include "util/ustring.h"
25 #include "util/enumbitops.h"
26 
27 #include "es2panda.h"
28 
29 namespace ark::es2panda::util {
30 
31 using ENUMBITOPS_OPERATORS;
32 
33 enum class ImportFlags {
34     NONE = 0U,
35     DEFAULT_IMPORT = 1U << 1U,
36     IMPLICIT_PACKAGE_IMPORT = 1U << 2U,
37 };
38 class ImportPathManager {
39 public:
40     struct ImportData {
41         Language lang;
42         std::string module;
43         bool hasDecl;
44     };
45 
46     struct ParseInfo {
47         StringView sourcePath;
48         bool isParsed;
49         bool isImplicitPackageImported = false;
50     };
51 
ImportPathManager(ark::ArenaAllocator * allocator,std::shared_ptr<ArkTsConfig> arktsConfig,std::string stdLib)52     ImportPathManager(ark::ArenaAllocator *allocator, std::shared_ptr<ArkTsConfig> arktsConfig, std::string stdLib)
53         : allocator_(allocator),
54           arktsConfig_(std::move(arktsConfig)),
55           stdLib_(std::move(stdLib)),
56           parseList_(allocator->Adapter())
57     {
58     }
59 
60     NO_COPY_SEMANTIC(ImportPathManager);
61     NO_MOVE_SEMANTIC(ImportPathManager);
62     ImportPathManager() = delete;
63     ~ImportPathManager() = default;
64 
ParseList()65     [[nodiscard]] const ArenaVector<ParseInfo> &ParseList() const
66     {
67         return parseList_;
68     }
69 
70     StringView ResolvePath(const StringView &currentModulePath, const StringView &importPath) const;
71     void AddToParseList(const StringView &resolvedPath, ImportFlags importFlags);
72     ImportData GetImportData(const util::StringView &path, const ScriptExtension &extension) const;
73     void MarkAsParsed(const StringView &path);
74 
75 private:
76     bool IsRelativePath(const StringView &path) const;
77     StringView GetRealPath(const StringView &path) const;
78     StringView AppendExtensionOrIndexFileIfOmitted(const StringView &basePath) const;
79 #ifdef USE_UNIX_SYSCALL
80     void UnixWalkThroughDirectoryAndAddToParseList(const StringView &directoryPath, ImportFlags importFlags);
81 #endif
82 
83     ArenaAllocator *allocator_ {nullptr};
84     std::shared_ptr<ArkTsConfig> arktsConfig_ {nullptr};
85     std::string stdLib_ {};
86     ArenaVector<ParseInfo> parseList_;
87     std::string_view pathDelimiter_ {ark::os::file::File::GetPathDelim()};
88 };
89 
90 }  // namespace ark::es2panda::util
91 
92 namespace enumbitops {
93 
94 template <>
95 struct IsAllowedType<ark::es2panda::util::ImportFlags> : std::true_type {
96 };
97 }  // namespace enumbitops
98 
99 #endif  // ES2PANDA_UTIL_IMPORT_PATH_MANAGER_H
100