arkanalyzer 1.0.20 → 1.0.21
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/lib/Config.d.ts +70 -70
- package/lib/Config.js +198 -198
- package/lib/Scene.d.ts +316 -316
- package/lib/Scene.js +1316 -1316
- package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +28 -28
- package/lib/callgraph/algorithm/AbstractAnalysis.js +144 -144
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +10 -10
- package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +69 -69
- package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +15 -15
- package/lib/callgraph/algorithm/RapidTypeAnalysis.js +146 -146
- package/lib/callgraph/common/Statistics.d.ts +57 -57
- package/lib/callgraph/common/Statistics.js +228 -228
- package/lib/callgraph/model/CallGraph.d.ts +96 -96
- package/lib/callgraph/model/CallGraph.js +354 -354
- package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +15 -15
- package/lib/callgraph/model/builder/CallGraphBuilder.js +106 -106
- package/lib/callgraph/pointerAnalysis/Context.d.ts +37 -37
- package/lib/callgraph/pointerAnalysis/Context.js +155 -155
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts +22 -22
- package/lib/callgraph/pointerAnalysis/DummyCallCreator.js +104 -104
- package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts +5 -5
- package/lib/callgraph/pointerAnalysis/PTAUtils.js +46 -46
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +261 -261
- package/lib/callgraph/pointerAnalysis/Pag.js +930 -930
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +157 -157
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +1399 -1399
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +72 -72
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +573 -573
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +15 -15
- package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +81 -81
- package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +80 -80
- package/lib/callgraph/pointerAnalysis/PtsDS.js +308 -308
- package/lib/core/base/Constant.d.ts +48 -48
- package/lib/core/base/Constant.js +103 -103
- package/lib/core/base/Decorator.d.ts +15 -15
- package/lib/core/base/Decorator.js +46 -46
- package/lib/core/base/DefUseChain.d.ts +8 -8
- package/lib/core/base/DefUseChain.js +25 -25
- package/lib/core/base/Expr.d.ts +340 -340
- package/lib/core/base/Expr.js +917 -917
- package/lib/core/base/Local.d.ts +104 -104
- package/lib/core/base/Local.js +176 -176
- package/lib/core/base/Position.d.ts +30 -30
- package/lib/core/base/Position.js +147 -147
- package/lib/core/base/Ref.d.ts +173 -173
- package/lib/core/base/Ref.js +374 -374
- package/lib/core/base/Stmt.d.ts +237 -237
- package/lib/core/base/Stmt.js +525 -525
- package/lib/core/base/Trap.d.ts +8 -8
- package/lib/core/base/Trap.js +30 -30
- package/lib/core/base/Type.d.ts +308 -308
- package/lib/core/base/Type.js +639 -639
- package/lib/core/base/TypeExpr.d.ts +71 -71
- package/lib/core/base/TypeExpr.js +155 -155
- package/lib/core/base/Value.d.ts +32 -32
- package/lib/core/base/Value.js +16 -16
- package/lib/core/common/ArkError.d.ts +14 -14
- package/lib/core/common/ArkError.js +28 -28
- package/lib/core/common/ArkIRTransformer.d.ts +67 -67
- package/lib/core/common/ArkIRTransformer.js +690 -690
- package/lib/core/common/ArkValueTransformer.d.ts +89 -89
- package/lib/core/common/ArkValueTransformer.js +1478 -1478
- package/lib/core/common/Builtin.d.ts +36 -36
- package/lib/core/common/Builtin.js +81 -81
- package/lib/core/common/Const.d.ts +21 -21
- package/lib/core/common/Const.js +43 -43
- package/lib/core/common/DummyMainCreater.d.ts +46 -46
- package/lib/core/common/DummyMainCreater.js +319 -319
- package/lib/core/common/EtsConst.d.ts +73 -73
- package/lib/core/common/EtsConst.js +1021 -1021
- package/lib/core/common/ExprUseReplacer.d.ts +21 -21
- package/lib/core/common/ExprUseReplacer.js +124 -124
- package/lib/core/common/IRInference.d.ts +36 -36
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +651 -648
- package/lib/core/common/IRUtils.d.ts +18 -18
- package/lib/core/common/IRUtils.js +141 -141
- package/lib/core/common/ModelUtils.d.ts +70 -70
- package/lib/core/common/ModelUtils.js +712 -712
- package/lib/core/common/RefUseReplacer.d.ts +13 -13
- package/lib/core/common/RefUseReplacer.js +52 -52
- package/lib/core/common/SdkUtils.d.ts +8 -8
- package/lib/core/common/SdkUtils.js +105 -105
- package/lib/core/common/StmtDefReplacer.d.ts +12 -12
- package/lib/core/common/StmtDefReplacer.js +41 -41
- package/lib/core/common/StmtUseReplacer.d.ts +16 -16
- package/lib/core/common/StmtUseReplacer.js +108 -108
- package/lib/core/common/TSConst.d.ts +18 -18
- package/lib/core/common/TSConst.js +36 -36
- package/lib/core/common/TypeInference.d.ts +102 -102
- package/lib/core/common/TypeInference.js +748 -748
- package/lib/core/common/ValueUtil.d.ts +12 -12
- package/lib/core/common/ValueUtil.js +54 -54
- package/lib/core/common/VisibleValue.d.ts +36 -36
- package/lib/core/common/VisibleValue.js +212 -212
- package/lib/core/dataflow/DataflowProblem.d.ts +20 -20
- package/lib/core/dataflow/DataflowProblem.js +20 -20
- package/lib/core/dataflow/DataflowResult.d.ts +7 -7
- package/lib/core/dataflow/DataflowResult.js +26 -26
- package/lib/core/dataflow/DataflowSolver.d.ts +43 -43
- package/lib/core/dataflow/DataflowSolver.js +307 -307
- package/lib/core/dataflow/Edge.d.ts +11 -11
- package/lib/core/dataflow/Edge.js +31 -31
- package/lib/core/dataflow/Fact.d.ts +6 -6
- package/lib/core/dataflow/Fact.js +24 -24
- package/lib/core/dataflow/GenericDataFlow.d.ts +142 -142
- package/lib/core/dataflow/GenericDataFlow.js +109 -109
- package/lib/core/dataflow/ReachingDef.d.ts +62 -62
- package/lib/core/dataflow/ReachingDef.js +168 -168
- package/lib/core/dataflow/UndefinedVariable.d.ts +45 -45
- package/lib/core/dataflow/UndefinedVariable.js +288 -288
- package/lib/core/dataflow/Util.d.ts +9 -9
- package/lib/core/dataflow/Util.js +64 -64
- package/lib/core/graph/BaseExplicitGraph.d.ts +58 -58
- package/lib/core/graph/BaseExplicitGraph.js +157 -157
- package/lib/core/graph/BaseImplicitGraph.d.ts +77 -77
- package/lib/core/graph/BaseImplicitGraph.js +78 -78
- package/lib/core/graph/BasicBlock.d.ts +104 -104
- package/lib/core/graph/BasicBlock.js +280 -280
- package/lib/core/graph/Cfg.d.ts +59 -59
- package/lib/core/graph/Cfg.js +282 -282
- package/lib/core/graph/DependsGraph.d.ts +35 -35
- package/lib/core/graph/DependsGraph.js +87 -87
- package/lib/core/graph/DominanceFinder.d.ts +15 -15
- package/lib/core/graph/DominanceFinder.js +121 -121
- package/lib/core/graph/DominanceTree.d.ts +12 -12
- package/lib/core/graph/DominanceTree.js +70 -70
- package/lib/core/graph/GraphTraits.d.ts +7 -7
- package/lib/core/graph/GraphTraits.js +16 -16
- package/lib/core/graph/Scc.d.ts +61 -61
- package/lib/core/graph/Scc.js +222 -222
- package/lib/core/graph/ViewTree.d.ts +114 -114
- package/lib/core/graph/ViewTree.js +16 -16
- package/lib/core/graph/builder/CfgBuilder.d.ts +176 -176
- package/lib/core/graph/builder/CfgBuilder.js +1139 -1139
- package/lib/core/graph/builder/ConditionBuilder.d.ts +15 -15
- package/lib/core/graph/builder/ConditionBuilder.js +252 -252
- package/lib/core/graph/builder/LoopBuilder.d.ts +20 -20
- package/lib/core/graph/builder/LoopBuilder.js +251 -251
- package/lib/core/graph/builder/SwitchBuilder.d.ts +11 -11
- package/lib/core/graph/builder/SwitchBuilder.js +152 -152
- package/lib/core/graph/builder/TrapBuilder.d.ts +16 -16
- package/lib/core/graph/builder/TrapBuilder.js +272 -272
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts +203 -203
- package/lib/core/graph/builder/ViewTreeBuilder.js +1055 -1055
- package/lib/core/model/ArkBaseModel.d.ts +59 -59
- package/lib/core/model/ArkBaseModel.js +274 -274
- package/lib/core/model/ArkBody.d.ts +24 -24
- package/lib/core/model/ArkBody.js +65 -65
- package/lib/core/model/ArkClass.d.ts +206 -206
- package/lib/core/model/ArkClass.js +439 -439
- package/lib/core/model/ArkExport.d.ts +72 -72
- package/lib/core/model/ArkExport.js +147 -147
- package/lib/core/model/ArkField.d.ts +62 -62
- package/lib/core/model/ArkField.js +113 -113
- package/lib/core/model/ArkFile.d.ts +131 -131
- package/lib/core/model/ArkFile.js +267 -267
- package/lib/core/model/ArkImport.d.ts +44 -44
- package/lib/core/model/ArkImport.js +108 -108
- package/lib/core/model/ArkMetadata.d.ts +31 -31
- package/lib/core/model/ArkMetadata.js +55 -55
- package/lib/core/model/ArkMethod.d.ts +261 -261
- package/lib/core/model/ArkMethod.js +592 -592
- package/lib/core/model/ArkNamespace.d.ts +66 -66
- package/lib/core/model/ArkNamespace.js +209 -209
- package/lib/core/model/ArkSignature.d.ts +162 -162
- package/lib/core/model/ArkSignature.js +379 -379
- package/lib/core/model/builder/ArkClassBuilder.d.ts +12 -12
- package/lib/core/model/builder/ArkClassBuilder.js +454 -454
- package/lib/core/model/builder/ArkExportBuilder.d.ts +24 -24
- package/lib/core/model/builder/ArkExportBuilder.js +210 -210
- package/lib/core/model/builder/ArkFieldBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkFieldBuilder.js +193 -193
- package/lib/core/model/builder/ArkFileBuilder.d.ts +9 -9
- package/lib/core/model/builder/ArkFileBuilder.js +165 -165
- package/lib/core/model/builder/ArkImportBuilder.d.ts +4 -4
- package/lib/core/model/builder/ArkImportBuilder.js +128 -128
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +63 -63
- package/lib/core/model/builder/ArkMethodBuilder.js +486 -486
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +5 -5
- package/lib/core/model/builder/ArkNamespaceBuilder.js +205 -205
- package/lib/core/model/builder/ArkSignatureBuilder.d.ts +8 -8
- package/lib/core/model/builder/ArkSignatureBuilder.js +40 -40
- package/lib/core/model/builder/BodyBuilder.d.ts +55 -30
- package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/BodyBuilder.js +542 -371
- package/lib/core/model/builder/builderUtils.d.ts +18 -18
- package/lib/core/model/builder/builderUtils.js +558 -558
- package/lib/index.d.ts +82 -80
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +201 -196
- package/lib/save/ArkStream.d.ts +23 -23
- package/lib/save/ArkStream.js +83 -83
- package/lib/save/DotPrinter.d.ts +43 -43
- package/lib/save/DotPrinter.js +170 -170
- package/lib/save/GraphPrinter.d.ts +16 -16
- package/lib/save/GraphPrinter.js +134 -134
- package/lib/save/JsonPrinter.d.ts +30 -30
- package/lib/save/JsonPrinter.js +580 -580
- package/lib/save/Printer.d.ts +12 -12
- package/lib/save/Printer.js +27 -27
- package/lib/save/PrinterBuilder.d.ts +53 -53
- package/lib/save/PrinterBuilder.js +145 -145
- package/lib/save/ViewTreePrinter.d.ts +14 -14
- package/lib/save/ViewTreePrinter.js +123 -123
- package/lib/save/arkir/ArkIRClassPrinter.d.ts +13 -13
- package/lib/save/arkir/ArkIRClassPrinter.js +92 -92
- package/lib/save/arkir/ArkIRFieldPrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRFieldPrinter.js +64 -64
- package/lib/save/arkir/ArkIRFilePrinter.d.ts +12 -12
- package/lib/save/arkir/ArkIRFilePrinter.js +54 -54
- package/lib/save/arkir/ArkIRMethodPrinter.d.ts +16 -16
- package/lib/save/arkir/ArkIRMethodPrinter.js +159 -159
- package/lib/save/arkir/ArkIRNamespacePrinter.d.ts +11 -11
- package/lib/save/arkir/ArkIRNamespacePrinter.js +66 -66
- package/lib/save/base/BasePrinter.d.ts +23 -23
- package/lib/save/base/BasePrinter.js +70 -70
- package/lib/save/base/ExportPrinter.d.ts +8 -8
- package/lib/save/base/ExportPrinter.js +67 -67
- package/lib/save/base/ImportPrinter.d.ts +9 -9
- package/lib/save/base/ImportPrinter.js +92 -92
- package/lib/save/base/PrinterUtils.d.ts +24 -24
- package/lib/save/base/PrinterUtils.js +208 -208
- package/lib/save/serializeArkIR.d.ts +8 -8
- package/lib/save/serializeArkIR.js +294 -294
- package/lib/save/source/SourceBase.d.ts +22 -22
- package/lib/save/source/SourceBase.js +64 -64
- package/lib/save/source/SourceBody.d.ts +58 -58
- package/lib/save/source/SourceBody.js +296 -296
- package/lib/save/source/SourceClass.d.ts +25 -25
- package/lib/save/source/SourceClass.js +187 -187
- package/lib/save/source/SourceField.d.ts +13 -13
- package/lib/save/source/SourceField.js +73 -73
- package/lib/save/source/SourceFilePrinter.d.ts +12 -12
- package/lib/save/source/SourceFilePrinter.js +69 -69
- package/lib/save/source/SourceMethod.d.ts +22 -22
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +196 -193
- package/lib/save/source/SourceNamespace.d.ts +11 -11
- package/lib/save/source/SourceNamespace.js +83 -83
- package/lib/save/source/SourceStmt.d.ts +178 -178
- package/lib/save/source/SourceStmt.js +838 -838
- package/lib/save/source/SourceTransformer.d.ts +46 -46
- package/lib/save/source/SourceTransformer.js +446 -446
- package/lib/transformer/FunctionTransformer.d.ts +2 -2
- package/lib/transformer/FunctionTransformer.js +17 -17
- package/lib/transformer/SceneTransformer.d.ts +2 -2
- package/lib/transformer/SceneTransformer.js +17 -17
- package/lib/transformer/StaticSingleAssignmentFormer.d.ts +12 -12
- package/lib/transformer/StaticSingleAssignmentFormer.js +259 -259
- package/lib/transformer/Transformer.d.ts +6 -6
- package/lib/transformer/Transformer.js +22 -22
- package/lib/utils/AstTreeUtils.d.ts +4 -4
- package/lib/utils/AstTreeUtils.js +26 -26
- package/lib/utils/CfgStructualAnalysis.d.ts +110 -110
- package/lib/utils/CfgStructualAnalysis.js +1277 -1277
- package/lib/utils/FileUtils.d.ts +18 -18
- package/lib/utils/FileUtils.js +135 -135
- package/lib/utils/SparseBitVector.d.ts +100 -100
- package/lib/utils/SparseBitVector.js +445 -445
- package/lib/utils/callGraphUtils.d.ts +30 -30
- package/lib/utils/callGraphUtils.js +205 -205
- package/lib/utils/crypto_utils.d.ts +5 -5
- package/lib/utils/crypto_utils.js +57 -57
- package/lib/utils/entryMethodUtils.d.ts +13 -13
- package/lib/utils/entryMethodUtils.js +110 -110
- package/lib/utils/getAllFiles.d.ts +9 -9
- package/lib/utils/getAllFiles.js +90 -90
- package/lib/utils/json5parser.d.ts +6 -6
- package/lib/utils/json5parser.js +146 -146
- package/lib/utils/logger.d.ts +18 -18
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +97 -90
- package/lib/utils/pathTransfer.d.ts +1 -1
- package/lib/utils/pathTransfer.js +25 -25
- package/node_modules/json5/lib/cli.js +0 -0
- package/node_modules/ohos-typescript/bin/tsc +0 -0
- package/node_modules/ohos-typescript/bin/tsserver +0 -0
- package/package.json +3 -3
|
@@ -1,294 +1,294 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.program = exports.serializeScene = exports.serializeArkFile = exports.buildSceneFromProjectDir = exports.buildSceneFromSingleFile = void 0;
|
|
21
|
-
const path_1 = __importDefault(require("path"));
|
|
22
|
-
const fs_1 = __importDefault(require("fs"));
|
|
23
|
-
const commander_1 = require("commander");
|
|
24
|
-
const PrinterBuilder_1 = require("./PrinterBuilder");
|
|
25
|
-
const Config_1 = require("../Config");
|
|
26
|
-
const Scene_1 = require("../Scene");
|
|
27
|
-
const JsonPrinter_1 = require("./JsonPrinter");
|
|
28
|
-
const PointerAnalysis_1 = require("../callgraph/pointerAnalysis/PointerAnalysis");
|
|
29
|
-
function buildSceneFromSingleFile(filename, verbose = false) {
|
|
30
|
-
if (verbose) {
|
|
31
|
-
console.log('Building scene...');
|
|
32
|
-
}
|
|
33
|
-
const filepath = path_1.default.resolve(filename);
|
|
34
|
-
const projectDir = path_1.default.dirname(filepath);
|
|
35
|
-
const config = new Config_1.SceneConfig();
|
|
36
|
-
config.buildConfig('single-file', projectDir, []);
|
|
37
|
-
config.getProjectFiles().push(filepath);
|
|
38
|
-
const scene = new Scene_1.Scene();
|
|
39
|
-
scene.buildSceneFromProjectDir(config);
|
|
40
|
-
return scene;
|
|
41
|
-
}
|
|
42
|
-
exports.buildSceneFromSingleFile = buildSceneFromSingleFile;
|
|
43
|
-
function buildSceneFromProjectDir(inputDir, verbose = false) {
|
|
44
|
-
if (verbose) {
|
|
45
|
-
console.log('Building scene...');
|
|
46
|
-
}
|
|
47
|
-
const config = new Config_1.SceneConfig();
|
|
48
|
-
config.buildFromProjectDir(inputDir);
|
|
49
|
-
const scene = new Scene_1.Scene();
|
|
50
|
-
scene.buildSceneFromProjectDir(config);
|
|
51
|
-
return scene;
|
|
52
|
-
}
|
|
53
|
-
exports.buildSceneFromProjectDir = buildSceneFromProjectDir;
|
|
54
|
-
function serializeArkFile(arkFile, output) {
|
|
55
|
-
let filename = output;
|
|
56
|
-
if (filename === undefined) {
|
|
57
|
-
const outputDir = path_1.default.join(arkFile.getProjectDir(), '..', 'output');
|
|
58
|
-
filename = path_1.default.join(outputDir, arkFile.getName() + '.json');
|
|
59
|
-
}
|
|
60
|
-
fs_1.default.mkdirSync(path_1.default.dirname(filename), { recursive: true });
|
|
61
|
-
let printer = new JsonPrinter_1.JsonPrinter(arkFile);
|
|
62
|
-
const fd = fs_1.default.openSync(filename, 'w');
|
|
63
|
-
fs_1.default.writeFileSync(fd, printer.dump());
|
|
64
|
-
fs_1.default.closeSync(fd);
|
|
65
|
-
}
|
|
66
|
-
exports.serializeArkFile = serializeArkFile;
|
|
67
|
-
function serializeScene(scene, outDir, verbose = false) {
|
|
68
|
-
let files = scene.getFiles();
|
|
69
|
-
console.log(`Serializing Scene with ${files.length} files to '${outDir}'...`);
|
|
70
|
-
for (let f of files) {
|
|
71
|
-
let filepath = f.getName();
|
|
72
|
-
let outPath = path_1.default.join(outDir, filepath + '.json');
|
|
73
|
-
if (verbose) {
|
|
74
|
-
console.log(`Serializing ArkIR for '${filepath}' to '${outPath}'...`);
|
|
75
|
-
}
|
|
76
|
-
serializeArkFile(f, outPath);
|
|
77
|
-
}
|
|
78
|
-
if (verbose) {
|
|
79
|
-
console.log(`All ${files.length} files in scene are serialized`);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
exports.serializeScene = serializeScene;
|
|
83
|
-
function serializeSingleTsFile(input, output, options) {
|
|
84
|
-
if (options.verbose) {
|
|
85
|
-
console.log(`Serializing TS file to JSON: '${input}' -> '${output}'`);
|
|
86
|
-
}
|
|
87
|
-
let filepath = path_1.default.resolve(input);
|
|
88
|
-
let projectDir = path_1.default.dirname(filepath);
|
|
89
|
-
const scene = buildSceneFromSingleFile(filepath, options.verbose);
|
|
90
|
-
let files = scene.getFiles();
|
|
91
|
-
if (options.verbose) {
|
|
92
|
-
console.log(`Scene contains ${files.length} files`);
|
|
93
|
-
for (let f of files) {
|
|
94
|
-
console.log(`- '${f.getName()}'`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
if (options.inferTypes) {
|
|
98
|
-
if (options.verbose) {
|
|
99
|
-
console.log('Inferring types...');
|
|
100
|
-
}
|
|
101
|
-
scene.inferTypes();
|
|
102
|
-
if (options.inferTypes > 1) {
|
|
103
|
-
for (let i = 1; i < options.inferTypes; i++) {
|
|
104
|
-
if (options.verbose) {
|
|
105
|
-
console.log(`Inferring types one more time (${i + 1} / ${options.inferTypes})...`);
|
|
106
|
-
}
|
|
107
|
-
scene.inferTypes();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (options.entrypoint) {
|
|
112
|
-
if (options.verbose) {
|
|
113
|
-
console.log('Generating entrypoint...');
|
|
114
|
-
}
|
|
115
|
-
PointerAnalysis_1.PointerAnalysis.pointerAnalysisForWholeProject(scene);
|
|
116
|
-
}
|
|
117
|
-
if (options.verbose) {
|
|
118
|
-
console.log('Extracting single ArkFile...');
|
|
119
|
-
}
|
|
120
|
-
if (files.length === 0) {
|
|
121
|
-
console.error(`ERROR: No files found in the project directory '${projectDir}'.`);
|
|
122
|
-
process.exit(1);
|
|
123
|
-
}
|
|
124
|
-
if (files.length > 1) {
|
|
125
|
-
console.error(`ERROR: More than one file found in the project directory '${projectDir}'.`);
|
|
126
|
-
process.exit(1);
|
|
127
|
-
}
|
|
128
|
-
// Note: we explicitly push a single path to the project files (in config),
|
|
129
|
-
// so we expect there is only *one* ArkFile in the scene.
|
|
130
|
-
let arkFile = scene.getFiles()[0];
|
|
131
|
-
let outPath;
|
|
132
|
-
if (fs_1.default.existsSync(output) && fs_1.default.statSync(output).isDirectory()) {
|
|
133
|
-
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
134
|
-
}
|
|
135
|
-
else if (!fs_1.default.existsSync(output) && output.endsWith('/')) {
|
|
136
|
-
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
outPath = output;
|
|
140
|
-
}
|
|
141
|
-
console.log(`Serializing ArkIR for '${arkFile.getName()}' to '${outPath}'...`);
|
|
142
|
-
let printer = new PrinterBuilder_1.PrinterBuilder();
|
|
143
|
-
printer.dumpToJson(arkFile, outPath);
|
|
144
|
-
if (options.entrypoint) {
|
|
145
|
-
let arkFile = scene.getFiles()[1];
|
|
146
|
-
let outPath;
|
|
147
|
-
if (fs_1.default.existsSync(output) && fs_1.default.statSync(output).isDirectory()) {
|
|
148
|
-
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
149
|
-
}
|
|
150
|
-
else if (!fs_1.default.existsSync(output) && output.endsWith('/')) {
|
|
151
|
-
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
outPath = path_1.default.join(path_1.default.dirname(output), arkFile.getName() + '.json');
|
|
155
|
-
}
|
|
156
|
-
console.log(`Serializing entrypoint to '${outPath}'...`);
|
|
157
|
-
printer.dumpToJson(arkFile, outPath);
|
|
158
|
-
}
|
|
159
|
-
if (options.verbose) {
|
|
160
|
-
console.log('All done!');
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
function serializeMultipleTsFiles(inputDir, outDir, options) {
|
|
164
|
-
console.log(`Serializing multiple TS files to JSON: '${inputDir}' -> '${outDir}'`);
|
|
165
|
-
if (fs_1.default.existsSync(outDir) && !fs_1.default.statSync(outDir).isDirectory()) {
|
|
166
|
-
console.error(`ERROR: Output path must be a directory.`);
|
|
167
|
-
process.exit(1);
|
|
168
|
-
}
|
|
169
|
-
if (options.verbose) {
|
|
170
|
-
console.log('Building scene...');
|
|
171
|
-
}
|
|
172
|
-
let config = new Config_1.SceneConfig();
|
|
173
|
-
config.buildFromProjectDir(inputDir);
|
|
174
|
-
let scene = new Scene_1.Scene();
|
|
175
|
-
scene.buildSceneFromProjectDir(config);
|
|
176
|
-
let files = scene.getFiles();
|
|
177
|
-
if (options.verbose) {
|
|
178
|
-
console.log(`Scene contains ${files.length} files`);
|
|
179
|
-
files.forEach((f) => console.log(`- '${f.getName()}'`));
|
|
180
|
-
}
|
|
181
|
-
if (options.inferTypes) {
|
|
182
|
-
if (options.verbose) {
|
|
183
|
-
console.log('Inferring types...');
|
|
184
|
-
}
|
|
185
|
-
scene.inferTypes();
|
|
186
|
-
if (options.inferTypes > 1) {
|
|
187
|
-
for (let i = 1; i < options.inferTypes; i++) {
|
|
188
|
-
if (options.verbose) {
|
|
189
|
-
console.log(`Inferring types one more time (${i + 1} / ${options.inferTypes})...`);
|
|
190
|
-
}
|
|
191
|
-
scene.inferTypes();
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
if (options.entrypoint) {
|
|
196
|
-
if (options.verbose) {
|
|
197
|
-
console.log('Generating entrypoint...');
|
|
198
|
-
}
|
|
199
|
-
PointerAnalysis_1.PointerAnalysis.pointerAnalysisForWholeProject(scene);
|
|
200
|
-
files = scene.getFiles();
|
|
201
|
-
}
|
|
202
|
-
if (options.verbose) {
|
|
203
|
-
console.log('Serializing...');
|
|
204
|
-
}
|
|
205
|
-
let printer = new PrinterBuilder_1.PrinterBuilder();
|
|
206
|
-
for (let f of files) {
|
|
207
|
-
let filepath = f.getName();
|
|
208
|
-
let outPath = path_1.default.join(outDir, filepath + '.json');
|
|
209
|
-
console.log(`Serializing ArkIR for '${filepath}' to '${outPath}'...`);
|
|
210
|
-
printer.dumpToJson(f, outPath);
|
|
211
|
-
}
|
|
212
|
-
console.log('All done!');
|
|
213
|
-
}
|
|
214
|
-
function serializeTsProject(inputDir, outDir, options) {
|
|
215
|
-
console.log(`Serializing TS project to JSON: '${inputDir}' -> '${outDir}'`);
|
|
216
|
-
if (fs_1.default.existsSync(outDir) && !fs_1.default.statSync(outDir).isDirectory()) {
|
|
217
|
-
console.error(`ERROR: Output path must be a directory.`);
|
|
218
|
-
process.exit(1);
|
|
219
|
-
}
|
|
220
|
-
const scene = buildSceneFromProjectDir(inputDir, options.verbose);
|
|
221
|
-
if (options.inferTypes) {
|
|
222
|
-
if (options.verbose) {
|
|
223
|
-
console.log('Inferring types...');
|
|
224
|
-
}
|
|
225
|
-
scene.inferTypes();
|
|
226
|
-
if (options.inferTypes > 1) {
|
|
227
|
-
for (let i = 1; i < options.inferTypes; i++) {
|
|
228
|
-
if (options.verbose) {
|
|
229
|
-
console.log(`Inferring types one more time (${i + 1} / ${options.inferTypes})...`);
|
|
230
|
-
}
|
|
231
|
-
scene.inferTypes();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
if (options.entrypoint) {
|
|
236
|
-
if (options.verbose) {
|
|
237
|
-
console.log('Generating entrypoint...');
|
|
238
|
-
}
|
|
239
|
-
PointerAnalysis_1.PointerAnalysis.pointerAnalysisForWholeProject(scene);
|
|
240
|
-
}
|
|
241
|
-
serializeScene(scene, outDir, options.verbose);
|
|
242
|
-
if (options.verbose) {
|
|
243
|
-
console.log('All done!');
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
function myParseInt(value, _previous) {
|
|
247
|
-
const parsedValue = parseInt(value, 10);
|
|
248
|
-
if (isNaN(parsedValue)) {
|
|
249
|
-
throw new commander_1.InvalidArgumentError('Must be a number.');
|
|
250
|
-
}
|
|
251
|
-
if (parsedValue < 1) {
|
|
252
|
-
throw new commander_1.InvalidArgumentError('Must be greater than 0.');
|
|
253
|
-
}
|
|
254
|
-
return parsedValue;
|
|
255
|
-
}
|
|
256
|
-
exports.program = new commander_1.Command()
|
|
257
|
-
.name('serializeArkIR')
|
|
258
|
-
.description('Serialize ArkIR for TypeScript files or projects to JSON')
|
|
259
|
-
.argument('<input>', 'Input file or directory')
|
|
260
|
-
.argument('<output>', 'Output file or directory')
|
|
261
|
-
.option('-m, --multi', 'Flag to indicate the input is a directory', false)
|
|
262
|
-
.option('-p, --project', 'Flag to indicate the input is a project directory', false)
|
|
263
|
-
.option('-t, --infer-types [times]', 'Infer types in the ArkIR', myParseInt)
|
|
264
|
-
.option('-e, --entrypoint', 'Generate entrypoint for the files', false)
|
|
265
|
-
.option('-v, --verbose', 'Verbose output', false)
|
|
266
|
-
.action((input, output, options) => {
|
|
267
|
-
// Check for invalid combinations of flags
|
|
268
|
-
if (options.multi && options.project) {
|
|
269
|
-
console.error(`ERROR: You cannot provide both the '-m' and '-p' flags.`);
|
|
270
|
-
process.exit(1);
|
|
271
|
-
}
|
|
272
|
-
// Ensure the input path exists
|
|
273
|
-
if (!fs_1.default.existsSync(input)) {
|
|
274
|
-
console.error(`ERROR: The input path '${input}' does not exist.`);
|
|
275
|
-
process.exit(1);
|
|
276
|
-
}
|
|
277
|
-
// Handle the case where the input is a directory
|
|
278
|
-
if (fs_1.default.statSync(input).isDirectory() && !(options.multi || options.project)) {
|
|
279
|
-
console.error(`ERROR: If the input is a directory, you must provide the '-p' or '-m' flag.`);
|
|
280
|
-
process.exit(1);
|
|
281
|
-
}
|
|
282
|
-
if (options.project) {
|
|
283
|
-
serializeTsProject(input, output, options);
|
|
284
|
-
}
|
|
285
|
-
else if (options.multi) {
|
|
286
|
-
serializeMultipleTsFiles(input, output, options);
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
serializeSingleTsFile(input, output, options);
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
if (require.main === module) {
|
|
293
|
-
exports.program.parse(process.argv);
|
|
294
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.program = exports.serializeScene = exports.serializeArkFile = exports.buildSceneFromProjectDir = exports.buildSceneFromSingleFile = void 0;
|
|
21
|
+
const path_1 = __importDefault(require("path"));
|
|
22
|
+
const fs_1 = __importDefault(require("fs"));
|
|
23
|
+
const commander_1 = require("commander");
|
|
24
|
+
const PrinterBuilder_1 = require("./PrinterBuilder");
|
|
25
|
+
const Config_1 = require("../Config");
|
|
26
|
+
const Scene_1 = require("../Scene");
|
|
27
|
+
const JsonPrinter_1 = require("./JsonPrinter");
|
|
28
|
+
const PointerAnalysis_1 = require("../callgraph/pointerAnalysis/PointerAnalysis");
|
|
29
|
+
function buildSceneFromSingleFile(filename, verbose = false) {
|
|
30
|
+
if (verbose) {
|
|
31
|
+
console.log('Building scene...');
|
|
32
|
+
}
|
|
33
|
+
const filepath = path_1.default.resolve(filename);
|
|
34
|
+
const projectDir = path_1.default.dirname(filepath);
|
|
35
|
+
const config = new Config_1.SceneConfig();
|
|
36
|
+
config.buildConfig('single-file', projectDir, []);
|
|
37
|
+
config.getProjectFiles().push(filepath);
|
|
38
|
+
const scene = new Scene_1.Scene();
|
|
39
|
+
scene.buildSceneFromProjectDir(config);
|
|
40
|
+
return scene;
|
|
41
|
+
}
|
|
42
|
+
exports.buildSceneFromSingleFile = buildSceneFromSingleFile;
|
|
43
|
+
function buildSceneFromProjectDir(inputDir, verbose = false) {
|
|
44
|
+
if (verbose) {
|
|
45
|
+
console.log('Building scene...');
|
|
46
|
+
}
|
|
47
|
+
const config = new Config_1.SceneConfig();
|
|
48
|
+
config.buildFromProjectDir(inputDir);
|
|
49
|
+
const scene = new Scene_1.Scene();
|
|
50
|
+
scene.buildSceneFromProjectDir(config);
|
|
51
|
+
return scene;
|
|
52
|
+
}
|
|
53
|
+
exports.buildSceneFromProjectDir = buildSceneFromProjectDir;
|
|
54
|
+
function serializeArkFile(arkFile, output) {
|
|
55
|
+
let filename = output;
|
|
56
|
+
if (filename === undefined) {
|
|
57
|
+
const outputDir = path_1.default.join(arkFile.getProjectDir(), '..', 'output');
|
|
58
|
+
filename = path_1.default.join(outputDir, arkFile.getName() + '.json');
|
|
59
|
+
}
|
|
60
|
+
fs_1.default.mkdirSync(path_1.default.dirname(filename), { recursive: true });
|
|
61
|
+
let printer = new JsonPrinter_1.JsonPrinter(arkFile);
|
|
62
|
+
const fd = fs_1.default.openSync(filename, 'w');
|
|
63
|
+
fs_1.default.writeFileSync(fd, printer.dump());
|
|
64
|
+
fs_1.default.closeSync(fd);
|
|
65
|
+
}
|
|
66
|
+
exports.serializeArkFile = serializeArkFile;
|
|
67
|
+
function serializeScene(scene, outDir, verbose = false) {
|
|
68
|
+
let files = scene.getFiles();
|
|
69
|
+
console.log(`Serializing Scene with ${files.length} files to '${outDir}'...`);
|
|
70
|
+
for (let f of files) {
|
|
71
|
+
let filepath = f.getName();
|
|
72
|
+
let outPath = path_1.default.join(outDir, filepath + '.json');
|
|
73
|
+
if (verbose) {
|
|
74
|
+
console.log(`Serializing ArkIR for '${filepath}' to '${outPath}'...`);
|
|
75
|
+
}
|
|
76
|
+
serializeArkFile(f, outPath);
|
|
77
|
+
}
|
|
78
|
+
if (verbose) {
|
|
79
|
+
console.log(`All ${files.length} files in scene are serialized`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.serializeScene = serializeScene;
|
|
83
|
+
function serializeSingleTsFile(input, output, options) {
|
|
84
|
+
if (options.verbose) {
|
|
85
|
+
console.log(`Serializing TS file to JSON: '${input}' -> '${output}'`);
|
|
86
|
+
}
|
|
87
|
+
let filepath = path_1.default.resolve(input);
|
|
88
|
+
let projectDir = path_1.default.dirname(filepath);
|
|
89
|
+
const scene = buildSceneFromSingleFile(filepath, options.verbose);
|
|
90
|
+
let files = scene.getFiles();
|
|
91
|
+
if (options.verbose) {
|
|
92
|
+
console.log(`Scene contains ${files.length} files`);
|
|
93
|
+
for (let f of files) {
|
|
94
|
+
console.log(`- '${f.getName()}'`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (options.inferTypes) {
|
|
98
|
+
if (options.verbose) {
|
|
99
|
+
console.log('Inferring types...');
|
|
100
|
+
}
|
|
101
|
+
scene.inferTypes();
|
|
102
|
+
if (options.inferTypes > 1) {
|
|
103
|
+
for (let i = 1; i < options.inferTypes; i++) {
|
|
104
|
+
if (options.verbose) {
|
|
105
|
+
console.log(`Inferring types one more time (${i + 1} / ${options.inferTypes})...`);
|
|
106
|
+
}
|
|
107
|
+
scene.inferTypes();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (options.entrypoint) {
|
|
112
|
+
if (options.verbose) {
|
|
113
|
+
console.log('Generating entrypoint...');
|
|
114
|
+
}
|
|
115
|
+
PointerAnalysis_1.PointerAnalysis.pointerAnalysisForWholeProject(scene);
|
|
116
|
+
}
|
|
117
|
+
if (options.verbose) {
|
|
118
|
+
console.log('Extracting single ArkFile...');
|
|
119
|
+
}
|
|
120
|
+
if (files.length === 0) {
|
|
121
|
+
console.error(`ERROR: No files found in the project directory '${projectDir}'.`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
if (files.length > 1) {
|
|
125
|
+
console.error(`ERROR: More than one file found in the project directory '${projectDir}'.`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
// Note: we explicitly push a single path to the project files (in config),
|
|
129
|
+
// so we expect there is only *one* ArkFile in the scene.
|
|
130
|
+
let arkFile = scene.getFiles()[0];
|
|
131
|
+
let outPath;
|
|
132
|
+
if (fs_1.default.existsSync(output) && fs_1.default.statSync(output).isDirectory()) {
|
|
133
|
+
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
134
|
+
}
|
|
135
|
+
else if (!fs_1.default.existsSync(output) && output.endsWith('/')) {
|
|
136
|
+
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
outPath = output;
|
|
140
|
+
}
|
|
141
|
+
console.log(`Serializing ArkIR for '${arkFile.getName()}' to '${outPath}'...`);
|
|
142
|
+
let printer = new PrinterBuilder_1.PrinterBuilder();
|
|
143
|
+
printer.dumpToJson(arkFile, outPath);
|
|
144
|
+
if (options.entrypoint) {
|
|
145
|
+
let arkFile = scene.getFiles()[1];
|
|
146
|
+
let outPath;
|
|
147
|
+
if (fs_1.default.existsSync(output) && fs_1.default.statSync(output).isDirectory()) {
|
|
148
|
+
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
149
|
+
}
|
|
150
|
+
else if (!fs_1.default.existsSync(output) && output.endsWith('/')) {
|
|
151
|
+
outPath = path_1.default.join(output, arkFile.getName() + '.json');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
outPath = path_1.default.join(path_1.default.dirname(output), arkFile.getName() + '.json');
|
|
155
|
+
}
|
|
156
|
+
console.log(`Serializing entrypoint to '${outPath}'...`);
|
|
157
|
+
printer.dumpToJson(arkFile, outPath);
|
|
158
|
+
}
|
|
159
|
+
if (options.verbose) {
|
|
160
|
+
console.log('All done!');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function serializeMultipleTsFiles(inputDir, outDir, options) {
|
|
164
|
+
console.log(`Serializing multiple TS files to JSON: '${inputDir}' -> '${outDir}'`);
|
|
165
|
+
if (fs_1.default.existsSync(outDir) && !fs_1.default.statSync(outDir).isDirectory()) {
|
|
166
|
+
console.error(`ERROR: Output path must be a directory.`);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
if (options.verbose) {
|
|
170
|
+
console.log('Building scene...');
|
|
171
|
+
}
|
|
172
|
+
let config = new Config_1.SceneConfig();
|
|
173
|
+
config.buildFromProjectDir(inputDir);
|
|
174
|
+
let scene = new Scene_1.Scene();
|
|
175
|
+
scene.buildSceneFromProjectDir(config);
|
|
176
|
+
let files = scene.getFiles();
|
|
177
|
+
if (options.verbose) {
|
|
178
|
+
console.log(`Scene contains ${files.length} files`);
|
|
179
|
+
files.forEach((f) => console.log(`- '${f.getName()}'`));
|
|
180
|
+
}
|
|
181
|
+
if (options.inferTypes) {
|
|
182
|
+
if (options.verbose) {
|
|
183
|
+
console.log('Inferring types...');
|
|
184
|
+
}
|
|
185
|
+
scene.inferTypes();
|
|
186
|
+
if (options.inferTypes > 1) {
|
|
187
|
+
for (let i = 1; i < options.inferTypes; i++) {
|
|
188
|
+
if (options.verbose) {
|
|
189
|
+
console.log(`Inferring types one more time (${i + 1} / ${options.inferTypes})...`);
|
|
190
|
+
}
|
|
191
|
+
scene.inferTypes();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (options.entrypoint) {
|
|
196
|
+
if (options.verbose) {
|
|
197
|
+
console.log('Generating entrypoint...');
|
|
198
|
+
}
|
|
199
|
+
PointerAnalysis_1.PointerAnalysis.pointerAnalysisForWholeProject(scene);
|
|
200
|
+
files = scene.getFiles();
|
|
201
|
+
}
|
|
202
|
+
if (options.verbose) {
|
|
203
|
+
console.log('Serializing...');
|
|
204
|
+
}
|
|
205
|
+
let printer = new PrinterBuilder_1.PrinterBuilder();
|
|
206
|
+
for (let f of files) {
|
|
207
|
+
let filepath = f.getName();
|
|
208
|
+
let outPath = path_1.default.join(outDir, filepath + '.json');
|
|
209
|
+
console.log(`Serializing ArkIR for '${filepath}' to '${outPath}'...`);
|
|
210
|
+
printer.dumpToJson(f, outPath);
|
|
211
|
+
}
|
|
212
|
+
console.log('All done!');
|
|
213
|
+
}
|
|
214
|
+
function serializeTsProject(inputDir, outDir, options) {
|
|
215
|
+
console.log(`Serializing TS project to JSON: '${inputDir}' -> '${outDir}'`);
|
|
216
|
+
if (fs_1.default.existsSync(outDir) && !fs_1.default.statSync(outDir).isDirectory()) {
|
|
217
|
+
console.error(`ERROR: Output path must be a directory.`);
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
const scene = buildSceneFromProjectDir(inputDir, options.verbose);
|
|
221
|
+
if (options.inferTypes) {
|
|
222
|
+
if (options.verbose) {
|
|
223
|
+
console.log('Inferring types...');
|
|
224
|
+
}
|
|
225
|
+
scene.inferTypes();
|
|
226
|
+
if (options.inferTypes > 1) {
|
|
227
|
+
for (let i = 1; i < options.inferTypes; i++) {
|
|
228
|
+
if (options.verbose) {
|
|
229
|
+
console.log(`Inferring types one more time (${i + 1} / ${options.inferTypes})...`);
|
|
230
|
+
}
|
|
231
|
+
scene.inferTypes();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (options.entrypoint) {
|
|
236
|
+
if (options.verbose) {
|
|
237
|
+
console.log('Generating entrypoint...');
|
|
238
|
+
}
|
|
239
|
+
PointerAnalysis_1.PointerAnalysis.pointerAnalysisForWholeProject(scene);
|
|
240
|
+
}
|
|
241
|
+
serializeScene(scene, outDir, options.verbose);
|
|
242
|
+
if (options.verbose) {
|
|
243
|
+
console.log('All done!');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function myParseInt(value, _previous) {
|
|
247
|
+
const parsedValue = parseInt(value, 10);
|
|
248
|
+
if (isNaN(parsedValue)) {
|
|
249
|
+
throw new commander_1.InvalidArgumentError('Must be a number.');
|
|
250
|
+
}
|
|
251
|
+
if (parsedValue < 1) {
|
|
252
|
+
throw new commander_1.InvalidArgumentError('Must be greater than 0.');
|
|
253
|
+
}
|
|
254
|
+
return parsedValue;
|
|
255
|
+
}
|
|
256
|
+
exports.program = new commander_1.Command()
|
|
257
|
+
.name('serializeArkIR')
|
|
258
|
+
.description('Serialize ArkIR for TypeScript files or projects to JSON')
|
|
259
|
+
.argument('<input>', 'Input file or directory')
|
|
260
|
+
.argument('<output>', 'Output file or directory')
|
|
261
|
+
.option('-m, --multi', 'Flag to indicate the input is a directory', false)
|
|
262
|
+
.option('-p, --project', 'Flag to indicate the input is a project directory', false)
|
|
263
|
+
.option('-t, --infer-types [times]', 'Infer types in the ArkIR', myParseInt)
|
|
264
|
+
.option('-e, --entrypoint', 'Generate entrypoint for the files', false)
|
|
265
|
+
.option('-v, --verbose', 'Verbose output', false)
|
|
266
|
+
.action((input, output, options) => {
|
|
267
|
+
// Check for invalid combinations of flags
|
|
268
|
+
if (options.multi && options.project) {
|
|
269
|
+
console.error(`ERROR: You cannot provide both the '-m' and '-p' flags.`);
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
// Ensure the input path exists
|
|
273
|
+
if (!fs_1.default.existsSync(input)) {
|
|
274
|
+
console.error(`ERROR: The input path '${input}' does not exist.`);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
|
+
// Handle the case where the input is a directory
|
|
278
|
+
if (fs_1.default.statSync(input).isDirectory() && !(options.multi || options.project)) {
|
|
279
|
+
console.error(`ERROR: If the input is a directory, you must provide the '-p' or '-m' flag.`);
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
282
|
+
if (options.project) {
|
|
283
|
+
serializeTsProject(input, output, options);
|
|
284
|
+
}
|
|
285
|
+
else if (options.multi) {
|
|
286
|
+
serializeMultipleTsFiles(input, output, options);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
serializeSingleTsFile(input, output, options);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
if (require.main === module) {
|
|
293
|
+
exports.program.parse(process.argv);
|
|
294
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { ArkFile } from '../../core/model/ArkFile';
|
|
2
|
-
import { ArkMethod } from '../../core/model/ArkMethod';
|
|
3
|
-
import { ClassSignature, MethodSignature } from '../../core/model/ArkSignature';
|
|
4
|
-
import { ArkClass } from '../../core/model/ArkClass';
|
|
5
|
-
import { ArkCodeBuffer } from '../ArkStream';
|
|
6
|
-
import { Local } from '../../core/base/Local';
|
|
7
|
-
import { TransformerContext } from './SourceTransformer';
|
|
8
|
-
import { ArkNamespace } from '../../core/model/ArkNamespace';
|
|
9
|
-
import { BasePrinter } from '../base/BasePrinter';
|
|
10
|
-
export declare abstract class SourceBase extends BasePrinter implements TransformerContext {
|
|
11
|
-
protected arkFile: ArkFile;
|
|
12
|
-
protected inBuilder: boolean;
|
|
13
|
-
constructor(arkFile: ArkFile, indent?: string);
|
|
14
|
-
getDeclaringArkNamespace(): ArkNamespace | undefined;
|
|
15
|
-
getArkFile(): ArkFile;
|
|
16
|
-
getMethod(signature: MethodSignature): ArkMethod | null;
|
|
17
|
-
getClass(signature: ClassSignature): ArkClass | null;
|
|
18
|
-
getPrinter(): ArkCodeBuffer;
|
|
19
|
-
transTemp2Code(temp: Local): string;
|
|
20
|
-
isInBuilderMethod(): boolean;
|
|
21
|
-
protected resolveKeywordType(keywordStr: string): string;
|
|
22
|
-
}
|
|
1
|
+
import { ArkFile } from '../../core/model/ArkFile';
|
|
2
|
+
import { ArkMethod } from '../../core/model/ArkMethod';
|
|
3
|
+
import { ClassSignature, MethodSignature } from '../../core/model/ArkSignature';
|
|
4
|
+
import { ArkClass } from '../../core/model/ArkClass';
|
|
5
|
+
import { ArkCodeBuffer } from '../ArkStream';
|
|
6
|
+
import { Local } from '../../core/base/Local';
|
|
7
|
+
import { TransformerContext } from './SourceTransformer';
|
|
8
|
+
import { ArkNamespace } from '../../core/model/ArkNamespace';
|
|
9
|
+
import { BasePrinter } from '../base/BasePrinter';
|
|
10
|
+
export declare abstract class SourceBase extends BasePrinter implements TransformerContext {
|
|
11
|
+
protected arkFile: ArkFile;
|
|
12
|
+
protected inBuilder: boolean;
|
|
13
|
+
constructor(arkFile: ArkFile, indent?: string);
|
|
14
|
+
getDeclaringArkNamespace(): ArkNamespace | undefined;
|
|
15
|
+
getArkFile(): ArkFile;
|
|
16
|
+
getMethod(signature: MethodSignature): ArkMethod | null;
|
|
17
|
+
getClass(signature: ClassSignature): ArkClass | null;
|
|
18
|
+
getPrinter(): ArkCodeBuffer;
|
|
19
|
+
transTemp2Code(temp: Local): string;
|
|
20
|
+
isInBuilderMethod(): boolean;
|
|
21
|
+
protected resolveKeywordType(keywordStr: string): string;
|
|
22
|
+
}
|
|
23
23
|
//# sourceMappingURL=SourceBase.d.ts.map
|