arkanalyzer 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/config/arkanalyzer.json +8 -0
  2. package/docs/IR2ts-stmt.md +81 -0
  3. package/docs/IR2ts.md +82 -0
  4. package/lib/Config.d.ts +29 -1
  5. package/lib/Config.d.ts.map +1 -1
  6. package/lib/Config.js +44 -11
  7. package/lib/Scene.d.ts +152 -9
  8. package/lib/Scene.d.ts.map +1 -1
  9. package/lib/Scene.js +233 -66
  10. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts +2 -1
  11. package/lib/callgraph/algorithm/AbstractAnalysis.d.ts.map +1 -1
  12. package/lib/callgraph/algorithm/AbstractAnalysis.js +14 -7
  13. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.d.ts.map +1 -1
  14. package/lib/callgraph/algorithm/ClassHierarchyAnalysis.js +2 -4
  15. package/lib/callgraph/algorithm/RapidTypeAnalysis.d.ts.map +1 -1
  16. package/lib/callgraph/algorithm/RapidTypeAnalysis.js +2 -3
  17. package/lib/callgraph/common/Statistics.js +1 -1
  18. package/lib/callgraph/model/BaseGraph.js +2 -2
  19. package/lib/callgraph/model/CallGraph.d.ts +3 -2
  20. package/lib/callgraph/model/CallGraph.d.ts.map +1 -1
  21. package/lib/callgraph/model/CallGraph.js +23 -14
  22. package/lib/callgraph/model/builder/CallGraphBuilder.d.ts +2 -2
  23. package/lib/callgraph/model/builder/CallGraphBuilder.js +3 -3
  24. package/lib/callgraph/pointerAnalysis/Context.d.ts.map +1 -1
  25. package/lib/callgraph/pointerAnalysis/Context.js +0 -1
  26. package/lib/callgraph/pointerAnalysis/Pag.d.ts +36 -9
  27. package/lib/callgraph/pointerAnalysis/Pag.d.ts.map +1 -1
  28. package/lib/callgraph/pointerAnalysis/Pag.js +130 -37
  29. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts +34 -5
  30. package/lib/callgraph/pointerAnalysis/PagBuilder.d.ts.map +1 -1
  31. package/lib/callgraph/pointerAnalysis/PagBuilder.js +479 -126
  32. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts +6 -0
  33. package/lib/callgraph/pointerAnalysis/PointerAnalysis.d.ts.map +1 -1
  34. package/lib/callgraph/pointerAnalysis/PointerAnalysis.js +107 -45
  35. package/lib/callgraph/pointerAnalysis/PtsDS.d.ts.map +1 -1
  36. package/lib/callgraph/pointerAnalysis/PtsDS.js +0 -2
  37. package/lib/core/base/Constant.d.ts +37 -5
  38. package/lib/core/base/Constant.d.ts.map +1 -1
  39. package/lib/core/base/Constant.js +58 -8
  40. package/lib/core/base/Expr.d.ts +98 -13
  41. package/lib/core/base/Expr.d.ts.map +1 -1
  42. package/lib/core/base/Expr.js +295 -127
  43. package/lib/core/base/Local.d.ts +70 -5
  44. package/lib/core/base/Local.d.ts.map +1 -1
  45. package/lib/core/base/Local.js +77 -4
  46. package/lib/core/base/Ref.d.ts +79 -5
  47. package/lib/core/base/Ref.d.ts.map +1 -1
  48. package/lib/core/base/Ref.js +143 -38
  49. package/lib/core/base/Stmt.d.ts +126 -12
  50. package/lib/core/base/Stmt.d.ts.map +1 -1
  51. package/lib/core/base/Stmt.js +135 -28
  52. package/lib/core/base/Type.d.ts +11 -2
  53. package/lib/core/base/Type.d.ts.map +1 -1
  54. package/lib/core/base/Type.js +47 -42
  55. package/lib/core/base/Value.d.ts +24 -2
  56. package/lib/core/base/Value.d.ts.map +1 -1
  57. package/lib/core/common/ArkError.d.ts +15 -0
  58. package/lib/core/common/ArkError.d.ts.map +1 -0
  59. package/lib/core/common/ArkError.js +28 -0
  60. package/lib/core/common/ArkIRTransformer.d.ts +12 -5
  61. package/lib/core/common/ArkIRTransformer.d.ts.map +1 -1
  62. package/lib/core/common/ArkIRTransformer.js +90 -45
  63. package/lib/core/common/BodyBuilder.d.ts +2 -0
  64. package/lib/core/common/BodyBuilder.d.ts.map +1 -1
  65. package/lib/core/common/BodyBuilder.js +5 -2
  66. package/lib/core/common/Builtin.js +1 -1
  67. package/lib/core/common/CfgBuilder.d.ts +12 -7
  68. package/lib/core/common/CfgBuilder.d.ts.map +1 -1
  69. package/lib/core/common/CfgBuilder.js +336 -140
  70. package/lib/core/common/Const.d.ts +15 -10
  71. package/lib/core/common/Const.d.ts.map +1 -1
  72. package/lib/core/common/Const.js +18 -11
  73. package/lib/core/common/DummyMainCreater.d.ts +5 -4
  74. package/lib/core/common/DummyMainCreater.d.ts.map +1 -1
  75. package/lib/core/common/DummyMainCreater.js +43 -28
  76. package/lib/core/common/EtsConst.d.ts +1 -0
  77. package/lib/core/common/EtsConst.d.ts.map +1 -1
  78. package/lib/core/common/EtsConst.js +2 -1
  79. package/lib/core/common/ExprUseReplacer.js +8 -8
  80. package/lib/core/common/IRUtils.d.ts +7 -0
  81. package/lib/core/common/IRUtils.d.ts.map +1 -1
  82. package/lib/core/common/IRUtils.js +34 -2
  83. package/lib/core/common/ModelUtils.d.ts +1 -0
  84. package/lib/core/common/ModelUtils.d.ts.map +1 -1
  85. package/lib/core/common/ModelUtils.js +39 -36
  86. package/lib/core/common/RefUseReplacer.js +3 -3
  87. package/lib/core/common/StmtUseReplacer.js +4 -4
  88. package/lib/core/common/TSConst.d.ts +10 -3
  89. package/lib/core/common/TSConst.d.ts.map +1 -1
  90. package/lib/core/common/TSConst.js +11 -4
  91. package/lib/core/common/TypeInference.d.ts +8 -2
  92. package/lib/core/common/TypeInference.d.ts.map +1 -1
  93. package/lib/core/common/TypeInference.js +222 -90
  94. package/lib/core/common/ValueUtil.d.ts +0 -4
  95. package/lib/core/common/ValueUtil.d.ts.map +1 -1
  96. package/lib/core/common/ValueUtil.js +10 -27
  97. package/lib/core/common/VisibleValue.js +1 -1
  98. package/lib/core/dataflow/DataflowProblem.d.ts +1 -0
  99. package/lib/core/dataflow/DataflowProblem.d.ts.map +1 -1
  100. package/lib/core/dataflow/DataflowProblem.js +4 -4
  101. package/lib/core/dataflow/DataflowSolver.d.ts +20 -16
  102. package/lib/core/dataflow/DataflowSolver.d.ts.map +1 -1
  103. package/lib/core/dataflow/DataflowSolver.js +67 -78
  104. package/lib/core/dataflow/TiantAnalysis.d.ts +1 -0
  105. package/lib/core/dataflow/TiantAnalysis.d.ts.map +1 -1
  106. package/lib/core/dataflow/TiantAnalysis.js +42 -28
  107. package/lib/core/dataflow/UndefinedVariable.d.ts +15 -1
  108. package/lib/core/dataflow/UndefinedVariable.d.ts.map +1 -1
  109. package/lib/core/dataflow/UndefinedVariable.js +122 -76
  110. package/lib/core/dataflow/Util.d.ts +5 -1
  111. package/lib/core/dataflow/Util.d.ts.map +1 -1
  112. package/lib/core/dataflow/Util.js +43 -22
  113. package/lib/core/graph/BasicBlock.d.ts +72 -0
  114. package/lib/core/graph/BasicBlock.d.ts.map +1 -1
  115. package/lib/core/graph/BasicBlock.js +165 -3
  116. package/lib/core/graph/Cfg.d.ts +30 -1
  117. package/lib/core/graph/Cfg.d.ts.map +1 -1
  118. package/lib/core/graph/Cfg.js +131 -11
  119. package/lib/core/graph/DominanceFinder.js +7 -7
  120. package/lib/core/graph/DominanceTree.js +4 -4
  121. package/lib/core/graph/builder/ViewTreeBuilder.d.ts.map +1 -1
  122. package/lib/core/graph/builder/ViewTreeBuilder.js +6 -5
  123. package/lib/core/model/ArkBaseModel.d.ts +59 -0
  124. package/lib/core/model/ArkBaseModel.d.ts.map +1 -0
  125. package/lib/core/model/ArkBaseModel.js +271 -0
  126. package/lib/core/model/ArkBody.d.ts +3 -9
  127. package/lib/core/model/ArkBody.d.ts.map +1 -1
  128. package/lib/core/model/ArkBody.js +3 -14
  129. package/lib/core/model/ArkClass.d.ts +107 -13
  130. package/lib/core/model/ArkClass.d.ts.map +1 -1
  131. package/lib/core/model/ArkClass.js +152 -54
  132. package/lib/core/model/ArkExport.d.ts +8 -7
  133. package/lib/core/model/ArkExport.d.ts.map +1 -1
  134. package/lib/core/model/ArkExport.js +16 -18
  135. package/lib/core/model/ArkField.d.ts +16 -13
  136. package/lib/core/model/ArkField.d.ts.map +1 -1
  137. package/lib/core/model/ArkField.js +18 -62
  138. package/lib/core/model/ArkFile.d.ts +42 -0
  139. package/lib/core/model/ArkFile.d.ts.map +1 -1
  140. package/lib/core/model/ArkFile.js +58 -0
  141. package/lib/core/model/ArkImport.d.ts +9 -7
  142. package/lib/core/model/ArkImport.d.ts.map +1 -1
  143. package/lib/core/model/ArkImport.js +11 -12
  144. package/lib/core/model/ArkMetadata.d.ts +20 -0
  145. package/lib/core/model/ArkMetadata.d.ts.map +1 -0
  146. package/lib/core/model/ArkMetadata.js +44 -0
  147. package/lib/core/model/ArkMethod.d.ts +195 -17
  148. package/lib/core/model/ArkMethod.d.ts.map +1 -1
  149. package/lib/core/model/ArkMethod.js +363 -46
  150. package/lib/core/model/ArkNamespace.d.ts +6 -8
  151. package/lib/core/model/ArkNamespace.d.ts.map +1 -1
  152. package/lib/core/model/ArkNamespace.js +16 -20
  153. package/lib/core/model/ArkSignature.d.ts +41 -0
  154. package/lib/core/model/ArkSignature.d.ts.map +1 -1
  155. package/lib/core/model/ArkSignature.js +76 -19
  156. package/lib/core/model/builder/ArkClassBuilder.d.ts.map +1 -1
  157. package/lib/core/model/builder/ArkClassBuilder.js +60 -49
  158. package/lib/core/model/builder/ArkExportBuilder.d.ts.map +1 -1
  159. package/lib/core/model/builder/ArkExportBuilder.js +12 -6
  160. package/lib/core/model/builder/ArkFieldBuilder.d.ts.map +1 -1
  161. package/lib/core/model/builder/ArkFieldBuilder.js +13 -9
  162. package/lib/core/model/builder/ArkFileBuilder.js +1 -3
  163. package/lib/core/model/builder/ArkImportBuilder.d.ts +2 -1
  164. package/lib/core/model/builder/ArkImportBuilder.d.ts.map +1 -1
  165. package/lib/core/model/builder/ArkImportBuilder.js +16 -13
  166. package/lib/core/model/builder/ArkMethodBuilder.d.ts +3 -1
  167. package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
  168. package/lib/core/model/builder/ArkMethodBuilder.js +105 -45
  169. package/lib/core/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
  170. package/lib/core/model/builder/ArkNamespaceBuilder.js +4 -5
  171. package/lib/core/model/builder/builderUtils.d.ts +2 -1
  172. package/lib/core/model/builder/builderUtils.d.ts.map +1 -1
  173. package/lib/core/model/builder/builderUtils.js +63 -43
  174. package/lib/index.d.ts +2 -1
  175. package/lib/index.d.ts.map +1 -1
  176. package/lib/index.js +4 -3
  177. package/lib/save/ArkStream.js +1 -1
  178. package/lib/save/DotPrinter.d.ts.map +1 -1
  179. package/lib/save/DotPrinter.js +1 -15
  180. package/lib/save/GraphPrinter.d.ts.map +1 -1
  181. package/lib/save/GraphPrinter.js +4 -2
  182. package/lib/save/JsonPrinter.js +5 -5
  183. package/lib/save/ViewTreePrinter.d.ts +16 -0
  184. package/lib/save/ViewTreePrinter.d.ts.map +1 -0
  185. package/lib/save/ViewTreePrinter.js +130 -0
  186. package/lib/save/source/SourceBase.d.ts +2 -2
  187. package/lib/save/source/SourceBase.d.ts.map +1 -1
  188. package/lib/save/source/SourceBase.js +6 -13
  189. package/lib/save/source/SourceBody.d.ts.map +1 -1
  190. package/lib/save/source/SourceBody.js +27 -14
  191. package/lib/save/source/SourceClass.d.ts.map +1 -1
  192. package/lib/save/source/SourceClass.js +12 -8
  193. package/lib/save/source/SourceField.d.ts.map +1 -1
  194. package/lib/save/source/SourceField.js +6 -2
  195. package/lib/save/source/SourceMethod.d.ts.map +1 -1
  196. package/lib/save/source/SourceMethod.js +10 -3
  197. package/lib/save/source/SourceModule.d.ts.map +1 -1
  198. package/lib/save/source/SourceModule.js +16 -10
  199. package/lib/save/source/SourceNamespace.d.ts.map +1 -1
  200. package/lib/save/source/SourceNamespace.js +4 -0
  201. package/lib/save/source/SourceStmt.d.ts +1 -1
  202. package/lib/save/source/SourceStmt.d.ts.map +1 -1
  203. package/lib/save/source/SourceStmt.js +37 -25
  204. package/lib/save/source/SourceTransformer.d.ts +6 -0
  205. package/lib/save/source/SourceTransformer.d.ts.map +1 -1
  206. package/lib/save/source/SourceTransformer.js +82 -51
  207. package/lib/save/source/SourceUtils.d.ts.map +1 -1
  208. package/lib/save/source/SourceUtils.js +12 -11
  209. package/lib/transformer/StaticSingleAssignmentFormer.js +3 -3
  210. package/lib/utils/CfgStructualAnalysis.d.ts +1 -0
  211. package/lib/utils/CfgStructualAnalysis.d.ts.map +1 -1
  212. package/lib/utils/CfgStructualAnalysis.js +103 -72
  213. package/lib/utils/callGraphUtils.d.ts.map +1 -1
  214. package/lib/utils/callGraphUtils.js +7 -10
  215. package/lib/utils/crypto_utils.d.ts +6 -0
  216. package/lib/utils/crypto_utils.d.ts.map +1 -0
  217. package/lib/utils/crypto_utils.js +57 -0
  218. package/lib/utils/entryMethodUtils.d.ts.map +1 -1
  219. package/lib/utils/entryMethodUtils.js +27 -26
  220. package/lib/utils/getAllFiles.d.ts +1 -1
  221. package/lib/utils/getAllFiles.d.ts.map +1 -1
  222. package/lib/utils/getAllFiles.js +4 -5
  223. package/lib/utils/logger.js +2 -2
  224. package/package.json +3 -2
@@ -48,12 +48,13 @@ const ValueUtil_1 = require("../common/ValueUtil");
48
48
  const ArkField_1 = require("../model/ArkField");
49
49
  const ArkMethod_1 = require("../model/ArkMethod");
50
50
  const Const_1 = require("../common/Const");
51
+ const TSConst_1 = require("../common/TSConst");
51
52
  const logger = logger_1.default.getLogger(logger_1.LOG_MODULE_TYPE.ARKANALYZER, 'Ref');
52
53
  /**
53
54
  * @category core/base/ref
54
55
  */
55
56
  class AbstractRef {
56
- inferType(arkClass) {
57
+ inferType(arkMethod) {
57
58
  return this;
58
59
  }
59
60
  }
@@ -64,12 +65,43 @@ class ArkArrayRef extends AbstractRef {
64
65
  this.base = base;
65
66
  this.index = index;
66
67
  }
68
+ /**
69
+ * Returns the base of this array reference. Array reference refers to access to array elements.
70
+ * Array references usually consist of an local variable and an index.
71
+ * For example, `a[i]` is a typical array reference, where `a` is the base (i.e., local variable)
72
+ * pointing to the actual memory location where the array is stored
73
+ * and `i` is the index indicating access to the `i-th` element from array `a`.
74
+ * @returns the base of this array reference.
75
+ * @example
76
+ * 1. Get the base and the specific elements.
77
+
78
+ ```typescript
79
+ // Create an array
80
+ let myArray: number[] = [10, 20, 30, 40];
81
+ // Create an ArrayRef object representing a reference to myArray[2]
82
+ let arrayRef = new ArkArrayRef(myArray, 2);
83
+ // Use the getBase() method to get the base of the array
84
+ let baseArray = arrayRef.getBase();
85
+
86
+ console.log("Base array:", baseArray); // Output: Base array: [10, 20, 30, 40]
87
+
88
+ // Use baseArray and obeject index of ArrayRef to access to specific array elements
89
+ let element = baseArray[arrayRef.index];
90
+ console.log("Element at index", arrayRef.index, ":", element); // Output: Element at index 2 : 30
91
+ ```
92
+ */
67
93
  getBase() {
68
94
  return this.base;
69
95
  }
70
96
  setBase(newBase) {
71
97
  this.base = newBase;
72
98
  }
99
+ /**
100
+ * Returns the index of this array reference.
101
+ * In TypeScript, an array reference means that the variable stores
102
+ * the memory address of the array rather than the actual data of the array.
103
+ * @returns The index of this array reference.
104
+ */
73
105
  getIndex() {
74
106
  return this.index;
75
107
  }
@@ -78,6 +110,9 @@ class ArkArrayRef extends AbstractRef {
78
110
  }
79
111
  getType() {
80
112
  const baseType = this.base.getType();
113
+ if (baseType instanceof Type_1.AliasType) {
114
+ return baseType.getOriginalType();
115
+ }
81
116
  if (baseType instanceof Type_1.ArrayType) {
82
117
  return baseType.getBaseType();
83
118
  }
@@ -104,9 +139,31 @@ class AbstractFieldRef extends AbstractRef {
104
139
  super();
105
140
  this.fieldSignature = fieldSignature;
106
141
  }
142
+ /**
143
+ * Returns the the field name as a **string**.
144
+ * @returns The the field name.
145
+ */
107
146
  getFieldName() {
108
147
  return this.fieldSignature.getFieldName();
109
148
  }
149
+ /**
150
+ * Returns a field signature, which consists of a class signature,
151
+ * a **string** field name, and a **boolean** label indicating whether it is static or not.
152
+ * @returns The field signature.
153
+ * @example
154
+ * 1. Compare two Fields
155
+
156
+ ```typescript
157
+ const fieldSignature = new FieldSignature();
158
+ fieldSignature.setFieldName(...);
159
+ const fieldRef = new ArkInstanceFieldRef(baseValue as Local, fieldSignature);
160
+ ...
161
+ if (fieldRef.getFieldSignature().getFieldName() ===
162
+ targetField.getFieldSignature().getFieldName()) {
163
+ ...
164
+ }
165
+ ```
166
+ */
110
167
  getFieldSignature() {
111
168
  return this.fieldSignature;
112
169
  }
@@ -123,6 +180,26 @@ class ArkInstanceFieldRef extends AbstractFieldRef {
123
180
  super(fieldSignature);
124
181
  this.base = base;
125
182
  }
183
+ /**
184
+ * Returns the local of field, showing which object this field belongs to.
185
+ * A {@link Local} consists of :
186
+ * - Name: the **string** name of local value, e.g., "$temp0".
187
+ * - Type: the type of value.
188
+ * @returns The object that the field belongs to.
189
+ * @example
190
+ * 1. Get a base.
191
+
192
+ ```typescript
193
+ if (expr instanceof ArkInstanceFieldRef) {
194
+ ...
195
+ let base = expr.getBase();
196
+ if (base.getName() == 'this') {
197
+ ...
198
+ }
199
+ ...
200
+ }
201
+ ```
202
+ */
126
203
  getBase() {
127
204
  return this.base;
128
205
  }
@@ -138,7 +215,7 @@ class ArkInstanceFieldRef extends AbstractFieldRef {
138
215
  toString() {
139
216
  return this.base.toString() + '.<' + this.getFieldSignature() + '>';
140
217
  }
141
- inferType(arkClass) {
218
+ getBaseType(arkClass) {
142
219
  let baseType = this.base.getType();
143
220
  if (this.base instanceof Local_1.Local && baseType instanceof Type_1.UnknownType) {
144
221
  baseType = TypeInference_1.TypeInference.inferBaseType(this.base.getName(), arkClass);
@@ -152,61 +229,80 @@ class ArkInstanceFieldRef extends AbstractFieldRef {
152
229
  }
153
230
  if (!baseType) {
154
231
  logger.warn('infer field ref base type fail: ' + this.toString());
155
- return this;
232
+ return null;
156
233
  }
157
234
  if (this.base instanceof Local_1.Local) {
235
+ if (this.base.getName() === TSConst_1.THIS_NAME && arkClass.isAnonymousClass()) {
236
+ return null;
237
+ }
158
238
  this.base.setType(baseType);
159
239
  }
240
+ if (baseType instanceof Type_1.AliasType) {
241
+ baseType = baseType.getOriginalType();
242
+ }
243
+ return baseType;
244
+ }
245
+ inferType(arkMethod) {
246
+ const arkClass = arkMethod.getDeclaringArkClass();
247
+ const baseType = this.getBaseType(arkClass);
248
+ if (!baseType) {
249
+ return this;
250
+ }
160
251
  if (baseType instanceof Type_1.ArrayType && this.getFieldName() !== 'length') {
161
252
  return new ArkArrayRef(this.base, ValueUtil_1.ValueUtil.createConst(this.getFieldName()));
162
253
  }
163
- const newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
164
- if (newFieldSignature.isStatic()) {
165
- return new ArkStaticFieldRef(newFieldSignature);
254
+ let newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
255
+ if (baseType instanceof Type_1.UnionType) {
256
+ for (const type of baseType.getTypes()) {
257
+ if (type instanceof Type_1.UndefinedType || type instanceof Type_1.NullType) {
258
+ continue;
259
+ }
260
+ newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
261
+ if (!TypeInference_1.TypeInference.isUnclearType(newFieldSignature)) {
262
+ break;
263
+ }
264
+ }
166
265
  }
167
266
  else {
267
+ newFieldSignature = this.getNewFieldSignature(arkClass, baseType);
268
+ }
269
+ if (newFieldSignature) {
270
+ if (newFieldSignature.isStatic()) {
271
+ return new ArkStaticFieldRef(newFieldSignature);
272
+ }
168
273
  this.setFieldSignature(newFieldSignature);
169
274
  }
170
275
  return this;
171
276
  }
172
277
  getNewFieldSignature(arkClass, baseType) {
173
- let oldFieldSignature = this.getFieldSignature();
174
- const propertyAndproperty = TypeInference_1.TypeInference.inferFieldType(baseType, this.getFieldName(), arkClass);
175
- let property = null;
176
- let propertyType = oldFieldSignature.getType();
177
- if (propertyAndproperty) {
178
- property = propertyAndproperty[0];
179
- propertyType = propertyAndproperty[1];
180
- }
181
- if (TypeInference_1.TypeInference.isUnclearType(propertyType)) {
278
+ const fieldName = this.getFieldName().replace(/[\"|\']/, '');
279
+ const propertyAndType = TypeInference_1.TypeInference.inferFieldType(baseType, fieldName, arkClass);
280
+ let propertyType = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[1];
281
+ if (propertyType && TypeInference_1.TypeInference.isUnclearType(propertyType)) {
182
282
  const newType = TypeInference_1.TypeInference.inferUnclearedType(propertyType, arkClass);
183
283
  if (newType) {
184
284
  propertyType = newType;
185
285
  }
186
286
  }
187
- let newFieldSignature;
188
- if (baseType instanceof Type_1.ClassType && property instanceof ArkField_1.ArkField) {
189
- newFieldSignature = property.getSignature();
287
+ let staticFlag;
288
+ let signature;
289
+ if (baseType instanceof Type_1.ClassType) {
290
+ const property = propertyAndType === null || propertyAndType === void 0 ? void 0 : propertyAndType[0];
291
+ if (property instanceof ArkField_1.ArkField) {
292
+ return property.getSignature();
293
+ }
294
+ staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
295
+ (property instanceof ArkMethod_1.ArkMethod && property.isStatic());
296
+ signature = property instanceof ArkMethod_1.ArkMethod ? property.getSignature().getDeclaringClassSignature() : baseType.getClassSignature();
297
+ }
298
+ else if (baseType instanceof Type_1.AnnotationNamespaceType) {
299
+ staticFlag = true;
300
+ signature = baseType.getNamespaceSignature();
190
301
  }
191
302
  else {
192
- let staticFlag;
193
- let signature;
194
- if (baseType instanceof Type_1.ClassType) {
195
- staticFlag = baseType.getClassSignature().getClassName() === Const_1.DEFAULT_ARK_CLASS_NAME ||
196
- (property instanceof ArkMethod_1.ArkMethod && property.isStatic());
197
- signature = baseType.getClassSignature();
198
- }
199
- else if (baseType instanceof Type_1.AnnotationNamespaceType) {
200
- staticFlag = true;
201
- signature = baseType.getNamespaceSignature();
202
- }
203
- else {
204
- staticFlag = oldFieldSignature.isStatic();
205
- signature = oldFieldSignature.getDeclaringSignature();
206
- }
207
- newFieldSignature = new ArkSignature_1.FieldSignature(this.getFieldName(), signature, propertyType, staticFlag);
303
+ return null;
208
304
  }
209
- return newFieldSignature;
305
+ return new ArkSignature_1.FieldSignature(fieldName, signature, propertyType !== null && propertyType !== void 0 ? propertyType : this.getType(), staticFlag);
210
306
  }
211
307
  }
212
308
  exports.ArkInstanceFieldRef = ArkInstanceFieldRef;
@@ -237,8 +333,16 @@ class ArkParameterRef extends AbstractRef {
237
333
  setType(newType) {
238
334
  this.paramType = newType;
239
335
  }
240
- inferType(arkClass) {
241
- let type = TypeInference_1.TypeInference.inferUnclearedType(this.paramType, arkClass);
336
+ inferType(arkMethod) {
337
+ var _a;
338
+ if (arkMethod.isAnonymousMethod() && this.paramType instanceof Type_1.UnknownType) {
339
+ const type1 = (_a = arkMethod.getSignature().getMethodSubSignature().getParameters()[this.index]) === null || _a === void 0 ? void 0 : _a.getType();
340
+ if (!TypeInference_1.TypeInference.isUnclearType(type1)) {
341
+ this.paramType = type1;
342
+ return this;
343
+ }
344
+ }
345
+ let type = TypeInference_1.TypeInference.inferUnclearedType(this.paramType, arkMethod.getDeclaringArkClass());
242
346
  if (type) {
243
347
  this.paramType = type;
244
348
  }
@@ -257,7 +361,8 @@ class ArkThisRef extends AbstractRef {
257
361
  super();
258
362
  this.type = type;
259
363
  }
260
- inferType(arkClass) {
364
+ inferType(arkMethod) {
365
+ const arkClass = arkMethod.getDeclaringArkClass();
261
366
  const className = this.type.getClassSignature().getClassName();
262
367
  if (className.startsWith(Const_1.ANONYMOUS_CLASS_PREFIX)) {
263
368
  let type = TypeInference_1.TypeInference.inferBaseType(className.split(Const_1.ANONYMOUS_CLASS_DELIMITER)[1], arkClass);
@@ -3,21 +3,63 @@ import { AbstractExpr, AbstractInvokeExpr, ArkConditionExpr } from './Expr';
3
3
  import { AbstractFieldRef, ArkArrayRef } from './Ref';
4
4
  import { Value } from './Value';
5
5
  import { FullPosition, LineColPosition } from './Position';
6
+ import { ArkMetadata, ArkMetadataKind, ArkMetadataType } from '../model/ArkMetadata';
6
7
  /**
7
8
  * @category core/base/stmt
8
9
  */
9
10
  export declare abstract class Stmt {
10
- protected text: string;
11
- protected position: LineColPosition;
12
- protected cfg: Cfg | null;
13
- protected operandOriginalPositions: FullPosition[] | null;
11
+ protected text?: string;
12
+ protected originalText?: string;
13
+ protected originalPosition: LineColPosition;
14
+ protected cfg: Cfg;
15
+ protected operandOriginalPositions?: FullPosition[];
16
+ metadata?: ArkMetadata;
17
+ getMetadata(kind: ArkMetadataKind): ArkMetadataType | undefined;
18
+ setMetadata(kind: ArkMetadataKind, value: ArkMetadataType): void;
14
19
  /** Return a list of values which are uesd in this statement */
15
20
  getUses(): Value[];
16
21
  replaceUse(oldUse: Value, newUse: Value): void;
17
- /** Return the def which is uesd in this statement */
22
+ /**
23
+ * Return the definition which is uesd in this statement. Generally, the definition is the left value of `=` in 3AC.
24
+ * For example, the definition in 3AC of `value = parameter0: @project-1/sample-1.ets: AnonymousClass-0` is `value`,
25
+ * and the definition in `$temp0 = staticinvoke <@_ProjectName/_FileName: xxx.create()>()` is `\$temp0`.
26
+ * @returns The definition in 3AC (may be a **null**).
27
+ * @example
28
+ * 1. get the def in stmt.
29
+
30
+ ```typescript
31
+ for (const block of this.blocks) {
32
+ for (const stmt of block.getStmts()) {
33
+ const defValue = stmt.getDef();
34
+ ...
35
+ }
36
+ }
37
+ ```
38
+ */
18
39
  getDef(): Value | null;
19
40
  getDefAndUses(): Value[];
20
- getCfg(): Cfg | null;
41
+ /**
42
+ * Get the CFG (i.e., control flow graph) of an {@link ArkBody} in which the statement is.
43
+ * A CFG contains a set of basic blocks and statements corresponding to each basic block.
44
+ * Note that, "source code" and "three-address" are two types of {@link Stmt} in ArkAnalyzer.
45
+ * Source code {@link Stmt} represents the statement of ets/ts source code, while three-address code {@link Stmt} represents the statement after it has been converted into three-address code.
46
+ * Since the source code {@link Stmt} does not save its CFG reference, it returns **null**,
47
+ * while the `getCfg()` of the third address code {@link Stmt} will return its CFG reference.
48
+ * @returns The CFG (i.e., control flow graph) of an {@link ArkBody} in which the statement is.
49
+ * @example
50
+ * 1. get the ArkFile based on stmt.
51
+
52
+ ```typescript
53
+ const arkFile = stmt.getCfg()?.getDeclaringMethod().getDeclaringArkFile();
54
+ ```
55
+
56
+ 2. get the ArkMethod based on stmt.
57
+
58
+ ```typescript
59
+ let sourceMethod: ArkMethod = stmt.getCfg()?.getDeclaringMethod();
60
+ ```
61
+ */
62
+ getCfg(): Cfg;
21
63
  setCfg(cfg: Cfg): void;
22
64
  /**
23
65
  * Return true if the following statement may not execute after this statement.
@@ -27,30 +69,86 @@ export declare abstract class Stmt {
27
69
  /** Return the number of statements which this statement may go to */
28
70
  getExpectedSuccessorCount(): number;
29
71
  containsInvokeExpr(): boolean;
72
+ /**
73
+ * Returns the method's invocation expression (including method signature and its arguments)
74
+ * in the current statement. An **undefined** will be returned if there is no method used in this statement.
75
+ * @returns the method's invocation expression from the statement. An **undefined** will be returned if there is no method can be found in this statement.
76
+ * @example
77
+ * 1. get invoke expr based on stmt.
78
+
79
+ ```typescript
80
+ let invoke = stmt.getInvokeExpr();
81
+ ```
82
+ */
30
83
  getInvokeExpr(): AbstractInvokeExpr | undefined;
84
+ /**
85
+ * Returns an array of expressions in the statement.
86
+ * @returns An array of expressions in the statement.
87
+ * @example
88
+ * 1. Traverse expression of statement.
89
+
90
+ ```typescript
91
+ for (const expr of stmt.getExprs()) {
92
+ ...
93
+ }
94
+ ```
95
+ */
31
96
  getExprs(): AbstractExpr[];
32
97
  containsArrayRef(): boolean;
33
98
  getArrayRef(): ArkArrayRef | undefined;
34
99
  containsFieldRef(): boolean;
35
100
  getFieldRef(): AbstractFieldRef | undefined;
36
- setPositionInfo(position: LineColPosition): void;
37
- getPositionInfo(): LineColPosition;
101
+ setOriginPositionInfo(originPositionInfo: LineColPosition): void;
102
+ /**
103
+ * Returns the original position of the statement.
104
+ * The position consists of two parts: line number and column number.
105
+ * In the source file, the former (i.e., line number) indicates which line the statement is in,
106
+ * and the latter (i.e., column number) indicates the position of the statement in the line.
107
+ * The position is described as `LineColPosition(lineNo,colNum)` in ArkAnalyzer,
108
+ * and its default value is LineColPosition(-1,-1).
109
+ * @returns The original location of the statement.
110
+ * @example
111
+ * 1. Get the stmt position info to make some condition judgements.
112
+ ```typescript
113
+ for (const stmt of stmts) {
114
+ if (stmt.getOriginPositionInfo().getLineNo() === -1) {
115
+ stmt.setOriginPositionInfo(originalStmt.getOriginPositionInfo());
116
+ this.stmtToOriginalStmt.set(stmt, originalStmt);
117
+ }
118
+ }
119
+ ```
120
+ */
38
121
  getOriginPositionInfo(): LineColPosition;
39
122
  abstract toString(): string;
40
123
  setText(text: string): void;
124
+ setOriginalText(originalText: string): void;
125
+ getOriginalText(): string | undefined;
41
126
  setOperandOriginalPositions(operandOriginalPositions: FullPosition[]): void;
42
127
  getOperandOriginalPosition(indexOrOperand: number | Value): FullPosition | null;
43
128
  }
44
- export declare class OriginalStmt extends Stmt {
45
- constructor(text: string, position: LineColPosition);
46
- toString(): string;
47
- }
48
129
  export declare class ArkAssignStmt extends Stmt {
49
130
  private leftOp;
50
131
  private rightOp;
51
132
  constructor(leftOp: Value, rightOp: Value);
133
+ /**
134
+ * Returns the left operand of the assigning statement.
135
+ * @returns The left operand of the assigning statement.
136
+ * @example
137
+ * 1. If the statement is `a=b;`, the right operand is `a`; if the statement is `dd = cc + 5;`, the right operand is `cc`.
138
+ */
52
139
  getLeftOp(): Value;
53
140
  setLeftOp(newLeftOp: Value): void;
141
+ /**
142
+ * Returns the right operand of the assigning statement.
143
+ * @returns The right operand of the assigning statement.
144
+ * @example
145
+ * 1. If the statement is `a=b;`, the right operand is `b`; if the statement is `dd = cc + 5;`, the right operand is `cc + 5`.
146
+ * 2. Get the rightOp from stmt.
147
+
148
+ ```typescript
149
+ const rightOp = stmt.getRightOp();
150
+ ```
151
+ */
54
152
  getRightOp(): Value;
55
153
  setRightOp(rightOp: Value): void;
56
154
  toString(): string;
@@ -68,6 +166,18 @@ export declare class ArkInvokeStmt extends Stmt {
68
166
  export declare class ArkIfStmt extends Stmt {
69
167
  private conditionExpr;
70
168
  constructor(conditionExpr: ArkConditionExpr);
169
+ /**
170
+ * The condition expression consisit of two values as operands and one binary operator as operator.
171
+ * The operator can indicate the relation between the two values, e.g., `<`, `<=`,`>`, `>=`, `==`, `!=`, `===`, `!==`.
172
+ * @returns a condition expression.
173
+ * @example
174
+ * 1. When a statement is `if (a > b)`, the operands are `a` and `b`, the operator is `<`. Therefore, the condition expression is `a > b`.
175
+ * 2. get a conditon expr from a condition statement.
176
+
177
+ ```typescript
178
+ let expr = (this.original as ArkIfStmt).getConditionExprExpr();
179
+ ```
180
+ */
71
181
  getConditionExprExpr(): ArkConditionExpr;
72
182
  isBranch(): boolean;
73
183
  getExpectedSuccessorCount(): number;
@@ -92,6 +202,10 @@ export declare class ArkSwitchStmt extends Stmt {
92
202
  private key;
93
203
  private cases;
94
204
  constructor(key: Value, cases: Value[]);
205
+ /**
206
+ * Returns the key in a switch statement.
207
+ * @returns The key in a switch statement.
208
+ */
95
209
  getKey(): Value;
96
210
  getCases(): Value[];
97
211
  isBranch(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"Stmt.d.ts","sourceRoot":"","sources":["../../../src/core/base/Stmt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Stmt.d.ts","sourceRoot":"","sources":["../../../src/core/base/Stmt.ts"],"names":[],"mappings":"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"}