arkanalyzer 1.0.5

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 (322) hide show
  1. package/LICENSE +201 -0
  2. package/README.en.md +88 -0
  3. package/README.md +98 -0
  4. package/docs/HowToCreatePR.md +55 -0
  5. package/docs/HowToHandleIssues.md +155 -0
  6. package/docs/quickstart.pdf +0 -0
  7. package/lib/Config.d.ts +26 -0
  8. package/lib/Config.d.ts.map +1 -0
  9. package/lib/Config.js +128 -0
  10. package/lib/Scene.d.ts +125 -0
  11. package/lib/Scene.d.ts.map +1 -0
  12. package/lib/Scene.js +762 -0
  13. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +28 -0
  14. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -0
  15. package/lib/callgraph/algorithm/AbstractAnalysis.js +137 -0
  16. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts +11 -0
  17. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts.map +1 -0
  18. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +71 -0
  19. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts +16 -0
  20. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -0
  21. package/lib/callgraph/algorithm/RapidTypeAnalysis.js +147 -0
  22. package/lib/callgraph/common/Statistics.d.ts +58 -0
  23. package/lib/callgraph/common/Statistics.d.ts.map +1 -0
  24. package/lib/callgraph/common/Statistics.js +203 -0
  25. package/lib/callgraph/model/BaseGraph.d.ts +62 -0
  26. package/lib/callgraph/model/BaseGraph.d.ts.map +1 -0
  27. package/lib/callgraph/model/BaseGraph.js +158 -0
  28. package/lib/callgraph/model/CallGraph.d.ts +94 -0
  29. package/lib/callgraph/model/CallGraph.d.ts.map +1 -0
  30. package/lib/callgraph/model/CallGraph.js +339 -0
  31. package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +16 -0
  32. package/lib/callgraph/model/builder/CallGraphBuilder.d.ts.map +1 -0
  33. package/lib/callgraph/model/builder/CallGraphBuilder.js +106 -0
  34. package/lib/callgraph/pointerAnalysis/Context.d.ts +38 -0
  35. package/lib/callgraph/pointerAnalysis/Context.d.ts.map +1 -0
  36. package/lib/callgraph/pointerAnalysis/Context.js +156 -0
  37. package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts +23 -0
  38. package/lib/callgraph/pointerAnalysis/DummyCallCreator.d.ts.map +1 -0
  39. package/lib/callgraph/pointerAnalysis/DummyCallCreator.js +104 -0
  40. package/lib/callgraph/pointerAnalysis/Pag.d.ts +209 -0
  41. package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -0
  42. package/lib/callgraph/pointerAnalysis/Pag.js +774 -0
  43. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +88 -0
  44. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -0
  45. package/lib/callgraph/pointerAnalysis/PagBuilder.js +821 -0
  46. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +64 -0
  47. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -0
  48. package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +502 -0
  49. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts +9 -0
  50. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.d.ts.map +1 -0
  51. package/lib/callgraph/pointerAnalysis/PointerAnalysisConfig.js +57 -0
  52. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts +58 -0
  53. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts.map +1 -0
  54. package/lib/callgraph/pointerAnalysis/PtsDS.js +234 -0
  55. package/lib/core/base/Constant.d.ts +17 -0
  56. package/lib/core/base/Constant.d.ts.map +1 -0
  57. package/lib/core/base/Constant.js +53 -0
  58. package/lib/core/base/Decorator.d.ts +15 -0
  59. package/lib/core/base/Decorator.d.ts.map +1 -0
  60. package/lib/core/base/Decorator.js +43 -0
  61. package/lib/core/base/DefUseChain.d.ts +9 -0
  62. package/lib/core/base/DefUseChain.d.ts.map +1 -0
  63. package/lib/core/base/DefUseChain.js +25 -0
  64. package/lib/core/base/Expr.d.ts +219 -0
  65. package/lib/core/base/Expr.d.ts.map +1 -0
  66. package/lib/core/base/Expr.js +896 -0
  67. package/lib/core/base/Local.d.ts +40 -0
  68. package/lib/core/base/Local.d.ts.map +1 -0
  69. package/lib/core/base/Local.js +101 -0
  70. package/lib/core/base/Position.d.ts +39 -0
  71. package/lib/core/base/Position.d.ts.map +1 -0
  72. package/lib/core/base/Position.js +86 -0
  73. package/lib/core/base/Ref.d.ts +75 -0
  74. package/lib/core/base/Ref.d.ts.map +1 -0
  75. package/lib/core/base/Ref.js +286 -0
  76. package/lib/core/base/Stmt.d.ts +109 -0
  77. package/lib/core/base/Stmt.d.ts.map +1 -0
  78. package/lib/core/base/Stmt.js +374 -0
  79. package/lib/core/base/Type.d.ts +220 -0
  80. package/lib/core/base/Type.d.ts.map +1 -0
  81. package/lib/core/base/Type.js +477 -0
  82. package/lib/core/base/Value.d.ts +11 -0
  83. package/lib/core/base/Value.d.ts.map +1 -0
  84. package/lib/core/base/Value.js +16 -0
  85. package/lib/core/common/ArkIRTransformer.d.ts +101 -0
  86. package/lib/core/common/ArkIRTransformer.d.ts.map +1 -0
  87. package/lib/core/common/ArkIRTransformer.js +1674 -0
  88. package/lib/core/common/BodyBuilder.d.ts +10 -0
  89. package/lib/core/common/BodyBuilder.d.ts.map +1 -0
  90. package/lib/core/common/BodyBuilder.js +34 -0
  91. package/lib/core/common/Builtin.d.ts +35 -0
  92. package/lib/core/common/Builtin.d.ts.map +1 -0
  93. package/lib/core/common/Builtin.js +78 -0
  94. package/lib/core/common/CfgBuilder.d.ts +136 -0
  95. package/lib/core/common/CfgBuilder.d.ts.map +1 -0
  96. package/lib/core/common/CfgBuilder.js +1241 -0
  97. package/lib/core/common/Const.d.ts +15 -0
  98. package/lib/core/common/Const.d.ts.map +1 -0
  99. package/lib/core/common/Const.js +34 -0
  100. package/lib/core/common/DummyMainCreater.d.ts +48 -0
  101. package/lib/core/common/DummyMainCreater.d.ts.map +1 -0
  102. package/lib/core/common/DummyMainCreater.js +433 -0
  103. package/lib/core/common/EtsConst.d.ts +65 -0
  104. package/lib/core/common/EtsConst.d.ts.map +1 -0
  105. package/lib/core/common/EtsConst.js +918 -0
  106. package/lib/core/common/ExprUseReplacer.d.ts +18 -0
  107. package/lib/core/common/ExprUseReplacer.d.ts.map +1 -0
  108. package/lib/core/common/ExprUseReplacer.js +88 -0
  109. package/lib/core/common/IRUtils.d.ts +7 -0
  110. package/lib/core/common/IRUtils.d.ts.map +1 -0
  111. package/lib/core/common/IRUtils.js +39 -0
  112. package/lib/core/common/ModelUtils.d.ts +61 -0
  113. package/lib/core/common/ModelUtils.d.ts.map +1 -0
  114. package/lib/core/common/ModelUtils.js +628 -0
  115. package/lib/core/common/RefUseReplacer.d.ts +14 -0
  116. package/lib/core/common/RefUseReplacer.d.ts.map +1 -0
  117. package/lib/core/common/RefUseReplacer.js +50 -0
  118. package/lib/core/common/StmtUseReplacer.d.ts +16 -0
  119. package/lib/core/common/StmtUseReplacer.d.ts.map +1 -0
  120. package/lib/core/common/StmtUseReplacer.js +88 -0
  121. package/lib/core/common/TSConst.d.ts +11 -0
  122. package/lib/core/common/TSConst.d.ts.map +1 -0
  123. package/lib/core/common/TSConst.js +28 -0
  124. package/lib/core/common/TypeInference.d.ts +44 -0
  125. package/lib/core/common/TypeInference.d.ts.map +1 -0
  126. package/lib/core/common/TypeInference.js +519 -0
  127. package/lib/core/common/ValueUtil.d.ts +17 -0
  128. package/lib/core/common/ValueUtil.d.ts.map +1 -0
  129. package/lib/core/common/ValueUtil.js +71 -0
  130. package/lib/core/common/VisibleValue.d.ts +37 -0
  131. package/lib/core/common/VisibleValue.d.ts.map +1 -0
  132. package/lib/core/common/VisibleValue.js +212 -0
  133. package/lib/core/dataflow/DataflowProblem.d.ts +21 -0
  134. package/lib/core/dataflow/DataflowProblem.d.ts.map +1 -0
  135. package/lib/core/dataflow/DataflowProblem.js +33 -0
  136. package/lib/core/dataflow/DataflowResult.d.ts +8 -0
  137. package/lib/core/dataflow/DataflowResult.d.ts.map +1 -0
  138. package/lib/core/dataflow/DataflowResult.js +26 -0
  139. package/lib/core/dataflow/DataflowSolver.d.ts +40 -0
  140. package/lib/core/dataflow/DataflowSolver.d.ts.map +1 -0
  141. package/lib/core/dataflow/DataflowSolver.js +318 -0
  142. package/lib/core/dataflow/Edge.d.ts +16 -0
  143. package/lib/core/dataflow/Edge.d.ts.map +1 -0
  144. package/lib/core/dataflow/Edge.js +40 -0
  145. package/lib/core/dataflow/Fact.d.ts +7 -0
  146. package/lib/core/dataflow/Fact.d.ts.map +1 -0
  147. package/lib/core/dataflow/Fact.js +24 -0
  148. package/lib/core/dataflow/TiantAnalysis.d.ts +37 -0
  149. package/lib/core/dataflow/TiantAnalysis.d.ts.map +1 -0
  150. package/lib/core/dataflow/TiantAnalysis.js +326 -0
  151. package/lib/core/dataflow/UndefinedVariable.d.ts +32 -0
  152. package/lib/core/dataflow/UndefinedVariable.d.ts.map +1 -0
  153. package/lib/core/dataflow/UndefinedVariable.js +235 -0
  154. package/lib/core/dataflow/Util.d.ts +8 -0
  155. package/lib/core/dataflow/Util.d.ts.map +1 -0
  156. package/lib/core/dataflow/Util.js +137 -0
  157. package/lib/core/graph/BasicBlock.d.ts +26 -0
  158. package/lib/core/graph/BasicBlock.d.ts.map +1 -0
  159. package/lib/core/graph/BasicBlock.js +92 -0
  160. package/lib/core/graph/Cfg.d.ts +29 -0
  161. package/lib/core/graph/Cfg.d.ts.map +1 -0
  162. package/lib/core/graph/Cfg.js +154 -0
  163. package/lib/core/graph/DominanceFinder.d.ts +16 -0
  164. package/lib/core/graph/DominanceFinder.d.ts.map +1 -0
  165. package/lib/core/graph/DominanceFinder.js +121 -0
  166. package/lib/core/graph/DominanceTree.d.ts +13 -0
  167. package/lib/core/graph/DominanceTree.d.ts.map +1 -0
  168. package/lib/core/graph/DominanceTree.js +70 -0
  169. package/lib/core/graph/ViewTree.d.ts +115 -0
  170. package/lib/core/graph/ViewTree.d.ts.map +1 -0
  171. package/lib/core/graph/ViewTree.js +16 -0
  172. package/lib/core/graph/builder/ViewTreeBuilder.d.ts +204 -0
  173. package/lib/core/graph/builder/ViewTreeBuilder.d.ts.map +1 -0
  174. package/lib/core/graph/builder/ViewTreeBuilder.js +1046 -0
  175. package/lib/core/model/ArkBody.d.ts +22 -0
  176. package/lib/core/model/ArkBody.d.ts.map +1 -0
  177. package/lib/core/model/ArkBody.js +63 -0
  178. package/lib/core/model/ArkClass.d.ts +110 -0
  179. package/lib/core/model/ArkClass.d.ts.map +1 -0
  180. package/lib/core/model/ArkClass.js +315 -0
  181. package/lib/core/model/ArkExport.d.ts +70 -0
  182. package/lib/core/model/ArkExport.d.ts.map +1 -0
  183. package/lib/core/model/ArkExport.js +143 -0
  184. package/lib/core/model/ArkField.d.ts +60 -0
  185. package/lib/core/model/ArkField.d.ts.map +1 -0
  186. package/lib/core/model/ArkField.js +157 -0
  187. package/lib/core/model/ArkFile.d.ts +62 -0
  188. package/lib/core/model/ArkFile.d.ts.map +1 -0
  189. package/lib/core/model/ArkFile.js +160 -0
  190. package/lib/core/model/ArkImport.d.ts +43 -0
  191. package/lib/core/model/ArkImport.d.ts.map +1 -0
  192. package/lib/core/model/ArkImport.js +109 -0
  193. package/lib/core/model/ArkMethod.d.ts +76 -0
  194. package/lib/core/model/ArkMethod.d.ts.map +1 -0
  195. package/lib/core/model/ArkMethod.js +235 -0
  196. package/lib/core/model/ArkNamespace.d.ts +65 -0
  197. package/lib/core/model/ArkNamespace.d.ts.map +1 -0
  198. package/lib/core/model/ArkNamespace.js +182 -0
  199. package/lib/core/model/ArkSignature.d.ts +98 -0
  200. package/lib/core/model/ArkSignature.d.ts.map +1 -0
  201. package/lib/core/model/ArkSignature.js +281 -0
  202. package/lib/core/model/builder/ArkClassBuilder.d.ts +13 -0
  203. package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -0
  204. package/lib/core/model/builder/ArkClassBuilder.js +422 -0
  205. package/lib/core/model/builder/ArkExportBuilder.d.ts +25 -0
  206. package/lib/core/model/builder/ArkExportBuilder.d.ts.map +1 -0
  207. package/lib/core/model/builder/ArkExportBuilder.js +207 -0
  208. package/lib/core/model/builder/ArkFieldBuilder.d.ts +9 -0
  209. package/lib/core/model/builder/ArkFieldBuilder.d.ts.map +1 -0
  210. package/lib/core/model/builder/ArkFieldBuilder.js +189 -0
  211. package/lib/core/model/builder/ArkFileBuilder.d.ts +10 -0
  212. package/lib/core/model/builder/ArkFileBuilder.d.ts.map +1 -0
  213. package/lib/core/model/builder/ArkFileBuilder.js +164 -0
  214. package/lib/core/model/builder/ArkImportBuilder.d.ts +4 -0
  215. package/lib/core/model/builder/ArkImportBuilder.d.ts.map +1 -0
  216. package/lib/core/model/builder/ArkImportBuilder.js +125 -0
  217. package/lib/core/model/builder/ArkMethodBuilder.d.ts +60 -0
  218. package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -0
  219. package/lib/core/model/builder/ArkMethodBuilder.js +419 -0
  220. package/lib/core/model/builder/ArkNamespaceBuilder.d.ts +5 -0
  221. package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -0
  222. package/lib/core/model/builder/ArkNamespaceBuilder.js +171 -0
  223. package/lib/core/model/builder/ArkSignatureBuilder.d.ts +9 -0
  224. package/lib/core/model/builder/ArkSignatureBuilder.d.ts.map +1 -0
  225. package/lib/core/model/builder/ArkSignatureBuilder.js +40 -0
  226. package/lib/core/model/builder/builderUtils.d.ts +18 -0
  227. package/lib/core/model/builder/builderUtils.d.ts.map +1 -0
  228. package/lib/core/model/builder/builderUtils.js +449 -0
  229. package/lib/index.d.ts +77 -0
  230. package/lib/index.d.ts.map +1 -0
  231. package/lib/index.js +190 -0
  232. package/lib/save/ArkStream.d.ts +24 -0
  233. package/lib/save/ArkStream.d.ts.map +1 -0
  234. package/lib/save/ArkStream.js +83 -0
  235. package/lib/save/DotPrinter.d.ts +48 -0
  236. package/lib/save/DotPrinter.d.ts.map +1 -0
  237. package/lib/save/DotPrinter.js +229 -0
  238. package/lib/save/GraphPrinter.d.ts +17 -0
  239. package/lib/save/GraphPrinter.d.ts.map +1 -0
  240. package/lib/save/GraphPrinter.js +135 -0
  241. package/lib/save/JsonPrinter.d.ts +28 -0
  242. package/lib/save/JsonPrinter.d.ts.map +1 -0
  243. package/lib/save/JsonPrinter.js +511 -0
  244. package/lib/save/Printer.d.ts +17 -0
  245. package/lib/save/Printer.d.ts.map +1 -0
  246. package/lib/save/Printer.js +27 -0
  247. package/lib/save/PrinterBuilder.d.ts +38 -0
  248. package/lib/save/PrinterBuilder.d.ts.map +1 -0
  249. package/lib/save/PrinterBuilder.js +102 -0
  250. package/lib/save/serializeArkIR.d.ts +3 -0
  251. package/lib/save/serializeArkIR.d.ts.map +1 -0
  252. package/lib/save/serializeArkIR.js +166 -0
  253. package/lib/save/source/SourceBase.d.ts +32 -0
  254. package/lib/save/source/SourceBase.d.ts.map +1 -0
  255. package/lib/save/source/SourceBase.js +93 -0
  256. package/lib/save/source/SourceBody.d.ts +60 -0
  257. package/lib/save/source/SourceBody.d.ts.map +1 -0
  258. package/lib/save/source/SourceBody.js +292 -0
  259. package/lib/save/source/SourceClass.d.ts +27 -0
  260. package/lib/save/source/SourceClass.d.ts.map +1 -0
  261. package/lib/save/source/SourceClass.js +202 -0
  262. package/lib/save/source/SourceField.d.ts +15 -0
  263. package/lib/save/source/SourceField.d.ts.map +1 -0
  264. package/lib/save/source/SourceField.js +68 -0
  265. package/lib/save/source/SourceFilePrinter.d.ts +14 -0
  266. package/lib/save/source/SourceFilePrinter.d.ts.map +1 -0
  267. package/lib/save/source/SourceFilePrinter.js +73 -0
  268. package/lib/save/source/SourceMethod.d.ts +24 -0
  269. package/lib/save/source/SourceMethod.d.ts.map +1 -0
  270. package/lib/save/source/SourceMethod.js +170 -0
  271. package/lib/save/source/SourceModule.d.ts +18 -0
  272. package/lib/save/source/SourceModule.d.ts.map +1 -0
  273. package/lib/save/source/SourceModule.js +120 -0
  274. package/lib/save/source/SourceNamespace.d.ts +13 -0
  275. package/lib/save/source/SourceNamespace.d.ts.map +1 -0
  276. package/lib/save/source/SourceNamespace.js +80 -0
  277. package/lib/save/source/SourceStmt.d.ts +172 -0
  278. package/lib/save/source/SourceStmt.d.ts.map +1 -0
  279. package/lib/save/source/SourceStmt.js +757 -0
  280. package/lib/save/source/SourceTransformer.d.ts +37 -0
  281. package/lib/save/source/SourceTransformer.d.ts.map +1 -0
  282. package/lib/save/source/SourceTransformer.js +338 -0
  283. package/lib/save/source/SourceUtils.d.ts +25 -0
  284. package/lib/save/source/SourceUtils.d.ts.map +1 -0
  285. package/lib/save/source/SourceUtils.js +201 -0
  286. package/lib/transformer/FunctionTransformer.d.ts +3 -0
  287. package/lib/transformer/FunctionTransformer.d.ts.map +1 -0
  288. package/lib/transformer/FunctionTransformer.js +17 -0
  289. package/lib/transformer/SceneTransformer.d.ts +3 -0
  290. package/lib/transformer/SceneTransformer.d.ts.map +1 -0
  291. package/lib/transformer/SceneTransformer.js +17 -0
  292. package/lib/transformer/StaticSingleAssignmentFormer.d.ts +13 -0
  293. package/lib/transformer/StaticSingleAssignmentFormer.d.ts.map +1 -0
  294. package/lib/transformer/StaticSingleAssignmentFormer.js +259 -0
  295. package/lib/transformer/Transformer.d.ts +7 -0
  296. package/lib/transformer/Transformer.d.ts.map +1 -0
  297. package/lib/transformer/Transformer.js +22 -0
  298. package/lib/utils/CfgStructualAnalysis.d.ts +93 -0
  299. package/lib/utils/CfgStructualAnalysis.d.ts.map +1 -0
  300. package/lib/utils/CfgStructualAnalysis.js +955 -0
  301. package/lib/utils/FileUtils.d.ts +18 -0
  302. package/lib/utils/FileUtils.d.ts.map +1 -0
  303. package/lib/utils/FileUtils.js +131 -0
  304. package/lib/utils/callGraphUtils.d.ts +31 -0
  305. package/lib/utils/callGraphUtils.d.ts.map +1 -0
  306. package/lib/utils/callGraphUtils.js +208 -0
  307. package/lib/utils/entryMethodUtils.d.ts +16 -0
  308. package/lib/utils/entryMethodUtils.d.ts.map +1 -0
  309. package/lib/utils/entryMethodUtils.js +139 -0
  310. package/lib/utils/getAllFiles.d.ts +10 -0
  311. package/lib/utils/getAllFiles.d.ts.map +1 -0
  312. package/lib/utils/getAllFiles.js +91 -0
  313. package/lib/utils/json5parser.d.ts +7 -0
  314. package/lib/utils/json5parser.d.ts.map +1 -0
  315. package/lib/utils/json5parser.js +146 -0
  316. package/lib/utils/logger.d.ts +19 -0
  317. package/lib/utils/logger.d.ts.map +1 -0
  318. package/lib/utils/logger.js +90 -0
  319. package/lib/utils/pathTransfer.d.ts +2 -0
  320. package/lib/utils/pathTransfer.d.ts.map +1 -0
  321. package/lib/utils/pathTransfer.js +25 -0
  322. package/package.json +29 -0
@@ -0,0 +1,1674 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ var __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
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.ArkIRTransformer = exports.DUMMY_INITIALIZER_STMT = void 0;
41
+ const Expr_1 = require("../base/Expr");
42
+ const Ref_1 = require("../base/Ref");
43
+ const ts = __importStar(require("ohos-typescript"));
44
+ const Local_1 = require("../base/Local");
45
+ const Stmt_1 = require("../base/Stmt");
46
+ const Type_1 = require("../base/Type");
47
+ const Constant_1 = require("../base/Constant");
48
+ const ValueUtil_1 = require("./ValueUtil");
49
+ const ArkSignature_1 = require("../model/ArkSignature");
50
+ const logger_1 = __importStar(require("../../utils/logger"));
51
+ const IRUtils_1 = require("./IRUtils");
52
+ const ArkMethod_1 = require("../model/ArkMethod");
53
+ const ArkMethodBuilder_1 = require("../model/builder/ArkMethodBuilder");
54
+ const ArkClassBuilder_1 = require("../model/builder/ArkClassBuilder");
55
+ const ArkClass_1 = require("../model/ArkClass");
56
+ const ArkSignatureBuilder_1 = require("../model/builder/ArkSignatureBuilder");
57
+ const EtsConst_1 = require("./EtsConst");
58
+ const Position_1 = require("../base/Position");
59
+ const ModelUtils_1 = require("./ModelUtils");
60
+ const Builtin_1 = require("./Builtin");
61
+ const TSConst_1 = require("./TSConst");
62
+ const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'ArkIRTransformer');
63
+ exports.DUMMY_INITIALIZER_STMT = 'dummyInitializerStmt';
64
+ class ArkIRTransformer {
65
+ constructor(sourceFile, declaringMethod) {
66
+ this.tempLocalPrefix = '$temp';
67
+ this.tempLocalIndex = 0;
68
+ this.locals = new Map();
69
+ this.inBuilderMethod = false;
70
+ this.stmtToOriginalStmt = new Map();
71
+ this.aliasTypeMap = new Map();
72
+ this.builderMethodContextFlag = false;
73
+ this.sourceFile = sourceFile;
74
+ this.declaringMethod = declaringMethod;
75
+ this.thisLocal = new Local_1.Local(TSConst_1.THIS_NAME, declaringMethod.getDeclaringArkClass().getSignature().getType());
76
+ this.locals.set(this.thisLocal.getName(), this.thisLocal);
77
+ this.inBuilderMethod = ModelUtils_1.ModelUtils.isArkUIBuilderMethod(declaringMethod);
78
+ }
79
+ getLocals() {
80
+ return new Set(this.locals.values());
81
+ }
82
+ getThisLocal() {
83
+ return this.thisLocal;
84
+ }
85
+ getStmtToOriginalStmt() {
86
+ return this.stmtToOriginalStmt;
87
+ }
88
+ getAliasTypeMap() {
89
+ return this.aliasTypeMap;
90
+ }
91
+ prebuildStmts() {
92
+ const stmts = [];
93
+ let index = 0;
94
+ for (const methodParameter of this.declaringMethod.getParameters()) {
95
+ const parameterRef = new Ref_1.ArkParameterRef(index, methodParameter.getType());
96
+ stmts.push(new Stmt_1.ArkAssignStmt(this.getOrCreatLocal(methodParameter.getName(), parameterRef.getType()), parameterRef));
97
+ index++;
98
+ }
99
+ const thisRef = new Ref_1.ArkThisRef(this.getThisLocal().getType());
100
+ stmts.push(new Stmt_1.ArkAssignStmt(this.getThisLocal(), thisRef));
101
+ return stmts;
102
+ }
103
+ tsNodeToStmts(node) {
104
+ let stmts = [];
105
+ if (ts.isExpressionStatement(node)) {
106
+ stmts = this.expressionStatementToStmts(node);
107
+ }
108
+ else if (ts.isTypeAliasDeclaration(node)) {
109
+ stmts = this.typeAliasDeclarationToStmts(node);
110
+ }
111
+ else if (ts.isBlock(node)) {
112
+ stmts = this.blockToStmts(node);
113
+ }
114
+ else if (ts.isSwitchStatement(node)) {
115
+ stmts = this.switchStatementToStmts(node);
116
+ }
117
+ else if (ts.isForStatement(node)) {
118
+ stmts = this.forStatementToStmts(node);
119
+ }
120
+ else if (ts.isForInStatement(node) || ts.isForOfStatement(node)) {
121
+ stmts = this.rangeForStatementToStmts(node);
122
+ }
123
+ else if (ts.isWhileStatement(node)) {
124
+ stmts = this.whileStatementToStmts(node);
125
+ }
126
+ else if (ts.isDoStatement(node)) {
127
+ stmts = this.doStatementToStmts(node);
128
+ }
129
+ else if (ts.isVariableStatement(node)) {
130
+ stmts = this.variableStatementToStmts(node);
131
+ }
132
+ else if (ts.isVariableDeclarationList(node)) {
133
+ stmts = this.variableDeclarationListToStmts(node);
134
+ }
135
+ else if (ts.isIfStatement(node)) {
136
+ stmts = this.ifStatementToStmts(node);
137
+ }
138
+ else if (ts.isBreakStatement(node) || ts.isContinueStatement(node)) {
139
+ stmts = this.gotoStatementToStmts(node);
140
+ }
141
+ else if (ts.isThrowStatement(node)) {
142
+ stmts = this.throwStatementToStmts(node);
143
+ }
144
+ else if (ts.isCatchClause(node)) {
145
+ stmts = this.catchClauseToStmts(node);
146
+ }
147
+ else if (ts.isReturnStatement(node)) {
148
+ stmts = this.returnStatementToStmts(node);
149
+ }
150
+ this.mapStmtsToTsStmt(stmts, node);
151
+ return stmts;
152
+ }
153
+ returnStatementToStmts(returnStatement) {
154
+ const stmts = [];
155
+ if (returnStatement.expression) {
156
+ let { value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts, } = this.tsNodeToValueAndStmts(returnStatement.expression);
157
+ stmts.push(...exprStmts);
158
+ if (IRUtils_1.IRUtils.moreThanOneAddress(exprValue)) {
159
+ ({
160
+ value: exprValue,
161
+ valueOriginalPositions: exprPositions,
162
+ stmts: exprStmts,
163
+ } = this.generateAssignStmtForValue(exprValue, exprPositions));
164
+ stmts.push(...exprStmts);
165
+ }
166
+ const returnStmt = new Stmt_1.ArkReturnStmt(exprValue);
167
+ returnStmt.setOperandOriginalPositions(exprPositions);
168
+ stmts.push(returnStmt);
169
+ }
170
+ else {
171
+ stmts.push(new Stmt_1.ArkReturnVoidStmt());
172
+ }
173
+ return stmts;
174
+ }
175
+ blockToStmts(block) {
176
+ const stmts = [];
177
+ for (const statement of block.statements) {
178
+ stmts.push(...this.tsNodeToStmts(statement));
179
+ }
180
+ return stmts;
181
+ }
182
+ expressionStatementToStmts(expressionStatement) {
183
+ return this.expressionToStmts(expressionStatement.expression);
184
+ }
185
+ expressionToStmts(expression) {
186
+ const { value: exprValue, valueOriginalPositions: exprPositions, stmts: stmts } = this.tsNodeToValueAndStmts(expression);
187
+ if (exprValue instanceof Expr_1.AbstractInvokeExpr) {
188
+ const invokeStmt = new Stmt_1.ArkInvokeStmt(exprValue);
189
+ invokeStmt.setOperandOriginalPositions(exprPositions);
190
+ stmts.push(invokeStmt);
191
+ let hasRepeat = false;
192
+ for (const stmt of stmts) {
193
+ if ((stmt instanceof Stmt_1.ArkAssignStmt) && (stmt.getRightOp() instanceof Expr_1.ArkStaticInvokeExpr)) {
194
+ const rightOp = stmt.getRightOp();
195
+ if (rightOp.getMethodSignature().getMethodSubSignature().getMethodName() === EtsConst_1.COMPONENT_REPEAT) {
196
+ const createMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_REPEAT, EtsConst_1.COMPONENT_CREATE_FUNCTION);
197
+ const createInvokeExpr = new Expr_1.ArkStaticInvokeExpr(createMethodSignature, rightOp.getArgs());
198
+ stmt.setRightOp(createInvokeExpr);
199
+ hasRepeat = true;
200
+ }
201
+ }
202
+ }
203
+ if (hasRepeat) {
204
+ const popMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_REPEAT, EtsConst_1.COMPONENT_POP_FUNCTION);
205
+ const popInvokeExpr = new Expr_1.ArkStaticInvokeExpr(popMethodSignature, []);
206
+ const popInvokeStmt = new Stmt_1.ArkInvokeStmt(popInvokeExpr);
207
+ stmts.push(popInvokeStmt);
208
+ }
209
+ }
210
+ else if (exprValue instanceof Expr_1.AbstractExpr) {
211
+ const { stmts: exprStmts } = this.generateAssignStmtForValue(exprValue, exprPositions);
212
+ stmts.push(...exprStmts);
213
+ }
214
+ return stmts;
215
+ }
216
+ typeAliasDeclarationToStmts(typeAliasDeclaration) {
217
+ const aliasName = typeAliasDeclaration.name.text;
218
+ const originalType = this.resolveTypeNode(typeAliasDeclaration.type);
219
+ const aliasType = new Type_1.AliasType(aliasName, originalType, new ArkSignature_1.LocalSignature(aliasName, this.declaringMethod.getSignature()));
220
+ const sourceCode = typeAliasDeclaration.getText(this.sourceFile);
221
+ const aliasTypePosition = Position_1.LineColPosition.buildFromNode(typeAliasDeclaration, this.sourceFile);
222
+ const aliasTypeDeclaration = new Type_1.AliasTypeDeclaration(sourceCode, aliasTypePosition);
223
+ this.aliasTypeMap.set(aliasName, [aliasType, aliasTypeDeclaration]);
224
+ return [];
225
+ }
226
+ switchStatementToStmts(switchStatement) {
227
+ const stmts = [];
228
+ let { value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts, } = this.tsNodeToValueAndStmts(switchStatement.expression);
229
+ stmts.push(...exprStmts);
230
+ if (IRUtils_1.IRUtils.moreThanOneAddress(exprValue)) {
231
+ const { value: newExprValue, stmts: exprStmts } = this.generateAssignStmtForValue(exprValue, exprPositions);
232
+ stmts.push(...exprStmts);
233
+ exprValue = newExprValue;
234
+ }
235
+ const caseValues = [];
236
+ for (const clause of switchStatement.caseBlock.clauses) {
237
+ if (ts.isCaseClause(clause)) {
238
+ let { value: clauseValue, valueOriginalPositions: clausePositions, stmts: clauseStmts, } = this.tsNodeToValueAndStmts(switchStatement.expression);
239
+ stmts.push(...clauseStmts);
240
+ if (IRUtils_1.IRUtils.moreThanOneAddress(clauseValue)) {
241
+ const { value: newClauseValue, stmts: clauseStmts, } = this.generateAssignStmtForValue(exprValue, clausePositions);
242
+ stmts.push(...clauseStmts);
243
+ clauseValue = newClauseValue;
244
+ }
245
+ caseValues.push(clauseValue);
246
+ }
247
+ }
248
+ return stmts;
249
+ }
250
+ forStatementToStmts(forStatement) {
251
+ const stmts = [];
252
+ if (forStatement.initializer) {
253
+ stmts.push(...this.tsNodeToValueAndStmts(forStatement.initializer).stmts);
254
+ }
255
+ const dummyInitializerStmt = new Stmt_1.OriginalStmt(exports.DUMMY_INITIALIZER_STMT, Position_1.LineColPosition.DEFAULT);
256
+ stmts.push(dummyInitializerStmt);
257
+ if (forStatement.condition) {
258
+ const { value: conditionValue, stmts: conditionStmts, } = this.conditionToValueAndStmts(forStatement.condition);
259
+ stmts.push(...conditionStmts);
260
+ stmts.push(new Stmt_1.ArkIfStmt(conditionValue));
261
+ }
262
+ if (forStatement.incrementor) {
263
+ stmts.push(...this.tsNodeToValueAndStmts(forStatement.incrementor).stmts);
264
+ }
265
+ return stmts;
266
+ }
267
+ rangeForStatementToStmts(forOfStatement) {
268
+ const stmts = [];
269
+ let { value: iterableValue, valueOriginalPositions: iterablePositions, stmts: iterableStmts, } = this.tsNodeToValueAndStmts(forOfStatement.expression);
270
+ stmts.push(...iterableStmts);
271
+ if (!(iterableValue instanceof Local_1.Local)) {
272
+ ({ value: iterableValue, valueOriginalPositions: iterablePositions, stmts: iterableStmts } =
273
+ this.generateAssignStmtForValue(iterableValue, iterablePositions));
274
+ stmts.push(...iterableStmts);
275
+ }
276
+ const iteratorMethodSubSignature = new ArkSignature_1.MethodSubSignature(Builtin_1.Builtin.ITERATOR_FUNCTION, [], Builtin_1.Builtin.ITERATOR_CLASS_TYPE);
277
+ const iteratorMethodSignature = new ArkSignature_1.MethodSignature(ArkSignature_1.ClassSignature.DEFAULT, iteratorMethodSubSignature);
278
+ const iteratorInvokeExpr = new Expr_1.ArkInstanceInvokeExpr(iterableValue, iteratorMethodSignature, []);
279
+ const iteratorInvokeExprPositions = [iterablePositions[0], ...iterablePositions];
280
+ const { value: iterator, valueOriginalPositions: iteratorPositions, stmts: iteratorStmts, } = this.generateAssignStmtForValue(iteratorInvokeExpr, iteratorInvokeExprPositions);
281
+ stmts.push(...iteratorStmts);
282
+ iterator.setType(Builtin_1.Builtin.ITERATOR_CLASS_TYPE);
283
+ const nextMethodSubSignature = new ArkSignature_1.MethodSubSignature(Builtin_1.Builtin.ITERATOR_NEXT, [], Builtin_1.Builtin.ITERATOR_RESULT_CLASS_TYPE);
284
+ const nextMethodSignature = new ArkSignature_1.MethodSignature(ArkSignature_1.ClassSignature.DEFAULT, nextMethodSubSignature);
285
+ const iteratorNextInvokeExpr = new Expr_1.ArkInstanceInvokeExpr(iterator, nextMethodSignature, []);
286
+ const iteratorNextInvokeExprPositions = [iteratorPositions[0], ...iteratorPositions];
287
+ const { value: iteratorResult, valueOriginalPositions: iteratorResultPositions, stmts: iteratorResultStmts, } = this.generateAssignStmtForValue(iteratorNextInvokeExpr, iteratorNextInvokeExprPositions);
288
+ stmts.push(...iteratorResultStmts);
289
+ iteratorResult.setType(Builtin_1.Builtin.ITERATOR_RESULT_CLASS_TYPE);
290
+ const doneFieldSignature = new ArkSignature_1.FieldSignature(Builtin_1.Builtin.ITERATOR_RESULT_DONE, Builtin_1.Builtin.ITERATOR_RESULT_CLASS_SIGNATURE, Type_1.BooleanType.getInstance(), false);
291
+ const doneFieldRef = new Ref_1.ArkInstanceFieldRef(iteratorResult, doneFieldSignature);
292
+ const doneFieldRefPositions = [iteratorResultPositions[0], ...iteratorResultPositions];
293
+ const { value: doneFlag, valueOriginalPositions: doneFlagPositions, stmts: doneFlagStmts, } = this.generateAssignStmtForValue(doneFieldRef, doneFieldRefPositions);
294
+ stmts.push(...doneFlagStmts);
295
+ doneFlag.setType(Type_1.BooleanType.getInstance());
296
+ const conditionExpr = new Expr_1.ArkConditionExpr(doneFlag, ValueUtil_1.ValueUtil.getBooleanConstant(true), Expr_1.RelationalBinaryOperator.Equality);
297
+ const conditionExprPositions = [doneFlagPositions[0], ...doneFlagPositions, Position_1.FullPosition.DEFAULT];
298
+ const ifStmt = new Stmt_1.ArkIfStmt(conditionExpr);
299
+ ifStmt.setOperandOriginalPositions(conditionExprPositions);
300
+ stmts.push(ifStmt);
301
+ const valueFieldSignature = new ArkSignature_1.FieldSignature(Builtin_1.Builtin.ITERATOR_RESULT_VALUE, Builtin_1.Builtin.ITERATOR_RESULT_CLASS_SIGNATURE, Type_1.UnknownType.getInstance(), false);
302
+ const valueFieldRef = new Ref_1.ArkInstanceFieldRef(iteratorResult, valueFieldSignature);
303
+ const valueFieldRefPositions = [iteratorResultPositions[0], ...iteratorResultPositions];
304
+ const { value: yieldValue, valueOriginalPositions: yieldValuePositions, stmts: yieldValueStmts, } = this.generateAssignStmtForValue(valueFieldRef, valueFieldRefPositions);
305
+ stmts.push(...yieldValueStmts);
306
+ // TODO: Support generics and then fill in the exact type
307
+ const castExpr = new Expr_1.ArkCastExpr(yieldValue, Type_1.UnknownType.getInstance());
308
+ const castExprPositions = [yieldValuePositions[0], ...yieldValuePositions];
309
+ if (ts.isVariableDeclarationList(forOfStatement.initializer)) {
310
+ const variableDeclarationList = forOfStatement.initializer;
311
+ const isConst = (variableDeclarationList.flags & ts.NodeFlags.Const) != 0;
312
+ const variableDeclaration = variableDeclarationList.declarations[0];
313
+ if (ts.isArrayBindingPattern(variableDeclaration.name)) {
314
+ const { value: arrayItem, valueOriginalPositions: arrayItemPositions, stmts: arrayItemStmts, } = this.generateAssignStmtForValue(castExpr, castExprPositions);
315
+ stmts.push(...arrayItemStmts);
316
+ arrayItem.setType(new Type_1.ArrayType(Type_1.UnknownType.getInstance(), 1));
317
+ const elements = variableDeclaration.name.elements;
318
+ let index = 0;
319
+ for (const element of elements) {
320
+ const arrayRef = new Ref_1.ArkArrayRef(arrayItem, new Constant_1.Constant(index.toString(), Type_1.NumberType.getInstance()));
321
+ const arrayRefPositions = [arrayItemPositions[0], ...arrayItemPositions, Position_1.FullPosition.DEFAULT];
322
+ const item = new Local_1.Local(element.getText(this.sourceFile));
323
+ const itemPosition = Position_1.FullPosition.buildFromNode(element, this.sourceFile);
324
+ item.setConstFlag(isConst);
325
+ const assignStmt = new Stmt_1.ArkAssignStmt(item, arrayRef);
326
+ assignStmt.setOperandOriginalPositions([itemPosition, ...arrayRefPositions]);
327
+ stmts.push(assignStmt);
328
+ index++;
329
+ }
330
+ }
331
+ else if (ts.isObjectBindingPattern(variableDeclaration.name)) {
332
+ const { value: objectItem, valueOriginalPositions: objectItemPositions, stmts: objectItemStmts, } = this.generateAssignStmtForValue(castExpr, castExprPositions);
333
+ stmts.push(...objectItemStmts);
334
+ const elements = variableDeclaration.name.elements;
335
+ for (const element of elements) {
336
+ const fieldName = element.propertyName ? element.propertyName.getText(this.sourceFile) : element.name.getText(this.sourceFile);
337
+ const fieldSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildFieldSignatureFromFieldName(fieldName);
338
+ const fieldRef = new Ref_1.ArkInstanceFieldRef(objectItem, fieldSignature);
339
+ const fieldRefPositions = [objectItemPositions[0], ...objectItemPositions];
340
+ const fieldLocal = this.getOrCreatLocal(element.name.getText(this.sourceFile));
341
+ const fieldLocalPosition = Position_1.FullPosition.buildFromNode(element, this.sourceFile);
342
+ fieldLocal.setConstFlag(isConst);
343
+ const assignStmt = new Stmt_1.ArkAssignStmt(fieldLocal, fieldRef);
344
+ assignStmt.setOperandOriginalPositions([fieldLocalPosition, ...fieldRefPositions]);
345
+ stmts.push(assignStmt);
346
+ }
347
+ }
348
+ else {
349
+ const item = this.getOrCreatLocal(variableDeclaration.name.getText(this.sourceFile));
350
+ item.setConstFlag(isConst);
351
+ stmts.push(new Stmt_1.ArkAssignStmt(item, castExpr));
352
+ }
353
+ }
354
+ else {
355
+ const { value: item, valueOriginalPositions: itemPositions, stmts: itemStmts } = this.tsNodeToValueAndStmts(forOfStatement.initializer);
356
+ stmts.push(...itemStmts);
357
+ const assignStmt = new Stmt_1.ArkAssignStmt(item, castExpr);
358
+ assignStmt.setOperandOriginalPositions([...itemPositions, ...castExprPositions]);
359
+ stmts.push(assignStmt);
360
+ }
361
+ return stmts;
362
+ }
363
+ whileStatementToStmts(whileStatement) {
364
+ const stmts = [];
365
+ const dummyInitializerStmt = new Stmt_1.OriginalStmt(exports.DUMMY_INITIALIZER_STMT, Position_1.LineColPosition.DEFAULT);
366
+ stmts.push(dummyInitializerStmt);
367
+ const { value: conditionExpr, stmts: conditionStmts, } = this.conditionToValueAndStmts(whileStatement.expression);
368
+ stmts.push(...conditionStmts);
369
+ stmts.push(new Stmt_1.ArkIfStmt(conditionExpr));
370
+ return stmts;
371
+ }
372
+ doStatementToStmts(doStatement) {
373
+ const stmts = [];
374
+ const { value: conditionExpr, stmts: conditionStmts, } = this.conditionToValueAndStmts(doStatement.expression);
375
+ stmts.push(...conditionStmts);
376
+ stmts.push(new Stmt_1.ArkIfStmt(conditionExpr));
377
+ return stmts;
378
+ }
379
+ variableStatementToStmts(variableStatement) {
380
+ return this.variableDeclarationListToStmts(variableStatement.declarationList);
381
+ }
382
+ variableDeclarationListToStmts(variableDeclarationList) {
383
+ return this.variableDeclarationListToValueAndStmts(variableDeclarationList).stmts;
384
+ }
385
+ ifStatementToStmts(ifStatement) {
386
+ const stmts = [];
387
+ if (this.inBuilderMethod) {
388
+ const { value: conditionExpr, valueOriginalPositions: conditionExprPositions, stmts: conditionStmts, } = this.conditionToValueAndStmts(ifStatement.expression);
389
+ stmts.push(...conditionStmts);
390
+ const createMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_IF, EtsConst_1.COMPONENT_CREATE_FUNCTION);
391
+ const { value: conditionLocal, valueOriginalPositions: conditionLocalPositions, stmts: assignConditionStmts } = this.generateAssignStmtForValue(conditionExpr, conditionExprPositions);
392
+ stmts.push(...assignConditionStmts);
393
+ const createInvokeExpr = new Expr_1.ArkStaticInvokeExpr(createMethodSignature, [conditionLocal]);
394
+ const createInvokeExprPositions = [conditionLocalPositions[0], ...conditionLocalPositions];
395
+ const { stmts: createStmts } = this.generateAssignStmtForValue(createInvokeExpr, createInvokeExprPositions);
396
+ stmts.push(...createStmts);
397
+ const branchMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_IF, EtsConst_1.COMPONENT_BRANCH_FUNCTION);
398
+ const branchInvokeExpr = new Expr_1.ArkStaticInvokeExpr(branchMethodSignature, [ValueUtil_1.ValueUtil.getOrCreateNumberConst(0)]);
399
+ const branchInvokeExprPositions = [conditionLocalPositions[0], Position_1.FullPosition.DEFAULT];
400
+ const branchInvokeStmt = new Stmt_1.ArkInvokeStmt(branchInvokeExpr);
401
+ branchInvokeStmt.setOperandOriginalPositions(branchInvokeExprPositions);
402
+ stmts.push(branchInvokeStmt);
403
+ stmts.push(...this.tsNodeToStmts(ifStatement.thenStatement));
404
+ if (ifStatement.elseStatement) {
405
+ const branchElseMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_IF, EtsConst_1.COMPONENT_BRANCH_FUNCTION);
406
+ const branchElseInvokeExpr = new Expr_1.ArkStaticInvokeExpr(branchElseMethodSignature, [ValueUtil_1.ValueUtil.getOrCreateNumberConst(1)]);
407
+ const branchElseInvokeExprPositions = [Position_1.FullPosition.buildFromNode(ifStatement.elseStatement, this.sourceFile), Position_1.FullPosition.DEFAULT];
408
+ const branchElseInvokeStmt = new Stmt_1.ArkInvokeStmt(branchElseInvokeExpr);
409
+ branchElseInvokeStmt.setOperandOriginalPositions(branchElseInvokeExprPositions);
410
+ stmts.push(branchElseInvokeStmt);
411
+ stmts.push(...this.tsNodeToStmts(ifStatement.elseStatement));
412
+ }
413
+ const popMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_IF, EtsConst_1.COMPONENT_POP_FUNCTION);
414
+ const popInvokeExpr = new Expr_1.ArkStaticInvokeExpr(popMethodSignature, []);
415
+ const popInvokeStmt = new Stmt_1.ArkInvokeStmt(popInvokeExpr);
416
+ stmts.push(popInvokeStmt);
417
+ }
418
+ else {
419
+ const { value: conditionExpr, valueOriginalPositions: conditionExprPositions, stmts: conditionStmts, } = this.conditionToValueAndStmts(ifStatement.expression);
420
+ stmts.push(...conditionStmts);
421
+ const ifStmt = new Stmt_1.ArkIfStmt(conditionExpr);
422
+ ifStmt.setOperandOriginalPositions(conditionExprPositions);
423
+ stmts.push(ifStmt);
424
+ }
425
+ return stmts;
426
+ }
427
+ gotoStatementToStmts(gotoStatement) {
428
+ return [];
429
+ }
430
+ throwStatementToStmts(throwStatement) {
431
+ const stmts = [];
432
+ const { value: throwValue, valueOriginalPositions: throwValuePositions, stmts: throwStmts, } = this.tsNodeToValueAndStmts(throwStatement.expression);
433
+ stmts.push(...throwStmts);
434
+ const throwStmt = new Stmt_1.ArkThrowStmt(throwValue);
435
+ throwStmt.setOperandOriginalPositions(throwValuePositions);
436
+ stmts.push(throwStmt);
437
+ return stmts;
438
+ }
439
+ catchClauseToStmts(catchClause) {
440
+ const stmts = [];
441
+ if (catchClause.variableDeclaration) {
442
+ const { value: catchValue, valueOriginalPositions: catchValuePositions, stmts: catchStmts, } = this.tsNodeToValueAndStmts(catchClause.variableDeclaration);
443
+ stmts.push(...catchStmts);
444
+ const caughtExceptionRef = new Ref_1.ArkCaughtExceptionRef(Type_1.UnknownType.getInstance());
445
+ const assignStmt = new Stmt_1.ArkAssignStmt(catchValue, caughtExceptionRef);
446
+ assignStmt.setOperandOriginalPositions(catchValuePositions);
447
+ stmts.push(assignStmt);
448
+ }
449
+ return stmts;
450
+ }
451
+ tsNodeToValueAndStmts(node) {
452
+ if (ts.isBinaryExpression(node)) {
453
+ return this.binaryExpressionToValueAndStmts(node);
454
+ }
455
+ else if (ts.isCallExpression(node)) {
456
+ return this.callExpressionToValueAndStmts(node);
457
+ }
458
+ else if (ts.isVariableDeclarationList(node)) {
459
+ return this.variableDeclarationListToValueAndStmts(node);
460
+ }
461
+ else if (ts.isIdentifier(node)) {
462
+ return this.identifierToValueAndStmts(node);
463
+ }
464
+ else if (ts.isPropertyAccessExpression(node)) {
465
+ return this.propertyAccessExpressionToValue(node);
466
+ }
467
+ else if (ts.isPrefixUnaryExpression(node)) {
468
+ return this.prefixUnaryExpressionToValueAndStmts(node);
469
+ }
470
+ else if (ts.isPostfixUnaryExpression(node)) {
471
+ return this.postfixUnaryExpressionToValueAndStmts(node);
472
+ }
473
+ else if (ts.isTemplateExpression(node)) {
474
+ return this.templateExpressionToValueAndStmts(node);
475
+ }
476
+ else if (ts.isAwaitExpression(node)) {
477
+ return this.awaitExpressionToValueAndStmts(node);
478
+ }
479
+ else if (ts.isYieldExpression(node)) {
480
+ return this.yieldExpressionToValueAndStmts(node);
481
+ }
482
+ else if (ts.isDeleteExpression(node)) {
483
+ return this.deleteExpressionToValueAndStmts(node);
484
+ }
485
+ else if (ts.isVoidExpression(node)) {
486
+ return this.voidExpressionToValueAndStmts(node);
487
+ }
488
+ else if (ts.isElementAccessExpression(node)) {
489
+ return this.elementAccessExpressionToValueAndStmts(node);
490
+ }
491
+ else if (ts.isNewExpression(node)) {
492
+ return this.newExpressionToValueAndStmts(node);
493
+ }
494
+ else if (ts.isParenthesizedExpression(node)) {
495
+ return this.parenthesizedExpressionToValueAndStmts(node);
496
+ }
497
+ else if (ts.isAsExpression(node)) {
498
+ return this.asExpressionToValueAndStmts(node);
499
+ }
500
+ else if (ts.isNonNullExpression(node)) {
501
+ return this.nonNullExpressionToValueAndStmts(node);
502
+ }
503
+ else if (ts.isTypeAssertionExpression(node)) {
504
+ return this.typeAssertionToValueAndStmts(node);
505
+ }
506
+ else if (ts.isTypeOfExpression(node)) {
507
+ return this.typeOfExpressionToValueAndStmts(node);
508
+ }
509
+ else if (ts.isArrayLiteralExpression(node)) {
510
+ return this.arrayLiteralExpressionToValueAndStmts(node);
511
+ }
512
+ else if (this.isLiteralNode(node)) {
513
+ return this.literalNodeToValueAndStmts(node);
514
+ }
515
+ else if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
516
+ return this.callableNodeToValueAndStmts(node);
517
+ }
518
+ else if (ts.isClassExpression(node)) {
519
+ return this.classExpressionToValueAndStmts(node);
520
+ }
521
+ else if (ts.isEtsComponentExpression(node)) {
522
+ return this.etsComponentExpressionToValueAndStmts(node);
523
+ }
524
+ else if (ts.isObjectLiteralExpression(node)) {
525
+ return this.objectLiteralExpresionToValueAndStmts(node);
526
+ }
527
+ else if (node.kind === ts.SyntaxKind.ThisKeyword) {
528
+ return this.thisExpressionToValueAndStmts(node);
529
+ }
530
+ else if (ts.isConditionalExpression(node)) {
531
+ return this.conditionalExpressionToValueAndStmts(node);
532
+ }
533
+ return {
534
+ value: new Local_1.Local(node.getText(this.sourceFile)),
535
+ valueOriginalPositions: [Position_1.FullPosition.buildFromNode(node, this.sourceFile)],
536
+ stmts: [],
537
+ };
538
+ }
539
+ thisExpressionToValueAndStmts(thisExpression) {
540
+ return {
541
+ value: this.getThisLocal(),
542
+ valueOriginalPositions: [Position_1.FullPosition.buildFromNode(thisExpression, this.sourceFile)],
543
+ stmts: [],
544
+ };
545
+ }
546
+ conditionalExpressionToValueAndStmts(conditionalExpression) {
547
+ // TODO: separated by blocks
548
+ const stmts = [];
549
+ const { value: conditionValue, valueOriginalPositions: conditionPositions, stmts: conditionStmts, } = this.conditionToValueAndStmts(conditionalExpression.condition);
550
+ stmts.push(...conditionStmts);
551
+ const ifStmt = new Stmt_1.ArkIfStmt(conditionValue);
552
+ ifStmt.setOperandOriginalPositions(conditionPositions);
553
+ stmts.push(ifStmt);
554
+ const { value: whenTrueValue, valueOriginalPositions: whenTruePositions, stmts: whenTrueStmts } = this.tsNodeToValueAndStmts(conditionalExpression.whenTrue);
555
+ stmts.push(...whenTrueStmts);
556
+ const { value: resultValue, valueOriginalPositions: resultPositions, stmts: tempStmts, } = this.generateAssignStmtForValue(whenTrueValue, whenTruePositions);
557
+ stmts.push(...tempStmts);
558
+ const { value: whenFalseValue, valueOriginalPositions: whenFalsePositions, stmts: whenFalseStmts, } = this.tsNodeToValueAndStmts(conditionalExpression.whenFalse);
559
+ stmts.push(...whenFalseStmts);
560
+ const assignStmt = new Stmt_1.ArkAssignStmt(resultValue, whenFalseValue);
561
+ assignStmt.setOperandOriginalPositions([...resultPositions, ...whenFalsePositions]);
562
+ stmts.push(assignStmt);
563
+ return { value: resultValue, valueOriginalPositions: resultPositions, stmts: stmts };
564
+ }
565
+ objectLiteralExpresionToValueAndStmts(objectLiteralExpression) {
566
+ const declaringArkClass = this.declaringMethod.getDeclaringArkClass();
567
+ const declaringArkNamespace = declaringArkClass.getDeclaringArkNamespace();
568
+ const anonymousClass = new ArkClass_1.ArkClass();
569
+ if (declaringArkNamespace) {
570
+ (0, ArkClassBuilder_1.buildNormalArkClassFromArkNamespace)(objectLiteralExpression, declaringArkNamespace, anonymousClass, this.sourceFile, this.declaringMethod);
571
+ declaringArkNamespace.addArkClass(anonymousClass);
572
+ }
573
+ else {
574
+ const declaringArkFile = declaringArkClass.getDeclaringArkFile();
575
+ (0, ArkClassBuilder_1.buildNormalArkClassFromArkFile)(objectLiteralExpression, declaringArkFile, anonymousClass, this.sourceFile, this.declaringMethod);
576
+ declaringArkFile.addArkClass(anonymousClass);
577
+ }
578
+ const objectLiteralExpressionPosition = Position_1.FullPosition.buildFromNode(objectLiteralExpression, this.sourceFile);
579
+ const stmts = [];
580
+ const anonymousClassSignature = anonymousClass.getSignature();
581
+ const anonymousClassType = new Type_1.ClassType(anonymousClassSignature);
582
+ const newExpr = new Expr_1.ArkNewExpr(anonymousClassType);
583
+ const { value: newExprLocal, valueOriginalPositions: newExprLocalPositions, stmts: newExprStmts, } = this.generateAssignStmtForValue(newExpr, [objectLiteralExpressionPosition]);
584
+ stmts.push(...newExprStmts);
585
+ const constructorMethodSubSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSubSignatureFromMethodName(TSConst_1.CONSTRUCTOR_NAME);
586
+ const constructorMethodSignature = new ArkSignature_1.MethodSignature(anonymousClassSignature, constructorMethodSubSignature);
587
+ const constructorInvokeExpr = new Expr_1.ArkInstanceInvokeExpr(newExprLocal, constructorMethodSignature, []);
588
+ const constructorInvokeExprPositions = [objectLiteralExpressionPosition, ...newExprLocalPositions];
589
+ const constructorInvokeStmt = new Stmt_1.ArkInvokeStmt(constructorInvokeExpr);
590
+ constructorInvokeStmt.setOperandOriginalPositions(constructorInvokeExprPositions);
591
+ stmts.push(constructorInvokeStmt);
592
+ return { value: newExprLocal, valueOriginalPositions: newExprLocalPositions, stmts: stmts };
593
+ }
594
+ createCustomViewStmt(componentName, args, argPositionsAll, componentExpression, currStmts) {
595
+ const stmts = [...currStmts];
596
+ const componentExpressionPosition = Position_1.FullPosition.buildFromNode(componentExpression, this.sourceFile);
597
+ const classSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildClassSignatureFromClassName(componentName);
598
+ const classType = new Type_1.ClassType(classSignature);
599
+ const newExpr = new Expr_1.ArkNewExpr(classType);
600
+ const { value: newExprLocal, valueOriginalPositions: newExprPositions, stmts: newExprStmts, } = this.generateAssignStmtForValue(newExpr, [componentExpressionPosition]);
601
+ stmts.push(...newExprStmts);
602
+ const constructorMethodSubSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSubSignatureFromMethodName(TSConst_1.CONSTRUCTOR_NAME);
603
+ const constructorMethodSignature = new ArkSignature_1.MethodSignature(classSignature, constructorMethodSubSignature);
604
+ const instanceInvokeExpr = new Expr_1.ArkInstanceInvokeExpr(newExprLocal, constructorMethodSignature, args);
605
+ const instanceInvokeExprPositions = [componentExpressionPosition, ...newExprPositions,
606
+ ...argPositionsAll.flat()];
607
+ const instanceInvokeStmt = new Stmt_1.ArkInvokeStmt(instanceInvokeExpr);
608
+ instanceInvokeStmt.setOperandOriginalPositions(instanceInvokeExprPositions);
609
+ stmts.push(instanceInvokeStmt);
610
+ const createViewArgs = [newExprLocal];
611
+ const createViewArgPositionsAll = [newExprPositions];
612
+ if (ts.isEtsComponentExpression(componentExpression) && componentExpression.body) {
613
+ const anonymous = ts.factory.createArrowFunction([], [], [], undefined, undefined, componentExpression.body);
614
+ // @ts-ignore
615
+ anonymous.pos = componentExpression.body.pos;
616
+ // @ts-ignore
617
+ anonymous.end = componentExpression.body.end;
618
+ const { value: builderMethod, valueOriginalPositions: builderMethodPositions, } = this.callableNodeToValueAndStmts(anonymous);
619
+ createViewArgs.push(builderMethod);
620
+ createViewArgPositionsAll.push(builderMethodPositions);
621
+ }
622
+ const createMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_CUSTOMVIEW, EtsConst_1.COMPONENT_CREATE_FUNCTION);
623
+ const createInvokeExpr = new Expr_1.ArkStaticInvokeExpr(createMethodSignature, createViewArgs);
624
+ const createInvokeExprPositions = [componentExpressionPosition, ...createViewArgPositionsAll.flat()];
625
+ const { value: componentValue, valueOriginalPositions: componentPositions, stmts: componentStmts, } = this.generateAssignStmtForValue(createInvokeExpr, createInvokeExprPositions);
626
+ stmts.push(...componentStmts);
627
+ const popMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(EtsConst_1.COMPONENT_CUSTOMVIEW, EtsConst_1.COMPONENT_POP_FUNCTION);
628
+ const popInvokeExpr = new Expr_1.ArkStaticInvokeExpr(popMethodSignature, []);
629
+ const popInvokeExprPositions = [componentExpressionPosition];
630
+ const popInvokeStmt = new Stmt_1.ArkInvokeStmt(popInvokeExpr);
631
+ popInvokeStmt.setOperandOriginalPositions(popInvokeExprPositions);
632
+ stmts.push(popInvokeStmt);
633
+ return { value: componentValue, valueOriginalPositions: componentPositions, stmts: stmts };
634
+ }
635
+ etsComponentExpressionToValueAndStmts(etsComponentExpression) {
636
+ const stmts = [];
637
+ const componentName = etsComponentExpression.expression.text;
638
+ let builderMethodIndexes = undefined;
639
+ if (componentName === EtsConst_1.COMPONENT_FOR_EACH || componentName === EtsConst_1.COMPONENT_LAZY_FOR_EACH) {
640
+ builderMethodIndexes = new Set([1]);
641
+ }
642
+ const { args: args, argPositionsAll: argPositionsAll } = this.parseArguments(stmts, etsComponentExpression.arguments, builderMethodIndexes);
643
+ if ((0, EtsConst_1.isEtsSystemComponent)(componentName)) {
644
+ const createMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(componentName, EtsConst_1.COMPONENT_CREATE_FUNCTION);
645
+ const createInvokeExpr = new Expr_1.ArkStaticInvokeExpr(createMethodSignature, args);
646
+ const argPositionsAllFlat = argPositionsAll.flat();
647
+ let createInvokeExprPosition = Position_1.FullPosition.buildFromNode(etsComponentExpression, this.sourceFile);
648
+ const createInvokeExprPositions = [createInvokeExprPosition, ...argPositionsAllFlat];
649
+ const { value: componentValue, valueOriginalPositions: componentPositions, stmts: componentStmts, } = this.generateAssignStmtForValue(createInvokeExpr, createInvokeExprPositions);
650
+ stmts.push(...componentStmts);
651
+ if (etsComponentExpression.body) {
652
+ for (const statement of etsComponentExpression.body.statements) {
653
+ stmts.push(...this.tsNodeToStmts(statement));
654
+ }
655
+ }
656
+ const popMethodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromClassNameAndMethodName(componentName, EtsConst_1.COMPONENT_POP_FUNCTION);
657
+ const popInvokeExpr = new Expr_1.ArkStaticInvokeExpr(popMethodSignature, []);
658
+ const popInvokeExprPositions = [Position_1.FullPosition.DEFAULT];
659
+ const popInvokeStmt = new Stmt_1.ArkInvokeStmt(popInvokeExpr);
660
+ popInvokeStmt.setOperandOriginalPositions(popInvokeExprPositions);
661
+ stmts.push(popInvokeStmt);
662
+ return { value: componentValue, valueOriginalPositions: componentPositions, stmts: stmts };
663
+ }
664
+ return this.createCustomViewStmt(componentName, args, argPositionsAll, etsComponentExpression, stmts);
665
+ }
666
+ classExpressionToValueAndStmts(classExpression) {
667
+ const declaringArkClass = this.declaringMethod.getDeclaringArkClass();
668
+ const declaringArkNamespace = declaringArkClass.getDeclaringArkNamespace();
669
+ const newClass = new ArkClass_1.ArkClass();
670
+ if (declaringArkNamespace) {
671
+ (0, ArkClassBuilder_1.buildNormalArkClassFromArkNamespace)(classExpression, declaringArkNamespace, newClass, this.sourceFile, this.declaringMethod);
672
+ declaringArkNamespace.addArkClass(newClass);
673
+ }
674
+ else {
675
+ const declaringArkFile = declaringArkClass.getDeclaringArkFile();
676
+ (0, ArkClassBuilder_1.buildNormalArkClassFromArkFile)(classExpression, declaringArkFile, newClass, this.sourceFile, this.declaringMethod);
677
+ declaringArkFile.addArkClass(newClass);
678
+ }
679
+ const classValue = this.getOrCreatLocal(newClass.getName(), new Type_1.ClassType(newClass.getSignature()));
680
+ return {
681
+ value: classValue,
682
+ valueOriginalPositions: [Position_1.FullPosition.buildFromNode(classExpression, this.sourceFile)],
683
+ stmts: [],
684
+ };
685
+ }
686
+ templateExpressionToValueAndStmts(templateExpression) {
687
+ const stmts = [];
688
+ const head = templateExpression.head;
689
+ const templateValues = [];
690
+ const templatePositions = [];
691
+ if (head.rawText) {
692
+ templateValues.push(ValueUtil_1.ValueUtil.createStringConst(head.rawText));
693
+ templatePositions.push([Position_1.FullPosition.buildFromNode(head, this.sourceFile)]);
694
+ }
695
+ for (const templateSpan of templateExpression.templateSpans) {
696
+ let { value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts, } = this.tsNodeToValueAndStmts(templateSpan.expression);
697
+ stmts.push(...exprStmts);
698
+ if (IRUtils_1.IRUtils.moreThanOneAddress(exprValue)) {
699
+ ({ value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts } =
700
+ this.generateAssignStmtForValue(exprValue, exprPositions));
701
+ stmts.push(...exprStmts);
702
+ }
703
+ templateValues.push(exprValue);
704
+ templatePositions.push(exprPositions);
705
+ const literalRawText = templateSpan.literal.rawText;
706
+ if (literalRawText) {
707
+ templateValues.push(ValueUtil_1.ValueUtil.createStringConst(literalRawText));
708
+ templatePositions.push([Position_1.FullPosition.buildFromNode(templateSpan.literal, this.sourceFile)]);
709
+ }
710
+ }
711
+ let currTemplateValue = ValueUtil_1.ValueUtil.getUndefinedConst();
712
+ let currTemplatePositions = [Position_1.FullPosition.DEFAULT];
713
+ const templateValueCnt = templateValues.length;
714
+ if (templateValueCnt > 0) {
715
+ currTemplateValue = templateValues[0];
716
+ currTemplatePositions = templatePositions[0];
717
+ for (let i = 1; i < templateValueCnt; i++) {
718
+ const nextTemplatePositions = templatePositions[i];
719
+ const normalBinopExpr = new Expr_1.ArkNormalBinopExpr(currTemplateValue, templateValues[i], Expr_1.NormalBinaryOperator.Addition);
720
+ const normalBinopExprPositions = [Position_1.FullPosition.merge(currTemplatePositions[0], nextTemplatePositions[0]), ...currTemplatePositions, ...nextTemplatePositions];
721
+ const { value: combinationValue, valueOriginalPositions: combinationPositions, stmts: combinationStmts, } = this.generateAssignStmtForValue(normalBinopExpr, normalBinopExprPositions);
722
+ stmts.push(...combinationStmts);
723
+ currTemplateValue = combinationValue;
724
+ currTemplatePositions = combinationPositions;
725
+ }
726
+ }
727
+ return { value: currTemplateValue, valueOriginalPositions: currTemplatePositions, stmts: stmts };
728
+ }
729
+ identifierToValueAndStmts(identifier) {
730
+ // TODO: handle global variable
731
+ let identifierValue;
732
+ let identifierPositions = [Position_1.FullPosition.buildFromNode(identifier, this.sourceFile)];
733
+ if (identifier.text == Type_1.UndefinedType.getInstance().getName()) {
734
+ identifierValue = ValueUtil_1.ValueUtil.getUndefinedConst();
735
+ }
736
+ else {
737
+ identifierValue = this.getOrCreatLocal(identifier.text);
738
+ }
739
+ return { value: identifierValue, valueOriginalPositions: identifierPositions, stmts: [] };
740
+ }
741
+ propertyAccessExpressionToValue(propertyAccessExpression) {
742
+ const stmts = [];
743
+ let { value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts, } = this.tsNodeToValueAndStmts(propertyAccessExpression.expression);
744
+ stmts.push(...baseStmts);
745
+ if (IRUtils_1.IRUtils.moreThanOneAddress(baseValue)) {
746
+ ({ value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts } =
747
+ this.generateAssignStmtForValue(baseValue, basePositions));
748
+ stmts.push(...baseStmts);
749
+ }
750
+ if (!(baseValue instanceof Local_1.Local)) {
751
+ ({ value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts } =
752
+ this.generateAssignStmtForValue(baseValue, basePositions));
753
+ stmts.push(...baseStmts);
754
+ }
755
+ const fieldSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildFieldSignatureFromFieldName(propertyAccessExpression.name.getText(this.sourceFile));
756
+ const fieldRef = new Ref_1.ArkInstanceFieldRef(baseValue, fieldSignature);
757
+ const fieldRefPositions = [Position_1.FullPosition.buildFromNode(propertyAccessExpression, this.sourceFile), ...basePositions];
758
+ return { value: fieldRef, valueOriginalPositions: fieldRefPositions, stmts: stmts };
759
+ }
760
+ elementAccessExpressionToValueAndStmts(elementAccessExpression) {
761
+ const stmts = [];
762
+ let { value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts } = this.tsNodeToValueAndStmts(elementAccessExpression.expression);
763
+ stmts.push(...baseStmts);
764
+ if (!(baseValue instanceof Local_1.Local)) {
765
+ ({ value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts } =
766
+ this.generateAssignStmtForValue(baseValue, basePositions));
767
+ stmts.push(...baseStmts);
768
+ }
769
+ let { value: argumentValue, valueOriginalPositions: arguPositions, stmts: argumentStmts, } = this.tsNodeToValueAndStmts(elementAccessExpression.argumentExpression);
770
+ stmts.push(...argumentStmts);
771
+ if (IRUtils_1.IRUtils.moreThanOneAddress(argumentValue)) {
772
+ ({ value: argumentValue, valueOriginalPositions: arguPositions, stmts: argumentStmts } =
773
+ this.generateAssignStmtForValue(argumentValue, arguPositions));
774
+ stmts.push(...argumentStmts);
775
+ }
776
+ let elementAccessExpr;
777
+ if (baseValue.getType() instanceof Type_1.ArrayType) {
778
+ elementAccessExpr = new Ref_1.ArkArrayRef(baseValue, argumentValue);
779
+ }
780
+ else {
781
+ // TODO: deal with ArkStaticFieldRef
782
+ const fieldSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildFieldSignatureFromFieldName(argumentValue.toString());
783
+ elementAccessExpr = new Ref_1.ArkInstanceFieldRef(baseValue, fieldSignature);
784
+ }
785
+ const exprPositions = [Position_1.FullPosition.buildFromNode(elementAccessExpression, this.sourceFile), ...basePositions,
786
+ ...arguPositions];
787
+ return { value: elementAccessExpr, valueOriginalPositions: exprPositions, stmts: stmts };
788
+ }
789
+ callExpressionToValueAndStmts(callExpression) {
790
+ let realGenericTypes = undefined;
791
+ if (callExpression.typeArguments) {
792
+ realGenericTypes = [];
793
+ callExpression.typeArguments.forEach(typeArgument => {
794
+ // @ts-ignore
795
+ realGenericTypes.push(this.resolveTypeNode(typeArgument));
796
+ });
797
+ }
798
+ const stmts = [];
799
+ const { args: args, argPositionsAll: argPositionsAll } = this.parseArguments(stmts, callExpression.arguments);
800
+ const argPositionsAllFlat = argPositionsAll.flat();
801
+ let { value: callerValue, valueOriginalPositions: callerPositions, stmts: callerStmts, } = this.tsNodeToValueAndStmts(callExpression.expression);
802
+ stmts.push(...callerStmts);
803
+ let invokeValue;
804
+ let invokeValuePositions = [Position_1.FullPosition.buildFromNode(callExpression, this.sourceFile)];
805
+ if (callerValue instanceof Ref_1.ArkInstanceFieldRef) {
806
+ const methodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromMethodName(callerValue.getFieldName());
807
+ invokeValue = new Expr_1.ArkInstanceInvokeExpr(callerValue.getBase(), methodSignature, args, realGenericTypes);
808
+ invokeValuePositions.push(...callerPositions.slice(1), ...argPositionsAllFlat);
809
+ }
810
+ else if (callerValue instanceof Ref_1.ArkStaticFieldRef) {
811
+ const methodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromMethodName(callerValue.getFieldName());
812
+ invokeValue = new Expr_1.ArkStaticInvokeExpr(methodSignature, args, realGenericTypes);
813
+ invokeValuePositions.push(...argPositionsAllFlat);
814
+ }
815
+ else if (callerValue instanceof Local_1.Local) {
816
+ const callerName = callerValue.getName();
817
+ let classSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildClassSignatureFromClassName(callerName);
818
+ let cls = ModelUtils_1.ModelUtils.getClass(this.declaringMethod, classSignature);
819
+ if (cls === null || cls === void 0 ? void 0 : cls.hasComponentDecorator()) {
820
+ return this.createCustomViewStmt(callerName, args, argPositionsAll, callExpression, stmts);
821
+ }
822
+ const methodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromMethodName(callerName);
823
+ if (callerValue.getType() instanceof Type_1.FunctionType) {
824
+ invokeValue = new Expr_1.ArkPtrInvokeExpr(methodSignature, callerValue, args, realGenericTypes);
825
+ }
826
+ else {
827
+ invokeValue = new Expr_1.ArkStaticInvokeExpr(methodSignature, args, realGenericTypes);
828
+ }
829
+ invokeValuePositions.push(...argPositionsAllFlat);
830
+ }
831
+ else {
832
+ ({ value: callerValue, valueOriginalPositions: callerPositions, stmts: callerStmts } =
833
+ this.generateAssignStmtForValue(callerValue, callerPositions));
834
+ stmts.push(...callerStmts);
835
+ const methodSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSignatureFromMethodName(callerValue.getName());
836
+ invokeValue = new Expr_1.ArkStaticInvokeExpr(methodSignature, args, realGenericTypes);
837
+ invokeValuePositions.push(...argPositionsAllFlat);
838
+ }
839
+ return { value: invokeValue, valueOriginalPositions: invokeValuePositions, stmts: stmts };
840
+ }
841
+ parseArguments(currStmts, argumentNodes, builderMethodIndexes) {
842
+ const args = [];
843
+ const argPositionsAll = [];
844
+ if (argumentNodes) {
845
+ for (let i = 0; i < argumentNodes.length; i++) {
846
+ const argument = argumentNodes[i];
847
+ const prevBuilderMethodContextFlag = this.builderMethodContextFlag;
848
+ if (builderMethodIndexes === null || builderMethodIndexes === void 0 ? void 0 : builderMethodIndexes.has(i)) {
849
+ this.builderMethodContextFlag = true;
850
+ }
851
+ let { value: argValue, valueOriginalPositions: argPositions, stmts: argStmts, } = this.tsNodeToValueAndStmts(argument);
852
+ this.builderMethodContextFlag = prevBuilderMethodContextFlag;
853
+ currStmts.push(...argStmts);
854
+ if (IRUtils_1.IRUtils.moreThanOneAddress(argValue)) {
855
+ ({ value: argValue, valueOriginalPositions: argPositions, stmts: argStmts } =
856
+ this.generateAssignStmtForValue(argValue, argPositions));
857
+ currStmts.push(...argStmts);
858
+ }
859
+ args.push(argValue);
860
+ argPositionsAll.push(argPositions);
861
+ }
862
+ }
863
+ return { args: args, argPositionsAll: argPositionsAll };
864
+ }
865
+ callableNodeToValueAndStmts(callableNode) {
866
+ const declaringClass = this.declaringMethod.getDeclaringArkClass();
867
+ const arrowArkMethod = new ArkMethod_1.ArkMethod();
868
+ if (this.builderMethodContextFlag) {
869
+ ModelUtils_1.ModelUtils.implicitArkUIBuilderMethods.add(arrowArkMethod);
870
+ }
871
+ (0, ArkMethodBuilder_1.buildArkMethodFromArkClass)(callableNode, declaringClass, arrowArkMethod, this.sourceFile, this.declaringMethod);
872
+ declaringClass.addMethod(arrowArkMethod);
873
+ const callableType = new Type_1.FunctionType(arrowArkMethod.getSignature());
874
+ const callableValue = this.getOrCreatLocal(arrowArkMethod.getName(), callableType);
875
+ return {
876
+ value: callableValue,
877
+ valueOriginalPositions: [Position_1.FullPosition.buildFromNode(callableNode, this.sourceFile)],
878
+ stmts: [],
879
+ };
880
+ }
881
+ newExpressionToValueAndStmts(newExpression) {
882
+ const className = newExpression.expression.getText(this.sourceFile);
883
+ if (className === Builtin_1.Builtin.ARRAY) {
884
+ return this.newArrayExpressionToValueAndStmts(newExpression);
885
+ }
886
+ const stmts = [];
887
+ let realGenericTypes = undefined;
888
+ if (newExpression.typeArguments) {
889
+ realGenericTypes = [];
890
+ newExpression.typeArguments.forEach(typeArgument => {
891
+ // @ts-ignore
892
+ realGenericTypes.push(this.resolveTypeNode(typeArgument));
893
+ });
894
+ }
895
+ const classSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildClassSignatureFromClassName(className);
896
+ const classType = new Type_1.ClassType(classSignature, realGenericTypes);
897
+ const newExpr = new Expr_1.ArkNewExpr(classType);
898
+ const { value: newLocal, valueOriginalPositions: newLocalPositions, stmts: newExprStmts, } = this.generateAssignStmtForValue(newExpr, [Position_1.FullPosition.buildFromNode(newExpression, this.sourceFile)]);
899
+ stmts.push(...newExprStmts);
900
+ const constructorMethodSubSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildMethodSubSignatureFromMethodName(TSConst_1.CONSTRUCTOR_NAME);
901
+ const constructorMethodSignature = new ArkSignature_1.MethodSignature(classSignature, constructorMethodSubSignature);
902
+ const { args: argValues, argPositionsAll: argPositionsAll } = this.parseArguments(stmts, newExpression.arguments);
903
+ const instanceInvokeExpr = new Expr_1.ArkInstanceInvokeExpr(newLocal, constructorMethodSignature, argValues);
904
+ const instanceInvokeExprPositions = [newLocalPositions[0], ...newLocalPositions, ...argPositionsAll.flat()];
905
+ const invokeStmt = new Stmt_1.ArkInvokeStmt(instanceInvokeExpr);
906
+ invokeStmt.setOperandOriginalPositions(instanceInvokeExprPositions);
907
+ stmts.push(invokeStmt);
908
+ return { value: newLocal, valueOriginalPositions: newLocalPositions, stmts: stmts };
909
+ }
910
+ newArrayExpressionToValueAndStmts(newArrayExpression) {
911
+ let baseType = Type_1.UnknownType.getInstance();
912
+ if (newArrayExpression.typeArguments && newArrayExpression.typeArguments.length > 0) {
913
+ const argumentType = this.resolveTypeNode(newArrayExpression.typeArguments[0]);
914
+ if (!(argumentType instanceof Type_1.AnyType || argumentType instanceof Type_1.UnknownType)) {
915
+ baseType = argumentType;
916
+ }
917
+ }
918
+ const stmts = [];
919
+ const { args: argumentValues, argPositionsAll: argumentPositionsAll } = this.parseArguments(stmts, newArrayExpression.arguments);
920
+ let arrayLength = newArrayExpression.arguments ? newArrayExpression.arguments.length : 0;
921
+ let arrayLengthValue = ValueUtil_1.ValueUtil.getOrCreateNumberConst(arrayLength);
922
+ let arrayLengthPosition = Position_1.FullPosition.DEFAULT;
923
+ let arrayLengthFlag = false;
924
+ if ((arrayLength === 1) && ((argumentValues[0].getType() instanceof Type_1.NumberType) || argumentValues[0].getType() instanceof Type_1.UnknownType)) {
925
+ arrayLengthValue = argumentValues[0];
926
+ arrayLengthPosition = argumentPositionsAll[0][0];
927
+ arrayLengthFlag = true;
928
+ }
929
+ if (baseType instanceof Type_1.UnknownType) {
930
+ if ((arrayLength > 1) && !(argumentValues[0].getType() instanceof Type_1.UnknownType)) {
931
+ baseType = argumentValues[0].getType();
932
+ }
933
+ else {
934
+ baseType = Type_1.AnyType.getInstance();
935
+ }
936
+ }
937
+ const newArrayExpr = new Expr_1.ArkNewArrayExpr(baseType, arrayLengthValue);
938
+ const newArrayExprPositions = [Position_1.FullPosition.buildFromNode(newArrayExpression, this.sourceFile),
939
+ arrayLengthPosition];
940
+ const { value: arrayLocal, valueOriginalPositions: arrayLocalPositions, stmts: arrayStmts, } = this.generateAssignStmtForValue(newArrayExpr, newArrayExprPositions);
941
+ stmts.push(...arrayStmts);
942
+ if (!arrayLengthFlag) {
943
+ for (let i = 0; i < arrayLength; i++) {
944
+ const arrayRef = new Ref_1.ArkArrayRef(arrayLocal, ValueUtil_1.ValueUtil.getOrCreateNumberConst(i));
945
+ const arrayRefPositions = [arrayLocalPositions[0], ...arrayLocalPositions, Position_1.FullPosition.DEFAULT];
946
+ const assignStmt = new Stmt_1.ArkAssignStmt(arrayRef, argumentValues[i]);
947
+ assignStmt.setOperandOriginalPositions([...arrayRefPositions, ...argumentPositionsAll[i]]);
948
+ stmts.push(assignStmt);
949
+ }
950
+ }
951
+ return { value: arrayLocal, valueOriginalPositions: arrayLocalPositions, stmts: stmts };
952
+ }
953
+ arrayLiteralExpressionToValueAndStmts(arrayLiteralExpression) {
954
+ const stmts = [];
955
+ const elementTypes = new Set();
956
+ const elementValues = [];
957
+ const elementPositonsAll = [];
958
+ const arrayLength = arrayLiteralExpression.elements.length;
959
+ for (const element of arrayLiteralExpression.elements) {
960
+ let { value: elementValue, valueOriginalPositions: elementPosition, stmts: elementStmts, } = this.tsNodeToValueAndStmts(element);
961
+ stmts.push(...elementStmts);
962
+ if (IRUtils_1.IRUtils.moreThanOneAddress(elementValue)) {
963
+ ({ value: elementValue, valueOriginalPositions: elementPosition, stmts: elementStmts } =
964
+ this.generateAssignStmtForValue(elementValue, elementPosition));
965
+ stmts.push(...elementStmts);
966
+ }
967
+ elementValues.push(elementValue);
968
+ elementTypes.add(elementValue.getType());
969
+ elementPositonsAll.push(elementPosition);
970
+ }
971
+ let baseType = Type_1.AnyType.getInstance();
972
+ if (elementTypes.size == 1) {
973
+ baseType = elementTypes.keys().next().value;
974
+ }
975
+ else if (elementTypes.size > 1) {
976
+ baseType = new Type_1.UnionType(Array.from(elementTypes));
977
+ }
978
+ const newArrayExpr = new Expr_1.ArkNewArrayExpr(baseType, ValueUtil_1.ValueUtil.getOrCreateNumberConst(arrayLength), true);
979
+ const newArrayExprPositions = [Position_1.FullPosition.buildFromNode(arrayLiteralExpression, this.sourceFile),
980
+ Position_1.FullPosition.DEFAULT];
981
+ const { value: newArrayLocal, valueOriginalPositions: newArrayPositions, stmts: elementStmts, } = this.generateAssignStmtForValue(newArrayExpr, newArrayExprPositions);
982
+ stmts.push(...elementStmts);
983
+ for (let i = 0; i < arrayLength; i++) {
984
+ const arrayRef = new Ref_1.ArkArrayRef(newArrayLocal, ValueUtil_1.ValueUtil.getOrCreateNumberConst(i));
985
+ const arrayRefPositions = [newArrayPositions[0], ...newArrayPositions, Position_1.FullPosition.DEFAULT];
986
+ const assignStmt = new Stmt_1.ArkAssignStmt(arrayRef, elementValues[i]);
987
+ assignStmt.setOperandOriginalPositions([...arrayRefPositions, ...elementPositonsAll[i]]);
988
+ stmts.push(assignStmt);
989
+ }
990
+ return { value: newArrayLocal, valueOriginalPositions: newArrayPositions, stmts: stmts };
991
+ }
992
+ prefixUnaryExpressionToValueAndStmts(prefixUnaryExpression) {
993
+ const stmts = [];
994
+ let { value: operandValue, valueOriginalPositions: operandPositions, stmts: operandStmts, } = this.tsNodeToValueAndStmts(prefixUnaryExpression.operand);
995
+ stmts.push(...operandStmts);
996
+ if (IRUtils_1.IRUtils.moreThanOneAddress(operandValue)) {
997
+ ({ value: operandValue, valueOriginalPositions: operandPositions, stmts: operandStmts } =
998
+ this.generateAssignStmtForValue(operandValue, operandPositions));
999
+ stmts.push(...operandStmts);
1000
+ }
1001
+ const operatorToken = prefixUnaryExpression.operator;
1002
+ let exprPositions = [Position_1.FullPosition.buildFromNode(prefixUnaryExpression, this.sourceFile)];
1003
+ if (operatorToken === ts.SyntaxKind.PlusPlusToken || operatorToken === ts.SyntaxKind.MinusMinusToken) {
1004
+ const binaryOperator = operatorToken === ts.SyntaxKind.PlusPlusToken ? Expr_1.NormalBinaryOperator.Addition : Expr_1.NormalBinaryOperator.Subtraction;
1005
+ const binopExpr = new Expr_1.ArkNormalBinopExpr(operandValue, ValueUtil_1.ValueUtil.getOrCreateNumberConst(1), binaryOperator);
1006
+ exprPositions.push(...operandPositions, Position_1.FullPosition.DEFAULT);
1007
+ const assignStmt = new Stmt_1.ArkAssignStmt(operandValue, binopExpr);
1008
+ assignStmt.setOperandOriginalPositions([...operandPositions, ...exprPositions]);
1009
+ stmts.push(assignStmt);
1010
+ return { value: operandValue, valueOriginalPositions: operandPositions, stmts: stmts };
1011
+ }
1012
+ else if (operatorToken === ts.SyntaxKind.PlusToken) {
1013
+ return { value: operandValue, valueOriginalPositions: operandPositions, stmts: stmts };
1014
+ }
1015
+ else {
1016
+ let unopExpr;
1017
+ const operator = ArkIRTransformer.tokenToUnaryOperator(operatorToken);
1018
+ if (operator) {
1019
+ unopExpr = new Expr_1.ArkUnopExpr(operandValue, operator);
1020
+ exprPositions.push(...operandPositions);
1021
+ }
1022
+ else {
1023
+ unopExpr = ValueUtil_1.ValueUtil.getUndefinedConst();
1024
+ exprPositions = [Position_1.FullPosition.DEFAULT];
1025
+ }
1026
+ return { value: unopExpr, valueOriginalPositions: exprPositions, stmts: stmts };
1027
+ }
1028
+ }
1029
+ postfixUnaryExpressionToValueAndStmts(postfixUnaryExpression) {
1030
+ const stmts = [];
1031
+ let { value: operandValue, valueOriginalPositions: operandPositions, stmts: exprStmts, } = this.tsNodeToValueAndStmts(postfixUnaryExpression.operand);
1032
+ stmts.push(...exprStmts);
1033
+ if (IRUtils_1.IRUtils.moreThanOneAddress(operandValue)) {
1034
+ ({ value: operandValue, valueOriginalPositions: operandPositions, stmts: exprStmts } =
1035
+ this.generateAssignStmtForValue(operandValue, operandPositions));
1036
+ stmts.push(...exprStmts);
1037
+ }
1038
+ let value;
1039
+ let exprPositions = [Position_1.FullPosition.buildFromNode(postfixUnaryExpression, this.sourceFile)];
1040
+ const operatorToken = postfixUnaryExpression.operator;
1041
+ if (operatorToken === ts.SyntaxKind.PlusPlusToken || operatorToken === ts.SyntaxKind.MinusMinusToken) {
1042
+ const binaryOperator = operatorToken === ts.SyntaxKind.PlusPlusToken ? Expr_1.NormalBinaryOperator.Addition : Expr_1.NormalBinaryOperator.Subtraction;
1043
+ const binopExpr = new Expr_1.ArkNormalBinopExpr(operandValue, ValueUtil_1.ValueUtil.getOrCreateNumberConst(1), binaryOperator);
1044
+ exprPositions.push(...operandPositions, Position_1.FullPosition.DEFAULT);
1045
+ const assignStmt = new Stmt_1.ArkAssignStmt(operandValue, binopExpr);
1046
+ assignStmt.setOperandOriginalPositions([...operandPositions, ...exprPositions]);
1047
+ stmts.push(assignStmt);
1048
+ value = operandValue;
1049
+ }
1050
+ else {
1051
+ value = ValueUtil_1.ValueUtil.getUndefinedConst();
1052
+ exprPositions = [Position_1.FullPosition.DEFAULT];
1053
+ }
1054
+ return { value: value, valueOriginalPositions: exprPositions, stmts: stmts };
1055
+ }
1056
+ awaitExpressionToValueAndStmts(awaitExpression) {
1057
+ const { value: promiseValue, valueOriginalPositions: promisePositions, stmts: stmts, } = this.tsNodeToValueAndStmts(awaitExpression.expression);
1058
+ const awaitExpr = new Expr_1.ArkAwaitExpr(promiseValue);
1059
+ const awaitExprPositions = [Position_1.FullPosition.buildFromNode(awaitExpression, this.sourceFile), ...promisePositions];
1060
+ return { value: awaitExpr, valueOriginalPositions: awaitExprPositions, stmts: stmts };
1061
+ }
1062
+ yieldExpressionToValueAndStmts(yieldExpression) {
1063
+ let yieldValue = ValueUtil_1.ValueUtil.getUndefinedConst();
1064
+ let yieldPositions = [Position_1.FullPosition.DEFAULT];
1065
+ let stmts = [];
1066
+ if (yieldExpression.expression) {
1067
+ ({ value: yieldValue, valueOriginalPositions: yieldPositions, stmts: stmts } =
1068
+ this.tsNodeToValueAndStmts(yieldExpression.expression));
1069
+ }
1070
+ const yieldExpr = new Expr_1.ArkYieldExpr(yieldValue);
1071
+ const yieldExprPositions = [Position_1.FullPosition.buildFromNode(yieldExpression, this.sourceFile), ...yieldPositions];
1072
+ return { value: yieldExpr, valueOriginalPositions: yieldExprPositions, stmts: stmts };
1073
+ }
1074
+ deleteExpressionToValueAndStmts(deleteExpression) {
1075
+ const { value: exprValue, valueOriginalPositions: exprPositions, stmts: stmts } = this.tsNodeToValueAndStmts(deleteExpression.expression);
1076
+ const deleteExpr = new Expr_1.ArkDeleteExpr(exprValue);
1077
+ const deleteExprPositions = [Position_1.FullPosition.buildFromNode(deleteExpression, this.sourceFile),
1078
+ ...exprPositions];
1079
+ return { value: deleteExpr, valueOriginalPositions: deleteExprPositions, stmts: stmts };
1080
+ }
1081
+ voidExpressionToValueAndStmts(voidExpression) {
1082
+ const stmts = this.expressionToStmts(voidExpression.expression);
1083
+ return { value: ValueUtil_1.ValueUtil.getUndefinedConst(), valueOriginalPositions: [Position_1.FullPosition.DEFAULT], stmts: stmts };
1084
+ }
1085
+ nonNullExpressionToValueAndStmts(nonNullExpression) {
1086
+ return this.tsNodeToValueAndStmts(nonNullExpression.expression);
1087
+ }
1088
+ parenthesizedExpressionToValueAndStmts(parenthesizedExpression) {
1089
+ return this.tsNodeToValueAndStmts(parenthesizedExpression.expression);
1090
+ }
1091
+ typeOfExpressionToValueAndStmts(typeOfExpression) {
1092
+ const { value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts, } = this.tsNodeToValueAndStmts(typeOfExpression.expression);
1093
+ const typeOfExpr = new Expr_1.ArkTypeOfExpr(exprValue);
1094
+ const typeOfExprPositions = [Position_1.FullPosition.buildFromNode(typeOfExpression, this.sourceFile), ...exprPositions];
1095
+ return { value: typeOfExpr, valueOriginalPositions: typeOfExprPositions, stmts: exprStmts };
1096
+ }
1097
+ asExpressionToValueAndStmts(asExpression) {
1098
+ const stmts = [];
1099
+ let { value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts } = this.tsNodeToValueAndStmts(asExpression.expression);
1100
+ stmts.push(...exprStmts);
1101
+ if (IRUtils_1.IRUtils.moreThanOneAddress(exprValue)) {
1102
+ ({ value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts } =
1103
+ this.generateAssignStmtForValue(exprValue, exprPositions));
1104
+ stmts.push(...exprStmts);
1105
+ }
1106
+ const castExpr = new Expr_1.ArkCastExpr(exprValue, this.resolveTypeNode(asExpression.type));
1107
+ const castExprPositions = [Position_1.FullPosition.buildFromNode(asExpression, this.sourceFile), ...exprPositions];
1108
+ return { value: castExpr, valueOriginalPositions: castExprPositions, stmts: stmts };
1109
+ }
1110
+ typeAssertionToValueAndStmts(typeAssertion) {
1111
+ const { value: exprValue, valueOriginalPositions: exprPositions, stmts: exprStmts, } = this.tsNodeToValueAndStmts(typeAssertion.expression);
1112
+ const castExpr = new Expr_1.ArkCastExpr(exprValue, this.resolveTypeNode(typeAssertion.type));
1113
+ const castExprPositions = [Position_1.FullPosition.buildFromNode(typeAssertion, this.sourceFile), ...exprPositions];
1114
+ return { value: castExpr, valueOriginalPositions: castExprPositions, stmts: exprStmts };
1115
+ }
1116
+ variableDeclarationListToValueAndStmts(variableDeclarationList) {
1117
+ const stmts = [];
1118
+ for (const declaration of variableDeclarationList.declarations) {
1119
+ const { stmts: declaredStmts, } = this.variableDeclarationToValueAndStmts(declaration, variableDeclarationList.flags);
1120
+ stmts.push(...declaredStmts);
1121
+ }
1122
+ return { value: ValueUtil_1.ValueUtil.getUndefinedConst(), valueOriginalPositions: [Position_1.FullPosition.DEFAULT], stmts: stmts };
1123
+ }
1124
+ variableDeclarationToValueAndStmts(variableDeclaration, nodeFlag) {
1125
+ const leftOpNode = variableDeclaration.name;
1126
+ let rightOpNode = null;
1127
+ if (variableDeclaration.initializer) {
1128
+ rightOpNode = variableDeclaration.initializer;
1129
+ }
1130
+ const stmts = [];
1131
+ let { value: leftValue, valueOriginalPositions: leftPositions, stmts: leftStmts } = this.tsNodeToValueAndStmts(leftOpNode);
1132
+ stmts.push(...leftStmts);
1133
+ let rightValue;
1134
+ let rightPositions;
1135
+ if (rightOpNode) {
1136
+ let { value: tempRightValue, valueOriginalPositions: tempRightPositions, stmts: rightStmts, } = this.tsNodeToValueAndStmts(rightOpNode);
1137
+ stmts.push(...rightStmts);
1138
+ rightValue = tempRightValue;
1139
+ rightPositions = tempRightPositions;
1140
+ }
1141
+ else {
1142
+ rightValue = ValueUtil_1.ValueUtil.getUndefinedConst();
1143
+ rightPositions = [Position_1.FullPosition.DEFAULT];
1144
+ }
1145
+ if (IRUtils_1.IRUtils.moreThanOneAddress(leftValue) && IRUtils_1.IRUtils.moreThanOneAddress(rightValue)) {
1146
+ const { value: tempRightValue, valueOriginalPositions: tempRightPositions, stmts: rightStmts, } = this.generateAssignStmtForValue(rightValue, rightPositions);
1147
+ stmts.push(...rightStmts);
1148
+ rightValue = tempRightValue;
1149
+ rightPositions = tempRightPositions;
1150
+ }
1151
+ const isConst = (nodeFlag & ts.NodeFlags.Const) != 0;
1152
+ if (leftValue instanceof Local_1.Local) {
1153
+ leftValue.setConstFlag(isConst);
1154
+ if (variableDeclaration.type) {
1155
+ leftValue.setType(this.resolveTypeNode(variableDeclaration.type));
1156
+ }
1157
+ if (leftValue.getType() instanceof Type_1.UnknownType && !(rightValue.getType() instanceof Type_1.UnknownType) &&
1158
+ !(rightValue.getType() instanceof Type_1.UndefinedType)) {
1159
+ leftValue.setType(rightValue.getType());
1160
+ }
1161
+ }
1162
+ const assignStmt = new Stmt_1.ArkAssignStmt(leftValue, rightValue);
1163
+ assignStmt.setOperandOriginalPositions([...leftPositions, ...rightPositions]);
1164
+ stmts.push(assignStmt);
1165
+ if (ts.isArrayBindingPattern(leftOpNode)) {
1166
+ const elements = leftOpNode.elements;
1167
+ let index = 0;
1168
+ for (const element of elements) {
1169
+ const arrayRef = new Ref_1.ArkArrayRef(leftValue, new Constant_1.Constant(index.toString(), Type_1.NumberType.getInstance()));
1170
+ const arrayRefPositions = [leftPositions[0], ...leftPositions, Position_1.FullPosition.DEFAULT];
1171
+ const item = new Local_1.Local(element.getText(this.sourceFile));
1172
+ const itemPosition = Position_1.FullPosition.buildFromNode(element, this.sourceFile);
1173
+ item.setConstFlag(isConst);
1174
+ const assignStmt = new Stmt_1.ArkAssignStmt(item, arrayRef);
1175
+ assignStmt.setOperandOriginalPositions([itemPosition, ...arrayRefPositions]);
1176
+ stmts.push(assignStmt);
1177
+ index++;
1178
+ }
1179
+ }
1180
+ else if (ts.isObjectBindingPattern(leftOpNode)) {
1181
+ const elements = leftOpNode.elements;
1182
+ for (const element of elements) {
1183
+ const fieldName = element.propertyName ? element.propertyName.getText(this.sourceFile) : element.name.getText(this.sourceFile);
1184
+ const fieldSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildFieldSignatureFromFieldName(fieldName);
1185
+ const fieldRef = new Ref_1.ArkInstanceFieldRef(leftValue, fieldSignature);
1186
+ const fieldRefPositions = [leftPositions[0], ...leftPositions];
1187
+ const fieldLocal = this.getOrCreatLocal(element.name.getText(this.sourceFile));
1188
+ fieldLocal.setConstFlag(isConst);
1189
+ const fieldLocalPosition = Position_1.FullPosition.buildFromNode(element, this.sourceFile);
1190
+ const assignStmt = new Stmt_1.ArkAssignStmt(fieldLocal, fieldRef);
1191
+ assignStmt.setOperandOriginalPositions([fieldLocalPosition, ...fieldRefPositions]);
1192
+ stmts.push(assignStmt);
1193
+ }
1194
+ }
1195
+ return { value: leftValue, valueOriginalPositions: leftPositions, stmts: stmts };
1196
+ }
1197
+ binaryExpressionToValueAndStmts(binaryExpression) {
1198
+ const compoundAssignmentOperators = new Set([ts.SyntaxKind.PlusEqualsToken,
1199
+ ts.SyntaxKind.MinusEqualsToken,
1200
+ ts.SyntaxKind.AsteriskAsteriskEqualsToken,
1201
+ ts.SyntaxKind.AsteriskEqualsToken,
1202
+ ts.SyntaxKind.SlashEqualsToken,
1203
+ ts.SyntaxKind.PercentEqualsToken,
1204
+ ts.SyntaxKind.AmpersandEqualsToken,
1205
+ ts.SyntaxKind.BarEqualsToken,
1206
+ ts.SyntaxKind.CaretEqualsToken,
1207
+ ts.SyntaxKind.LessThanLessThanEqualsToken,
1208
+ ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
1209
+ ts.SyntaxKind.GreaterThanGreaterThanEqualsToken,
1210
+ ts.SyntaxKind.BarBarEqualsToken,
1211
+ ts.SyntaxKind.AmpersandAmpersandEqualsToken,
1212
+ ts.SyntaxKind.QuestionQuestionEqualsToken]);
1213
+ const operatorToken = binaryExpression.operatorToken;
1214
+ if (operatorToken.kind === ts.SyntaxKind.FirstAssignment) {
1215
+ return this.assignmentToValueAndStmts(binaryExpression);
1216
+ }
1217
+ else if (compoundAssignmentOperators.has(operatorToken.kind)) {
1218
+ return this.compoundAssignmentToValueAndStmts(binaryExpression);
1219
+ }
1220
+ const stmts = [];
1221
+ let { value: opValue1, valueOriginalPositions: opPositions1, stmts: opStmts1, } = this.tsNodeToValueAndStmts(binaryExpression.left);
1222
+ stmts.push(...opStmts1);
1223
+ if (IRUtils_1.IRUtils.moreThanOneAddress(opValue1)) {
1224
+ ({ value: opValue1, valueOriginalPositions: opPositions1, stmts: opStmts1 } =
1225
+ this.generateAssignStmtForValue(opValue1, opPositions1));
1226
+ stmts.push(...opStmts1);
1227
+ }
1228
+ const binaryExpressionPosition = Position_1.FullPosition.buildFromNode(binaryExpression, this.sourceFile);
1229
+ if (operatorToken.kind === ts.SyntaxKind.InstanceOfKeyword) {
1230
+ const instanceOfExpr = new Expr_1.ArkInstanceOfExpr(opValue1, new Type_1.UnclearReferenceType(binaryExpression.right.getText(this.sourceFile)));
1231
+ const instanceOfExprPositions = [binaryExpressionPosition, ...opPositions1];
1232
+ return { value: instanceOfExpr, valueOriginalPositions: instanceOfExprPositions, stmts: stmts };
1233
+ }
1234
+ let { value: opValue2, valueOriginalPositions: opPositions2, stmts: opStmts2, } = this.tsNodeToValueAndStmts(binaryExpression.right);
1235
+ stmts.push(...opStmts2);
1236
+ if (IRUtils_1.IRUtils.moreThanOneAddress(opValue2)) {
1237
+ ({ value: opValue2, valueOriginalPositions: opPositions2, stmts: opStmts2 } =
1238
+ this.generateAssignStmtForValue(opValue2, opPositions2));
1239
+ stmts.push(...opStmts2);
1240
+ }
1241
+ let exprValue;
1242
+ let exprValuePositions = [binaryExpressionPosition];
1243
+ if (operatorToken.kind === ts.SyntaxKind.CommaToken) {
1244
+ exprValue = opValue2;
1245
+ }
1246
+ else {
1247
+ const operator = ArkIRTransformer.tokenToBinaryOperator(operatorToken.kind);
1248
+ if (operator) {
1249
+ if (this.isRelationalOperator(operator)) {
1250
+ exprValue = new Expr_1.ArkConditionExpr(opValue1, opValue2, operator);
1251
+ }
1252
+ else {
1253
+ exprValue = new Expr_1.ArkNormalBinopExpr(opValue1, opValue2, operator);
1254
+ }
1255
+ exprValuePositions.push(...opPositions1, ...opPositions2);
1256
+ }
1257
+ else {
1258
+ exprValue = ValueUtil_1.ValueUtil.getUndefinedConst();
1259
+ exprValuePositions.push(binaryExpressionPosition);
1260
+ }
1261
+ }
1262
+ return { value: exprValue, valueOriginalPositions: exprValuePositions, stmts: stmts };
1263
+ }
1264
+ assignmentToValueAndStmts(binaryExpression) {
1265
+ const leftOpNode = binaryExpression.left;
1266
+ const rightOpNode = binaryExpression.right;
1267
+ const stmts = [];
1268
+ let { value: leftValue, valueOriginalPositions: leftPositions, stmts: leftStmts } = this.tsNodeToValueAndStmts(leftOpNode);
1269
+ stmts.push(...leftStmts);
1270
+ let { value: rightValue, valueOriginalPositions: rightPositions, stmts: rightStmts, } = this.tsNodeToValueAndStmts(rightOpNode);
1271
+ stmts.push(...rightStmts);
1272
+ if (IRUtils_1.IRUtils.moreThanOneAddress(leftValue) && IRUtils_1.IRUtils.moreThanOneAddress(rightValue)) {
1273
+ const { value: newRightValue, valueOriginalPositions: newRightPositions, stmts: rightStmts, } = this.generateAssignStmtForValue(rightValue, rightPositions);
1274
+ stmts.push(...rightStmts);
1275
+ rightValue = newRightValue;
1276
+ rightPositions = newRightPositions;
1277
+ }
1278
+ if (leftValue instanceof Local_1.Local && leftValue.getType() instanceof Type_1.UnknownType
1279
+ && !(rightValue.getType() instanceof Type_1.UnknownType)) {
1280
+ leftValue.setType(rightValue.getType());
1281
+ }
1282
+ const assignStmt = new Stmt_1.ArkAssignStmt(leftValue, rightValue);
1283
+ assignStmt.setOperandOriginalPositions([...leftPositions, ...rightPositions]);
1284
+ stmts.push(assignStmt);
1285
+ return { value: leftValue, valueOriginalPositions: leftPositions, stmts: stmts };
1286
+ }
1287
+ compoundAssignmentToValueAndStmts(binaryExpression) {
1288
+ const stmts = [];
1289
+ let { value: leftValue, valueOriginalPositions: leftPositions, stmts: leftStmts, } = this.tsNodeToValueAndStmts(binaryExpression.left);
1290
+ stmts.push(...leftStmts);
1291
+ let { value: rightValue, valueOriginalPositions: rightPositions, stmts: rightStmts, } = this.tsNodeToValueAndStmts(binaryExpression.right);
1292
+ stmts.push(...rightStmts);
1293
+ if (IRUtils_1.IRUtils.moreThanOneAddress(leftValue) && IRUtils_1.IRUtils.moreThanOneAddress(rightValue)) {
1294
+ const { value: newRightValue, valueOriginalPositions: newRightPositions, stmts: rightStmts, } = this.generateAssignStmtForValue(rightValue, rightPositions);
1295
+ rightValue = newRightValue;
1296
+ rightPositions = newRightPositions;
1297
+ stmts.push(...rightStmts);
1298
+ }
1299
+ let leftOpValue;
1300
+ let leftOpPositions;
1301
+ const operator = this.compoundAssignmentTokenToBinaryOperator(binaryExpression.operatorToken.kind);
1302
+ if (operator) {
1303
+ const exprValue = new Expr_1.ArkNormalBinopExpr(leftValue, rightValue, operator);
1304
+ const exprValuePosition = Position_1.FullPosition.buildFromNode(binaryExpression, this.sourceFile);
1305
+ const assignStmt = new Stmt_1.ArkAssignStmt(leftValue, exprValue);
1306
+ assignStmt.setOperandOriginalPositions([...leftPositions, exprValuePosition, ...leftPositions, ...rightPositions]);
1307
+ stmts.push(assignStmt);
1308
+ leftOpValue = leftValue;
1309
+ leftOpPositions = leftPositions;
1310
+ }
1311
+ else {
1312
+ leftOpValue = ValueUtil_1.ValueUtil.getUndefinedConst();
1313
+ leftOpPositions = [leftPositions[0]];
1314
+ }
1315
+ return { value: leftOpValue, valueOriginalPositions: leftOpPositions, stmts: stmts };
1316
+ }
1317
+ compoundAssignmentTokenToBinaryOperator(token) {
1318
+ switch (token) {
1319
+ case ts.SyntaxKind.QuestionQuestionEqualsToken:
1320
+ return Expr_1.NormalBinaryOperator.NullishCoalescing;
1321
+ case ts.SyntaxKind.AsteriskAsteriskEqualsToken:
1322
+ return Expr_1.NormalBinaryOperator.Exponentiation;
1323
+ case ts.SyntaxKind.SlashEqualsToken:
1324
+ return Expr_1.NormalBinaryOperator.Division;
1325
+ case ts.SyntaxKind.PlusEqualsToken:
1326
+ return Expr_1.NormalBinaryOperator.Addition;
1327
+ case ts.SyntaxKind.MinusEqualsToken:
1328
+ return Expr_1.NormalBinaryOperator.Subtraction;
1329
+ case ts.SyntaxKind.AsteriskEqualsToken:
1330
+ return Expr_1.NormalBinaryOperator.Multiplication;
1331
+ case ts.SyntaxKind.PercentEqualsToken:
1332
+ return Expr_1.NormalBinaryOperator.Remainder;
1333
+ case ts.SyntaxKind.LessThanLessThanEqualsToken:
1334
+ return Expr_1.NormalBinaryOperator.LeftShift;
1335
+ case ts.SyntaxKind.GreaterThanGreaterThanEqualsToken:
1336
+ return Expr_1.NormalBinaryOperator.RightShift;
1337
+ case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:
1338
+ return Expr_1.NormalBinaryOperator.UnsignedRightShift;
1339
+ case ts.SyntaxKind.AmpersandEqualsToken:
1340
+ return Expr_1.NormalBinaryOperator.BitwiseAnd;
1341
+ case ts.SyntaxKind.BarEqualsToken:
1342
+ return Expr_1.NormalBinaryOperator.BitwiseOr;
1343
+ case ts.SyntaxKind.CaretEqualsToken:
1344
+ return Expr_1.NormalBinaryOperator.BitwiseXor;
1345
+ case ts.SyntaxKind.AmpersandAmpersandEqualsToken:
1346
+ return Expr_1.NormalBinaryOperator.LogicalAnd;
1347
+ case ts.SyntaxKind.BarBarEqualsToken:
1348
+ return Expr_1.NormalBinaryOperator.LogicalOr;
1349
+ }
1350
+ return null;
1351
+ }
1352
+ conditionToValueAndStmts(condition) {
1353
+ const stmts = [];
1354
+ let { value: conditionValue, valueOriginalPositions: conditionPositions, stmts: conditionStmts, } = this.tsNodeToValueAndStmts(condition);
1355
+ stmts.push(...conditionStmts);
1356
+ let conditionExpr;
1357
+ if ((conditionValue instanceof Expr_1.AbstractBinopExpr) && this.isRelationalOperator(conditionValue.getOperator())) {
1358
+ const operator = conditionValue.getOperator();
1359
+ conditionExpr = new Expr_1.ArkConditionExpr(conditionValue.getOp1(), conditionValue.getOp2(), operator);
1360
+ }
1361
+ else {
1362
+ if (IRUtils_1.IRUtils.moreThanOneAddress(conditionValue)) {
1363
+ ({
1364
+ value: conditionValue,
1365
+ valueOriginalPositions: conditionPositions,
1366
+ stmts: conditionStmts,
1367
+ } = this.generateAssignStmtForValue(conditionValue, conditionPositions));
1368
+ stmts.push(...conditionStmts);
1369
+ }
1370
+ conditionExpr = new Expr_1.ArkConditionExpr(conditionValue, ValueUtil_1.ValueUtil.getOrCreateNumberConst(0), Expr_1.RelationalBinaryOperator.InEquality);
1371
+ conditionPositions = [conditionPositions[0], ...conditionPositions, Position_1.FullPosition.DEFAULT];
1372
+ }
1373
+ return { value: conditionExpr, valueOriginalPositions: conditionPositions, stmts: stmts };
1374
+ }
1375
+ literalNodeToValueAndStmts(literalNode) {
1376
+ const syntaxKind = literalNode.kind;
1377
+ let constant = null;
1378
+ switch (syntaxKind) {
1379
+ case ts.SyntaxKind.NumericLiteral:
1380
+ constant = ValueUtil_1.ValueUtil.getOrCreateNumberConst(parseFloat(literalNode.text));
1381
+ break;
1382
+ case ts.SyntaxKind.BigIntLiteral:
1383
+ constant = ValueUtil_1.ValueUtil.getOrCreateNumberConst(parseInt(literalNode.text));
1384
+ break;
1385
+ case ts.SyntaxKind.StringLiteral:
1386
+ constant = ValueUtil_1.ValueUtil.createStringConst(literalNode.text);
1387
+ break;
1388
+ case ts.SyntaxKind.RegularExpressionLiteral:
1389
+ constant = new Constant_1.Constant(literalNode.text, Builtin_1.Builtin.REGEXP_CLASS_TYPE);
1390
+ break;
1391
+ case ts.SyntaxKind.NoSubstitutionTemplateLiteral:
1392
+ constant = ValueUtil_1.ValueUtil.createStringConst(literalNode.text);
1393
+ break;
1394
+ case ts.SyntaxKind.NullKeyword:
1395
+ constant = ValueUtil_1.ValueUtil.getNullConstant();
1396
+ break;
1397
+ case ts.SyntaxKind.UndefinedKeyword:
1398
+ constant = ValueUtil_1.ValueUtil.getUndefinedConst();
1399
+ break;
1400
+ case ts.SyntaxKind.TrueKeyword:
1401
+ constant = ValueUtil_1.ValueUtil.getBooleanConstant(true);
1402
+ break;
1403
+ case ts.SyntaxKind.FalseKeyword:
1404
+ constant = ValueUtil_1.ValueUtil.getBooleanConstant(false);
1405
+ break;
1406
+ default:
1407
+ logger.warn(`ast node's syntaxKind is ${ts.SyntaxKind[literalNode.kind]}, not literalNode`);
1408
+ }
1409
+ if (constant === null) {
1410
+ return null;
1411
+ }
1412
+ return {
1413
+ value: constant,
1414
+ valueOriginalPositions: [Position_1.FullPosition.buildFromNode(literalNode, this.sourceFile)],
1415
+ stmts: [],
1416
+ };
1417
+ }
1418
+ getOrCreatLocal(localName, localType = Type_1.UnknownType.getInstance()) {
1419
+ let local = this.locals.get(localName) || null;
1420
+ if (local == null) {
1421
+ local = new Local_1.Local(localName, localType);
1422
+ this.locals.set(localName, local);
1423
+ }
1424
+ return local;
1425
+ }
1426
+ generateTempLocal(localType = Type_1.UnknownType.getInstance()) {
1427
+ const tempLocalName = this.tempLocalPrefix + this.tempLocalIndex;
1428
+ this.tempLocalIndex++;
1429
+ const tempLocal = new Local_1.Local(tempLocalName, localType);
1430
+ this.locals.set(tempLocalName, tempLocal);
1431
+ return tempLocal;
1432
+ }
1433
+ generateAssignStmtForValue(value, valueOriginalPositions) {
1434
+ const leftOp = this.generateTempLocal(value.getType());
1435
+ const leftOpPosition = valueOriginalPositions[0];
1436
+ const assignStmt = new Stmt_1.ArkAssignStmt(leftOp, value);
1437
+ assignStmt.setOperandOriginalPositions([leftOpPosition, ...valueOriginalPositions]);
1438
+ return { value: leftOp, valueOriginalPositions: [leftOpPosition], stmts: [assignStmt] };
1439
+ }
1440
+ isRelationalOperator(operator) {
1441
+ return operator == Expr_1.RelationalBinaryOperator.LessThan ||
1442
+ operator == Expr_1.RelationalBinaryOperator.LessThanOrEqual ||
1443
+ operator == Expr_1.RelationalBinaryOperator.GreaterThan ||
1444
+ operator == Expr_1.RelationalBinaryOperator.GreaterThanOrEqual ||
1445
+ operator == Expr_1.RelationalBinaryOperator.Equality ||
1446
+ operator == Expr_1.RelationalBinaryOperator.InEquality ||
1447
+ operator == Expr_1.RelationalBinaryOperator.StrictEquality ||
1448
+ operator == Expr_1.RelationalBinaryOperator.StrictInequality;
1449
+ }
1450
+ resolveTypeNode(type) {
1451
+ const kind = type.kind;
1452
+ switch (kind) {
1453
+ case ts.SyntaxKind.BooleanKeyword:
1454
+ return Type_1.BooleanType.getInstance();
1455
+ case ts.SyntaxKind.NumberKeyword:
1456
+ return Type_1.NumberType.getInstance();
1457
+ case ts.SyntaxKind.StringKeyword:
1458
+ return Type_1.StringType.getInstance();
1459
+ case ts.SyntaxKind.UndefinedKeyword:
1460
+ return Type_1.UndefinedType.getInstance();
1461
+ case ts.SyntaxKind.AnyKeyword:
1462
+ return Type_1.AnyType.getInstance();
1463
+ case ts.SyntaxKind.VoidKeyword:
1464
+ return Type_1.VoidType.getInstance();
1465
+ case ts.SyntaxKind.NeverKeyword:
1466
+ return Type_1.NeverType.getInstance();
1467
+ case ts.SyntaxKind.TypeReference:
1468
+ return this.resolveTypeReferenceNode(type);
1469
+ case ts.SyntaxKind.ArrayType:
1470
+ return new Type_1.ArrayType(this.resolveTypeNode(type.elementType), 1);
1471
+ case ts.SyntaxKind.UnionType:
1472
+ const cur = type;
1473
+ const mayTypes = [];
1474
+ cur.types.forEach(t => mayTypes.push(this.resolveTypeNode(t)));
1475
+ return new Type_1.UnionType(mayTypes);
1476
+ case ts.SyntaxKind.TupleType:
1477
+ const types = [];
1478
+ type.elements.forEach(element => {
1479
+ types.push(this.resolveTypeNode(element));
1480
+ });
1481
+ return new Type_1.TupleType(types);
1482
+ case ts.SyntaxKind.NamedTupleMember:
1483
+ return this.resolveTypeNode(type.type);
1484
+ case ts.SyntaxKind.LiteralType:
1485
+ return this.resolveLiteralTypeNode(type);
1486
+ case ts.SyntaxKind.TemplateLiteralType:
1487
+ return this.resolveTemplateLiteralTypeNode(type);
1488
+ case ts.SyntaxKind.TypeLiteral:
1489
+ return this.resolveTypeLiteralNode(type);
1490
+ case ts.SyntaxKind.FunctionType:
1491
+ return this.resolveFunctionTypeNode(type);
1492
+ }
1493
+ return Type_1.UnknownType.getInstance();
1494
+ }
1495
+ resolveLiteralTypeNode(literalTypeNode) {
1496
+ const literal = literalTypeNode.literal;
1497
+ const kind = literal.kind;
1498
+ switch (kind) {
1499
+ case ts.SyntaxKind.NullKeyword:
1500
+ return Type_1.NullType.getInstance();
1501
+ case ts.SyntaxKind.TrueKeyword:
1502
+ return Type_1.LiteralType.TRUE;
1503
+ case ts.SyntaxKind.FalseKeyword:
1504
+ return Type_1.LiteralType.FALSE;
1505
+ case ts.SyntaxKind.NumericLiteral:
1506
+ return new Type_1.LiteralType(parseFloat(literal.text));
1507
+ case ts.SyntaxKind.PrefixUnaryExpression:
1508
+ return new Type_1.LiteralType(parseFloat(literal.getText(this.sourceFile)));
1509
+ }
1510
+ return new Type_1.LiteralType(literal.getText(this.sourceFile));
1511
+ }
1512
+ resolveTemplateLiteralTypeNode(templateLiteralTypeNode) {
1513
+ let stringLiterals = [''];
1514
+ const headString = templateLiteralTypeNode.head.rawText || '';
1515
+ let newStringLiterals = [];
1516
+ for (const stringLiteral of stringLiterals) {
1517
+ newStringLiterals.push(stringLiteral + headString);
1518
+ }
1519
+ stringLiterals = newStringLiterals;
1520
+ newStringLiterals = [];
1521
+ for (const templateSpan of templateLiteralTypeNode.templateSpans) {
1522
+ const templateType = this.resolveTypeNode(templateSpan.type);
1523
+ const unfoldTemplateTypes = [];
1524
+ if (templateType instanceof Type_1.UnionType) {
1525
+ unfoldTemplateTypes.push(...templateType.getTypes());
1526
+ }
1527
+ else {
1528
+ unfoldTemplateTypes.push(templateType);
1529
+ }
1530
+ const unfoldTemplateTypeStrs = [];
1531
+ for (const unfoldTemplateType of unfoldTemplateTypes) {
1532
+ unfoldTemplateTypeStrs.push(unfoldTemplateType instanceof Type_1.AliasType ? unfoldTemplateType.getOriginalType().toString() : unfoldTemplateType.toString());
1533
+ }
1534
+ const templateSpanString = templateSpan.literal.rawText || '';
1535
+ for (const stringLiteral of stringLiterals) {
1536
+ for (const unfoldTemplateTypeStr of unfoldTemplateTypeStrs) {
1537
+ newStringLiterals.push(stringLiteral + unfoldTemplateTypeStr + templateSpanString);
1538
+ }
1539
+ }
1540
+ stringLiterals = newStringLiterals;
1541
+ newStringLiterals = [];
1542
+ }
1543
+ const templateTypes = [];
1544
+ for (const stringLiteral of stringLiterals) {
1545
+ templateTypes.push(new Type_1.LiteralType(stringLiteral));
1546
+ }
1547
+ if (templateTypes.length > 0) {
1548
+ return new Type_1.UnionType(templateTypes);
1549
+ }
1550
+ return templateTypes[0];
1551
+ }
1552
+ resolveTypeReferenceNode(typeReferenceNode) {
1553
+ const typeReferenceFullName = typeReferenceNode.getText(this.sourceFile);
1554
+ const aliasTypeAndPosition = this.aliasTypeMap.get(typeReferenceFullName);
1555
+ if (!aliasTypeAndPosition) {
1556
+ const genericTypes = [];
1557
+ if (typeReferenceNode.typeArguments) {
1558
+ for (const typeArgument of typeReferenceNode.typeArguments) {
1559
+ genericTypes.push(this.resolveTypeNode(typeArgument));
1560
+ }
1561
+ }
1562
+ // TODO:handle ts.QualifiedName
1563
+ const typeNameNode = typeReferenceNode.typeName;
1564
+ const typeName = typeNameNode.getText(this.sourceFile);
1565
+ return new Type_1.UnclearReferenceType(typeName, genericTypes);
1566
+ }
1567
+ else {
1568
+ return aliasTypeAndPosition[0];
1569
+ }
1570
+ }
1571
+ resolveTypeLiteralNode(typeLiteralNode) {
1572
+ const anonymousClass = new ArkClass_1.ArkClass();
1573
+ const declaringClass = this.declaringMethod.getDeclaringArkClass();
1574
+ const declaringNamespace = declaringClass.getDeclaringArkNamespace();
1575
+ if (declaringNamespace) {
1576
+ (0, ArkClassBuilder_1.buildNormalArkClassFromArkNamespace)(typeLiteralNode, declaringNamespace, anonymousClass, this.sourceFile);
1577
+ }
1578
+ else {
1579
+ (0, ArkClassBuilder_1.buildNormalArkClassFromArkFile)(typeLiteralNode, declaringClass.getDeclaringArkFile(), anonymousClass, this.sourceFile);
1580
+ }
1581
+ return new Type_1.ClassType(anonymousClass.getSignature());
1582
+ }
1583
+ resolveFunctionTypeNode(functionTypeNode) {
1584
+ const anonymousMethod = new ArkMethod_1.ArkMethod();
1585
+ const declaringClass = this.declaringMethod.getDeclaringArkClass();
1586
+ (0, ArkMethodBuilder_1.buildArkMethodFromArkClass)(functionTypeNode, declaringClass, anonymousMethod, this.sourceFile);
1587
+ return new Type_1.FunctionType(anonymousMethod.getSignature());
1588
+ }
1589
+ isLiteralNode(node) {
1590
+ if (ts.isStringLiteral(node) ||
1591
+ ts.isNumericLiteral(node) ||
1592
+ ts.isBigIntLiteral(node) ||
1593
+ ts.isRegularExpressionLiteral(node) ||
1594
+ ts.isNoSubstitutionTemplateLiteral(node) ||
1595
+ node.kind === ts.SyntaxKind.NullKeyword ||
1596
+ node.kind === ts.SyntaxKind.TrueKeyword ||
1597
+ node.kind === ts.SyntaxKind.FalseKeyword ||
1598
+ node.kind === ts.SyntaxKind.UndefinedKeyword) {
1599
+ return true;
1600
+ }
1601
+ return false;
1602
+ }
1603
+ mapStmtsToTsStmt(stmts, node) {
1604
+ const originalStmt = new Stmt_1.OriginalStmt(node.getText(this.sourceFile), Position_1.LineColPosition.buildFromNode(node, this.sourceFile));
1605
+ for (const stmt of stmts) {
1606
+ if (!this.stmtToOriginalStmt.has(stmt)) {
1607
+ this.stmtToOriginalStmt.set(stmt, originalStmt);
1608
+ }
1609
+ }
1610
+ }
1611
+ static tokenToUnaryOperator(token) {
1612
+ switch (token) {
1613
+ case ts.SyntaxKind.MinusToken:
1614
+ return Expr_1.UnaryOperator.Neg;
1615
+ case ts.SyntaxKind.TildeToken:
1616
+ return Expr_1.UnaryOperator.BitwiseNot;
1617
+ case ts.SyntaxKind.ExclamationToken:
1618
+ return Expr_1.UnaryOperator.LogicalNot;
1619
+ }
1620
+ return null;
1621
+ }
1622
+ static tokenToBinaryOperator(token) {
1623
+ switch (token) {
1624
+ case ts.SyntaxKind.QuestionQuestionToken:
1625
+ return Expr_1.NormalBinaryOperator.NullishCoalescing;
1626
+ case ts.SyntaxKind.AsteriskAsteriskToken:
1627
+ return Expr_1.NormalBinaryOperator.Exponentiation;
1628
+ case ts.SyntaxKind.SlashToken:
1629
+ return Expr_1.NormalBinaryOperator.Division;
1630
+ case ts.SyntaxKind.PlusToken:
1631
+ return Expr_1.NormalBinaryOperator.Addition;
1632
+ case ts.SyntaxKind.MinusToken:
1633
+ return Expr_1.NormalBinaryOperator.Subtraction;
1634
+ case ts.SyntaxKind.AsteriskToken:
1635
+ return Expr_1.NormalBinaryOperator.Multiplication;
1636
+ case ts.SyntaxKind.PercentToken:
1637
+ return Expr_1.NormalBinaryOperator.Remainder;
1638
+ case ts.SyntaxKind.LessThanLessThanToken:
1639
+ return Expr_1.NormalBinaryOperator.LeftShift;
1640
+ case ts.SyntaxKind.GreaterThanGreaterThanToken:
1641
+ return Expr_1.NormalBinaryOperator.RightShift;
1642
+ case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken:
1643
+ return Expr_1.NormalBinaryOperator.UnsignedRightShift;
1644
+ case ts.SyntaxKind.AmpersandToken:
1645
+ return Expr_1.NormalBinaryOperator.BitwiseAnd;
1646
+ case ts.SyntaxKind.BarToken:
1647
+ return Expr_1.NormalBinaryOperator.BitwiseOr;
1648
+ case ts.SyntaxKind.CaretToken:
1649
+ return Expr_1.NormalBinaryOperator.BitwiseXor;
1650
+ case ts.SyntaxKind.AmpersandAmpersandToken:
1651
+ return Expr_1.NormalBinaryOperator.LogicalAnd;
1652
+ case ts.SyntaxKind.BarBarToken:
1653
+ return Expr_1.NormalBinaryOperator.LogicalOr;
1654
+ case ts.SyntaxKind.LessThanToken:
1655
+ return Expr_1.RelationalBinaryOperator.LessThan;
1656
+ case ts.SyntaxKind.LessThanEqualsToken:
1657
+ return Expr_1.RelationalBinaryOperator.LessThanOrEqual;
1658
+ case ts.SyntaxKind.GreaterThanToken:
1659
+ return Expr_1.RelationalBinaryOperator.GreaterThan;
1660
+ case ts.SyntaxKind.GreaterThanEqualsToken:
1661
+ return Expr_1.RelationalBinaryOperator.GreaterThanOrEqual;
1662
+ case ts.SyntaxKind.EqualsEqualsToken:
1663
+ return Expr_1.RelationalBinaryOperator.Equality;
1664
+ case ts.SyntaxKind.ExclamationEqualsToken:
1665
+ return Expr_1.RelationalBinaryOperator.InEquality;
1666
+ case ts.SyntaxKind.EqualsEqualsEqualsToken:
1667
+ return Expr_1.RelationalBinaryOperator.StrictEquality;
1668
+ case ts.SyntaxKind.ExclamationEqualsEqualsToken:
1669
+ return Expr_1.RelationalBinaryOperator.StrictInequality;
1670
+ }
1671
+ return null;
1672
+ }
1673
+ }
1674
+ exports.ArkIRTransformer = ArkIRTransformer;