arkanalyzer 1.0.90 → 1.0.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/arkanalyzer.json +0 -1
- package/lib/Config.d.ts +3 -0
- package/lib/Config.d.ts.map +1 -1
- package/lib/Scene.d.ts +99 -0
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +229 -13
- package/lib/callgraph/common/Statistics.js +2 -2
- package/lib/callgraph/model/CallGraph.d.ts +2 -2
- package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
- package/lib/callgraph/model/CallGraph.js +6 -6
- package/lib/callgraph/model/CallSite.d.ts +1 -1
- package/lib/callgraph/model/CallSite.d.ts.map +1 -1
- package/lib/callgraph/model/CallSite.js +2 -2
- package/lib/core/base/Ref.d.ts.map +1 -1
- package/lib/core/base/Ref.js +6 -1
- package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkIRTransformer.js +5 -0
- package/lib/core/common/ArkValueTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkValueTransformer.js +2 -1
- package/lib/core/common/Const.d.ts +3 -0
- package/lib/core/common/Const.d.ts.map +1 -1
- package/lib/core/common/Const.js +5 -1
- package/lib/core/common/DummyMainCreater.d.ts +25 -12
- package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
- package/lib/core/common/DummyMainCreater.js +90 -76
- package/lib/core/common/EtsConst.d.ts +2 -0
- package/lib/core/common/EtsConst.d.ts.map +1 -1
- package/lib/core/common/EtsConst.js +133 -125
- package/lib/core/common/SdkUtils.d.ts +1 -0
- package/lib/core/common/SdkUtils.d.ts.map +1 -1
- package/lib/core/common/SdkUtils.js +29 -0
- package/lib/core/graph/BaseExplicitGraph.d.ts +2 -0
- package/lib/core/graph/BaseExplicitGraph.d.ts.map +1 -1
- package/lib/core/graph/BaseExplicitGraph.js +12 -1
- package/lib/core/graph/BaseImplicitGraph.d.ts +16 -0
- package/lib/core/graph/BaseImplicitGraph.d.ts.map +1 -1
- package/lib/core/graph/BaseImplicitGraph.js +21 -0
- package/lib/core/graph/FileDepGraph.d.ts +75 -0
- package/lib/core/graph/FileDepGraph.d.ts.map +1 -0
- package/lib/core/graph/FileDepGraph.js +170 -0
- package/lib/core/graph/GraphTraits.d.ts +2 -0
- package/lib/core/graph/GraphTraits.d.ts.map +1 -1
- package/lib/core/graph/GraphTraits.js +1 -1
- package/lib/core/graph/ModuleDepGraph.d.ts +175 -0
- package/lib/core/graph/ModuleDepGraph.d.ts.map +1 -0
- package/lib/core/graph/ModuleDepGraph.js +421 -0
- package/lib/core/graph/Scc.d.ts +1 -3
- package/lib/core/graph/Scc.d.ts.map +1 -1
- package/lib/core/graph/Scc.js +6 -19
- package/lib/core/graph/builder/CfgBuilder.d.ts.map +1 -1
- package/lib/core/graph/builder/CfgBuilder.js +7 -1
- package/lib/core/graph/builder/TrapBuilder.d.ts +1 -0
- package/lib/core/graph/builder/TrapBuilder.d.ts.map +1 -1
- package/lib/core/graph/builder/TrapBuilder.js +27 -7
- package/lib/core/model/ArkBody.d.ts +1 -0
- package/lib/core/model/ArkBody.d.ts.map +1 -1
- package/lib/core/model/ArkBody.js +7 -0
- package/lib/core/model/ArkClass.d.ts +1 -0
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +37 -0
- package/lib/core/model/ArkExport.d.ts +1 -0
- package/lib/core/model/ArkExport.d.ts.map +1 -1
- package/lib/core/model/ArkExport.js +6 -0
- package/lib/core/model/ArkField.d.ts +1 -0
- package/lib/core/model/ArkField.d.ts.map +1 -1
- package/lib/core/model/ArkField.js +5 -0
- package/lib/core/model/ArkFile.d.ts +5 -0
- package/lib/core/model/ArkFile.d.ts.map +1 -1
- package/lib/core/model/ArkFile.js +30 -0
- package/lib/core/model/ArkImport.d.ts +1 -0
- package/lib/core/model/ArkImport.d.ts.map +1 -1
- package/lib/core/model/ArkImport.js +5 -0
- package/lib/core/model/ArkMethod.d.ts +8 -0
- package/lib/core/model/ArkMethod.d.ts.map +1 -1
- package/lib/core/model/ArkMethod.js +22 -0
- package/lib/core/model/ArkModule.d.ts +136 -0
- package/lib/core/model/ArkModule.d.ts.map +1 -0
- package/lib/core/model/ArkModule.js +250 -0
- package/lib/core/model/ArkNamespace.d.ts +1 -0
- package/lib/core/model/ArkNamespace.d.ts.map +1 -1
- package/lib/core/model/ArkNamespace.js +18 -0
- package/lib/core/model/builder/ArkFileBuilder.d.ts +19 -0
- package/lib/core/model/builder/ArkFileBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkFileBuilder.js +155 -51
- package/lib/frontend/FrontendBuilder.d.ts +116 -0
- package/lib/frontend/FrontendBuilder.d.ts.map +1 -1
- package/lib/frontend/FrontendBuilder.js +256 -0
- package/lib/frontend/arktsFrontend/ArktsFrontend.d.ts +11 -0
- package/lib/frontend/arktsFrontend/ArktsFrontend.d.ts.map +1 -1
- package/lib/frontend/arktsFrontend/ArktsFrontend.js +15 -0
- package/lib/frontend/common/MemoryMonitor.d.ts +62 -0
- package/lib/frontend/common/MemoryMonitor.d.ts.map +1 -0
- package/lib/frontend/common/MemoryMonitor.js +108 -0
- package/lib/frontend/common/ModuleAnalysisConfig.d.ts +92 -0
- package/lib/frontend/common/ModuleAnalysisConfig.d.ts.map +1 -0
- package/lib/frontend/common/ModuleAnalysisConfig.js +144 -0
- package/lib/frontend/common/ModuleBuilder.d.ts +497 -0
- package/lib/frontend/common/ModuleBuilder.d.ts.map +1 -0
- package/lib/frontend/common/ModuleBuilder.js +1458 -0
- package/lib/frontend/common/ModuleCache.d.ts +119 -0
- package/lib/frontend/common/ModuleCache.d.ts.map +1 -0
- package/lib/frontend/common/ModuleCache.js +197 -0
- package/lib/frontend/common/ModuleDepth.d.ts +28 -0
- package/lib/frontend/common/ModuleDepth.d.ts.map +1 -0
- package/lib/frontend/common/ModuleDepth.js +45 -0
- package/lib/frontend/cppFrontend/CppFrontend.d.ts +5 -0
- package/lib/frontend/cppFrontend/CppFrontend.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/CppFrontend.js +11 -1
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.d.ts +8 -0
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.js +105 -2
- package/lib/index.d.ts +9 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +22 -3
- package/lib/utils/Canonicalizer.d.ts +105 -0
- package/lib/utils/Canonicalizer.d.ts.map +1 -0
- package/lib/utils/Canonicalizer.js +520 -0
- package/lib/utils/ModuleUtils.js +4 -2
- package/lib/utils/entryMethodUtils.d.ts +23 -0
- package/lib/utils/entryMethodUtils.d.ts.map +1 -1
- package/lib/utils/entryMethodUtils.js +53 -1
- package/package.json +1 -1
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { SparseBitVector } from '../../utils/SparseBitVector';
|
|
2
|
+
import { ArkModule, ModuleID } from '../../core/model/ArkModule';
|
|
3
|
+
import { ModuleDepGraph } from '../../core/graph/ModuleDepGraph';
|
|
4
|
+
import { ModuleDepthLevel } from './ModuleDepth';
|
|
5
|
+
import { ModuleAnalysisConfig } from './ModuleAnalysisConfig';
|
|
6
|
+
import type { Scene } from '../../Scene';
|
|
7
|
+
import type { SceneOptions } from '../../Config';
|
|
8
|
+
/**
|
|
9
|
+
* ModuleBuilder holds the build logic for module-level analysis embedded in {@link Scene}.
|
|
10
|
+
*
|
|
11
|
+
* It is responsible for the build side of the module lifecycle: registration, SDK build, module
|
|
12
|
+
* preparation, dependency graph construction and SCC analysis, and module loading. Persistent
|
|
13
|
+
* state (the Canonicalizer, pathToId map, dependency graph, and progress flags) lives on the
|
|
14
|
+
* owning {@link Scene}; this class reads and writes that state through the Scene accessors.
|
|
15
|
+
*
|
|
16
|
+
* Each module is identified by its absolute path and assigned a dense integer {@link ModuleID} via
|
|
17
|
+
* the Scene's Canonicalizer using the objectIdentity strategy. The `pathToId` map on the Scene is
|
|
18
|
+
* a persistent cache that survives graph construction, allowing runtime path-based lookups.
|
|
19
|
+
*
|
|
20
|
+
* @category core/model
|
|
21
|
+
*/
|
|
22
|
+
export declare class ModuleBuilder {
|
|
23
|
+
private scene;
|
|
24
|
+
/** Persistent map from absolute module path to ModuleID (survives graph construction). */
|
|
25
|
+
private pathToId;
|
|
26
|
+
/** Reference to Scene's persistent memory monitor; set by initCacheManagement. */
|
|
27
|
+
private monitor?;
|
|
28
|
+
/** Reference to Scene's persistent module cache; set by initCacheManagement. */
|
|
29
|
+
private cache?;
|
|
30
|
+
/** Topological order of the current call, used for protected-set computation and Phase 2/3 reverse-topo iteration. */
|
|
31
|
+
private topoOrder;
|
|
32
|
+
/** Map from moduleId to its index in topoOrder for O(1) lookup. */
|
|
33
|
+
private topoOrderIndex?;
|
|
34
|
+
/** Load level to which protected dependency modules are downgraded during eviction Phase 2. */
|
|
35
|
+
private dependencyLoadLevel;
|
|
36
|
+
/**
|
|
37
|
+
* Estimated heapUsed bytes per file for each depth level, used for pre-load memory cost estimation.
|
|
38
|
+
* Calibrated from scene_board_ext measurements (no-eviction, no GC runs):
|
|
39
|
+
* - BODIES: P75 of per-module heapUsed-per-file at BODIES level = ~1.7MB/file
|
|
40
|
+
* - SIGNATURES: P75 of per-module heapUsed-per-file at SIGNATURES level = ~700KB/file
|
|
41
|
+
* - IMPORTS/META: negligible (metadata only).
|
|
42
|
+
*
|
|
43
|
+
* No-GC calibration matches production conditions (no forced GC). Without GC,
|
|
44
|
+
* heapUsed increments include uncollected garbage from parsing and type inference,
|
|
45
|
+
* which is several times larger than surviving data.
|
|
46
|
+
*
|
|
47
|
+
* Used for pre-load estimation (deciding whether eviction is needed before loading)
|
|
48
|
+
* and as a fallback for unload estimation when the heapUsed table has no entry.
|
|
49
|
+
*/
|
|
50
|
+
private static readonly HEAPUSED_PER_FILE;
|
|
51
|
+
/**
|
|
52
|
+
* Ratio of memory released by downgrading from BODIES to SIGNATURES, relative to
|
|
53
|
+
* the BODIES-level heapUsed. Calibrated from GC trace test data:
|
|
54
|
+
* downgrade releases ~60% of BODIES heapUsed (method bodies + AST + source code).
|
|
55
|
+
*/
|
|
56
|
+
private static readonly DOWNGRADE_RELEASE_RATIO;
|
|
57
|
+
constructor(scene: Scene);
|
|
58
|
+
/** Get a registered module by its ModuleID. Returns undefined when the id is out of bounds. */
|
|
59
|
+
getModule(id: ModuleID): ArkModule | undefined;
|
|
60
|
+
/** Look up a module by its absolute path using the pathToId cache. */
|
|
61
|
+
getModuleByPath(modulePath: string): ArkModule | undefined;
|
|
62
|
+
/** Total number of registered modules. */
|
|
63
|
+
getModuleCount(): number;
|
|
64
|
+
/**
|
|
65
|
+
* Iterate over all registered modules.
|
|
66
|
+
* Iteration order follows ModuleID assignment order (0, 1, 2, ...).
|
|
67
|
+
*/
|
|
68
|
+
modulesIterator(): IterableIterator<ArkModule>;
|
|
69
|
+
/** Find the next module starting from the cursor. */
|
|
70
|
+
private nextModule;
|
|
71
|
+
/** Topologically sorted module IDs (empty before dependency analysis completes). */
|
|
72
|
+
getTopoOrder(): ModuleID[];
|
|
73
|
+
/**
|
|
74
|
+
* Resolve a dependency alias within the scope of the given module.
|
|
75
|
+
* Looks up the alias in the module's per-module alias map, then resolves the
|
|
76
|
+
* resulting ModuleID back to the depended-on ArkModule.
|
|
77
|
+
*/
|
|
78
|
+
resolveAlias(moduleId: ModuleID, alias: string): ArkModule | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Resolve the final set of target module IDs from the config's three selection dimensions.
|
|
81
|
+
* Excluded IDs take precedence; type filter and explicit include IDs are unioned.
|
|
82
|
+
*/
|
|
83
|
+
resolveTargetModuleIds(config: ModuleAnalysisConfig): SparseBitVector;
|
|
84
|
+
/**
|
|
85
|
+
* Compute transitive closure of module IDs reachable from the given target IDs via
|
|
86
|
+
* dependency edges (BFS over {@link ModuleDepGraph.getSuccModuleIds}).
|
|
87
|
+
* SDK modules are never included in the closure.
|
|
88
|
+
*/
|
|
89
|
+
computeModuleClosureByIds(targetIds: SparseBitVector): SparseBitVector;
|
|
90
|
+
/** Filter the topological order to only include module IDs present in the given closure. */
|
|
91
|
+
getFilteredTopoOrder(closure: SparseBitVector): ModuleID[];
|
|
92
|
+
/** Get the ModuleID assigned to a registered ArkModule. */
|
|
93
|
+
getModuleId(module: ArkModule): ModuleID;
|
|
94
|
+
/** Create a {@link ModuleDepGraph} sharing the scene's module canonicalizer. */
|
|
95
|
+
createModuleDepGraph(): ModuleDepGraph;
|
|
96
|
+
/**
|
|
97
|
+
* Register a module by its absolute path. If the same path has already been registered, the
|
|
98
|
+
* existing {@link ArkModule} is returned unchanged. A new ModuleID is allocated via the
|
|
99
|
+
* Scene's Canonicalizer for first-time registrations, and cached on the module.
|
|
100
|
+
*
|
|
101
|
+
* @param modulePath - Absolute path of the module (primary identifier).
|
|
102
|
+
* @param moduleName - Optional module name (auxiliary field, e.g. "@ohos/entry").
|
|
103
|
+
* @returns The registered ArkModule (newly created or previously registered).
|
|
104
|
+
*/
|
|
105
|
+
registerModule(modulePath: string, moduleName?: string): ArkModule;
|
|
106
|
+
/**
|
|
107
|
+
* Register and build SDK modules in one fused step. Each project-level SDK is treated as an
|
|
108
|
+
* {@link ArkModule} (moduleType=SDK): its files are collected, parsed, and registered into the
|
|
109
|
+
* module's `filesMap` as well as the scene's `sdkArkFilesMap`. SDK type inference and global
|
|
110
|
+
* API merge run after all SDK files are built.
|
|
111
|
+
*
|
|
112
|
+
* This method merges the former `prepareSdkModules` (registration-only) and `SDKBuilder.buildSdks`
|
|
113
|
+
* (building-only) into a single step — SDK modules are never just registered without being built.
|
|
114
|
+
*
|
|
115
|
+
* Module-level SDKs (those with `moduleName` set) are skipped entirely.
|
|
116
|
+
*
|
|
117
|
+
* Idempotent: guarded by {@link SceneBuildStage.SDK_INFERRED}.
|
|
118
|
+
*/
|
|
119
|
+
buildSdkModules(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Collect and build all source files for a single SDK module. Each file is parsed via
|
|
122
|
+
* {@link ArktsFrontend.buildArkFileFromSdkPath} (using the SDK name as projectName), default
|
|
123
|
+
* method bodies are built and all BodyBuilders freed, then the file is registered into both
|
|
124
|
+
* the module's `filesMap` and the scene's `sdkArkFilesMap`. C++ SDK files are skipped.
|
|
125
|
+
*/
|
|
126
|
+
private buildSdkModuleFiles;
|
|
127
|
+
/**
|
|
128
|
+
* Collect source file paths for an SDK.
|
|
129
|
+
*
|
|
130
|
+
* Built-in SDK uses {@link SdkUtils.fetchBuiltInFiles} (reference-based DFS over `lib.*.d.ts`);
|
|
131
|
+
* other SDKs scan the directory with the scene's supported extensions and ignore patterns.
|
|
132
|
+
*/
|
|
133
|
+
private collectSdkFiles;
|
|
134
|
+
/**
|
|
135
|
+
* Parse a single SDK source file into an ArkFile, build default method bodies, free all
|
|
136
|
+
* BodyBuilders, and register the file in both the module's `filesMap` and the scene's
|
|
137
|
+
* `sdkArkFilesMap`.
|
|
138
|
+
*/
|
|
139
|
+
private parseAndRegisterSdkFile;
|
|
140
|
+
/**
|
|
141
|
+
* Read `build-profile.json5` from the project root and call
|
|
142
|
+
* {@link SdkUtils.setEsVersion} so that {@link SdkUtils.fetchBuiltInFiles} selects the correct
|
|
143
|
+
* `lib.*.d.ts` entry.
|
|
144
|
+
*/
|
|
145
|
+
private setEsVersionFromBuildProfile;
|
|
146
|
+
/**
|
|
147
|
+
* Prepare modules by discovering and registering project modules and oh_modules dependencies.
|
|
148
|
+
*
|
|
149
|
+
* Reads build-profile.json5 to discover project modules, then scans oh_modules directories
|
|
150
|
+
* to discover third-party dependencies. Only basic info (paths) is registered —
|
|
151
|
+
* oh-package.json5 is NOT read and no dependency graph is built.
|
|
152
|
+
*
|
|
153
|
+
* Idempotent: if module preparation has already been completed via
|
|
154
|
+
* `Scene.setModulesRegistered(true)`, this method returns immediately.
|
|
155
|
+
* Note: this method does NOT set modulesRegistered — that is done by
|
|
156
|
+
* `Scene.analyseByModule` after both prepareModules and analyzeModuleDependencies complete.
|
|
157
|
+
*/
|
|
158
|
+
prepareModules(): void;
|
|
159
|
+
/**
|
|
160
|
+
* Read build-profile.json5 from the project root and register each module as
|
|
161
|
+
* ArkModule(moduleType=PROJECT). The module's srcPath is resolved to an absolute path
|
|
162
|
+
* via path.resolve(projectDir, srcPath). oh-package.json5 is NOT read.
|
|
163
|
+
*/
|
|
164
|
+
private registerProjectModules;
|
|
165
|
+
/**
|
|
166
|
+
* Scan oh_modules directories and register third-party dependencies as
|
|
167
|
+
* ArkModule(moduleType=OH_MODULES).
|
|
168
|
+
*
|
|
169
|
+
* Scans two types of oh_modules directories:
|
|
170
|
+
* 1. The project-level oh_modules/ under the project root.
|
|
171
|
+
* 2. The oh_modules/ under each registered PROJECT module's directory.
|
|
172
|
+
*
|
|
173
|
+
* A Set is used to avoid scanning the same directory twice.
|
|
174
|
+
*/
|
|
175
|
+
private registerOhModulesModules;
|
|
176
|
+
/**
|
|
177
|
+
* Recursively scan a single oh_modules directory, registering discovered packages as
|
|
178
|
+
* ArkModule(moduleType=OH_MODULES).
|
|
179
|
+
*
|
|
180
|
+
* Directories starting with '@' (scoped packages) are recursed into.
|
|
181
|
+
* Regular directories have their symlinks resolved via fs.realpathSync() and are
|
|
182
|
+
* registered if not already present (deduplication by resolved real path).
|
|
183
|
+
*
|
|
184
|
+
* @param ohModulesDir - Absolute path of the oh_modules directory to scan.
|
|
185
|
+
*/
|
|
186
|
+
private scanOhModulesDirectory;
|
|
187
|
+
/**
|
|
188
|
+
* Main entry point for module dependency analysis.
|
|
189
|
+
*
|
|
190
|
+
* Reads oh-package.json5 to update module names, builds the dependency graph,
|
|
191
|
+
* runs SCC detection with post-processing refinement. The topological order and SCC groups
|
|
192
|
+
* are stored inside the dependency graph on the Scene, accessed via `ModuleBuilder.getTopoOrder()`.
|
|
193
|
+
*
|
|
194
|
+
* Idempotent: if the dependency graph already exists on the Scene, this method returns immediately.
|
|
195
|
+
*/
|
|
196
|
+
analyzeModuleDependencies(): void;
|
|
197
|
+
/**
|
|
198
|
+
* Build the module dependency graph by reading each module's oh-package.json5.
|
|
199
|
+
*
|
|
200
|
+
* Creates a new {@link ModuleDepGraph} with the shared canonicalizer, adds all
|
|
201
|
+
* registered modules as nodes, then resolves dependencies and adds edges.
|
|
202
|
+
* Resolved dependencies create graph edges and update the module's alias map;
|
|
203
|
+
* unresolved dependencies are recorded as unresolved dependencies. The built graph is
|
|
204
|
+
* stored on the Scene via `Scene.setModuleDepGraph()`.
|
|
205
|
+
*/
|
|
206
|
+
private buildDependencyGraph;
|
|
207
|
+
/**
|
|
208
|
+
* Read the project root oh-package.json5 and extract `overrides` and `overrideDependencyMap`.
|
|
209
|
+
*
|
|
210
|
+
* Both fields are optional dependency override configurations. `overrides` maps a dependency
|
|
211
|
+
* alias to an override path (local path, file: path, or @module: reference).
|
|
212
|
+
* `overrideDependencyMap` maps a dependency alias to an override file path. When a dependency
|
|
213
|
+
* alias is present in either map, the override path is used instead of the original dependency
|
|
214
|
+
* value during resolution (checked before normal resolution).
|
|
215
|
+
*
|
|
216
|
+
* @returns An object with `overrides` and `overrideDependencyMap` string maps (empty when absent).
|
|
217
|
+
*/
|
|
218
|
+
private readProjectOverrides;
|
|
219
|
+
/**
|
|
220
|
+
* Coerce a record value to a `{ [k: string]: string }` map, dropping non-string entries.
|
|
221
|
+
*/
|
|
222
|
+
private toStringMap;
|
|
223
|
+
/**
|
|
224
|
+
* Extract dependency entries from oh-package.json5 content.
|
|
225
|
+
*
|
|
226
|
+
* Traverses dependencies (→ DEPENDENCIES), devDependencies (→ DEV_DEPENDENCIES),
|
|
227
|
+
* and dynamicDependencies (→ DYNAMIC), returning a [alias, value, DependencyType]
|
|
228
|
+
* triple for each entry. The DependencyType is used during SCC post-processing
|
|
229
|
+
* to determine edge removal priority when splitting oversized groups.
|
|
230
|
+
*/
|
|
231
|
+
private extractDependenciesWithValues;
|
|
232
|
+
/**
|
|
233
|
+
* Resolve a dependency declaration to its target {@link ArkModule}.
|
|
234
|
+
*
|
|
235
|
+
* Resolution priority:
|
|
236
|
+
* 0. overrides / overrideDependencyMap — when the alias is present in either project-level
|
|
237
|
+
* override map, the override path replaces the original dependency value before resolution.
|
|
238
|
+
* 1. {@link MODULE_PREFIX} prefix — find by moduleName among registered modules
|
|
239
|
+
* 2. "./", "../", or "file:" prefix — resolve as local path relative to
|
|
240
|
+
* scopeModulePath, look up in pathToId
|
|
241
|
+
* 3. Version number — look in oh_modules directories in priority order:
|
|
242
|
+
* a. current module's oh_modules (scopeModulePath/oh_modules/alias)
|
|
243
|
+
* b. project-level oh_modules (projectDir/oh_modules/alias)
|
|
244
|
+
* c. .ohpm cache (projectDir/oh_modules/.ohpm/<name>@<version>/oh_modules/<name>)
|
|
245
|
+
* Each candidate is verified as a directory, resolved via fs.realpathSync(), then looked
|
|
246
|
+
* up in pathToId. For .har dependencies inside the .ohpm cache, the current module's
|
|
247
|
+
* oh_modules base is recomputed from the enclosing oh_modules ancestor.
|
|
248
|
+
*
|
|
249
|
+
* @param alias - The dependency alias (key in oh-package.json5 dependencies).
|
|
250
|
+
* @param depValue - The dependency value (path, version, or @module: reference).
|
|
251
|
+
* @param scopeModulePath - The absolute path of the source module (for relative path resolution).
|
|
252
|
+
* @param overrides - Optional project-level overrides map (alias -> override path).
|
|
253
|
+
* @param overrideDependencyMap - Optional project-level overrideDependencyMap (alias -> override path).
|
|
254
|
+
* @returns The target ArkModule if resolved, undefined otherwise.
|
|
255
|
+
*/
|
|
256
|
+
private resolveDepModule;
|
|
257
|
+
/**
|
|
258
|
+
* Find a module path in the .ohpm cache directory.
|
|
259
|
+
*
|
|
260
|
+
* Mirrors {@link ModuleUtils.findModulePathInOHPM}: the cache lives at
|
|
261
|
+
* `<projectDir>/oh_modules/.ohpm` and stores packages as
|
|
262
|
+
* `<moduleName.replace('/', '+')>@<version>/oh_modules/<moduleName>`. Exact versions are
|
|
263
|
+
* matched directly; `^`-prefixed ranges pick the first directory whose version is not less
|
|
264
|
+
* than the requested minimum.
|
|
265
|
+
*
|
|
266
|
+
* @param projectDir - The project root directory.
|
|
267
|
+
* @param moduleName - The dependency alias / module name.
|
|
268
|
+
* @param version - The dependency version value (exact or `^`-prefixed).
|
|
269
|
+
* @returns The candidate directory path, or '' when not found.
|
|
270
|
+
*/
|
|
271
|
+
private findModulePathInOHPM;
|
|
272
|
+
/**
|
|
273
|
+
* Read oh-package.json5 for each registered module and update moduleName.
|
|
274
|
+
*
|
|
275
|
+
* The "name" field in oh-package.json5 (e.g. "@ohos/entry") is the canonical
|
|
276
|
+
* module name used for "@module:" reference resolution. This method populates
|
|
277
|
+
* {@link ArkModule.moduleName} from oh-package.json5, overriding the short name
|
|
278
|
+
* from build-profile.json5 set during registration.
|
|
279
|
+
*/
|
|
280
|
+
private updateModuleNamesFromOhPkg;
|
|
281
|
+
private registerModulePath;
|
|
282
|
+
/**
|
|
283
|
+
* Map a {@link ModuleDepthLevel} to the corresponding {@link ModuleLoadState}.
|
|
284
|
+
* Used by {@link loadModule} to translate the configured depth level into a load state.
|
|
285
|
+
*/
|
|
286
|
+
private depthLevelToLoadState;
|
|
287
|
+
/**
|
|
288
|
+
* Reverse mapping of {@link depthLevelToLoadState}. Used to look up the heapUsed table
|
|
289
|
+
* entry for a module's current load state.
|
|
290
|
+
*/
|
|
291
|
+
private loadStateToDepthLevel;
|
|
292
|
+
/**
|
|
293
|
+
* Run type inference on the module's files, following the same pattern as
|
|
294
|
+
* {@link Scene.inferTypes} but scoped to a single module.
|
|
295
|
+
*
|
|
296
|
+
* Reuses the file topological order already computed by {@link analyzeFileDependencies}
|
|
297
|
+
* (stored in the module's {@link FileDepGraph}) so that depended-on files are inferred first.
|
|
298
|
+
* Falls back to unsorted iteration when no file dependency graph is available (e.g. when this
|
|
299
|
+
* method is called directly without a prior {@link loadModule}).
|
|
300
|
+
*
|
|
301
|
+
* At SIGNATURES level (no method bodies), only the `preInfer` phase is effective (generic
|
|
302
|
+
* types, parameter types, signature return types, import/export resolution). At BODIES level,
|
|
303
|
+
* full type inference runs (including stmt-level propagation and return type aggregation).
|
|
304
|
+
*
|
|
305
|
+
* Does NOT call {@link Scene.getMethodsMap}(true): rebuilding the global index would clear
|
|
306
|
+
* caches for other modules. Does NOT set {@link Scene.buildStage} to TYPE_INFERRED: that is a
|
|
307
|
+
* whole-scene flag. Does NOT call {@link SdkUtils.dispose} / {@link ModuleUtils.dispose} /
|
|
308
|
+
* {@link ValueUtil.dispose}: the global caches are shared across modules and should be
|
|
309
|
+
* released by the caller after all modules are processed.
|
|
310
|
+
*
|
|
311
|
+
* @param module - The module whose files are to be type-inferred.
|
|
312
|
+
* @param times - Number of inference iterations (clamped to 1–5). Default 1.
|
|
313
|
+
*/
|
|
314
|
+
inferModuleTypes(module: ArkModule, times?: number): void;
|
|
315
|
+
/**
|
|
316
|
+
* Load module data at the specified depth level.
|
|
317
|
+
*
|
|
318
|
+
* Dependencies are NOT recursively loaded here — the caller (e.g.
|
|
319
|
+
* {@link Scene.analyseByModule}) must iterate modules in topological order so that
|
|
320
|
+
* depended-on modules are loaded before their dependents.
|
|
321
|
+
*
|
|
322
|
+
* When cache management has been initialized via {@link initCacheManagement}, this method
|
|
323
|
+
* automatically checks memory before loading (evicting cached modules if over threshold)
|
|
324
|
+
* and registers the module in the cache after loading.
|
|
325
|
+
*
|
|
326
|
+
* Flow:
|
|
327
|
+
* 1. SDK modules are skipped — their file content is built by {@link buildSdkModules}, not here.
|
|
328
|
+
* 2. Idempotent: skip if the module's loadState already reaches the target load state.
|
|
329
|
+
* 3. Build module data to the effective level via {@link buildModuleToLevel}, which integrates
|
|
330
|
+
* intra-module file dependency analysis and topological-order parsing.
|
|
331
|
+
* 4. When the effective level reaches BODIES, build method bodies (ArkBody/CFG/Stmt/Expr) via
|
|
332
|
+
* {@link FrontendBuilder.buildModuleMethodBody}, following the same two-phase pattern as
|
|
333
|
+
* {@link Scene.genArkFiles}.
|
|
334
|
+
* 5. When the effective level reaches SIGNATURES, run type inference on the module's files
|
|
335
|
+
* via {@link inferModuleTypes}, referencing the logic of {@link Scene.inferTypes}.
|
|
336
|
+
* 6. Set the load state to the target level (after successful build).
|
|
337
|
+
*
|
|
338
|
+
* @param moduleId - ID of the module to load.
|
|
339
|
+
* @param depthLevel - The depth level to load the module to.
|
|
340
|
+
*/
|
|
341
|
+
loadModule(moduleId: ModuleID, depthLevel?: ModuleDepthLevel): void;
|
|
342
|
+
/**
|
|
343
|
+
* Unload a module's data, releasing heavy data and resetting to NOT_LOADED state.
|
|
344
|
+
*
|
|
345
|
+
* Clears the module's filesMap (releasing ArkFile/ArkClass/ArkMethod objects), resets the
|
|
346
|
+
* file dependency graph (so that the next {@link loadModule} rebuilds IMPORTS from scratch),
|
|
347
|
+
* and sets the load state to NOT_LOADED. After unloading, {@link loadModule} can rebuild
|
|
348
|
+
* the module from scratch.
|
|
349
|
+
*
|
|
350
|
+
* SDK modules are not unloaded (their data is built by {@link buildSdkModules} and shared
|
|
351
|
+
* globally).
|
|
352
|
+
*
|
|
353
|
+
* @param moduleId - ID of the module to unload.
|
|
354
|
+
*/
|
|
355
|
+
unload(moduleId: ModuleID): void;
|
|
356
|
+
/**
|
|
357
|
+
* Break all internal references between IR objects in a module's ArkFiles.
|
|
358
|
+
* Called after {@link Scene.disposeModule} to ensure that IR objects (ArkClass, ArkMethod,
|
|
359
|
+
* ArkBody, ArkField, ExportInfo, ImportInfo) do not retain each other through cross-references,
|
|
360
|
+
* allowing V8 GC to reclaim them individually.
|
|
361
|
+
*/
|
|
362
|
+
private breakInternalReferences;
|
|
363
|
+
/**
|
|
364
|
+
* Initialize or update cache management for module loading.
|
|
365
|
+
*
|
|
366
|
+
* On the first call, creates a {@link ModuleCache} and {@link MemoryMonitor} and stores
|
|
367
|
+
* them persistently in {@link Scene}. On subsequent calls, reuses the persistent instances
|
|
368
|
+
* and only updates the per-call topological order.
|
|
369
|
+
*
|
|
370
|
+
* @param options - Scene options containing memoryLimitMB.
|
|
371
|
+
* @param topoOrder - Topological order of modules to be loaded (dependees before dependents).
|
|
372
|
+
* @param dependencyLoadLevel - Load level to downgrade protected dependencies to during eviction.
|
|
373
|
+
*/
|
|
374
|
+
initCacheManagement(options: SceneOptions, topoOrder: ModuleID[], dependencyLoadLevel?: ModuleDepthLevel): void;
|
|
375
|
+
/**
|
|
376
|
+
* Check memory and evict cached modules if needed, before loading a new module.
|
|
377
|
+
*
|
|
378
|
+
* Estimates the heapUsed increment of the upcoming load (from the heapUsed table if available,
|
|
379
|
+
* otherwise from HEAPUSED_PER_FILE), computes a heapUsed upper limit (heapUsedLimit - estimated
|
|
380
|
+
* increment), takes one actual heapUsed measurement, and only proceeds with eviction if
|
|
381
|
+
* heapUsed exceeds the upper limit.
|
|
382
|
+
*
|
|
383
|
+
* During eviction, the heapUsed estimate is tracked via {@link HeapUsedEstimateState},
|
|
384
|
+
* decremented by the heapUsed table value of each unloaded/downgraded module.
|
|
385
|
+
*/
|
|
386
|
+
private evictIfNeeded;
|
|
387
|
+
private runPhase1Eviction;
|
|
388
|
+
private runPhase2Downgrade;
|
|
389
|
+
private runPhase3Eviction;
|
|
390
|
+
/**
|
|
391
|
+
* Estimate the memory cost of loading a module at the given depth level.
|
|
392
|
+
* Used as a fallback when the heapUsed table has no entry for this module+level.
|
|
393
|
+
*/
|
|
394
|
+
private estimateLoadCost;
|
|
395
|
+
/**
|
|
396
|
+
* Estimate the heapUsed increment for loading a module at the given depth level.
|
|
397
|
+
* Uses the heapUsed table value if available (from a prior first-load measurement),
|
|
398
|
+
* otherwise falls back to {@link estimateLoadCost} (fileCount × HEAPUSED_PER_FILE).
|
|
399
|
+
*/
|
|
400
|
+
private estimateLoadHeapUsed;
|
|
401
|
+
/**
|
|
402
|
+
* Estimate the heapUsed decrease from unloading a module (full unload).
|
|
403
|
+
* Uses the heapUsed table value for the module's current load level,
|
|
404
|
+
* or falls back to HEAPUSED_PER_FILE estimate.
|
|
405
|
+
*/
|
|
406
|
+
private estimateUnloadHeapUsedDecrease;
|
|
407
|
+
/**
|
|
408
|
+
* Estimate the heapUsed decrease from downgrading a module from its current level
|
|
409
|
+
* to a target level. Uses a ratio-based approach: downgrade releases a fixed
|
|
410
|
+
* proportion of the current-level heapUsed, avoiding the need for target-level
|
|
411
|
+
* table entries (which are never populated since downgradeModule doesn't write
|
|
412
|
+
* to the heapUsed table).
|
|
413
|
+
*/
|
|
414
|
+
private estimateDowngradeHeapUsedDecrease;
|
|
415
|
+
/**
|
|
416
|
+
* Downgrade a module's loaded data to the given target level (min SIGNATURES), releasing the
|
|
417
|
+
* heavy method-body/view-tree/AST data while keeping signatures (ArkClass/method signatures,
|
|
418
|
+
* filesMap, Scene index maps) so dependents can still resolve types. No-op if already at or
|
|
419
|
+
* below the target level. Used by eviction Phase 2.
|
|
420
|
+
*/
|
|
421
|
+
private downgradeModule;
|
|
422
|
+
/**
|
|
423
|
+
* Get the number of source files in a module. If the module's filesMap is empty
|
|
424
|
+
* (not yet loaded), scans the module directory.
|
|
425
|
+
*/
|
|
426
|
+
private getFileCount;
|
|
427
|
+
/**
|
|
428
|
+
* Compute the hard and soft protected sets for eviction.
|
|
429
|
+
* - Hard: the current module and its direct dependencies (never evicted).
|
|
430
|
+
* - Soft: direct dependencies of not-yet-loaded modules, plus already-cached modules
|
|
431
|
+
* at later topo positions (to avoid reload overhead).
|
|
432
|
+
*/
|
|
433
|
+
private computeProtectedSets;
|
|
434
|
+
/**
|
|
435
|
+
* Build module data to the specified depth level, integrating intra-module file dependency
|
|
436
|
+
* analysis into the build flow.
|
|
437
|
+
*
|
|
438
|
+
* Two-phase build for level > IMPORTS:
|
|
439
|
+
* 1. Ensure ArkFile shells exist (create if filesMap is empty, reuse otherwise).
|
|
440
|
+
* 2. Build all files to IMPORTS level (lightweight import/export parsing, no dependency on
|
|
441
|
+
* other files in the module).
|
|
442
|
+
* 3. Analyze intra-module file dependencies → compute topological order (moved here from
|
|
443
|
+
* {@link loadModule} so it is part of the build-to-level flow).
|
|
444
|
+
* 4. For level > IMPORTS: upgrade each file to the target level (SIGNATURES/BODIES) in
|
|
445
|
+
* topological order, so that depended-on files are parsed first.
|
|
446
|
+
*
|
|
447
|
+
* For level == META: only shells are created (no content).
|
|
448
|
+
* For level == IMPORTS: steps 1-3 (topoOrder available for later type inference).
|
|
449
|
+
* For level >= SIGNATURES: steps 1-4 (signatures built in topoOrder).
|
|
450
|
+
*
|
|
451
|
+
* The {@link ArkModule.hasFileTopoOrder} flag is used to detect whether IMPORTS was already
|
|
452
|
+
* built (e.g. when upgrading from IMPORTS to SIGNATURES), avoiding redundant re-parsing.
|
|
453
|
+
*
|
|
454
|
+
* @param module - The module to build.
|
|
455
|
+
* @param level - The target depth level.
|
|
456
|
+
*/
|
|
457
|
+
buildModuleToLevel(module: ArkModule, level: ModuleDepthLevel): void;
|
|
458
|
+
/**
|
|
459
|
+
* Analyze file-to-file dependencies within a module using the import/export `from` specifiers
|
|
460
|
+
* populated at IMPORTS level.
|
|
461
|
+
*
|
|
462
|
+
* Builds a {@link FileDepGraph}, resolves relative `from` specifiers to file paths within the
|
|
463
|
+
* same module, adds dependency edges, computes a topological order via SCC detection, and
|
|
464
|
+
* stores the graph on the {@link ArkModule}. The topological order is retained inside the
|
|
465
|
+
* FileDepGraph and queried via {@link ArkModule.hasFileTopoOrder}.
|
|
466
|
+
*
|
|
467
|
+
* - Only relative `from` specifiers (`./`, `../`) are resolved; bare specifiers are ignored.
|
|
468
|
+
* - Resolution matches the specifier against already-existing ArkFile paths in the module's filesMap.
|
|
469
|
+
* - Only files within the module (present in the module's filesMap) get edges; external files are ignored.
|
|
470
|
+
*
|
|
471
|
+
* @param module - The module whose files are analyzed.
|
|
472
|
+
*/
|
|
473
|
+
analyzeFileDependencies(module: ArkModule): void;
|
|
474
|
+
/**
|
|
475
|
+
* Collect all `from` specifiers from an ArkFile's import and export infos.
|
|
476
|
+
* Duplicate specifiers are deduplicated.
|
|
477
|
+
*/
|
|
478
|
+
private collectFromSpecifiers;
|
|
479
|
+
/**
|
|
480
|
+
* Resolve a relative `from` specifier (e.g. `./b`, `../utils/helper`) to an absolute file path
|
|
481
|
+
* that exists as an already-built ArkFile in the module.
|
|
482
|
+
*
|
|
483
|
+
* Resolution matches against the keys of {@link pathToFile} (the module's already-generated
|
|
484
|
+
* ArkFile paths) instead of probing the filesystem:
|
|
485
|
+
*
|
|
486
|
+
* 1. The specifier as-is (may already include an extension).
|
|
487
|
+
* 2. The specifier with each unique extension found among existing ArkFile paths appended.
|
|
488
|
+
* 3. The specifier as a directory: look for an index file whose path is in {@link pathToFile}.
|
|
489
|
+
*
|
|
490
|
+
* @param from - The relative from specifier (starts with `./` or `../`).
|
|
491
|
+
* @param arkFile - The file containing the import/export (base for relative resolution).
|
|
492
|
+
* @param pathToFile - Map of already-built ArkFile paths in the module.
|
|
493
|
+
* @returns The resolved absolute file path, or undefined if not found.
|
|
494
|
+
*/
|
|
495
|
+
private resolveFromSpecifier;
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=ModuleBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleBuilder.d.ts","sourceRoot":"","sources":["../../../src/frontend/common/ModuleBuilder.ts"],"names":[],"mappings":"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"}
|