arkanalyzer 1.0.7 → 1.0.8
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 +8 -0
- package/docs/IR2ts-stmt.md +81 -0
- package/docs/IR2ts.md +82 -0
- package/lib/Config.d.ts +9 -1
- package/lib/Config.d.ts.map +1 -1
- package/lib/Config.js +24 -11
- package/lib/Scene.d.ts +49 -42
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +124 -93
- package/lib/callgraph/algorithm/AbstractAnalysis.js +1 -1
- package/lib/callgraph/common/Statistics.js +1 -1
- package/lib/callgraph/model/CallGraph.d.ts +3 -2
- package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
- package/lib/callgraph/model/CallGraph.js +16 -6
- package/lib/callgraph/model/builder/CallGraphBuilder.js +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.d.ts +35 -8
- package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/Pag.js +93 -12
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +32 -5
- package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PagBuilder.js +378 -83
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +3 -0
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +71 -18
- package/lib/core/base/Constant.d.ts +25 -5
- package/lib/core/base/Constant.d.ts.map +1 -1
- package/lib/core/base/Constant.js +46 -8
- package/lib/core/base/Expr.d.ts +45 -40
- package/lib/core/base/Expr.d.ts.map +1 -1
- package/lib/core/base/Expr.js +239 -153
- package/lib/core/base/Local.d.ts +2 -2
- package/lib/core/base/Local.d.ts.map +1 -1
- package/lib/core/base/Local.js +2 -2
- package/lib/core/base/Ref.d.ts +38 -37
- package/lib/core/base/Ref.d.ts.map +1 -1
- package/lib/core/base/Ref.js +102 -70
- package/lib/core/base/Stmt.d.ts +4 -0
- package/lib/core/base/Stmt.d.ts.map +1 -1
- package/lib/core/base/Stmt.js +12 -1
- package/lib/core/base/Type.d.ts +4 -0
- package/lib/core/base/Type.d.ts.map +1 -1
- package/lib/core/base/Type.js +41 -17
- package/lib/core/common/ArkError.d.ts +15 -0
- package/lib/core/common/ArkError.d.ts.map +1 -0
- package/lib/core/common/ArkError.js +28 -0
- package/lib/core/common/ArkIRTransformer.d.ts +7 -3
- package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
- package/lib/core/common/ArkIRTransformer.js +46 -20
- package/lib/core/common/Builtin.js +1 -1
- package/lib/core/common/CfgBuilder.d.ts +12 -0
- package/lib/core/common/CfgBuilder.d.ts.map +1 -1
- package/lib/core/common/CfgBuilder.js +289 -61
- package/lib/core/common/Const.d.ts +15 -10
- package/lib/core/common/Const.d.ts.map +1 -1
- package/lib/core/common/Const.js +18 -11
- package/lib/core/common/DummyMainCreater.d.ts +2 -1
- package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
- package/lib/core/common/DummyMainCreater.js +28 -15
- package/lib/core/common/EtsConst.d.ts +1 -0
- package/lib/core/common/EtsConst.d.ts.map +1 -1
- package/lib/core/common/EtsConst.js +2 -1
- package/lib/core/common/IRUtils.d.ts +7 -0
- package/lib/core/common/IRUtils.d.ts.map +1 -1
- package/lib/core/common/IRUtils.js +34 -2
- package/lib/core/common/ModelUtils.d.ts +1 -0
- package/lib/core/common/ModelUtils.d.ts.map +1 -1
- package/lib/core/common/ModelUtils.js +32 -32
- package/lib/core/common/TSConst.d.ts +10 -3
- package/lib/core/common/TSConst.d.ts.map +1 -1
- package/lib/core/common/TSConst.js +11 -4
- package/lib/core/common/TypeInference.d.ts +8 -2
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +218 -87
- package/lib/core/common/ValueUtil.d.ts +0 -4
- package/lib/core/common/ValueUtil.d.ts.map +1 -1
- package/lib/core/common/ValueUtil.js +8 -25
- package/lib/core/dataflow/DataflowSolver.d.ts.map +1 -1
- package/lib/core/dataflow/DataflowSolver.js +2 -4
- package/lib/core/dataflow/TiantAnalysis.js +2 -1
- package/lib/core/dataflow/Util.d.ts +1 -1
- package/lib/core/dataflow/Util.d.ts.map +1 -1
- package/lib/core/dataflow/Util.js +8 -7
- package/lib/core/graph/BasicBlock.d.ts +41 -0
- package/lib/core/graph/BasicBlock.d.ts.map +1 -1
- package/lib/core/graph/BasicBlock.js +132 -1
- package/lib/core/graph/Cfg.d.ts +30 -1
- package/lib/core/graph/Cfg.d.ts.map +1 -1
- package/lib/core/graph/Cfg.js +129 -6
- package/lib/core/graph/builder/ViewTreeBuilder.d.ts.map +1 -1
- package/lib/core/graph/builder/ViewTreeBuilder.js +3 -2
- package/lib/core/model/ArkBaseModel.d.ts +8 -0
- package/lib/core/model/ArkBaseModel.d.ts.map +1 -1
- package/lib/core/model/ArkBaseModel.js +56 -4
- package/lib/core/model/ArkClass.d.ts +36 -30
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +79 -40
- package/lib/core/model/ArkExport.d.ts +3 -0
- package/lib/core/model/ArkExport.d.ts.map +1 -1
- package/lib/core/model/ArkExport.js +11 -1
- package/lib/core/model/ArkField.d.ts +2 -0
- package/lib/core/model/ArkField.d.ts.map +1 -1
- package/lib/core/model/ArkField.js +4 -1
- package/lib/core/model/ArkFile.d.ts +4 -0
- package/lib/core/model/ArkFile.d.ts.map +1 -1
- package/lib/core/model/ArkFile.js +20 -0
- package/lib/core/model/ArkImport.d.ts +2 -0
- package/lib/core/model/ArkImport.d.ts.map +1 -1
- package/lib/core/model/ArkImport.js +3 -0
- package/lib/core/model/ArkMetadata.d.ts +20 -0
- package/lib/core/model/ArkMetadata.d.ts.map +1 -0
- package/lib/core/model/ArkMetadata.js +44 -0
- package/lib/core/model/ArkMethod.d.ts +156 -53
- package/lib/core/model/ArkMethod.d.ts.map +1 -1
- package/lib/core/model/ArkMethod.js +309 -54
- package/lib/core/model/ArkNamespace.d.ts +4 -0
- package/lib/core/model/ArkNamespace.d.ts.map +1 -1
- package/lib/core/model/ArkNamespace.js +13 -0
- package/lib/core/model/ArkSignature.d.ts +11 -5
- package/lib/core/model/ArkSignature.d.ts.map +1 -1
- package/lib/core/model/ArkSignature.js +38 -18
- package/lib/core/model/builder/ArkClassBuilder.d.ts +0 -1
- package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkClassBuilder.js +9 -34
- package/lib/core/model/builder/ArkExportBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkExportBuilder.js +6 -1
- package/lib/core/model/builder/ArkFieldBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkFieldBuilder.js +3 -0
- package/lib/core/model/builder/ArkFileBuilder.js +1 -1
- package/lib/core/model/builder/ArkImportBuilder.d.ts +2 -1
- package/lib/core/model/builder/ArkImportBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkImportBuilder.js +12 -5
- package/lib/core/model/builder/ArkMethodBuilder.d.ts +2 -1
- package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkMethodBuilder.js +87 -47
- package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkNamespaceBuilder.js +2 -0
- package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
- package/lib/core/model/builder/builderUtils.js +25 -2
- package/lib/save/source/SourceClass.d.ts.map +1 -1
- package/lib/save/source/SourceClass.js +4 -0
- package/lib/save/source/SourceField.d.ts.map +1 -1
- package/lib/save/source/SourceField.js +4 -0
- package/lib/save/source/SourceMethod.d.ts.map +1 -1
- package/lib/save/source/SourceMethod.js +7 -0
- package/lib/save/source/SourceModule.d.ts.map +1 -1
- package/lib/save/source/SourceModule.js +14 -9
- package/lib/save/source/SourceNamespace.d.ts.map +1 -1
- package/lib/save/source/SourceNamespace.js +4 -0
- package/lib/save/source/SourceStmt.d.ts.map +1 -1
- package/lib/save/source/SourceStmt.js +15 -3
- package/lib/save/source/SourceTransformer.d.ts +6 -0
- package/lib/save/source/SourceTransformer.d.ts.map +1 -1
- package/lib/save/source/SourceTransformer.js +72 -41
- package/lib/save/source/SourceUtils.d.ts.map +1 -1
- package/lib/save/source/SourceUtils.js +3 -2
- package/lib/transformer/StaticSingleAssignmentFormer.js +1 -1
- package/lib/utils/CfgStructualAnalysis.d.ts +1 -0
- package/lib/utils/CfgStructualAnalysis.d.ts.map +1 -1
- package/lib/utils/CfgStructualAnalysis.js +42 -8
- package/lib/utils/callGraphUtils.d.ts.map +1 -1
- package/lib/utils/callGraphUtils.js +7 -10
- package/lib/utils/crypto_utils.d.ts +6 -0
- package/lib/utils/crypto_utils.d.ts.map +1 -0
- package/lib/utils/crypto_utils.js +57 -0
- package/lib/utils/entryMethodUtils.js +23 -23
- package/lib/utils/getAllFiles.d.ts +1 -1
- package/lib/utils/getAllFiles.d.ts.map +1 -1
- package/lib/utils/getAllFiles.js +4 -5
- package/lib/utils/logger.js +2 -2
- package/package.json +3 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Stmt } from '../base/Stmt';
|
|
2
|
+
import { ArkError } from '../common/ArkError';
|
|
2
3
|
/**
|
|
3
4
|
* @category core/graph
|
|
4
5
|
* A `BasicBlock` is composed of:
|
|
@@ -21,6 +22,44 @@ export declare class BasicBlock {
|
|
|
21
22
|
*/
|
|
22
23
|
getStmts(): Stmt[];
|
|
23
24
|
addStmt(stmt: Stmt): void;
|
|
25
|
+
/**
|
|
26
|
+
* Adds the given stmt at the beginning of the basic block.
|
|
27
|
+
* @param stmt
|
|
28
|
+
*/
|
|
29
|
+
addHead(stmt: Stmt | Stmt[]): void;
|
|
30
|
+
/**
|
|
31
|
+
* Adds the given stmt at the end of the basic block.
|
|
32
|
+
* @param stmt
|
|
33
|
+
*/
|
|
34
|
+
addTail(stmt: Stmt | Stmt[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Inserts toInsert in the basic block after point.
|
|
37
|
+
* @param toInsert
|
|
38
|
+
* @param point
|
|
39
|
+
* @returns The number of successfully inserted statements
|
|
40
|
+
*/
|
|
41
|
+
insertAfter(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
42
|
+
/**
|
|
43
|
+
* Inserts toInsert in the basic block befor point.
|
|
44
|
+
* @param toInsert
|
|
45
|
+
* @param point
|
|
46
|
+
* @returns The number of successfully inserted statements
|
|
47
|
+
*/
|
|
48
|
+
insertBefore(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
49
|
+
/**
|
|
50
|
+
* Removes the given stmt from this basic block.
|
|
51
|
+
* @param stmt
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
remove(stmt: Stmt): void;
|
|
55
|
+
/**
|
|
56
|
+
* Removes the first stmt from this basic block.
|
|
57
|
+
*/
|
|
58
|
+
removeHead(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Removes the last stmt from this basic block.
|
|
61
|
+
*/
|
|
62
|
+
removeTail(): void;
|
|
24
63
|
getHead(): Stmt | null;
|
|
25
64
|
getTail(): Stmt | null;
|
|
26
65
|
/**
|
|
@@ -53,5 +92,7 @@ export declare class BasicBlock {
|
|
|
53
92
|
addStmtToFirst(stmt: Stmt): void;
|
|
54
93
|
addSuccessorBlock(block: BasicBlock): void;
|
|
55
94
|
toString(): string;
|
|
95
|
+
validate(): ArkError;
|
|
96
|
+
private insertPos;
|
|
56
97
|
}
|
|
57
98
|
//# sourceMappingURL=BasicBlock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasicBlock.d.ts","sourceRoot":"","sources":["../../../src/core/graph/BasicBlock.ts"],"names":[],"mappings":"AAeA,OAAO,
|
|
1
|
+
{"version":3,"file":"BasicBlock.d.ts","sourceRoot":"","sources":["../../../src/core/graph/BasicBlock.ts"],"names":[],"mappings":"AAeA,OAAO,EAA8D,IAAI,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAgB,MAAM,oBAAoB,CAAC;AAI5D;;;;;;;GAOG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,EAAE,CAAc;IACxB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAoB;;IAIpC,KAAK,IAAI,MAAM;IAIf,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B;;;OAGG;IACI,QAAQ,IAAI,IAAI,EAAE;IAIlB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIhC;;;OAGG;IACI,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAQzC;;;OAGG;IACI,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAQzC;;;;;OAKG;IACI,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM;IAQhE;;;;;OAKG;IACI,YAAY,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM;IAQjE;;;;OAIG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQ/B;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACI,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI,GAAG,IAAI;IAOtB,OAAO,IAAI,IAAI,GAAG,IAAI;IAQ7B;;;;;;;;;;;;;;;;;OAiBG;IACI,aAAa,IAAI,UAAU,EAAE;IAIpC;;;OAGG;IACI,eAAe,IAAI,UAAU,EAAE;IAI/B,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAI5C,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO;IAQ5D,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO;IAS1D,cAAc,CAAC,IAAI,EAAE,IAAI;IAKzB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAI1C,QAAQ,IAAI,MAAM;IAQlB,QAAQ,IAAI,QAAQ;IA4B3B,OAAO,CAAC,SAAS;CAQpB"}
|
|
@@ -13,8 +13,35 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
16
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
40
|
exports.BasicBlock = void 0;
|
|
41
|
+
const Stmt_1 = require("../base/Stmt");
|
|
42
|
+
const ArkError_1 = require("../common/ArkError");
|
|
43
|
+
const logger_1 = __importStar(require("../../utils/logger"));
|
|
44
|
+
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'BasicBlock');
|
|
18
45
|
/**
|
|
19
46
|
* @category core/graph
|
|
20
47
|
* A `BasicBlock` is composed of:
|
|
@@ -46,6 +73,80 @@ class BasicBlock {
|
|
|
46
73
|
addStmt(stmt) {
|
|
47
74
|
this.stmts.push(stmt);
|
|
48
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Adds the given stmt at the beginning of the basic block.
|
|
78
|
+
* @param stmt
|
|
79
|
+
*/
|
|
80
|
+
addHead(stmt) {
|
|
81
|
+
if (stmt instanceof Stmt_1.Stmt) {
|
|
82
|
+
this.stmts.unshift(stmt);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.stmts.unshift(...stmt);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Adds the given stmt at the end of the basic block.
|
|
90
|
+
* @param stmt
|
|
91
|
+
*/
|
|
92
|
+
addTail(stmt) {
|
|
93
|
+
if (stmt instanceof Stmt_1.Stmt) {
|
|
94
|
+
this.stmts.push(stmt);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.stmts.push(...stmt);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Inserts toInsert in the basic block after point.
|
|
102
|
+
* @param toInsert
|
|
103
|
+
* @param point
|
|
104
|
+
* @returns The number of successfully inserted statements
|
|
105
|
+
*/
|
|
106
|
+
insertAfter(toInsert, point) {
|
|
107
|
+
let index = this.stmts.indexOf(point);
|
|
108
|
+
if (index < 0) {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
return this.insertPos(index + 1, toInsert);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Inserts toInsert in the basic block befor point.
|
|
115
|
+
* @param toInsert
|
|
116
|
+
* @param point
|
|
117
|
+
* @returns The number of successfully inserted statements
|
|
118
|
+
*/
|
|
119
|
+
insertBefore(toInsert, point) {
|
|
120
|
+
let index = this.stmts.indexOf(point);
|
|
121
|
+
if (index < 0) {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
return this.insertPos(index, toInsert);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Removes the given stmt from this basic block.
|
|
128
|
+
* @param stmt
|
|
129
|
+
* @returns
|
|
130
|
+
*/
|
|
131
|
+
remove(stmt) {
|
|
132
|
+
let index = this.stmts.indexOf(stmt);
|
|
133
|
+
if (index < 0) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.stmts.splice(index, 1);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Removes the first stmt from this basic block.
|
|
140
|
+
*/
|
|
141
|
+
removeHead() {
|
|
142
|
+
this.stmts.splice(0, 1);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Removes the last stmt from this basic block.
|
|
146
|
+
*/
|
|
147
|
+
removeTail() {
|
|
148
|
+
this.stmts.splice(this.stmts.length - 1, 1);
|
|
149
|
+
}
|
|
49
150
|
getHead() {
|
|
50
151
|
if (this.stmts.length === 0) {
|
|
51
152
|
return null;
|
|
@@ -106,7 +207,7 @@ class BasicBlock {
|
|
|
106
207
|
}
|
|
107
208
|
// Temp just for SSA
|
|
108
209
|
addStmtToFirst(stmt) {
|
|
109
|
-
this.
|
|
210
|
+
this.addHead(stmt);
|
|
110
211
|
}
|
|
111
212
|
// Temp just for SSA
|
|
112
213
|
addSuccessorBlock(block) {
|
|
@@ -119,5 +220,35 @@ class BasicBlock {
|
|
|
119
220
|
}
|
|
120
221
|
return strs.join('');
|
|
121
222
|
}
|
|
223
|
+
validate() {
|
|
224
|
+
let branchStmts = [];
|
|
225
|
+
for (const stmt of this.stmts) {
|
|
226
|
+
if (stmt instanceof Stmt_1.ArkIfStmt ||
|
|
227
|
+
stmt instanceof Stmt_1.ArkReturnStmt ||
|
|
228
|
+
stmt instanceof Stmt_1.ArkReturnVoidStmt ||
|
|
229
|
+
stmt instanceof Stmt_1.ArkSwitchStmt) {
|
|
230
|
+
branchStmts.push(stmt);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (branchStmts.length > 1) {
|
|
234
|
+
let errMsg = `More than one branch or return stmts in the block: ${branchStmts.map((value) => value.toString()).join('\n')}`;
|
|
235
|
+
logger.error(errMsg);
|
|
236
|
+
return { errCode: ArkError_1.ArkErrorCode.BB_MORE_THAN_ONE_BRANCH_RET_STMT, errMsg: errMsg };
|
|
237
|
+
}
|
|
238
|
+
if (branchStmts.length === 1 && branchStmts[0] !== this.stmts[this.stmts.length - 1]) {
|
|
239
|
+
let errMsg = `${branchStmts[0].toString()} not at the end of block.`;
|
|
240
|
+
logger.error(errMsg);
|
|
241
|
+
return { errCode: ArkError_1.ArkErrorCode.BB_BRANCH_RET_STMT_NOT_AT_END, errMsg: errMsg };
|
|
242
|
+
}
|
|
243
|
+
return { errCode: ArkError_1.ArkErrorCode.OK };
|
|
244
|
+
}
|
|
245
|
+
insertPos(index, toInsert) {
|
|
246
|
+
if (toInsert instanceof Stmt_1.Stmt) {
|
|
247
|
+
this.stmts.splice(index, 0, toInsert);
|
|
248
|
+
return 1;
|
|
249
|
+
}
|
|
250
|
+
this.stmts.splice(index, 0, ...toInsert);
|
|
251
|
+
return toInsert.length;
|
|
252
|
+
}
|
|
122
253
|
}
|
|
123
254
|
exports.BasicBlock = BasicBlock;
|
package/lib/core/graph/Cfg.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DefUseChain } from '../base/DefUseChain';
|
|
2
2
|
import { Stmt } from '../base/Stmt';
|
|
3
|
+
import { ArkError } from '../common/ArkError';
|
|
3
4
|
import { ArkMethod } from '../model/ArkMethod';
|
|
4
5
|
import { BasicBlock } from './BasicBlock';
|
|
5
6
|
/**
|
|
@@ -13,7 +14,32 @@ export declare class Cfg {
|
|
|
13
14
|
private declaringMethod;
|
|
14
15
|
constructor();
|
|
15
16
|
getStmts(): Stmt[];
|
|
16
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Inserts toInsert in the basic block in CFG after point.
|
|
19
|
+
* @param toInsert
|
|
20
|
+
* @param point
|
|
21
|
+
* @returns The number of successfully inserted statements
|
|
22
|
+
*/
|
|
23
|
+
insertAfter(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
24
|
+
/**
|
|
25
|
+
* Inserts toInsert in the basic block in CFG befor point.
|
|
26
|
+
* @param toInsert
|
|
27
|
+
* @param point
|
|
28
|
+
* @returns The number of successfully inserted statements
|
|
29
|
+
*/
|
|
30
|
+
insertBefore(toInsert: Stmt | Stmt[], point: Stmt): number;
|
|
31
|
+
/**
|
|
32
|
+
* Removes the given stmt from the basic block in CFG.
|
|
33
|
+
* @param stmt
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
remove(stmt: Stmt): void;
|
|
37
|
+
/**
|
|
38
|
+
* Update stmtToBlock Map
|
|
39
|
+
* @param block
|
|
40
|
+
* @param changed
|
|
41
|
+
*/
|
|
42
|
+
updateStmt2BlockMap(block: BasicBlock, changed?: Stmt | Stmt[]): void;
|
|
17
43
|
addBlock(block: BasicBlock): void;
|
|
18
44
|
getBlocks(): Set<BasicBlock>;
|
|
19
45
|
getStartingBlock(): BasicBlock | undefined;
|
|
@@ -25,5 +51,8 @@ export declare class Cfg {
|
|
|
25
51
|
toString(): string;
|
|
26
52
|
buildDefUseStmt(): void;
|
|
27
53
|
buildDefUseChain(): void;
|
|
54
|
+
getUnreachableBlocks(): Set<BasicBlock>;
|
|
55
|
+
validate(): ArkError;
|
|
56
|
+
private dfsPostOrder;
|
|
28
57
|
}
|
|
29
58
|
//# sourceMappingURL=Cfg.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cfg.d.ts","sourceRoot":"","sources":["../../../src/core/graph/Cfg.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"Cfg.d.ts","sourceRoot":"","sources":["../../../src/core/graph/Cfg.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAgB,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C;;GAEG;AACH,qBAAa,GAAG;IACZ,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAA8B;;IAI9C,QAAQ,IAAI,IAAI,EAAE;IAQzB;;;;;OAKG;IACI,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM;IAUhE;;;;;OAKG;IACI,YAAY,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM;IAUjE;;;;OAIG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAS/B;;;;OAIG;IACI,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI;IAerE,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQjC,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC;IAI5B,gBAAgB,IAAI,UAAU,GAAG,SAAS;IAI1C,eAAe,IAAI,IAAI;IAIvB,eAAe,CAAC,eAAe,EAAE,IAAI,GAAG,IAAI;IAI5C,kBAAkB,IAAI,SAAS;IAI/B,kBAAkB,CAAC,MAAM,EAAE,SAAS;IAIpC,eAAe,IAAI,WAAW,EAAE;IAKhC,QAAQ,IAAI,MAAM;IAIlB,eAAe;IAiBf,gBAAgB;IA0DhB,oBAAoB,IAAI,GAAG,CAAC,UAAU,CAAC;IAevC,QAAQ,IAAI,QAAQ;IAoB3B,OAAO,CAAC,YAAY;CAevB"}
|
package/lib/core/graph/Cfg.js
CHANGED
|
@@ -13,11 +13,38 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
16
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
40
|
exports.Cfg = void 0;
|
|
18
41
|
const DefUseChain_1 = require("../base/DefUseChain");
|
|
19
42
|
const Local_1 = require("../base/Local");
|
|
43
|
+
const Stmt_1 = require("../base/Stmt");
|
|
44
|
+
const ArkError_1 = require("../common/ArkError");
|
|
20
45
|
const ArkMethod_1 = require("../model/ArkMethod");
|
|
46
|
+
const logger_1 = __importStar(require("../../utils/logger"));
|
|
47
|
+
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'BasicBlock');
|
|
21
48
|
/**
|
|
22
49
|
* @category core/graph
|
|
23
50
|
*/
|
|
@@ -35,12 +62,66 @@ class Cfg {
|
|
|
35
62
|
}
|
|
36
63
|
return stmts;
|
|
37
64
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Inserts toInsert in the basic block in CFG after point.
|
|
67
|
+
* @param toInsert
|
|
68
|
+
* @param point
|
|
69
|
+
* @returns The number of successfully inserted statements
|
|
70
|
+
*/
|
|
71
|
+
insertAfter(toInsert, point) {
|
|
72
|
+
const block = this.stmtToBlock.get(point);
|
|
73
|
+
if (!block) {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
this.updateStmt2BlockMap(block, toInsert);
|
|
77
|
+
return block.insertAfter(toInsert, point);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Inserts toInsert in the basic block in CFG befor point.
|
|
81
|
+
* @param toInsert
|
|
82
|
+
* @param point
|
|
83
|
+
* @returns The number of successfully inserted statements
|
|
84
|
+
*/
|
|
85
|
+
insertBefore(toInsert, point) {
|
|
86
|
+
const block = this.stmtToBlock.get(point);
|
|
87
|
+
if (!block) {
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
this.updateStmt2BlockMap(block, toInsert);
|
|
91
|
+
return block.insertBefore(toInsert, point);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Removes the given stmt from the basic block in CFG.
|
|
95
|
+
* @param stmt
|
|
96
|
+
* @returns
|
|
97
|
+
*/
|
|
98
|
+
remove(stmt) {
|
|
99
|
+
const block = this.stmtToBlock.get(stmt);
|
|
100
|
+
if (!block) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.stmtToBlock.delete(stmt);
|
|
104
|
+
block.remove(stmt);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Update stmtToBlock Map
|
|
108
|
+
* @param block
|
|
109
|
+
* @param changed
|
|
110
|
+
*/
|
|
111
|
+
updateStmt2BlockMap(block, changed) {
|
|
112
|
+
if (!changed) {
|
|
113
|
+
for (const stmt of block.getStmts()) {
|
|
114
|
+
this.stmtToBlock.set(stmt, block);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (changed instanceof Stmt_1.Stmt) {
|
|
118
|
+
this.stmtToBlock.set(changed, block);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
for (const insert of changed) {
|
|
122
|
+
this.stmtToBlock.set(insert, block);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
44
125
|
}
|
|
45
126
|
// TODO: 添加block之间的边
|
|
46
127
|
addBlock(block) {
|
|
@@ -147,5 +228,47 @@ class Cfg {
|
|
|
147
228
|
}
|
|
148
229
|
}
|
|
149
230
|
}
|
|
231
|
+
getUnreachableBlocks() {
|
|
232
|
+
let unreachable = new Set();
|
|
233
|
+
let startBB = this.getStartingBlock();
|
|
234
|
+
if (!startBB) {
|
|
235
|
+
return unreachable;
|
|
236
|
+
}
|
|
237
|
+
let postOrder = this.dfsPostOrder(startBB);
|
|
238
|
+
for (const bb of this.blocks) {
|
|
239
|
+
if (!postOrder.has(bb)) {
|
|
240
|
+
unreachable.add(bb);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return unreachable;
|
|
244
|
+
}
|
|
245
|
+
validate() {
|
|
246
|
+
let startBB = this.getStartingBlock();
|
|
247
|
+
if (!startBB) {
|
|
248
|
+
let errMsg = `Not found starting block}`;
|
|
249
|
+
logger.error(errMsg);
|
|
250
|
+
return { errCode: ArkError_1.ArkErrorCode.CFG_NOT_FOUND_START_BLOCK, errMsg: errMsg };
|
|
251
|
+
}
|
|
252
|
+
let unreachable = this.getUnreachableBlocks();
|
|
253
|
+
if (unreachable.size !== 0) {
|
|
254
|
+
let errMsg = `Unreachable blocks: ${Array.from(unreachable)
|
|
255
|
+
.map((value) => value.toString())
|
|
256
|
+
.join('\n')}`;
|
|
257
|
+
logger.error(errMsg);
|
|
258
|
+
return { errCode: ArkError_1.ArkErrorCode.CFG_HAS_UNREACHABLE_BLOCK, errMsg: errMsg };
|
|
259
|
+
}
|
|
260
|
+
return { errCode: ArkError_1.ArkErrorCode.OK };
|
|
261
|
+
}
|
|
262
|
+
dfsPostOrder(node, visitor = new Set(), postOrder = new Set()) {
|
|
263
|
+
visitor.add(node);
|
|
264
|
+
for (const succ of node.getSuccessors()) {
|
|
265
|
+
if (visitor.has(succ)) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
this.dfsPostOrder(succ, visitor, postOrder);
|
|
269
|
+
}
|
|
270
|
+
postOrder.add(node);
|
|
271
|
+
return postOrder;
|
|
272
|
+
}
|
|
150
273
|
}
|
|
151
274
|
exports.Cfg = Cfg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewTreeBuilder.d.ts","sourceRoot":"","sources":["../../../../src/core/graph/builder/ViewTreeBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAUjD,OAAO,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAgC,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAA2B,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAiBhE,OAAO,EAAE,QAAQ,EAAiB,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ViewTreeBuilder.d.ts","sourceRoot":"","sources":["../../../../src/core/graph/builder/ViewTreeBuilder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAUjD,OAAO,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAgC,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAA2B,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAiBhE,OAAO,EAAE,QAAQ,EAAiB,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAG3E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmLrD,cAAM,gBAAiB,YAAW,YAAY;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,eAAe,GAAG,mBAAmB,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,eAAe,GAAG,mBAAmB,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;IAC9D,SAAS,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;IACzD,mBAAmB,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC;IACtE,YAAY,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACpC,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACtC,OAAO,CAAC,IAAI,CAAmB;gBAEnB,IAAI,EAAE,MAAM;IAUxB;;;OAGG;IACI,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACI,cAAc,IAAI,OAAO;IAIhC;;;OAGG;IACI,iBAAiB,IAAI,OAAO;IAInC;;;;;;OAMG;IACI,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,EAAE,OAAO,GAAE,GAAG,CAAC,YAAY,CAAa,GAAG,OAAO;WAiBzF,qBAAqB,IAAI,gBAAgB;WAMzC,iBAAiB,IAAI,gBAAgB;WAMrC,sBAAsB,IAAI,gBAAgB;IAMjD,8BAA8B,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI;IAiBxD,eAAe,IAAI,OAAO;IAM1B,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,GAAE,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAa,GAAG,gBAAgB;IAwB3G,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAOpD,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,aAAa;IA4Bd,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;CAShE;AAED,cAAM,aAAa;IACf,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC/C,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC;;IAMpC;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,gBAAgB;IAWlC;;OAEG;IACI,GAAG;IAIV;;OAEG;IACI,GAAG,IAAI,gBAAgB,GAAG,IAAI;IAIrC;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW9C;;OAEG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAWtD,OAAO,CAAC,SAAS;IAYjB,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG/C;AAED,qBAAa,YAAa,SAAQ,aAAc,YAAW,QAAQ;IAC/D,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,UAAU,CAAgC;IAElD;;OAEG;gBACS,MAAM,EAAE,SAAS;IAQ7B;;;OAGG;IACI,OAAO,IAAI,YAAY,GAAG,IAAI;IAKrC;;;OAGG;IACI,cAAc,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAKzD;;OAEG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS;IAIpE;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;IAQxD;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACI,oBAAoB,IAAI,QAAQ;IAIvC;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiC9B,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,6BAA6B;IA4BrC,OAAO,CAAC,sBAAsB;IA4D9B,OAAO,CAAC,2BAA2B;IAmDnC,OAAO,CAAC,uBAAuB;IA0B/B,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,wBAAwB,CAU7B;IAEH,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,qBAAqB;IAkC7B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAgD/B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,oBAAoB;CAmB/B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAEzD"}
|
|
@@ -49,6 +49,7 @@ const EtsConst_1 = require("../../common/EtsConst");
|
|
|
49
49
|
const ArkClass_1 = require("../../model/ArkClass");
|
|
50
50
|
const logger_1 = __importStar(require("../../../utils/logger"));
|
|
51
51
|
const ModelUtils_1 = require("../../common/ModelUtils");
|
|
52
|
+
const Const_1 = require("../../common/Const");
|
|
52
53
|
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'ViewTreeBuilder');
|
|
53
54
|
const COMPONENT_CREATE_FUNCTIONS = new Set([EtsConst_1.COMPONENT_CREATE_FUNCTION, EtsConst_1.COMPONENT_BRANCH_FUNCTION]);
|
|
54
55
|
function backtraceLocalInitValue(value) {
|
|
@@ -58,7 +59,7 @@ function backtraceLocalInitValue(value) {
|
|
|
58
59
|
if (rightOp instanceof Local_1.Local) {
|
|
59
60
|
return backtraceLocalInitValue(rightOp);
|
|
60
61
|
}
|
|
61
|
-
else if (rightOp instanceof Ref_1.ArkInstanceFieldRef && rightOp.getBase().getName().startsWith(
|
|
62
|
+
else if (rightOp instanceof Ref_1.ArkInstanceFieldRef && rightOp.getBase().getName().startsWith(Const_1.TEMP_LOCAL_PREFIX)) {
|
|
62
63
|
return backtraceLocalInitValue(rightOp.getBase());
|
|
63
64
|
}
|
|
64
65
|
return rightOp;
|
|
@@ -970,7 +971,7 @@ class ViewTreeImpl extends TreeNodeStack {
|
|
|
970
971
|
return component;
|
|
971
972
|
}
|
|
972
973
|
let name = expr.getBase().getName();
|
|
973
|
-
if (name.startsWith(
|
|
974
|
+
if (name.startsWith(Const_1.TEMP_LOCAL_PREFIX)) {
|
|
974
975
|
let initValue = backtraceLocalInitValue(expr.getBase());
|
|
975
976
|
if (initValue instanceof Ref_1.ArkThisRef) {
|
|
976
977
|
name = 'this';
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import ts from 'ohos-typescript';
|
|
2
2
|
import { Decorator } from '../base/Decorator';
|
|
3
|
+
import { ArkError } from '../common/ArkError';
|
|
4
|
+
import { ArkMetadata, ArkMetadataKind, ArkMetadataType } from './ArkMetadata';
|
|
3
5
|
export declare enum ModifierType {
|
|
4
6
|
PRIVATE = 1,
|
|
5
7
|
PROTECTED = 2,
|
|
@@ -17,11 +19,15 @@ export declare enum ModifierType {
|
|
|
17
19
|
OVERRIDE = 8192,
|
|
18
20
|
DECLARE = 16384
|
|
19
21
|
}
|
|
22
|
+
export declare const MODIFIER_TYPE_MASK = 65535;
|
|
20
23
|
export declare function modifierKind2Enum(kind: ts.SyntaxKind): ModifierType;
|
|
21
24
|
export declare function modifiers2stringArray(modifiers: number): string[];
|
|
22
25
|
export declare abstract class ArkBaseModel {
|
|
23
26
|
protected modifiers?: number;
|
|
24
27
|
protected decorators?: Set<Decorator>;
|
|
28
|
+
protected metadata?: ArkMetadata;
|
|
29
|
+
getMetadata(kind: ArkMetadataKind): ArkMetadataType | undefined;
|
|
30
|
+
setMetadata(kind: ArkMetadataKind, value: ArkMetadataType): void;
|
|
25
31
|
getModifiers(): number;
|
|
26
32
|
setModifiers(modifiers: number): void;
|
|
27
33
|
addModifier(modifier: ModifierType | number): void;
|
|
@@ -47,5 +53,7 @@ export declare abstract class ArkBaseModel {
|
|
|
47
53
|
hasEntryDecorator(): boolean;
|
|
48
54
|
hasComponentDecorator(): boolean;
|
|
49
55
|
hasDecorator(kind: string | Set<string>): boolean;
|
|
56
|
+
protected validateFields(fields: string[]): ArkError;
|
|
57
|
+
abstract validate(): ArkError;
|
|
50
58
|
}
|
|
51
59
|
//# sourceMappingURL=ArkBaseModel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArkBaseModel.d.ts","sourceRoot":"","sources":["../../../src/core/model/ArkBaseModel.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ArkBaseModel.d.ts","sourceRoot":"","sources":["../../../src/core/model/ArkBaseModel.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAgB,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAqB9E,oBAAY,YAAY;IACpB,OAAO,IAAI;IACX,SAAS,IAAS;IAClB,MAAM,IAAS;IACf,MAAM,IAAS;IACf,MAAM,KAAS;IACf,QAAQ,KAAS;IACjB,KAAK,KAAS;IACd,KAAK,MAAS;IACd,QAAQ,MAAS;IACjB,OAAO,MAAS;IAChB,EAAE,OAAU;IACZ,QAAQ,OAAU;IAClB,GAAG,OAAU;IACb,QAAQ,OAAU;IAClB,OAAO,QAAU;CACpB;AAED,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAsCzC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,YAAY,CAEnE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CASjE;AAED,8BAAsB,YAAY;IAC9B,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAE1B,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,SAAS;IAI/D,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI;IAOhE,YAAY,IAAI,MAAM;IAOtB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMrC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI;IAIlD,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAO5C,QAAQ,IAAI,OAAO;IAInB,WAAW,IAAI,OAAO;IAItB,SAAS,IAAI,OAAO;IAIpB,QAAQ,IAAI,OAAO;IAInB,UAAU,IAAI,OAAO;IAIrB,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,OAAO;IAI1B,gDAAgD;IACzC,UAAU,IAAI,OAAO;IAIrB,SAAS,IAAI,OAAO;IAIpB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO;IAQrD,aAAa,IAAI,SAAS,EAAE;IAO5B,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI;IAM/C,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOxC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC,mBAAmB,IAAI,OAAO;IAI9B,kBAAkB,IAAI,SAAS,EAAE;IASjC,wBAAwB,IAAI,OAAO;IAInC,iBAAiB,IAAI,OAAO;IAI5B,qBAAqB,IAAI,OAAO;IAIhC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO;IAYxD,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ;aAepC,QAAQ,IAAI,QAAQ;CACvC"}
|
|
@@ -13,13 +13,40 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
16
39
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
40
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
41
|
};
|
|
19
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.ArkBaseModel = exports.modifiers2stringArray = exports.modifierKind2Enum = exports.ModifierType = void 0;
|
|
43
|
+
exports.ArkBaseModel = exports.modifiers2stringArray = exports.modifierKind2Enum = exports.MODIFIER_TYPE_MASK = exports.ModifierType = void 0;
|
|
21
44
|
const ohos_typescript_1 = __importDefault(require("ohos-typescript"));
|
|
22
45
|
const EtsConst_1 = require("../common/EtsConst");
|
|
46
|
+
const ArkError_1 = require("../common/ArkError");
|
|
47
|
+
const logger_1 = __importStar(require("../../utils/logger"));
|
|
48
|
+
const ArkMetadata_1 = require("./ArkMetadata");
|
|
49
|
+
const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'ArkBaseModel');
|
|
23
50
|
const COMPONENT_MEMBER_DECORATORS = new Set([
|
|
24
51
|
'State',
|
|
25
52
|
'Prop',
|
|
@@ -54,8 +81,8 @@ var ModifierType;
|
|
|
54
81
|
ModifierType[ModifierType["OUT"] = 4096] = "OUT";
|
|
55
82
|
ModifierType[ModifierType["OVERRIDE"] = 8192] = "OVERRIDE";
|
|
56
83
|
ModifierType[ModifierType["DECLARE"] = 16384] = "DECLARE";
|
|
57
|
-
})(ModifierType
|
|
58
|
-
|
|
84
|
+
})(ModifierType = exports.ModifierType || (exports.ModifierType = {}));
|
|
85
|
+
exports.MODIFIER_TYPE_MASK = 0xffff;
|
|
59
86
|
const MODIFIER_TYPE_STRINGS = [
|
|
60
87
|
'private',
|
|
61
88
|
'protected',
|
|
@@ -106,6 +133,17 @@ function modifiers2stringArray(modifiers) {
|
|
|
106
133
|
}
|
|
107
134
|
exports.modifiers2stringArray = modifiers2stringArray;
|
|
108
135
|
class ArkBaseModel {
|
|
136
|
+
getMetadata(kind) {
|
|
137
|
+
var _a;
|
|
138
|
+
return (_a = this.metadata) === null || _a === void 0 ? void 0 : _a.getMetadata(kind);
|
|
139
|
+
}
|
|
140
|
+
setMetadata(kind, value) {
|
|
141
|
+
var _a;
|
|
142
|
+
if (!this.metadata) {
|
|
143
|
+
this.metadata = new ArkMetadata_1.ArkMetadata();
|
|
144
|
+
}
|
|
145
|
+
return (_a = this.metadata) === null || _a === void 0 ? void 0 : _a.setMetadata(kind, value);
|
|
146
|
+
}
|
|
109
147
|
getModifiers() {
|
|
110
148
|
if (!this.modifiers) {
|
|
111
149
|
return 0;
|
|
@@ -124,7 +162,7 @@ class ArkBaseModel {
|
|
|
124
162
|
if (!this.modifiers) {
|
|
125
163
|
return;
|
|
126
164
|
}
|
|
127
|
-
this.modifiers &= MODIFIER_TYPE_MASK ^ modifier;
|
|
165
|
+
this.modifiers &= exports.MODIFIER_TYPE_MASK ^ modifier;
|
|
128
166
|
}
|
|
129
167
|
isStatic() {
|
|
130
168
|
return this.containsModifier(ModifierType.STATIC);
|
|
@@ -215,5 +253,19 @@ class ArkBaseModel {
|
|
|
215
253
|
return value.getKind() === kind;
|
|
216
254
|
}).length !== 0);
|
|
217
255
|
}
|
|
256
|
+
validateFields(fields) {
|
|
257
|
+
let errs = [];
|
|
258
|
+
for (const field of fields) {
|
|
259
|
+
let value = Reflect.get(this, field);
|
|
260
|
+
if (!value) {
|
|
261
|
+
errs.push(field);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (errs.length === 0) {
|
|
265
|
+
return { errCode: ArkError_1.ArkErrorCode.OK };
|
|
266
|
+
}
|
|
267
|
+
logger.error(`class fields: ${errs.join(',')} is undefined.`);
|
|
268
|
+
return { errCode: ArkError_1.ArkErrorCode.CLASS_INSTANCE_FIELD_UNDEFINDED, errMsg: `${errs.join(',')} is undefined.` };
|
|
269
|
+
}
|
|
218
270
|
}
|
|
219
271
|
exports.ArkBaseModel = ArkBaseModel;
|