arkanalyzer 1.0.19 → 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.
Files changed (290) hide show
  1. package/lib/Config.d.ts +70 -70
  2. package/lib/Config.js +198 -198
  3. package/lib/Scene.d.ts +316 -310
  4. package/lib/Scene.d.ts.map +1 -1
  5. package/lib/Scene.js +1316 -1271
  6. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +28 -28
  7. package/lib/callgraph/algorithm/AbstractAnalysis.js +144 -144
  8. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +10 -10
  9. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +69 -69
  10. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +15 -15
  11. package/lib/callgraph/algorithm/RapidTypeAnalysis.js +146 -146
  12. package/lib/callgraph/common/Statistics.d.ts +57 -57
  13. package/lib/callgraph/common/Statistics.js +228 -228
  14. package/lib/callgraph/model/CallGraph.d.ts +96 -96
  15. package/lib/callgraph/model/CallGraph.js +354 -354
  16. package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +15 -15
  17. package/lib/callgraph/model/builder/CallGraphBuilder.js +106 -106
  18. package/lib/callgraph/pointerAnalysis/Context.d.ts +37 -37
  19. package/lib/callgraph/pointerAnalysis/Context.js +155 -155
  20. package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts +22 -22
  21. package/lib/callgraph/pointerAnalysis/DummyCallCreator.js +104 -104
  22. package/lib/callgraph/pointerAnalysis/PTAUtils.d.ts +5 -5
  23. package/lib/callgraph/pointerAnalysis/PTAUtils.js +46 -46
  24. package/lib/callgraph/pointerAnalysis/Pag.d.ts +261 -261
  25. package/lib/callgraph/pointerAnalysis/Pag.js +930 -930
  26. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +157 -157
  27. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
  28. package/lib/callgraph/pointerAnalysis/PagBuilder.js +1399 -1397
  29. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +72 -72
  30. package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +573 -573
  31. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +15 -15
  32. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +81 -81
  33. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +80 -80
  34. package/lib/callgraph/pointerAnalysis/PtsDS.js +308 -308
  35. package/lib/core/base/Constant.d.ts +48 -48
  36. package/lib/core/base/Constant.js +103 -103
  37. package/lib/core/base/Decorator.d.ts +15 -15
  38. package/lib/core/base/Decorator.js +46 -46
  39. package/lib/core/base/DefUseChain.d.ts +8 -8
  40. package/lib/core/base/DefUseChain.js +25 -25
  41. package/lib/core/base/Expr.d.ts +340 -340
  42. package/lib/core/base/Expr.js +917 -917
  43. package/lib/core/base/Local.d.ts +104 -104
  44. package/lib/core/base/Local.js +176 -176
  45. package/lib/core/base/Position.d.ts +30 -30
  46. package/lib/core/base/Position.js +147 -147
  47. package/lib/core/base/Ref.d.ts +173 -173
  48. package/lib/core/base/Ref.js +374 -374
  49. package/lib/core/base/Stmt.d.ts +237 -237
  50. package/lib/core/base/Stmt.js +525 -525
  51. package/lib/core/base/Trap.d.ts +8 -8
  52. package/lib/core/base/Trap.js +30 -30
  53. package/lib/core/base/Type.d.ts +308 -308
  54. package/lib/core/base/Type.js +639 -639
  55. package/lib/core/base/TypeExpr.d.ts +71 -71
  56. package/lib/core/base/TypeExpr.js +155 -155
  57. package/lib/core/base/Value.d.ts +32 -32
  58. package/lib/core/base/Value.js +16 -16
  59. package/lib/core/common/ArkError.d.ts +14 -14
  60. package/lib/core/common/ArkError.js +28 -28
  61. package/lib/core/common/ArkIRTransformer.d.ts +67 -67
  62. package/lib/core/common/ArkIRTransformer.js +690 -690
  63. package/lib/core/common/ArkValueTransformer.d.ts +89 -89
  64. package/lib/core/common/ArkValueTransformer.js +1478 -1478
  65. package/lib/core/common/Builtin.d.ts +36 -36
  66. package/lib/core/common/Builtin.js +81 -81
  67. package/lib/core/common/Const.d.ts +21 -21
  68. package/lib/core/common/Const.js +43 -43
  69. package/lib/core/common/DummyMainCreater.d.ts +46 -42
  70. package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
  71. package/lib/core/common/DummyMainCreater.js +319 -300
  72. package/lib/core/common/EtsConst.d.ts +73 -73
  73. package/lib/core/common/EtsConst.js +1021 -1021
  74. package/lib/core/common/ExprUseReplacer.d.ts +21 -21
  75. package/lib/core/common/ExprUseReplacer.js +124 -124
  76. package/lib/core/common/IRInference.d.ts +36 -36
  77. package/lib/core/common/IRInference.d.ts.map +1 -1
  78. package/lib/core/common/IRInference.js +651 -648
  79. package/lib/core/common/IRUtils.d.ts +18 -18
  80. package/lib/core/common/IRUtils.js +141 -141
  81. package/lib/core/common/ModelUtils.d.ts +70 -70
  82. package/lib/core/common/ModelUtils.js +712 -712
  83. package/lib/core/common/RefUseReplacer.d.ts +13 -13
  84. package/lib/core/common/RefUseReplacer.js +52 -52
  85. package/lib/core/common/SdkUtils.d.ts +8 -8
  86. package/lib/core/common/SdkUtils.js +105 -105
  87. package/lib/core/common/StmtDefReplacer.d.ts +12 -12
  88. package/lib/core/common/StmtDefReplacer.js +41 -41
  89. package/lib/core/common/StmtUseReplacer.d.ts +16 -16
  90. package/lib/core/common/StmtUseReplacer.js +108 -108
  91. package/lib/core/common/TSConst.d.ts +18 -18
  92. package/lib/core/common/TSConst.js +36 -36
  93. package/lib/core/common/TypeInference.d.ts +102 -102
  94. package/lib/core/common/TypeInference.js +748 -748
  95. package/lib/core/common/ValueUtil.d.ts +12 -12
  96. package/lib/core/common/ValueUtil.js +54 -54
  97. package/lib/core/common/VisibleValue.d.ts +36 -36
  98. package/lib/core/common/VisibleValue.js +212 -212
  99. package/lib/core/dataflow/DataflowProblem.d.ts +20 -20
  100. package/lib/core/dataflow/DataflowProblem.js +20 -20
  101. package/lib/core/dataflow/DataflowResult.d.ts +7 -7
  102. package/lib/core/dataflow/DataflowResult.js +26 -26
  103. package/lib/core/dataflow/DataflowSolver.d.ts +43 -43
  104. package/lib/core/dataflow/DataflowSolver.js +307 -307
  105. package/lib/core/dataflow/Edge.d.ts +11 -11
  106. package/lib/core/dataflow/Edge.js +31 -31
  107. package/lib/core/dataflow/Fact.d.ts +6 -6
  108. package/lib/core/dataflow/Fact.js +24 -24
  109. package/lib/core/dataflow/GenericDataFlow.d.ts +143 -0
  110. package/lib/core/dataflow/GenericDataFlow.d.ts.map +1 -0
  111. package/lib/core/dataflow/GenericDataFlow.js +109 -0
  112. package/lib/core/dataflow/ReachingDef.d.ts +63 -0
  113. package/lib/core/dataflow/ReachingDef.d.ts.map +1 -0
  114. package/lib/core/dataflow/ReachingDef.js +168 -0
  115. package/lib/core/dataflow/UndefinedVariable.d.ts +45 -45
  116. package/lib/core/dataflow/UndefinedVariable.js +288 -288
  117. package/lib/core/dataflow/Util.d.ts +9 -9
  118. package/lib/core/dataflow/Util.js +64 -64
  119. package/lib/core/graph/BaseExplicitGraph.d.ts +58 -63
  120. package/lib/core/graph/BaseExplicitGraph.d.ts.map +1 -1
  121. package/lib/core/graph/BaseExplicitGraph.js +157 -157
  122. package/lib/core/graph/BaseImplicitGraph.d.ts +78 -0
  123. package/lib/core/graph/BaseImplicitGraph.d.ts.map +1 -0
  124. package/lib/core/graph/BaseImplicitGraph.js +78 -0
  125. package/lib/core/graph/BasicBlock.d.ts +104 -104
  126. package/lib/core/graph/BasicBlock.js +280 -280
  127. package/lib/core/graph/Cfg.d.ts +59 -59
  128. package/lib/core/graph/Cfg.js +282 -282
  129. package/lib/core/graph/DependsGraph.d.ts +35 -35
  130. package/lib/core/graph/DependsGraph.js +87 -87
  131. package/lib/core/graph/DominanceFinder.d.ts +15 -15
  132. package/lib/core/graph/DominanceFinder.js +121 -121
  133. package/lib/core/graph/DominanceTree.d.ts +12 -12
  134. package/lib/core/graph/DominanceTree.js +70 -70
  135. package/lib/core/graph/GraphTraits.d.ts +8 -0
  136. package/lib/core/graph/GraphTraits.d.ts.map +1 -0
  137. package/lib/core/graph/GraphTraits.js +16 -0
  138. package/lib/core/graph/Scc.d.ts +61 -60
  139. package/lib/core/graph/Scc.d.ts.map +1 -1
  140. package/lib/core/graph/Scc.js +222 -222
  141. package/lib/core/graph/ViewTree.d.ts +114 -114
  142. package/lib/core/graph/ViewTree.js +16 -16
  143. package/lib/core/graph/builder/CfgBuilder.d.ts +176 -176
  144. package/lib/core/graph/builder/CfgBuilder.js +1139 -1139
  145. package/lib/core/graph/builder/ConditionBuilder.d.ts +15 -15
  146. package/lib/core/graph/builder/ConditionBuilder.js +252 -252
  147. package/lib/core/graph/builder/LoopBuilder.d.ts +20 -20
  148. package/lib/core/graph/builder/LoopBuilder.js +251 -251
  149. package/lib/core/graph/builder/SwitchBuilder.d.ts +11 -11
  150. package/lib/core/graph/builder/SwitchBuilder.js +152 -152
  151. package/lib/core/graph/builder/TrapBuilder.d.ts +16 -16
  152. package/lib/core/graph/builder/TrapBuilder.js +272 -272
  153. package/lib/core/graph/builder/ViewTreeBuilder.d.ts +203 -203
  154. package/lib/core/graph/builder/ViewTreeBuilder.js +1055 -1055
  155. package/lib/core/model/ArkBaseModel.d.ts +59 -59
  156. package/lib/core/model/ArkBaseModel.js +274 -274
  157. package/lib/core/model/ArkBody.d.ts +24 -24
  158. package/lib/core/model/ArkBody.js +65 -65
  159. package/lib/core/model/ArkClass.d.ts +206 -206
  160. package/lib/core/model/ArkClass.js +439 -439
  161. package/lib/core/model/ArkExport.d.ts +72 -72
  162. package/lib/core/model/ArkExport.js +147 -147
  163. package/lib/core/model/ArkField.d.ts +62 -62
  164. package/lib/core/model/ArkField.js +113 -113
  165. package/lib/core/model/ArkFile.d.ts +131 -131
  166. package/lib/core/model/ArkFile.js +267 -267
  167. package/lib/core/model/ArkImport.d.ts +44 -44
  168. package/lib/core/model/ArkImport.js +108 -108
  169. package/lib/core/model/ArkMetadata.d.ts +31 -31
  170. package/lib/core/model/ArkMetadata.js +55 -55
  171. package/lib/core/model/ArkMethod.d.ts +261 -261
  172. package/lib/core/model/ArkMethod.js +592 -592
  173. package/lib/core/model/ArkNamespace.d.ts +66 -66
  174. package/lib/core/model/ArkNamespace.js +209 -209
  175. package/lib/core/model/ArkSignature.d.ts +162 -162
  176. package/lib/core/model/ArkSignature.js +379 -379
  177. package/lib/core/model/builder/ArkClassBuilder.d.ts +12 -12
  178. package/lib/core/model/builder/ArkClassBuilder.js +454 -454
  179. package/lib/core/model/builder/ArkExportBuilder.d.ts +24 -24
  180. package/lib/core/model/builder/ArkExportBuilder.js +210 -210
  181. package/lib/core/model/builder/ArkFieldBuilder.d.ts +8 -8
  182. package/lib/core/model/builder/ArkFieldBuilder.js +193 -193
  183. package/lib/core/model/builder/ArkFileBuilder.d.ts +9 -9
  184. package/lib/core/model/builder/ArkFileBuilder.js +165 -165
  185. package/lib/core/model/builder/ArkImportBuilder.d.ts +4 -4
  186. package/lib/core/model/builder/ArkImportBuilder.js +128 -128
  187. package/lib/core/model/builder/ArkMethodBuilder.d.ts +63 -63
  188. package/lib/core/model/builder/ArkMethodBuilder.js +486 -486
  189. package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +5 -5
  190. package/lib/core/model/builder/ArkNamespaceBuilder.js +205 -205
  191. package/lib/core/model/builder/ArkSignatureBuilder.d.ts +8 -8
  192. package/lib/core/model/builder/ArkSignatureBuilder.js +40 -40
  193. package/lib/core/model/builder/BodyBuilder.d.ts +55 -30
  194. package/lib/core/model/builder/BodyBuilder.d.ts.map +1 -1
  195. package/lib/core/model/builder/BodyBuilder.js +542 -371
  196. package/lib/core/model/builder/builderUtils.d.ts +18 -18
  197. package/lib/core/model/builder/builderUtils.js +558 -558
  198. package/lib/index.d.ts +82 -80
  199. package/lib/index.d.ts.map +1 -1
  200. package/lib/index.js +201 -196
  201. package/lib/save/ArkStream.d.ts +23 -23
  202. package/lib/save/ArkStream.js +83 -83
  203. package/lib/save/DotPrinter.d.ts +43 -43
  204. package/lib/save/DotPrinter.js +170 -170
  205. package/lib/save/GraphPrinter.d.ts +16 -15
  206. package/lib/save/GraphPrinter.d.ts.map +1 -1
  207. package/lib/save/GraphPrinter.js +134 -134
  208. package/lib/save/JsonPrinter.d.ts +30 -30
  209. package/lib/save/JsonPrinter.js +580 -580
  210. package/lib/save/Printer.d.ts +12 -12
  211. package/lib/save/Printer.js +27 -27
  212. package/lib/save/PrinterBuilder.d.ts +53 -53
  213. package/lib/save/PrinterBuilder.js +145 -145
  214. package/lib/save/ViewTreePrinter.d.ts +14 -14
  215. package/lib/save/ViewTreePrinter.js +123 -123
  216. package/lib/save/arkir/ArkIRClassPrinter.d.ts +13 -13
  217. package/lib/save/arkir/ArkIRClassPrinter.js +92 -92
  218. package/lib/save/arkir/ArkIRFieldPrinter.d.ts +11 -11
  219. package/lib/save/arkir/ArkIRFieldPrinter.js +64 -64
  220. package/lib/save/arkir/ArkIRFilePrinter.d.ts +12 -12
  221. package/lib/save/arkir/ArkIRFilePrinter.js +54 -54
  222. package/lib/save/arkir/ArkIRMethodPrinter.d.ts +16 -16
  223. package/lib/save/arkir/ArkIRMethodPrinter.js +159 -159
  224. package/lib/save/arkir/ArkIRNamespacePrinter.d.ts +11 -11
  225. package/lib/save/arkir/ArkIRNamespacePrinter.js +66 -66
  226. package/lib/save/base/BasePrinter.d.ts +23 -23
  227. package/lib/save/base/BasePrinter.js +70 -70
  228. package/lib/save/base/ExportPrinter.d.ts +8 -8
  229. package/lib/save/base/ExportPrinter.js +67 -67
  230. package/lib/save/base/ImportPrinter.d.ts +9 -9
  231. package/lib/save/base/ImportPrinter.js +92 -92
  232. package/lib/save/base/PrinterUtils.d.ts +24 -24
  233. package/lib/save/base/PrinterUtils.js +208 -208
  234. package/lib/save/serializeArkIR.d.ts +8 -8
  235. package/lib/save/serializeArkIR.js +294 -294
  236. package/lib/save/source/SourceBase.d.ts +22 -22
  237. package/lib/save/source/SourceBase.js +64 -64
  238. package/lib/save/source/SourceBody.d.ts +58 -58
  239. package/lib/save/source/SourceBody.js +296 -296
  240. package/lib/save/source/SourceClass.d.ts +25 -25
  241. package/lib/save/source/SourceClass.js +187 -187
  242. package/lib/save/source/SourceField.d.ts +13 -13
  243. package/lib/save/source/SourceField.js +73 -73
  244. package/lib/save/source/SourceFilePrinter.d.ts +12 -12
  245. package/lib/save/source/SourceFilePrinter.js +69 -69
  246. package/lib/save/source/SourceMethod.d.ts +22 -22
  247. package/lib/save/source/SourceMethod.d.ts.map +1 -1
  248. package/lib/save/source/SourceMethod.js +196 -193
  249. package/lib/save/source/SourceNamespace.d.ts +11 -11
  250. package/lib/save/source/SourceNamespace.js +83 -83
  251. package/lib/save/source/SourceStmt.d.ts +178 -178
  252. package/lib/save/source/SourceStmt.js +838 -838
  253. package/lib/save/source/SourceTransformer.d.ts +46 -46
  254. package/lib/save/source/SourceTransformer.js +446 -446
  255. package/lib/transformer/FunctionTransformer.d.ts +2 -2
  256. package/lib/transformer/FunctionTransformer.js +17 -17
  257. package/lib/transformer/SceneTransformer.d.ts +2 -2
  258. package/lib/transformer/SceneTransformer.js +17 -17
  259. package/lib/transformer/StaticSingleAssignmentFormer.d.ts +12 -12
  260. package/lib/transformer/StaticSingleAssignmentFormer.js +259 -259
  261. package/lib/transformer/Transformer.d.ts +6 -6
  262. package/lib/transformer/Transformer.js +22 -22
  263. package/lib/utils/AstTreeUtils.d.ts +4 -4
  264. package/lib/utils/AstTreeUtils.js +26 -26
  265. package/lib/utils/CfgStructualAnalysis.d.ts +110 -110
  266. package/lib/utils/CfgStructualAnalysis.js +1277 -1277
  267. package/lib/utils/FileUtils.d.ts +18 -18
  268. package/lib/utils/FileUtils.js +135 -135
  269. package/lib/utils/SparseBitVector.d.ts +100 -100
  270. package/lib/utils/SparseBitVector.d.ts.map +1 -1
  271. package/lib/utils/SparseBitVector.js +445 -444
  272. package/lib/utils/callGraphUtils.d.ts +30 -30
  273. package/lib/utils/callGraphUtils.js +205 -205
  274. package/lib/utils/crypto_utils.d.ts +5 -5
  275. package/lib/utils/crypto_utils.js +57 -57
  276. package/lib/utils/entryMethodUtils.d.ts +13 -13
  277. package/lib/utils/entryMethodUtils.js +110 -110
  278. package/lib/utils/getAllFiles.d.ts +9 -9
  279. package/lib/utils/getAllFiles.js +90 -90
  280. package/lib/utils/json5parser.d.ts +6 -6
  281. package/lib/utils/json5parser.js +146 -146
  282. package/lib/utils/logger.d.ts +18 -18
  283. package/lib/utils/logger.d.ts.map +1 -1
  284. package/lib/utils/logger.js +97 -90
  285. package/lib/utils/pathTransfer.d.ts +1 -1
  286. package/lib/utils/pathTransfer.js +25 -25
  287. package/node_modules/json5/lib/cli.js +0 -0
  288. package/node_modules/ohos-typescript/bin/tsc +0 -0
  289. package/node_modules/ohos-typescript/bin/tsserver +0 -0
  290. package/package.json +3 -2
@@ -1,648 +1,651 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.IRInference = void 0;
27
- /*
28
- * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
29
- * Licensed under the Apache License, Version 2.0 (the "License");
30
- * you may not use this file except in compliance with the License.
31
- * You may obtain a copy of the License at
32
- *
33
- * http://www.apache.org/licenses/LICENSE-2.0
34
- *
35
- * Unless required by applicable law or agreed to in writing, software
36
- * distributed under the License is distributed on an "AS IS" BASIS,
37
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
38
- * See the License for the specific language governing permissions and
39
- * limitations under the License.
40
- */
41
- const ArkMethod_1 = require("../model/ArkMethod");
42
- const Type_1 = require("../base/Type");
43
- const Local_1 = require("../base/Local");
44
- const TypeInference_1 = require("./TypeInference");
45
- const Expr_1 = require("../base/Expr");
46
- const logger_1 = __importStar(require("../../utils/logger"));
47
- const ArkClass_1 = require("../model/ArkClass");
48
- const ModelUtils_1 = require("./ModelUtils");
49
- const ArkField_1 = require("../model/ArkField");
50
- const EtsConst_1 = require("./EtsConst");
51
- const ArkSignature_1 = require("../model/ArkSignature");
52
- const TSConst_1 = require("./TSConst");
53
- const Builtin_1 = require("./Builtin");
54
- const Stmt_1 = require("../base/Stmt");
55
- const Ref_1 = require("../base/Ref");
56
- const Constant_1 = require("../base/Constant");
57
- const Const_1 = require("./Const");
58
- const ValueUtil_1 = require("./ValueUtil");
59
- const TypeExpr_1 = require("../base/TypeExpr");
60
- const ArkBaseModel_1 = require("../model/ArkBaseModel");
61
- const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'IRInference');
62
- class IRInference {
63
- static inferExportInfos(file) {
64
- file.getExportInfos().forEach(exportInfo => {
65
- if (exportInfo.getArkExport() === undefined) {
66
- let arkExport = (0, ModelUtils_1.findArkExport)(exportInfo);
67
- exportInfo.setArkExport(arkExport);
68
- if (arkExport) {
69
- exportInfo.setExportClauseType(arkExport.getExportType());
70
- }
71
- }
72
- });
73
- }
74
- static inferImportInfos(file) {
75
- file.getImportInfos().forEach(importInfo => {
76
- importInfo.getLazyExportInfo();
77
- });
78
- }
79
- static inferFile(file) {
80
- this.inferImportInfos(file);
81
- ModelUtils_1.ModelUtils.getAllClassesInFile(file).forEach(arkClass => {
82
- TypeInference_1.TypeInference.inferGenericType(arkClass.getGenericsTypes(), arkClass);
83
- const defaultArkMethod = arkClass.getDefaultArkMethod();
84
- if (defaultArkMethod) {
85
- TypeInference_1.TypeInference.inferTypeInMethod(defaultArkMethod);
86
- }
87
- arkClass.getFields().forEach(arkField => TypeInference_1.TypeInference.inferTypeInArkField(arkField));
88
- const methods = arkClass.getMethods().sort((a, b) => {
89
- const name = a.getName().split(Const_1.NAME_DELIMITER).reverse().join();
90
- const anotherName = b.getName().split(Const_1.NAME_DELIMITER).reverse().join();
91
- if (name.startsWith(anotherName)) {
92
- return 1;
93
- }
94
- else if (anotherName.startsWith(name)) {
95
- return -1;
96
- }
97
- return 0;
98
- });
99
- methods.forEach(arkMethod => TypeInference_1.TypeInference.inferTypeInMethod(arkMethod));
100
- });
101
- this.inferExportInfos(file);
102
- }
103
- static inferStaticInvokeExpr(expr, arkMethod) {
104
- const arkClass = arkMethod.getDeclaringArkClass();
105
- const methodName = expr.getMethodSignature().getMethodSubSignature().getMethodName();
106
- if (methodName === TSConst_1.IMPORT) {
107
- const arg = expr.getArg(0);
108
- let type;
109
- if (arg instanceof Constant_1.Constant) {
110
- type = TypeInference_1.TypeInference.inferDynamicImportType(arg.getValue(), arkClass);
111
- }
112
- if (type) {
113
- expr.getMethodSignature().getMethodSubSignature().setReturnType(type);
114
- }
115
- return expr;
116
- }
117
- const className = expr.getMethodSignature().getDeclaringClassSignature().getClassName();
118
- if (className && className !== Const_1.UNKNOWN_CLASS_NAME) {
119
- const baseType = TypeInference_1.TypeInference.inferUnclearRefName(className, arkClass);
120
- if (baseType) {
121
- let result = this.inferInvokeExpr(expr, baseType, methodName, arkClass.getDeclaringArkFile().getScene());
122
- if (result) {
123
- this.inferArgs(result, arkMethod);
124
- return result;
125
- }
126
- }
127
- return expr;
128
- }
129
- this.inferStaticInvokeExprByMethodName(methodName, arkMethod, expr);
130
- return expr;
131
- }
132
- static inferStaticInvokeExprByMethodName(methodName, arkMethod, expr) {
133
- var _a, _b, _c, _d, _e;
134
- const arkClass = arkMethod.getDeclaringArkClass();
135
- const arkExport = (_d = (_c = (_b = (_a = ModelUtils_1.ModelUtils.getStaticMethodWithName(methodName, arkClass)) !== null && _a !== void 0 ? _a : arkMethod.getFunctionLocal(methodName)) !== null && _b !== void 0 ? _b : ModelUtils_1.ModelUtils.findDeclaredLocal(new Local_1.Local(methodName), arkMethod)) !== null && _c !== void 0 ? _c : ModelUtils_1.ModelUtils.getArkExportInImportInfoWithName(methodName, arkClass.getDeclaringArkFile())) !== null && _d !== void 0 ? _d : arkClass.getDeclaringArkFile().getScene().getSdkGlobal(methodName);
136
- let method;
137
- let signature;
138
- if (arkExport instanceof ArkMethod_1.ArkMethod) {
139
- method = arkExport;
140
- }
141
- else if (arkExport instanceof ArkClass_1.ArkClass) {
142
- method = arkExport.getMethodWithName(TSConst_1.CONSTRUCTOR_NAME);
143
- }
144
- else if (arkExport instanceof Local_1.Local) {
145
- const type = arkExport.getType();
146
- if (type instanceof Type_1.ClassType) {
147
- const cls = arkClass.getDeclaringArkFile().getScene().getClass(type.getClassSignature());
148
- method = (_e = cls === null || cls === void 0 ? void 0 : cls.getMethodWithName(TSConst_1.CONSTRUCTOR_NAME)) !== null && _e !== void 0 ? _e : cls === null || cls === void 0 ? void 0 : cls.getMethodWithName(Const_1.CALL_SIGNATURE_NAME);
149
- }
150
- else if (type instanceof Type_1.FunctionType) {
151
- signature = type.getMethodSignature();
152
- }
153
- }
154
- else if (arkExport instanceof Type_1.AliasType && arkExport.getOriginalType() instanceof Type_1.FunctionType) {
155
- signature = arkExport.getOriginalType().getMethodSignature();
156
- }
157
- if (method) {
158
- signature = method.matchMethodSignature(expr.getArgs());
159
- TypeInference_1.TypeInference.inferSignatureReturnType(signature, method);
160
- }
161
- if (signature) {
162
- signature = this.generateNewMethodSignature(methodName, signature);
163
- expr.setMethodSignature(signature);
164
- this.inferArgs(expr, arkMethod);
165
- }
166
- }
167
- static generateNewMethodSignature(methodName, signature) {
168
- if (signature.getMethodSubSignature().getMethodName().startsWith(Const_1.ANONYMOUS_METHOD_PREFIX)) {
169
- const subSignature = signature.getMethodSubSignature();
170
- const newSubSignature = new ArkSignature_1.MethodSubSignature(methodName, subSignature.getParameters(), subSignature.getReturnType(), subSignature.isStatic());
171
- return new ArkSignature_1.MethodSignature(signature.getDeclaringClassSignature(), newSubSignature);
172
- }
173
- return signature;
174
- }
175
- static inferInstanceInvokeExpr(expr, arkMethod) {
176
- const arkClass = arkMethod.getDeclaringArkClass();
177
- TypeInference_1.TypeInference.inferRealGenericTypes(expr.getRealGenericTypes(), arkClass);
178
- this.inferLocal(expr.getBase(), arkMethod);
179
- const baseType = TypeInference_1.TypeInference.replaceAliasType(expr.getBase().getType());
180
- const methodName = expr.getMethodSignature().getMethodSubSignature().getMethodName();
181
- const scene = arkClass.getDeclaringArkFile().getScene();
182
- if ((methodName === 'forEach') && (baseType instanceof Type_1.ArrayType)) {
183
- this.processForEach(expr.getArg(0), baseType, scene);
184
- return expr;
185
- }
186
- let result = this.inferInvokeExpr(expr, baseType, methodName, scene);
187
- if (result) {
188
- this.inferArgs(result, arkMethod);
189
- return result;
190
- }
191
- logger.warn('invoke ArkInstanceInvokeExpr MethodSignature type fail: ', expr.toString());
192
- return expr;
193
- }
194
- static inferFieldRef(ref, arkMethod) {
195
- this.inferLocal(ref.getBase(), arkMethod);
196
- const baseType = TypeInference_1.TypeInference.replaceAliasType(ref.getBase().getType());
197
- if (baseType instanceof Type_1.ArrayType && ref.getFieldName() !== 'length') {
198
- return new Ref_1.ArkArrayRef(ref.getBase(), ValueUtil_1.ValueUtil.createConst(ref.getFieldName()));
199
- }
200
- const arkClass = arkMethod.getDeclaringArkClass();
201
- let newFieldSignature = this.generateNewFieldSignature(ref, arkClass, baseType);
202
- if (newFieldSignature) {
203
- if (newFieldSignature.isStatic()) {
204
- return new Ref_1.ArkStaticFieldRef(newFieldSignature);
205
- }
206
- ref.setFieldSignature(newFieldSignature);
207
- }
208
- return ref;
209
- }
210
- static inferArgs(expr, arkMethod) {
211
- const scene = arkMethod.getDeclaringArkFile().getScene();
212
- const parameters = expr.getMethodSignature().getMethodSubSignature().getParameters();
213
- let realTypes = [];
214
- const len = expr.getArgs().length;
215
- for (let index = 0; index < len; index++) {
216
- const arg = expr.getArg(index);
217
- TypeInference_1.TypeInference.inferValueType(arg, arkMethod);
218
- if (index >= parameters.length) {
219
- break;
220
- }
221
- const argType = arg.getType();
222
- const paramType = parameters[index].getType();
223
- this.inferArg(expr, argType, paramType, scene, realTypes);
224
- }
225
- if (realTypes.length > 0 && !expr.getRealGenericTypes()) {
226
- expr.setRealGenericTypes(realTypes);
227
- }
228
- }
229
- static inferArg(expr, argType, paramType, scene, realTypes) {
230
- if (paramType instanceof Type_1.UnionType) {
231
- paramType.getTypes().forEach(t => this.inferArg(expr, argType, t, scene, realTypes));
232
- }
233
- else if (paramType instanceof Type_1.AliasType) {
234
- this.inferArg(expr, argType, paramType.getOriginalType(), scene, realTypes);
235
- }
236
- else if (paramType instanceof Type_1.ArrayType && argType instanceof Type_1.ArrayType) {
237
- this.inferArg(expr, argType.getBaseType(), paramType.getBaseType(), scene, realTypes);
238
- }
239
- if (paramType instanceof Type_1.ClassType && scene.getProjectSdkMap().has(paramType.getClassSignature()
240
- .getDeclaringFileSignature().getProjectName())) {
241
- this.inferArgTypeWithSdk(paramType, scene, argType);
242
- }
243
- else if (paramType instanceof Type_1.GenericType || paramType instanceof Type_1.AnyType) {
244
- realTypes.push(argType);
245
- }
246
- else if (paramType instanceof Type_1.FunctionType && argType instanceof Type_1.FunctionType) {
247
- const params = paramType.getMethodSignature().getMethodSubSignature().getParameters();
248
- const realTypes = expr.getRealGenericTypes();
249
- TypeInference_1.TypeInference.inferFunctionType(argType, params, realTypes);
250
- }
251
- }
252
- static inferRightWithSdkType(leftType, rightType, ackClass) {
253
- if (leftType instanceof Type_1.AliasType) {
254
- this.inferRightWithSdkType(TypeInference_1.TypeInference.replaceAliasType(leftType), rightType, ackClass);
255
- }
256
- else if (leftType instanceof Type_1.UnionType) {
257
- leftType.getTypes().forEach(t => this.inferRightWithSdkType(t, rightType, ackClass));
258
- }
259
- else if (leftType instanceof Type_1.ClassType) {
260
- IRInference.inferArgTypeWithSdk(leftType, ackClass.getDeclaringArkFile().getScene(), rightType);
261
- }
262
- else if (rightType instanceof Type_1.ArrayType && leftType instanceof Type_1.ArrayType) {
263
- const baseType = TypeInference_1.TypeInference.replaceAliasType(leftType.getBaseType());
264
- if (baseType instanceof Type_1.ClassType) {
265
- IRInference.inferArgTypeWithSdk(baseType, ackClass.getDeclaringArkFile().getScene(), rightType);
266
- }
267
- }
268
- }
269
- static inferArgTypeWithSdk(sdkType, scene, argType) {
270
- var _a, _b;
271
- if (!scene.getProjectSdkMap().has(sdkType.getClassSignature().getDeclaringFileSignature().getProjectName())) {
272
- return;
273
- }
274
- if (argType instanceof Type_1.UnionType) {
275
- argType.getTypes().forEach(t => this.inferArgTypeWithSdk(sdkType, scene, t));
276
- }
277
- else if (argType instanceof Type_1.ClassType && argType.getClassSignature().getClassName().startsWith(Const_1.ANONYMOUS_CLASS_PREFIX)) {
278
- this.inferAnonymousClass(scene.getClass(argType.getClassSignature()), sdkType.getClassSignature());
279
- }
280
- else if (argType instanceof Type_1.FunctionType) {
281
- const params = (_b = (_a = scene.getClass(sdkType.getClassSignature())) === null || _a === void 0 ? void 0 : _a.getMethodWithName(Const_1.CALL_SIGNATURE_NAME)) === null || _b === void 0 ? void 0 : _b.getParameters();
282
- const realTypes = sdkType.getRealGenericTypes();
283
- TypeInference_1.TypeInference.inferFunctionType(argType, params, realTypes);
284
- }
285
- }
286
- static inferInvokeExpr(expr, baseType, methodName, scene) {
287
- if (baseType instanceof Type_1.AliasType) {
288
- return this.inferInvokeExpr(expr, baseType.getOriginalType(), methodName, scene);
289
- }
290
- else if (baseType instanceof Type_1.UnionType) {
291
- for (let type of baseType.flatType()) {
292
- if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
293
- continue;
294
- }
295
- let result = this.inferInvokeExpr(expr, type, methodName, scene);
296
- if (result) {
297
- return result;
298
- }
299
- }
300
- }
301
- if (baseType instanceof Type_1.ClassType) {
302
- return this.inferInvokeExprWithDeclaredClass(expr, baseType, methodName, scene);
303
- }
304
- else if (baseType instanceof Type_1.AnnotationNamespaceType) {
305
- const namespace = scene.getNamespace(baseType.getNamespaceSignature());
306
- if (namespace) {
307
- const foundMethod = ModelUtils_1.ModelUtils.findPropertyInNamespace(methodName, namespace);
308
- if (foundMethod instanceof ArkMethod_1.ArkMethod) {
309
- let signature = foundMethod.matchMethodSignature(expr.getArgs());
310
- TypeInference_1.TypeInference.inferSignatureReturnType(signature, foundMethod);
311
- expr.setMethodSignature(signature);
312
- return expr instanceof Expr_1.ArkInstanceInvokeExpr ?
313
- new Expr_1.ArkStaticInvokeExpr(signature, expr.getArgs(), expr.getRealGenericTypes()) : expr;
314
- }
315
- }
316
- }
317
- else if (baseType instanceof Type_1.FunctionType) {
318
- expr.setMethodSignature(baseType.getMethodSignature());
319
- return expr;
320
- }
321
- else if (baseType instanceof Type_1.ArrayType && methodName === Builtin_1.Builtin.ITERATOR_FUNCTION) {
322
- const returnType = expr.getMethodSignature().getMethodSubSignature().getReturnType();
323
- if (returnType instanceof Type_1.ClassType && returnType.getClassSignature().getDeclaringFileSignature()
324
- .getProjectName() === Builtin_1.Builtin.DUMMY_PROJECT_NAME) {
325
- returnType.setRealGenericTypes([baseType.getBaseType()]);
326
- return expr;
327
- }
328
- }
329
- return null;
330
- }
331
- static inferInvokeExprWithDeclaredClass(expr, baseType, methodName, scene) {
332
- var _a;
333
- let declaredClass = scene.getClass(baseType.getClassSignature());
334
- if (!declaredClass) {
335
- const globalClass = scene.getSdkGlobal(baseType.getClassSignature().getClassName());
336
- if (globalClass instanceof ArkClass_1.ArkClass) {
337
- declaredClass = globalClass;
338
- }
339
- }
340
- const method = declaredClass ? ModelUtils_1.ModelUtils.findPropertyInClass(methodName, declaredClass) : null;
341
- if (method instanceof ArkMethod_1.ArkMethod) {
342
- const methodSignature = method.matchMethodSignature(expr.getArgs());
343
- TypeInference_1.TypeInference.inferSignatureReturnType(methodSignature, method);
344
- expr.setMethodSignature(this.replaceMethodSignature(expr.getMethodSignature(), methodSignature));
345
- expr.setRealGenericTypes(IRInference.getRealTypes(method, declaredClass, baseType));
346
- if (method.isStatic() && expr instanceof Expr_1.ArkInstanceInvokeExpr) {
347
- return new Expr_1.ArkStaticInvokeExpr(methodSignature, expr.getArgs(), expr.getRealGenericTypes());
348
- }
349
- return expr;
350
- }
351
- else if (method instanceof ArkField_1.ArkField) {
352
- const type = method.getType();
353
- if (type instanceof Type_1.FunctionType) {
354
- expr.setMethodSignature(this.generateNewMethodSignature(methodName, type.getMethodSignature()));
355
- return expr;
356
- }
357
- else if (type instanceof Type_1.ClassType && type.getClassSignature().getClassName().endsWith(EtsConst_1.CALL_BACK)) {
358
- const callback = (_a = scene.getClass(type.getClassSignature())) === null || _a === void 0 ? void 0 : _a.getMethodWithName(Const_1.CALL_SIGNATURE_NAME);
359
- if (callback) {
360
- expr.setMethodSignature(callback.getSignature());
361
- return expr;
362
- }
363
- }
364
- }
365
- else if (methodName === TSConst_1.CONSTRUCTOR_NAME) { //sdk隐式构造
366
- const subSignature = new ArkSignature_1.MethodSubSignature(methodName, [], new Type_1.ClassType(baseType.getClassSignature()));
367
- const signature = new ArkSignature_1.MethodSignature(baseType.getClassSignature(), subSignature);
368
- expr.setMethodSignature(signature);
369
- return expr;
370
- }
371
- else if (methodName === Builtin_1.Builtin.ITERATOR_NEXT) { //sdk隐式构造
372
- const returnType = expr.getMethodSignature().getMethodSubSignature().getReturnType();
373
- if (returnType instanceof Type_1.ClassType && returnType.getClassSignature().getDeclaringFileSignature()
374
- .getProjectName() === Builtin_1.Builtin.DUMMY_PROJECT_NAME) {
375
- returnType.setRealGenericTypes(baseType.getRealGenericTypes());
376
- return expr;
377
- }
378
- }
379
- return null;
380
- }
381
- static getRealTypes(method, declaredClass, baseType) {
382
- let realTypes;
383
- if (method.getDeclaringArkClass() === declaredClass) {
384
- realTypes = baseType.getRealGenericTypes();
385
- }
386
- else if (declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.getRealTypes()) {
387
- realTypes = declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.getRealTypes();
388
- }
389
- else if (declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.hasComponentDecorator()) {
390
- realTypes = [new Type_1.ClassType(declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.getSignature())];
391
- }
392
- return realTypes;
393
- }
394
- static replaceMethodSignature(init, declared) {
395
- const className = init.getDeclaringClassSignature().getClassName();
396
- let classSignature;
397
- if (declared.getDeclaringClassSignature().getClassName().endsWith('Interface')) {
398
- classSignature = new ArkSignature_1.AliasClassSignature(className, declared.getDeclaringClassSignature());
399
- }
400
- let newSubSignature;
401
- if (classSignature || newSubSignature) {
402
- return new ArkSignature_1.MethodSignature(classSignature !== null && classSignature !== void 0 ? classSignature : declared.getDeclaringClassSignature(), newSubSignature !== null && newSubSignature !== void 0 ? newSubSignature : declared.getMethodSubSignature());
403
- }
404
- return declared;
405
- }
406
- static processForEach(arg, baseType, scene) {
407
- const argType = arg.getType();
408
- if (argType instanceof Type_1.FunctionType) {
409
- const argMethodSignature = argType.getMethodSignature();
410
- const argMethod = scene.getMethod(argMethodSignature);
411
- if (argMethod != null && argMethod.getBody()) {
412
- const body = argMethod.getBody();
413
- const firstStmt = body.getCfg().getStartingStmt();
414
- if ((firstStmt instanceof Stmt_1.ArkAssignStmt) && (firstStmt.getRightOp() instanceof Ref_1.ArkParameterRef)) {
415
- const parameterRef = firstStmt.getRightOp();
416
- parameterRef.setType(baseType.getBaseType());
417
- }
418
- TypeInference_1.TypeInference.inferTypeInMethod(argMethod);
419
- }
420
- }
421
- else {
422
- logger.warn(`arg of forEach must be callable`);
423
- }
424
- }
425
- static inferLocal(base, arkMethod) {
426
- var _a, _b, _c;
427
- const arkClass = arkMethod.getDeclaringArkClass();
428
- if (base.getName() === TSConst_1.THIS_NAME) {
429
- if (!arkClass.isAnonymousClass()) {
430
- base.setType(new Type_1.ClassType(arkClass.getSignature(), arkClass.getGenericsTypes()));
431
- }
432
- return;
433
- }
434
- let baseType = base.getType();
435
- if (baseType instanceof Type_1.UnclearReferenceType) {
436
- baseType = TypeInference_1.TypeInference.inferUnclearRefName(baseType.getName(), arkClass);
437
- }
438
- else if (TypeInference_1.TypeInference.isUnclearType(baseType)) {
439
- const declaringStmt = base.getDeclaringStmt();
440
- if (!declaringStmt || !declaringStmt.getOriginalText() || ((_a = declaringStmt.getOriginalText()) === null || _a === void 0 ? void 0 : _a.startsWith(base.getName()))) {
441
- baseType = (_c = (_b = ModelUtils_1.ModelUtils.findDeclaredLocal(base, arkMethod)) === null || _b === void 0 ? void 0 : _b.getType()) !== null && _c !== void 0 ? _c : TypeInference_1.TypeInference.inferBaseType(base.getName(), arkClass);
442
- }
443
- }
444
- if (baseType && !TypeInference_1.TypeInference.isUnclearType(baseType)) {
445
- base.setType(baseType);
446
- }
447
- }
448
- static generateNewFieldSignature(ref, arkClass, baseType) {
449
- if (baseType instanceof Type_1.UnionType) {
450
- for (let type of baseType.flatType()) {
451
- if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
452
- continue;
453
- }
454
- let newFieldSignature = this.generateNewFieldSignature(ref, arkClass, type);
455
- if (!TypeInference_1.TypeInference.isUnclearType(newFieldSignature === null || newFieldSignature === void 0 ? void 0 : newFieldSignature.getType())) {
456
- return newFieldSignature;
457
- }
458
- }
459
- return null;
460
- }
461
- else if (baseType instanceof Type_1.AliasType) {
462
- return this.generateNewFieldSignature(ref, arkClass, baseType.getOriginalType());
463
- }
464
- const fieldName = ref.getFieldName().replace(/[\"|\']/g, '');
465
- const propertyAndType = TypeInference_1.TypeInference.inferFieldType(baseType, fieldName, arkClass);
466
- let propertyType = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[1];
467
- if (propertyType && TypeInference_1.TypeInference.isUnclearType(propertyType)) {
468
- const newType = TypeInference_1.TypeInference.inferUnclearedType(propertyType, arkClass);
469
- if (newType) {
470
- propertyType = newType;
471
- }
472
- }
473
- let staticFlag;
474
- let signature;
475
- if (baseType instanceof Type_1.ClassType) {
476
- const property = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[0];
477
- if (property instanceof ArkField_1.ArkField) {
478
- return property.getSignature();
479
- }
480
- staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
481
- (property instanceof ArkMethod_1.ArkMethod && property.isStatic());
482
- signature = property instanceof ArkMethod_1.ArkMethod ? property.getSignature().getDeclaringClassSignature() : baseType.getClassSignature();
483
- }
484
- else if (baseType instanceof Type_1.AnnotationNamespaceType) {
485
- staticFlag = true;
486
- signature = baseType.getNamespaceSignature();
487
- }
488
- else {
489
- return null;
490
- }
491
- return new ArkSignature_1.FieldSignature(fieldName, signature, propertyType !== null && propertyType !== void 0 ? propertyType : ref.getType(), staticFlag);
492
- }
493
- static inferAnonymousClass(anon, declaredSignature, set = new Set()) {
494
- var _a;
495
- if (!anon) {
496
- return;
497
- }
498
- const key = anon.getSignature().toString();
499
- if (set.has(key)) {
500
- return;
501
- }
502
- else {
503
- set.add(key);
504
- }
505
- const scene = anon.getDeclaringArkFile().getScene();
506
- const declaredClass = scene.getClass(declaredSignature);
507
- if (!declaredClass) {
508
- return;
509
- }
510
- for (const anonField of anon.getFields()) {
511
- const property = ModelUtils_1.ModelUtils.findPropertyInClass(anonField.getName(), declaredClass);
512
- if (property instanceof ArkField_1.ArkField) {
513
- this.assignAnonField(property, anonField, scene, set);
514
- }
515
- }
516
- for (const anonMethod of anon.getMethods()) {
517
- const methodSignature = (_a = declaredClass.getMethodWithName(anonMethod.getName())) === null || _a === void 0 ? void 0 : _a.matchMethodSignature(anonMethod.getSubSignature().getParameters());
518
- if (methodSignature) {
519
- anonMethod.setImplementationSignature(methodSignature);
520
- }
521
- }
522
- }
523
- static assignAnonField(property, anonField, scene, set) {
524
- function deepInfer(anonType, declaredSignature) {
525
- if (anonType instanceof Type_1.ClassType && anonType.getClassSignature().getClassName().startsWith(Const_1.ANONYMOUS_CLASS_PREFIX)) {
526
- IRInference.inferAnonymousClass(scene.getClass(anonType.getClassSignature()), declaredSignature, set);
527
- }
528
- }
529
- const type = property.getSignature().getType();
530
- const lastStmt = anonField.getInitializer().at(-1);
531
- if (lastStmt instanceof Stmt_1.ArkAssignStmt) {
532
- const rightType = lastStmt.getRightOp().getType();
533
- if (type instanceof Type_1.ClassType) {
534
- deepInfer(rightType, type.getClassSignature());
535
- }
536
- else if (type instanceof Type_1.ArrayType && type.getBaseType() instanceof Type_1.ClassType &&
537
- rightType instanceof Type_1.ArrayType) {
538
- const baseType = rightType.getBaseType();
539
- const classSignature = type.getBaseType().getClassSignature();
540
- if (baseType instanceof Type_1.UnionType) {
541
- baseType.getTypes().forEach(t => deepInfer(t, classSignature));
542
- }
543
- else {
544
- deepInfer(rightType.getBaseType(), classSignature);
545
- }
546
- }
547
- const leftOp = lastStmt.getLeftOp();
548
- if (leftOp instanceof Ref_1.AbstractFieldRef) {
549
- leftOp.setFieldSignature(property.getSignature());
550
- }
551
- }
552
- anonField.setSignature(property.getSignature());
553
- }
554
- static inferAliasTypeExpr(expr, arkMethod) {
555
- const originalObject = expr.getOriginalObject();
556
- let model;
557
- if (originalObject instanceof Local_1.Local) {
558
- model = ModelUtils_1.ModelUtils.findArkModelByRefName(originalObject.getName(), arkMethod.getDeclaringArkClass());
559
- }
560
- else if (originalObject instanceof TypeExpr_1.AbstractTypeExpr) {
561
- originalObject.inferType(arkMethod);
562
- model = originalObject;
563
- }
564
- else if (originalObject instanceof Type_1.Type) {
565
- const type = TypeInference_1.TypeInference.inferUnclearedType(originalObject, arkMethod.getDeclaringArkClass());
566
- // If original Object is ClassType, AliasType or UnclearReferenceType with real generic types,
567
- // the type after infer should be revert back to the object itself.
568
- if (type instanceof Type_1.ClassType) {
569
- const scene = arkMethod.getDeclaringArkFile().getScene();
570
- model = ModelUtils_1.ModelUtils.findArkModelBySignature(type.getClassSignature(), scene);
571
- }
572
- else if (type instanceof Type_1.AliasType) {
573
- const scene = arkMethod.getDeclaringArkFile().getScene();
574
- model = ModelUtils_1.ModelUtils.findArkModelBySignature(type.getSignature(), scene);
575
- }
576
- else if (type) {
577
- model = type;
578
- }
579
- if (expr.getRealGenericTypes() !== undefined && originalObject instanceof Type_1.UnclearReferenceType) {
580
- expr.setRealGenericTypes(originalObject.getGenericTypes());
581
- }
582
- }
583
- if (Expr_1.AliasTypeExpr.isAliasTypeOriginalModel(model)) {
584
- expr.setOriginalObject(model);
585
- }
586
- return expr;
587
- }
588
- static inferTypeQueryExpr(expr, arkMethod) {
589
- var _a;
590
- let gTypes = expr.getGenerateTypes();
591
- if (gTypes) {
592
- for (let i = 0; i < gTypes.length; i++) {
593
- const newType = TypeInference_1.TypeInference.inferUnclearedType(gTypes[i], arkMethod.getDeclaringArkClass());
594
- if (newType) {
595
- gTypes[i] = newType;
596
- }
597
- }
598
- }
599
- const opValue = expr.getOpValue();
600
- let opValueType;
601
- if (opValue instanceof ArkBaseModel_1.ArkBaseModel) {
602
- opValueType = (_a = ModelUtils_1.ModelUtils.parseArkBaseModel2Type(opValue)) !== null && _a !== void 0 ? _a : Type_1.UnknownType.getInstance();
603
- }
604
- else {
605
- opValueType = opValue.getType();
606
- }
607
- if (!TypeInference_1.TypeInference.isUnclearType(opValueType)) {
608
- return;
609
- }
610
- if (opValue instanceof Local_1.Local) {
611
- const newOpValueType = TypeInference_1.TypeInference.inferUnclearRefName(opValue.getName(), arkMethod.getDeclaringArkClass());
612
- const scene = arkMethod.getDeclaringArkFile().getScene();
613
- if (newOpValueType instanceof Type_1.ClassType) {
614
- const newOpValue = ModelUtils_1.ModelUtils.findArkModelBySignature(newOpValueType.getClassSignature(), scene);
615
- if (newOpValue instanceof ArkBaseModel_1.ArkBaseModel) {
616
- expr.setOpValue(newOpValue);
617
- }
618
- }
619
- else if (newOpValueType instanceof Type_1.FunctionType) {
620
- const newOpValue = ModelUtils_1.ModelUtils.findArkModelBySignature(newOpValueType.getMethodSignature(), scene);
621
- if (newOpValue instanceof ArkBaseModel_1.ArkBaseModel) {
622
- expr.setOpValue(newOpValue);
623
- }
624
- }
625
- else {
626
- this.inferLocal(opValue, arkMethod);
627
- }
628
- }
629
- else if (opValue instanceof Ref_1.AbstractRef || opValue instanceof Expr_1.AbstractExpr) {
630
- expr.setOpValue(opValue.inferType(arkMethod));
631
- }
632
- }
633
- static inferKeyofTypeExpr(expr, arkMethod) {
634
- const opType = expr.getOpType();
635
- if (TypeInference_1.TypeInference.isUnclearType(opType)) {
636
- if (opType instanceof TypeExpr_1.TypeQueryExpr) {
637
- this.inferTypeQueryExpr(opType, arkMethod);
638
- }
639
- else {
640
- const type = TypeInference_1.TypeInference.inferUnclearedType(opType, arkMethod.getDeclaringArkClass());
641
- if (type) {
642
- expr.setOpType(type);
643
- }
644
- }
645
- }
646
- }
647
- }
648
- exports.IRInference = IRInference;
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.IRInference = void 0;
27
+ /*
28
+ * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
29
+ * Licensed under the Apache License, Version 2.0 (the "License");
30
+ * you may not use this file except in compliance with the License.
31
+ * You may obtain a copy of the License at
32
+ *
33
+ * http://www.apache.org/licenses/LICENSE-2.0
34
+ *
35
+ * Unless required by applicable law or agreed to in writing, software
36
+ * distributed under the License is distributed on an "AS IS" BASIS,
37
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
38
+ * See the License for the specific language governing permissions and
39
+ * limitations under the License.
40
+ */
41
+ const ArkMethod_1 = require("../model/ArkMethod");
42
+ const Type_1 = require("../base/Type");
43
+ const Local_1 = require("../base/Local");
44
+ const TypeInference_1 = require("./TypeInference");
45
+ const Expr_1 = require("../base/Expr");
46
+ const logger_1 = __importStar(require("../../utils/logger"));
47
+ const ArkClass_1 = require("../model/ArkClass");
48
+ const ModelUtils_1 = require("./ModelUtils");
49
+ const ArkField_1 = require("../model/ArkField");
50
+ const EtsConst_1 = require("./EtsConst");
51
+ const ArkSignature_1 = require("../model/ArkSignature");
52
+ const TSConst_1 = require("./TSConst");
53
+ const Builtin_1 = require("./Builtin");
54
+ const Stmt_1 = require("../base/Stmt");
55
+ const Ref_1 = require("../base/Ref");
56
+ const Constant_1 = require("../base/Constant");
57
+ const Const_1 = require("./Const");
58
+ const ValueUtil_1 = require("./ValueUtil");
59
+ const TypeExpr_1 = require("../base/TypeExpr");
60
+ const ArkBaseModel_1 = require("../model/ArkBaseModel");
61
+ const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'IRInference');
62
+ class IRInference {
63
+ static inferExportInfos(file) {
64
+ file.getExportInfos().forEach(exportInfo => {
65
+ if (exportInfo.getArkExport() === undefined) {
66
+ let arkExport = (0, ModelUtils_1.findArkExport)(exportInfo);
67
+ exportInfo.setArkExport(arkExport);
68
+ if (arkExport) {
69
+ exportInfo.setExportClauseType(arkExport.getExportType());
70
+ }
71
+ }
72
+ });
73
+ }
74
+ static inferImportInfos(file) {
75
+ file.getImportInfos().forEach(importInfo => {
76
+ importInfo.getLazyExportInfo();
77
+ });
78
+ }
79
+ static inferFile(file) {
80
+ this.inferImportInfos(file);
81
+ ModelUtils_1.ModelUtils.getAllClassesInFile(file).forEach(arkClass => {
82
+ TypeInference_1.TypeInference.inferGenericType(arkClass.getGenericsTypes(), arkClass);
83
+ const defaultArkMethod = arkClass.getDefaultArkMethod();
84
+ if (defaultArkMethod) {
85
+ TypeInference_1.TypeInference.inferTypeInMethod(defaultArkMethod);
86
+ }
87
+ arkClass.getFields().forEach(arkField => TypeInference_1.TypeInference.inferTypeInArkField(arkField));
88
+ const methods = arkClass.getMethods().sort((a, b) => {
89
+ const name = a.getName().split(Const_1.NAME_DELIMITER).reverse().join();
90
+ const anotherName = b.getName().split(Const_1.NAME_DELIMITER).reverse().join();
91
+ if (name.startsWith(anotherName)) {
92
+ return 1;
93
+ }
94
+ else if (anotherName.startsWith(name)) {
95
+ return -1;
96
+ }
97
+ return 0;
98
+ });
99
+ methods.forEach(arkMethod => TypeInference_1.TypeInference.inferTypeInMethod(arkMethod));
100
+ });
101
+ this.inferExportInfos(file);
102
+ }
103
+ static inferStaticInvokeExpr(expr, arkMethod) {
104
+ const arkClass = arkMethod.getDeclaringArkClass();
105
+ const methodName = expr.getMethodSignature().getMethodSubSignature().getMethodName();
106
+ if (methodName === TSConst_1.IMPORT) {
107
+ const arg = expr.getArg(0);
108
+ let type;
109
+ if (arg instanceof Constant_1.Constant) {
110
+ type = TypeInference_1.TypeInference.inferDynamicImportType(arg.getValue(), arkClass);
111
+ }
112
+ if (type) {
113
+ expr.getMethodSignature().getMethodSubSignature().setReturnType(type);
114
+ }
115
+ return expr;
116
+ }
117
+ const className = expr.getMethodSignature().getDeclaringClassSignature().getClassName();
118
+ if (className && className !== Const_1.UNKNOWN_CLASS_NAME) {
119
+ const baseType = TypeInference_1.TypeInference.inferUnclearRefName(className, arkClass);
120
+ if (baseType) {
121
+ let result = this.inferInvokeExpr(expr, baseType, methodName, arkClass.getDeclaringArkFile().getScene());
122
+ if (result) {
123
+ this.inferArgs(result, arkMethod);
124
+ return result;
125
+ }
126
+ }
127
+ return expr;
128
+ }
129
+ this.inferStaticInvokeExprByMethodName(methodName, arkMethod, expr);
130
+ return expr;
131
+ }
132
+ static inferStaticInvokeExprByMethodName(methodName, arkMethod, expr) {
133
+ var _a, _b, _c, _d, _e;
134
+ const arkClass = arkMethod.getDeclaringArkClass();
135
+ const arkExport = (_d = (_c = (_b = (_a = ModelUtils_1.ModelUtils.getStaticMethodWithName(methodName, arkClass)) !== null && _a !== void 0 ? _a : arkMethod.getFunctionLocal(methodName)) !== null && _b !== void 0 ? _b : ModelUtils_1.ModelUtils.findDeclaredLocal(new Local_1.Local(methodName), arkMethod)) !== null && _c !== void 0 ? _c : ModelUtils_1.ModelUtils.getArkExportInImportInfoWithName(methodName, arkClass.getDeclaringArkFile())) !== null && _d !== void 0 ? _d : arkClass.getDeclaringArkFile().getScene().getSdkGlobal(methodName);
136
+ let method;
137
+ let signature;
138
+ if (arkExport instanceof ArkMethod_1.ArkMethod) {
139
+ method = arkExport;
140
+ }
141
+ else if (arkExport instanceof ArkClass_1.ArkClass) {
142
+ method = arkExport.getMethodWithName(TSConst_1.CONSTRUCTOR_NAME);
143
+ }
144
+ else if (arkExport instanceof Local_1.Local) {
145
+ const type = arkExport.getType();
146
+ if (type instanceof Type_1.ClassType) {
147
+ const cls = arkClass.getDeclaringArkFile().getScene().getClass(type.getClassSignature());
148
+ method = (_e = cls === null || cls === void 0 ? void 0 : cls.getMethodWithName(TSConst_1.CONSTRUCTOR_NAME)) !== null && _e !== void 0 ? _e : cls === null || cls === void 0 ? void 0 : cls.getMethodWithName(Const_1.CALL_SIGNATURE_NAME);
149
+ }
150
+ else if (type instanceof Type_1.FunctionType) {
151
+ signature = type.getMethodSignature();
152
+ }
153
+ }
154
+ else if (arkExport instanceof Type_1.AliasType && arkExport.getOriginalType() instanceof Type_1.FunctionType) {
155
+ signature = arkExport.getOriginalType().getMethodSignature();
156
+ }
157
+ if (method) {
158
+ signature = method.matchMethodSignature(expr.getArgs());
159
+ TypeInference_1.TypeInference.inferSignatureReturnType(signature, method);
160
+ }
161
+ if (signature) {
162
+ signature = this.generateNewMethodSignature(methodName, signature);
163
+ expr.setMethodSignature(signature);
164
+ this.inferArgs(expr, arkMethod);
165
+ }
166
+ }
167
+ static generateNewMethodSignature(methodName, signature) {
168
+ if (signature.getMethodSubSignature().getMethodName().startsWith(Const_1.ANONYMOUS_METHOD_PREFIX)) {
169
+ const subSignature = signature.getMethodSubSignature();
170
+ const newSubSignature = new ArkSignature_1.MethodSubSignature(methodName, subSignature.getParameters(), subSignature.getReturnType(), subSignature.isStatic());
171
+ return new ArkSignature_1.MethodSignature(signature.getDeclaringClassSignature(), newSubSignature);
172
+ }
173
+ return signature;
174
+ }
175
+ static inferInstanceInvokeExpr(expr, arkMethod) {
176
+ const arkClass = arkMethod.getDeclaringArkClass();
177
+ TypeInference_1.TypeInference.inferRealGenericTypes(expr.getRealGenericTypes(), arkClass);
178
+ this.inferLocal(expr.getBase(), arkMethod);
179
+ const baseType = TypeInference_1.TypeInference.replaceAliasType(expr.getBase().getType());
180
+ const methodName = expr.getMethodSignature().getMethodSubSignature().getMethodName();
181
+ const scene = arkClass.getDeclaringArkFile().getScene();
182
+ if ((methodName === 'forEach') && (baseType instanceof Type_1.ArrayType)) {
183
+ this.processForEach(expr.getArg(0), baseType, scene);
184
+ return expr;
185
+ }
186
+ let result = this.inferInvokeExpr(expr, baseType, methodName, scene);
187
+ if (result) {
188
+ this.inferArgs(result, arkMethod);
189
+ return result;
190
+ }
191
+ logger.warn('invoke ArkInstanceInvokeExpr MethodSignature type fail: ', expr.toString());
192
+ return expr;
193
+ }
194
+ static inferFieldRef(ref, arkMethod) {
195
+ this.inferLocal(ref.getBase(), arkMethod);
196
+ const baseType = TypeInference_1.TypeInference.replaceAliasType(ref.getBase().getType());
197
+ if (baseType instanceof Type_1.ArrayType && ref.getFieldName() !== 'length') {
198
+ return new Ref_1.ArkArrayRef(ref.getBase(), ValueUtil_1.ValueUtil.createConst(ref.getFieldName()));
199
+ }
200
+ const arkClass = arkMethod.getDeclaringArkClass();
201
+ let newFieldSignature = this.generateNewFieldSignature(ref, arkClass, baseType);
202
+ if (newFieldSignature) {
203
+ if (newFieldSignature.isStatic()) {
204
+ return new Ref_1.ArkStaticFieldRef(newFieldSignature);
205
+ }
206
+ ref.setFieldSignature(newFieldSignature);
207
+ }
208
+ return ref;
209
+ }
210
+ static inferArgs(expr, arkMethod) {
211
+ const scene = arkMethod.getDeclaringArkFile().getScene();
212
+ const parameters = expr.getMethodSignature().getMethodSubSignature().getParameters();
213
+ let realTypes = [];
214
+ const len = expr.getArgs().length;
215
+ for (let index = 0; index < len; index++) {
216
+ const arg = expr.getArg(index);
217
+ TypeInference_1.TypeInference.inferValueType(arg, arkMethod);
218
+ if (index >= parameters.length) {
219
+ break;
220
+ }
221
+ const argType = arg.getType();
222
+ const paramType = parameters[index].getType();
223
+ this.inferArg(expr, argType, paramType, scene, realTypes);
224
+ }
225
+ if (realTypes.length > 0 && !expr.getRealGenericTypes()) {
226
+ expr.setRealGenericTypes(realTypes);
227
+ }
228
+ }
229
+ static inferArg(expr, argType, paramType, scene, realTypes) {
230
+ if (paramType instanceof Type_1.UnionType) {
231
+ paramType.getTypes().forEach(t => this.inferArg(expr, argType, t, scene, realTypes));
232
+ }
233
+ else if (paramType instanceof Type_1.AliasType) {
234
+ this.inferArg(expr, argType, paramType.getOriginalType(), scene, realTypes);
235
+ }
236
+ else if (paramType instanceof Type_1.ArrayType && argType instanceof Type_1.ArrayType) {
237
+ this.inferArg(expr, argType.getBaseType(), paramType.getBaseType(), scene, realTypes);
238
+ }
239
+ if (paramType instanceof Type_1.ClassType && scene.getProjectSdkMap().has(paramType.getClassSignature()
240
+ .getDeclaringFileSignature().getProjectName())) {
241
+ this.inferArgTypeWithSdk(paramType, scene, argType);
242
+ }
243
+ else if (paramType instanceof Type_1.GenericType || paramType instanceof Type_1.AnyType) {
244
+ realTypes.push(argType);
245
+ }
246
+ else if (paramType instanceof Type_1.FunctionType && argType instanceof Type_1.FunctionType) {
247
+ const params = paramType.getMethodSignature().getMethodSubSignature().getParameters();
248
+ const realTypes = expr.getRealGenericTypes();
249
+ TypeInference_1.TypeInference.inferFunctionType(argType, params, realTypes);
250
+ }
251
+ }
252
+ static inferRightWithSdkType(leftType, rightType, ackClass) {
253
+ if (leftType instanceof Type_1.AliasType) {
254
+ this.inferRightWithSdkType(TypeInference_1.TypeInference.replaceAliasType(leftType), rightType, ackClass);
255
+ }
256
+ else if (leftType instanceof Type_1.UnionType) {
257
+ leftType.getTypes().forEach(t => this.inferRightWithSdkType(t, rightType, ackClass));
258
+ }
259
+ else if (leftType instanceof Type_1.ClassType) {
260
+ IRInference.inferArgTypeWithSdk(leftType, ackClass.getDeclaringArkFile().getScene(), rightType);
261
+ }
262
+ else if (rightType instanceof Type_1.ArrayType && leftType instanceof Type_1.ArrayType) {
263
+ const baseType = TypeInference_1.TypeInference.replaceAliasType(leftType.getBaseType());
264
+ if (baseType instanceof Type_1.ClassType) {
265
+ IRInference.inferArgTypeWithSdk(baseType, ackClass.getDeclaringArkFile().getScene(), rightType);
266
+ }
267
+ }
268
+ }
269
+ static inferArgTypeWithSdk(sdkType, scene, argType) {
270
+ var _a, _b;
271
+ if (!scene.getProjectSdkMap().has(sdkType.getClassSignature().getDeclaringFileSignature().getProjectName())) {
272
+ return;
273
+ }
274
+ if (argType instanceof Type_1.UnionType) {
275
+ argType.getTypes().forEach(t => this.inferArgTypeWithSdk(sdkType, scene, t));
276
+ }
277
+ else if (argType instanceof Type_1.ClassType && argType.getClassSignature().getClassName().startsWith(Const_1.ANONYMOUS_CLASS_PREFIX)) {
278
+ this.inferAnonymousClass(scene.getClass(argType.getClassSignature()), sdkType.getClassSignature());
279
+ }
280
+ else if (argType instanceof Type_1.FunctionType) {
281
+ const params = (_b = (_a = scene.getClass(sdkType.getClassSignature())) === null || _a === void 0 ? void 0 : _a.getMethodWithName(Const_1.CALL_SIGNATURE_NAME)) === null || _b === void 0 ? void 0 : _b.getParameters();
282
+ const realTypes = sdkType.getRealGenericTypes();
283
+ TypeInference_1.TypeInference.inferFunctionType(argType, params, realTypes);
284
+ }
285
+ }
286
+ static inferInvokeExpr(expr, baseType, methodName, scene) {
287
+ if (baseType instanceof Type_1.AliasType) {
288
+ return this.inferInvokeExpr(expr, baseType.getOriginalType(), methodName, scene);
289
+ }
290
+ else if (baseType instanceof Type_1.UnionType) {
291
+ for (let type of baseType.flatType()) {
292
+ if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
293
+ continue;
294
+ }
295
+ let result = this.inferInvokeExpr(expr, type, methodName, scene);
296
+ if (result) {
297
+ return result;
298
+ }
299
+ }
300
+ }
301
+ if (baseType instanceof Type_1.ClassType) {
302
+ return this.inferInvokeExprWithDeclaredClass(expr, baseType, methodName, scene);
303
+ }
304
+ else if (baseType instanceof Type_1.AnnotationNamespaceType) {
305
+ const namespace = scene.getNamespace(baseType.getNamespaceSignature());
306
+ if (namespace) {
307
+ const foundMethod = ModelUtils_1.ModelUtils.findPropertyInNamespace(methodName, namespace);
308
+ if (foundMethod instanceof ArkMethod_1.ArkMethod) {
309
+ let signature = foundMethod.matchMethodSignature(expr.getArgs());
310
+ TypeInference_1.TypeInference.inferSignatureReturnType(signature, foundMethod);
311
+ expr.setMethodSignature(signature);
312
+ return expr instanceof Expr_1.ArkInstanceInvokeExpr ?
313
+ new Expr_1.ArkStaticInvokeExpr(signature, expr.getArgs(), expr.getRealGenericTypes()) : expr;
314
+ }
315
+ }
316
+ }
317
+ else if (baseType instanceof Type_1.FunctionType) {
318
+ expr.setMethodSignature(baseType.getMethodSignature());
319
+ return expr;
320
+ }
321
+ else if (baseType instanceof Type_1.ArrayType && methodName === Builtin_1.Builtin.ITERATOR_FUNCTION) {
322
+ const returnType = expr.getMethodSignature().getMethodSubSignature().getReturnType();
323
+ if (returnType instanceof Type_1.ClassType && returnType.getClassSignature().getDeclaringFileSignature()
324
+ .getProjectName() === Builtin_1.Builtin.DUMMY_PROJECT_NAME) {
325
+ returnType.setRealGenericTypes([baseType.getBaseType()]);
326
+ return expr;
327
+ }
328
+ }
329
+ return null;
330
+ }
331
+ static inferInvokeExprWithDeclaredClass(expr, baseType, methodName, scene) {
332
+ var _a;
333
+ let declaredClass = scene.getClass(baseType.getClassSignature());
334
+ if (!declaredClass) {
335
+ const globalClass = scene.getSdkGlobal(baseType.getClassSignature().getClassName());
336
+ if (globalClass instanceof ArkClass_1.ArkClass) {
337
+ declaredClass = globalClass;
338
+ }
339
+ }
340
+ const method = declaredClass ? ModelUtils_1.ModelUtils.findPropertyInClass(methodName, declaredClass) : null;
341
+ if (method instanceof ArkMethod_1.ArkMethod) {
342
+ const methodSignature = method.matchMethodSignature(expr.getArgs());
343
+ TypeInference_1.TypeInference.inferSignatureReturnType(methodSignature, method);
344
+ expr.setMethodSignature(this.replaceMethodSignature(expr.getMethodSignature(), methodSignature));
345
+ expr.setRealGenericTypes(IRInference.getRealTypes(method, declaredClass, baseType));
346
+ if (method.isStatic() && expr instanceof Expr_1.ArkInstanceInvokeExpr) {
347
+ return new Expr_1.ArkStaticInvokeExpr(methodSignature, expr.getArgs(), expr.getRealGenericTypes());
348
+ }
349
+ return expr;
350
+ }
351
+ else if (method instanceof ArkField_1.ArkField) {
352
+ const type = method.getType();
353
+ if (type instanceof Type_1.FunctionType) {
354
+ expr.setMethodSignature(this.generateNewMethodSignature(methodName, type.getMethodSignature()));
355
+ return expr;
356
+ }
357
+ else if (type instanceof Type_1.ClassType && type.getClassSignature().getClassName().endsWith(EtsConst_1.CALL_BACK)) {
358
+ const callback = (_a = scene.getClass(type.getClassSignature())) === null || _a === void 0 ? void 0 : _a.getMethodWithName(Const_1.CALL_SIGNATURE_NAME);
359
+ if (callback) {
360
+ expr.setMethodSignature(callback.getSignature());
361
+ return expr;
362
+ }
363
+ }
364
+ }
365
+ else if (methodName === TSConst_1.CONSTRUCTOR_NAME) { //sdk隐式构造
366
+ const subSignature = new ArkSignature_1.MethodSubSignature(methodName, [], new Type_1.ClassType(baseType.getClassSignature()));
367
+ const signature = new ArkSignature_1.MethodSignature(baseType.getClassSignature(), subSignature);
368
+ expr.setMethodSignature(signature);
369
+ return expr;
370
+ }
371
+ else if (methodName === Builtin_1.Builtin.ITERATOR_NEXT) { //sdk隐式构造
372
+ const returnType = expr.getMethodSignature().getMethodSubSignature().getReturnType();
373
+ if (returnType instanceof Type_1.ClassType && returnType.getClassSignature().getDeclaringFileSignature()
374
+ .getProjectName() === Builtin_1.Builtin.DUMMY_PROJECT_NAME) {
375
+ returnType.setRealGenericTypes(baseType.getRealGenericTypes());
376
+ return expr;
377
+ }
378
+ }
379
+ return null;
380
+ }
381
+ static getRealTypes(method, declaredClass, baseType) {
382
+ let realTypes;
383
+ if (method.getDeclaringArkClass() === declaredClass) {
384
+ realTypes = baseType.getRealGenericTypes();
385
+ }
386
+ else if (declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.getRealTypes()) {
387
+ realTypes = declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.getRealTypes();
388
+ }
389
+ else if (declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.hasComponentDecorator()) {
390
+ realTypes = [new Type_1.ClassType(declaredClass === null || declaredClass === void 0 ? void 0 : declaredClass.getSignature())];
391
+ }
392
+ return realTypes;
393
+ }
394
+ static replaceMethodSignature(init, declared) {
395
+ const className = init.getDeclaringClassSignature().getClassName();
396
+ let classSignature;
397
+ if (declared.getDeclaringClassSignature().getClassName().endsWith('Interface')) {
398
+ classSignature = new ArkSignature_1.AliasClassSignature(className, declared.getDeclaringClassSignature());
399
+ }
400
+ let newSubSignature;
401
+ if (classSignature || newSubSignature) {
402
+ return new ArkSignature_1.MethodSignature(classSignature !== null && classSignature !== void 0 ? classSignature : declared.getDeclaringClassSignature(), newSubSignature !== null && newSubSignature !== void 0 ? newSubSignature : declared.getMethodSubSignature());
403
+ }
404
+ return declared;
405
+ }
406
+ static processForEach(arg, baseType, scene) {
407
+ const argType = arg.getType();
408
+ if (argType instanceof Type_1.FunctionType) {
409
+ const argMethodSignature = argType.getMethodSignature();
410
+ const argMethod = scene.getMethod(argMethodSignature);
411
+ if (argMethod != null && argMethod.getBody()) {
412
+ const body = argMethod.getBody();
413
+ const firstStmt = body.getCfg().getStartingStmt();
414
+ if ((firstStmt instanceof Stmt_1.ArkAssignStmt) && (firstStmt.getRightOp() instanceof Ref_1.ArkParameterRef)) {
415
+ const parameterRef = firstStmt.getRightOp();
416
+ parameterRef.setType(baseType.getBaseType());
417
+ const argMethodParams = argMethod.getSignature().getMethodSubSignature().getParameters();
418
+ const actualParam = argMethodParams[argMethodParams.length - 1];
419
+ actualParam.setType(baseType.getBaseType());
420
+ }
421
+ TypeInference_1.TypeInference.inferTypeInMethod(argMethod);
422
+ }
423
+ }
424
+ else {
425
+ logger.warn(`arg of forEach must be callable`);
426
+ }
427
+ }
428
+ static inferLocal(base, arkMethod) {
429
+ var _a, _b, _c;
430
+ const arkClass = arkMethod.getDeclaringArkClass();
431
+ if (base.getName() === TSConst_1.THIS_NAME) {
432
+ if (!arkClass.isAnonymousClass()) {
433
+ base.setType(new Type_1.ClassType(arkClass.getSignature(), arkClass.getGenericsTypes()));
434
+ }
435
+ return;
436
+ }
437
+ let baseType = base.getType();
438
+ if (baseType instanceof Type_1.UnclearReferenceType) {
439
+ baseType = TypeInference_1.TypeInference.inferUnclearRefName(baseType.getName(), arkClass);
440
+ }
441
+ else if (TypeInference_1.TypeInference.isUnclearType(baseType)) {
442
+ const declaringStmt = base.getDeclaringStmt();
443
+ if (!declaringStmt || !declaringStmt.getOriginalText() || ((_a = declaringStmt.getOriginalText()) === null || _a === void 0 ? void 0 : _a.startsWith(base.getName()))) {
444
+ baseType = (_c = (_b = ModelUtils_1.ModelUtils.findDeclaredLocal(base, arkMethod)) === null || _b === void 0 ? void 0 : _b.getType()) !== null && _c !== void 0 ? _c : TypeInference_1.TypeInference.inferBaseType(base.getName(), arkClass);
445
+ }
446
+ }
447
+ if (baseType && !TypeInference_1.TypeInference.isUnclearType(baseType)) {
448
+ base.setType(baseType);
449
+ }
450
+ }
451
+ static generateNewFieldSignature(ref, arkClass, baseType) {
452
+ if (baseType instanceof Type_1.UnionType) {
453
+ for (let type of baseType.flatType()) {
454
+ if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
455
+ continue;
456
+ }
457
+ let newFieldSignature = this.generateNewFieldSignature(ref, arkClass, type);
458
+ if (!TypeInference_1.TypeInference.isUnclearType(newFieldSignature === null || newFieldSignature === void 0 ? void 0 : newFieldSignature.getType())) {
459
+ return newFieldSignature;
460
+ }
461
+ }
462
+ return null;
463
+ }
464
+ else if (baseType instanceof Type_1.AliasType) {
465
+ return this.generateNewFieldSignature(ref, arkClass, baseType.getOriginalType());
466
+ }
467
+ const fieldName = ref.getFieldName().replace(/[\"|\']/g, '');
468
+ const propertyAndType = TypeInference_1.TypeInference.inferFieldType(baseType, fieldName, arkClass);
469
+ let propertyType = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[1];
470
+ if (propertyType && TypeInference_1.TypeInference.isUnclearType(propertyType)) {
471
+ const newType = TypeInference_1.TypeInference.inferUnclearedType(propertyType, arkClass);
472
+ if (newType) {
473
+ propertyType = newType;
474
+ }
475
+ }
476
+ let staticFlag;
477
+ let signature;
478
+ if (baseType instanceof Type_1.ClassType) {
479
+ const property = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[0];
480
+ if (property instanceof ArkField_1.ArkField) {
481
+ return property.getSignature();
482
+ }
483
+ staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
484
+ (property instanceof ArkMethod_1.ArkMethod && property.isStatic());
485
+ signature = property instanceof ArkMethod_1.ArkMethod ? property.getSignature().getDeclaringClassSignature() : baseType.getClassSignature();
486
+ }
487
+ else if (baseType instanceof Type_1.AnnotationNamespaceType) {
488
+ staticFlag = true;
489
+ signature = baseType.getNamespaceSignature();
490
+ }
491
+ else {
492
+ return null;
493
+ }
494
+ return new ArkSignature_1.FieldSignature(fieldName, signature, propertyType !== null && propertyType !== void 0 ? propertyType : ref.getType(), staticFlag);
495
+ }
496
+ static inferAnonymousClass(anon, declaredSignature, set = new Set()) {
497
+ var _a;
498
+ if (!anon) {
499
+ return;
500
+ }
501
+ const key = anon.getSignature().toString();
502
+ if (set.has(key)) {
503
+ return;
504
+ }
505
+ else {
506
+ set.add(key);
507
+ }
508
+ const scene = anon.getDeclaringArkFile().getScene();
509
+ const declaredClass = scene.getClass(declaredSignature);
510
+ if (!declaredClass) {
511
+ return;
512
+ }
513
+ for (const anonField of anon.getFields()) {
514
+ const property = ModelUtils_1.ModelUtils.findPropertyInClass(anonField.getName(), declaredClass);
515
+ if (property instanceof ArkField_1.ArkField) {
516
+ this.assignAnonField(property, anonField, scene, set);
517
+ }
518
+ }
519
+ for (const anonMethod of anon.getMethods()) {
520
+ const methodSignature = (_a = declaredClass.getMethodWithName(anonMethod.getName())) === null || _a === void 0 ? void 0 : _a.matchMethodSignature(anonMethod.getSubSignature().getParameters());
521
+ if (methodSignature) {
522
+ anonMethod.setImplementationSignature(methodSignature);
523
+ }
524
+ }
525
+ }
526
+ static assignAnonField(property, anonField, scene, set) {
527
+ function deepInfer(anonType, declaredSignature) {
528
+ if (anonType instanceof Type_1.ClassType && anonType.getClassSignature().getClassName().startsWith(Const_1.ANONYMOUS_CLASS_PREFIX)) {
529
+ IRInference.inferAnonymousClass(scene.getClass(anonType.getClassSignature()), declaredSignature, set);
530
+ }
531
+ }
532
+ const type = property.getSignature().getType();
533
+ const lastStmt = anonField.getInitializer().at(-1);
534
+ if (lastStmt instanceof Stmt_1.ArkAssignStmt) {
535
+ const rightType = lastStmt.getRightOp().getType();
536
+ if (type instanceof Type_1.ClassType) {
537
+ deepInfer(rightType, type.getClassSignature());
538
+ }
539
+ else if (type instanceof Type_1.ArrayType && type.getBaseType() instanceof Type_1.ClassType &&
540
+ rightType instanceof Type_1.ArrayType) {
541
+ const baseType = rightType.getBaseType();
542
+ const classSignature = type.getBaseType().getClassSignature();
543
+ if (baseType instanceof Type_1.UnionType) {
544
+ baseType.getTypes().forEach(t => deepInfer(t, classSignature));
545
+ }
546
+ else {
547
+ deepInfer(rightType.getBaseType(), classSignature);
548
+ }
549
+ }
550
+ const leftOp = lastStmt.getLeftOp();
551
+ if (leftOp instanceof Ref_1.AbstractFieldRef) {
552
+ leftOp.setFieldSignature(property.getSignature());
553
+ }
554
+ }
555
+ anonField.setSignature(property.getSignature());
556
+ }
557
+ static inferAliasTypeExpr(expr, arkMethod) {
558
+ const originalObject = expr.getOriginalObject();
559
+ let model;
560
+ if (originalObject instanceof Local_1.Local) {
561
+ model = ModelUtils_1.ModelUtils.findArkModelByRefName(originalObject.getName(), arkMethod.getDeclaringArkClass());
562
+ }
563
+ else if (originalObject instanceof TypeExpr_1.AbstractTypeExpr) {
564
+ originalObject.inferType(arkMethod);
565
+ model = originalObject;
566
+ }
567
+ else if (originalObject instanceof Type_1.Type) {
568
+ const type = TypeInference_1.TypeInference.inferUnclearedType(originalObject, arkMethod.getDeclaringArkClass());
569
+ // If original Object is ClassType, AliasType or UnclearReferenceType with real generic types,
570
+ // the type after infer should be revert back to the object itself.
571
+ if (type instanceof Type_1.ClassType) {
572
+ const scene = arkMethod.getDeclaringArkFile().getScene();
573
+ model = ModelUtils_1.ModelUtils.findArkModelBySignature(type.getClassSignature(), scene);
574
+ }
575
+ else if (type instanceof Type_1.AliasType) {
576
+ const scene = arkMethod.getDeclaringArkFile().getScene();
577
+ model = ModelUtils_1.ModelUtils.findArkModelBySignature(type.getSignature(), scene);
578
+ }
579
+ else if (type) {
580
+ model = type;
581
+ }
582
+ if (expr.getRealGenericTypes() !== undefined && originalObject instanceof Type_1.UnclearReferenceType) {
583
+ expr.setRealGenericTypes(originalObject.getGenericTypes());
584
+ }
585
+ }
586
+ if (Expr_1.AliasTypeExpr.isAliasTypeOriginalModel(model)) {
587
+ expr.setOriginalObject(model);
588
+ }
589
+ return expr;
590
+ }
591
+ static inferTypeQueryExpr(expr, arkMethod) {
592
+ var _a;
593
+ let gTypes = expr.getGenerateTypes();
594
+ if (gTypes) {
595
+ for (let i = 0; i < gTypes.length; i++) {
596
+ const newType = TypeInference_1.TypeInference.inferUnclearedType(gTypes[i], arkMethod.getDeclaringArkClass());
597
+ if (newType) {
598
+ gTypes[i] = newType;
599
+ }
600
+ }
601
+ }
602
+ const opValue = expr.getOpValue();
603
+ let opValueType;
604
+ if (opValue instanceof ArkBaseModel_1.ArkBaseModel) {
605
+ opValueType = (_a = ModelUtils_1.ModelUtils.parseArkBaseModel2Type(opValue)) !== null && _a !== void 0 ? _a : Type_1.UnknownType.getInstance();
606
+ }
607
+ else {
608
+ opValueType = opValue.getType();
609
+ }
610
+ if (!TypeInference_1.TypeInference.isUnclearType(opValueType)) {
611
+ return;
612
+ }
613
+ if (opValue instanceof Local_1.Local) {
614
+ const newOpValueType = TypeInference_1.TypeInference.inferUnclearRefName(opValue.getName(), arkMethod.getDeclaringArkClass());
615
+ const scene = arkMethod.getDeclaringArkFile().getScene();
616
+ if (newOpValueType instanceof Type_1.ClassType) {
617
+ const newOpValue = ModelUtils_1.ModelUtils.findArkModelBySignature(newOpValueType.getClassSignature(), scene);
618
+ if (newOpValue instanceof ArkBaseModel_1.ArkBaseModel) {
619
+ expr.setOpValue(newOpValue);
620
+ }
621
+ }
622
+ else if (newOpValueType instanceof Type_1.FunctionType) {
623
+ const newOpValue = ModelUtils_1.ModelUtils.findArkModelBySignature(newOpValueType.getMethodSignature(), scene);
624
+ if (newOpValue instanceof ArkBaseModel_1.ArkBaseModel) {
625
+ expr.setOpValue(newOpValue);
626
+ }
627
+ }
628
+ else {
629
+ this.inferLocal(opValue, arkMethod);
630
+ }
631
+ }
632
+ else if (opValue instanceof Ref_1.AbstractRef || opValue instanceof Expr_1.AbstractExpr) {
633
+ expr.setOpValue(opValue.inferType(arkMethod));
634
+ }
635
+ }
636
+ static inferKeyofTypeExpr(expr, arkMethod) {
637
+ const opType = expr.getOpType();
638
+ if (TypeInference_1.TypeInference.isUnclearType(opType)) {
639
+ if (opType instanceof TypeExpr_1.TypeQueryExpr) {
640
+ this.inferTypeQueryExpr(opType, arkMethod);
641
+ }
642
+ else {
643
+ const type = TypeInference_1.TypeInference.inferUnclearedType(opType, arkMethod.getDeclaringArkClass());
644
+ if (type) {
645
+ expr.setOpType(type);
646
+ }
647
+ }
648
+ }
649
+ }
650
+ }
651
+ exports.IRInference = IRInference;