arkanalyzer 1.0.87 → 1.0.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/arkanalyzer.json +11 -0
- package/lib/Config.d.ts +27 -2
- package/lib/Config.d.ts.map +1 -1
- package/lib/Config.js +65 -2
- package/lib/Scene.d.ts +5 -2
- package/lib/Scene.d.ts.map +1 -1
- package/lib/Scene.js +34 -67
- package/lib/callgraph/pointerAnalysis/context/Context.d.ts.map +1 -1
- package/lib/callgraph/pointerAnalysis/context/Context.js +10 -12
- package/lib/callgraph/pointerAnalysis/plugins/WorkerPlugin.js +1 -1
- package/lib/cli/commands/cg.d.ts +27 -6
- package/lib/cli/commands/cg.d.ts.map +1 -1
- package/lib/cli/commands/cg.js +9 -6
- package/lib/core/base/Expr.js +3 -3
- package/lib/core/base/Position.d.ts +1 -1
- package/lib/core/base/Position.d.ts.map +1 -1
- package/lib/core/base/Position.js +2 -2
- package/lib/core/base/Type.d.ts.map +1 -1
- package/lib/core/base/Type.js +1 -2
- package/lib/core/common/Const.d.ts +1 -0
- package/lib/core/common/Const.d.ts.map +1 -1
- package/lib/core/common/Const.js +2 -1
- package/lib/core/common/IRInference.d.ts.map +1 -1
- package/lib/core/common/IRInference.js +1 -1
- package/lib/core/common/IRUtils.d.ts.map +1 -1
- package/lib/core/common/IRUtils.js +3 -33
- package/lib/core/common/ModelUtils.d.ts +6 -0
- package/lib/core/common/ModelUtils.d.ts.map +1 -1
- package/lib/core/common/ModelUtils.js +30 -0
- package/lib/core/common/SdkUtils.js +1 -1
- package/lib/core/common/TypeInference.d.ts +13 -0
- package/lib/core/common/TypeInference.d.ts.map +1 -1
- package/lib/core/common/TypeInference.js +44 -0
- package/lib/core/common/ValueUtil.d.ts +1 -1
- package/lib/core/common/ValueUtil.d.ts.map +1 -1
- package/lib/core/common/ValueUtil.js +28 -12
- package/lib/core/graph/Cfg.d.ts.map +1 -1
- package/lib/core/graph/Cfg.js +0 -2
- package/lib/core/graph/DominanceFinder.d.ts +3 -0
- package/lib/core/graph/DominanceFinder.d.ts.map +1 -1
- package/lib/core/graph/DominanceFinder.js +42 -36
- package/lib/core/graph/DominanceTree.d.ts.map +1 -1
- package/lib/core/graph/DominanceTree.js +0 -4
- package/lib/core/inference/ValueInference.d.ts.map +1 -1
- package/lib/core/inference/ValueInference.js +3 -2
- package/lib/core/inference/abc/AbcInference.d.ts.map +1 -1
- package/lib/core/inference/abc/AbcInference.js +2 -1
- package/lib/core/inference/arkts/ArkTsInference.d.ts.map +1 -1
- package/lib/core/inference/arkts/ArkTsInference.js +3 -2
- package/lib/core/model/ArkClass.d.ts +3 -0
- package/lib/core/model/ArkClass.d.ts.map +1 -1
- package/lib/core/model/ArkClass.js +32 -6
- package/lib/core/model/ArkFile.d.ts.map +1 -1
- package/lib/core/model/ArkFile.js +0 -1
- package/lib/core/model/ArkMetadata.d.ts +32 -1
- package/lib/core/model/ArkMetadata.d.ts.map +1 -1
- package/lib/core/model/ArkMetadata.js +28 -3
- package/lib/core/model/builder/ArkMetadataBuilder.d.ts +21 -0
- package/lib/core/model/builder/ArkMetadataBuilder.d.ts.map +1 -0
- package/lib/core/model/builder/ArkMetadataBuilder.js +160 -0
- package/lib/core/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/core/model/builder/ArkMethodBuilder.js +32 -26
- package/lib/frontend/FrontendBuilder.d.ts +26 -0
- package/lib/frontend/FrontendBuilder.d.ts.map +1 -0
- package/lib/frontend/FrontendBuilder.js +108 -0
- package/lib/frontend/arktsFrontend/ArktsFrontend.d.ts +16 -0
- package/lib/frontend/arktsFrontend/ArktsFrontend.d.ts.map +1 -0
- package/lib/frontend/arktsFrontend/ArktsFrontend.js +52 -0
- package/lib/frontend/cppFrontend/CppFrontend.d.ts +13 -0
- package/lib/frontend/cppFrontend/CppFrontend.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/CppFrontend.js +85 -0
- package/lib/frontend/cppFrontend/ast/index.d.ts +5 -0
- package/lib/frontend/cppFrontend/ast/index.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/index.js +31 -0
- package/lib/frontend/cppFrontend/ast/ts/ArkCxxAstNode.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ts/astParser.d.ts +25 -0
- package/lib/frontend/cppFrontend/ast/ts/astParser.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ts/astParser.js +280 -0
- package/lib/frontend/cppFrontend/ast/ts/astUtils.d.ts +18 -0
- package/lib/frontend/cppFrontend/ast/ts/astUtils.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ts/astUtils.js +158 -0
- package/lib/frontend/cppFrontend/ast/{const.d.ts → ts/const.d.ts} +0 -13
- package/lib/frontend/cppFrontend/ast/ts/const.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ts/const.js +58 -0
- package/lib/frontend/cppFrontend/ast/ts/napi/napiApi.d.ts +8 -0
- package/lib/frontend/cppFrontend/ast/ts/napi/napiApi.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ts/napi/napiApi.js +90 -0
- package/lib/frontend/cppFrontend/ast/ts/napi/napiRunner.d.ts +8 -0
- package/lib/frontend/cppFrontend/ast/ts/napi/napiRunner.d.ts.map +1 -0
- package/lib/frontend/cppFrontend/ast/ts/napi/napiRunner.js +180 -0
- package/lib/frontend/cppFrontend/common/ArkIRTransformer.d.ts +1 -1
- package/lib/frontend/cppFrontend/common/ArkIRTransformer.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/common/ArkIRTransformer.js +55 -55
- package/lib/frontend/cppFrontend/common/ArkValueTransformer.d.ts +1 -1
- package/lib/frontend/cppFrontend/common/ArkValueTransformer.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/common/ArkValueTransformer.js +151 -151
- package/lib/frontend/cppFrontend/common/IRInference.js +2 -2
- package/lib/frontend/cppFrontend/common/IRUtils.d.ts +1 -1
- package/lib/frontend/cppFrontend/common/IRUtils.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/common/IRUtils.js +2 -2
- package/lib/frontend/cppFrontend/graph/builder/CfgBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/graph/builder/CfgBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/graph/builder/CfgBuilder.js +74 -74
- package/lib/frontend/cppFrontend/model/builder/ArkClassBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkClassBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkClassBuilder.js +3 -3
- package/lib/frontend/cppFrontend/model/builder/ArkFieldBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkFieldBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkFileBuilder.js +16 -17
- package/lib/frontend/cppFrontend/model/builder/ArkImportBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkImportBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkMethodBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkMethodBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkMethodBuilder.js +2 -2
- package/lib/frontend/cppFrontend/model/builder/ArkNamespaceBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkNamespaceBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/ArkNamespaceBuilder.js +2 -2
- package/lib/frontend/cppFrontend/model/builder/BodyBuilder.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/BodyBuilder.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/builderUtils.d.ts +1 -1
- package/lib/frontend/cppFrontend/model/builder/builderUtils.d.ts.map +1 -1
- package/lib/frontend/cppFrontend/model/builder/builderUtils.js +3 -3
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +14 -6
- package/lib/pass/Dispatcher.d.ts.map +1 -1
- package/lib/pass/Dispatcher.js +0 -4
- package/lib/save/source/SourceStmt.d.ts.map +1 -1
- package/lib/save/source/SourceStmt.js +3 -1
- package/lib/utils/FileUtils.d.ts +1 -0
- package/lib/utils/FileUtils.d.ts.map +1 -1
- package/lib/utils/FileUtils.js +11 -3
- package/package.json +9 -4
- package/lib/frontend/cppFrontend/ast/ArkCxxAstNode.d.ts.map +0 -1
- package/lib/frontend/cppFrontend/ast/astUtils.d.ts +0 -51
- package/lib/frontend/cppFrontend/ast/astUtils.d.ts.map +0 -1
- package/lib/frontend/cppFrontend/ast/astUtils.js +0 -470
- package/lib/frontend/cppFrontend/ast/const.d.ts.map +0 -1
- package/lib/frontend/cppFrontend/ast/const.js +0 -134
- /package/lib/frontend/cppFrontend/ast/{ArkCxxAstNode.d.ts → ts/ArkCxxAstNode.d.ts} +0 -0
- /package/lib/frontend/cppFrontend/ast/{ArkCxxAstNode.js → ts/ArkCxxAstNode.js} +0 -0
|
@@ -64,7 +64,7 @@ const ModelUtils_1 = require("../../../core/common/ModelUtils");
|
|
|
64
64
|
const TSConst_1 = require("../../../core/common/TSConst");
|
|
65
65
|
const TypeInference_1 = require("./TypeInference");
|
|
66
66
|
const ModelUtils_2 = require("./ModelUtils");
|
|
67
|
-
const
|
|
67
|
+
const ast_1 = require("../ast");
|
|
68
68
|
const ArkIRTransformer_2 = require("../../../core/common/ArkIRTransformer");
|
|
69
69
|
const Builtin_2 = require("./Builtin");
|
|
70
70
|
const ArkClass_1 = require("../../../core/model/ArkClass");
|
|
@@ -94,11 +94,11 @@ function nodeInnerNode(node) {
|
|
|
94
94
|
if (Array.isArray(node === null || node === void 0 ? void 0 : node.inner) && node.inner.length > 0) {
|
|
95
95
|
const last = node.inner[node.inner.length - 1];
|
|
96
96
|
// Return InitListExpr first
|
|
97
|
-
if ((last === null || last === void 0 ? void 0 : last.kind) ===
|
|
97
|
+
if ((last === null || last === void 0 ? void 0 : last.kind) === ast_1.astKind.InitListExpr) {
|
|
98
98
|
return last;
|
|
99
99
|
}
|
|
100
100
|
// Arrays containing only one TypeRef node do not return
|
|
101
|
-
if (!(node.inner.length === 1 && ((_a = node.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) ===
|
|
101
|
+
if (!(node.inner.length === 1 && ((_a = node.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) === ast_1.astKind.TypeRef) && !(0, builderUtils_1.isCxxFunctionPointer)(node.type.qualType)) {
|
|
102
102
|
return last;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -111,65 +111,65 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
111
111
|
super(arkIRTransformer, sourceFile, declaringMethod);
|
|
112
112
|
// An object that records the corresponding processing functions of CXX ast nodes.
|
|
113
113
|
this.nodeTransformerFuncMap = {
|
|
114
|
-
[
|
|
115
|
-
[
|
|
116
|
-
[
|
|
117
|
-
[
|
|
118
|
-
[
|
|
119
|
-
[
|
|
120
|
-
[
|
|
121
|
-
[
|
|
122
|
-
[
|
|
123
|
-
[
|
|
124
|
-
[
|
|
125
|
-
[
|
|
126
|
-
[
|
|
127
|
-
[
|
|
128
|
-
[
|
|
129
|
-
[
|
|
130
|
-
[
|
|
131
|
-
[
|
|
132
|
-
[
|
|
133
|
-
[
|
|
134
|
-
[
|
|
135
|
-
[
|
|
136
|
-
[
|
|
137
|
-
[
|
|
138
|
-
[
|
|
139
|
-
[
|
|
140
|
-
[
|
|
141
|
-
[
|
|
142
|
-
[
|
|
143
|
-
[
|
|
144
|
-
[
|
|
145
|
-
[
|
|
146
|
-
[
|
|
147
|
-
[
|
|
148
|
-
[
|
|
149
|
-
[
|
|
150
|
-
[
|
|
151
|
-
[
|
|
152
|
-
[
|
|
153
|
-
[
|
|
154
|
-
[
|
|
155
|
-
[
|
|
156
|
-
[
|
|
157
|
-
[
|
|
158
|
-
[
|
|
159
|
-
[
|
|
160
|
-
[
|
|
161
|
-
[
|
|
162
|
-
[
|
|
163
|
-
[
|
|
164
|
-
[
|
|
165
|
-
[
|
|
166
|
-
[
|
|
167
|
-
[
|
|
168
|
-
[
|
|
169
|
-
[
|
|
170
|
-
[
|
|
171
|
-
[
|
|
172
|
-
[
|
|
114
|
+
[ast_1.astKind.ArraySubscriptExpr]: this.cxxElementAccessExpressionToValueAndStmts,
|
|
115
|
+
[ast_1.astKind.ArrayTypeTraitExpr]: this.arrayTypeTraitExprToValueAndStmts,
|
|
116
|
+
[ast_1.astKind.AtomicCallExpr]: this.cxxCallExpressionToValueAndStmts,
|
|
117
|
+
[ast_1.astKind.BinaryConditionalOperator]: this.cxxConditionalExpressionToValueAndStmts,
|
|
118
|
+
[ast_1.astKind.CXXRewrittenBinaryOperator]: this.cxxBinaryExpressionToValueAndStmts,
|
|
119
|
+
[ast_1.astKind.BinaryOperator]: this.cxxBinaryExpressionToValueAndStmts,
|
|
120
|
+
[ast_1.astKind.BindingDecl]: this.bindingNodeToValueAndStmts,
|
|
121
|
+
[ast_1.astKind.CallExpr]: this.cxxCallExpressionToValueAndStmts,
|
|
122
|
+
[ast_1.astKind.CharacterLiteral]: this.cxxLiteralNodeToValueAndStmts,
|
|
123
|
+
[ast_1.astKind.CompoundAssignOperator]: this.cxxCompoundAssignmentToValueAndStmts,
|
|
124
|
+
[ast_1.astKind.CompoundLiteralExpr]: this.cxxAggregateToValueAndStmts,
|
|
125
|
+
[ast_1.astKind.ConditionalOperator]: this.cxxConditionalExpressionToValueAndStmts,
|
|
126
|
+
[ast_1.astKind.ConstantExpr]: this.processInnerNodeToValueAndStmts,
|
|
127
|
+
[ast_1.astKind.CXXBindTemporaryExpr]: this.processInnerNodeToValueAndStmts,
|
|
128
|
+
[ast_1.astKind.CXXBoolLiteralExpr]: this.cxxLiteralNodeToValueAndStmts,
|
|
129
|
+
[ast_1.astKind.CXXConstCastExpr]: this.castExpressionToValueAndStmts,
|
|
130
|
+
[ast_1.astKind.CXXConstructExpr]: this.cxxConstructExprToValueAndStmts,
|
|
131
|
+
[ast_1.astKind.CXXCtorInitializer]: this.cxxCtorInitializerToValueAndStmts,
|
|
132
|
+
[ast_1.astKind.CXXDeleteExpr]: this.cxxDeleteExpressionToValueAndStmts,
|
|
133
|
+
[ast_1.astKind.CXXDynamicCastExpr]: this.castExpressionToValueAndStmts,
|
|
134
|
+
[ast_1.astKind.CXXFoldExpr]: this.cxxFoldExprToValueAndStmts,
|
|
135
|
+
[ast_1.astKind.CXXFunctionalCastExpr]: this.castExpressionToValueAndStmts,
|
|
136
|
+
[ast_1.astKind.CXXMemberCallExpr]: this.cxxMemberCallExpressionToValueAndStmts,
|
|
137
|
+
[ast_1.astKind.CXXNewExpr]: this.cxxNewExpressionToValueAndStmts,
|
|
138
|
+
[ast_1.astKind.CXXNoexceptExpr]: this.cxxNoexceptExprToValueAndStmts,
|
|
139
|
+
[ast_1.astKind.CXXNullPtrLiteralExpr]: this.cxxLiteralNodeToValueAndStmts,
|
|
140
|
+
[ast_1.astKind.CXXOperatorCallExpr]: this.cxxOperatorExpressionToValueAndStmts,
|
|
141
|
+
[ast_1.astKind.CXXReinterpretCastExpr]: this.castExpressionToValueAndStmts,
|
|
142
|
+
[ast_1.astKind.CXXScalarValueInitExpr]: this.cxxScalarValueInitToValueAndStmts,
|
|
143
|
+
[ast_1.astKind.CXXStdInitializerListExpr]: this.processInnerNodeToValueAndStmts,
|
|
144
|
+
[ast_1.astKind.CXXStaticCastExpr]: this.castExpressionToValueAndStmts,
|
|
145
|
+
[ast_1.astKind.CXXThisExpr]: this.cxxThisExpressionToValueAndStmts,
|
|
146
|
+
[ast_1.astKind.CXXTypeidExpr]: this.cxxTypeidExprToValueAndStmts,
|
|
147
|
+
[ast_1.astKind.CStyleCastExpr]: this.castExpressionToValueAndStmts,
|
|
148
|
+
[ast_1.astKind.CXXTemporaryObjectExpr]: this.cxxTemporaryObjectExprToValueAndStmts,
|
|
149
|
+
[ast_1.astKind.DeclRefExpr]: this.declAndTypeRefToValueAndStmts,
|
|
150
|
+
[ast_1.astKind.DeclStmt]: this.declStmtToValueAndStmts,
|
|
151
|
+
[ast_1.astKind.DecompositionDecl]: this.bindingNodeToValueAndStmts,
|
|
152
|
+
[ast_1.astKind.ExprWithCleanups]: this.processInnerNodeToValueAndStmts,
|
|
153
|
+
[ast_1.astKind.FloatingLiteral]: this.cxxLiteralNodeToValueAndStmts,
|
|
154
|
+
[ast_1.astKind.ImplicitCastExpr]: this.implicitCastExprToValueAndStmts,
|
|
155
|
+
[ast_1.astKind.InitListExpr]: this.initListExprToValueAndStmts,
|
|
156
|
+
[ast_1.astKind.IntegerLiteral]: this.cxxLiteralNodeToValueAndStmts,
|
|
157
|
+
[ast_1.astKind.LambdaExpr]: this.cxxCallableNodeToValueAndStmts,
|
|
158
|
+
[ast_1.astKind.MaterializeTemporaryExpr]: this.materializeTemporaryExprToValueAndStmts,
|
|
159
|
+
[ast_1.astKind.MemberExpr]: this.memberExpressionToValueAndStmts,
|
|
160
|
+
[ast_1.astKind.MemberRef]: this.memberExpressionToValueAndStmts,
|
|
161
|
+
[ast_1.astKind.NamespaceRef]: this.cxxNamespaceRefToValueAndStmts,
|
|
162
|
+
[ast_1.astKind.ParenExpr]: this.processInnerNodeToValueAndStmts,
|
|
163
|
+
[ast_1.astKind.ParenListExpr]: this.processInnerNodeToValueAndStmts,
|
|
164
|
+
[ast_1.astKind.RecoveryExpr]: this.RecoverExpressionToValueAndStmts,
|
|
165
|
+
[ast_1.astKind.StringLiteral]: this.cxxLiteralNodeToValueAndStmts,
|
|
166
|
+
[ast_1.astKind.TypeRef]: this.declAndTypeRefToValueAndStmts,
|
|
167
|
+
[ast_1.astKind.UnaryExprOrTypeTraitExpr]: this.unaryExprToValueAndStmts,
|
|
168
|
+
[ast_1.astKind.UnaryOperator]: this.unaryOperatorToValueAndStmts,
|
|
169
|
+
[ast_1.astKind.UnexposedExpr]: this.processInnerNodeToValueAndStmts,
|
|
170
|
+
[ast_1.astKind.UnresolvedLookupExpr]: this.declAndTypeRefToValueAndStmts,
|
|
171
|
+
[ast_1.astKind.UserDefinedLiteral]: this.userDefinedLiteralToValueAndStmts,
|
|
172
|
+
[ast_1.astKind.VarDecl]: this.cxxVariableDeclarationToValueAndStmts,
|
|
173
173
|
};
|
|
174
174
|
this.ArkCxxIRTransformer = arkIRTransformer;
|
|
175
175
|
this.cxxSourceFile = sourceFile;
|
|
@@ -214,16 +214,16 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
214
214
|
else {
|
|
215
215
|
classSignature = type.getClassSignature();
|
|
216
216
|
}
|
|
217
|
-
const list = aggregate.kind ===
|
|
217
|
+
const list = aggregate.kind === ast_1.astKind.InitListExpr ? aggregate : aggregate.inner[aggregate.inner.length - 1];
|
|
218
218
|
let elements = [];
|
|
219
|
-
if (list.kind !==
|
|
219
|
+
if (list.kind !== ast_1.astKind.InitListExpr) {
|
|
220
220
|
return this.unprocessedNodeToValueAndStmts(aggregate);
|
|
221
221
|
}
|
|
222
222
|
const aggregateExpr = new Expr_2.ArkAggregateExpr(elements, type);
|
|
223
223
|
const fullPosition = [Position_1.FullPosition.cxxBuildFromNode(aggregate, this.cxxSourceFile)];
|
|
224
224
|
let { value: temp, valueOriginalPositions: tempPositions, stmts: exprStmts, } = this.ArkCxxIRTransformer.generateAssignStmtForValue(aggregateExpr, fullPosition);
|
|
225
225
|
for (let i = 0; i < list.inner.length; i++) {
|
|
226
|
-
if (list.inner[i].kind ===
|
|
226
|
+
if (list.inner[i].kind === ast_1.astKind.DesignatedInitExpr) {
|
|
227
227
|
// Because the syntax tree does not have fields representing field information,
|
|
228
228
|
// regular matching is used to preserve the information.
|
|
229
229
|
// If there are any changes to the syntax tree, optimization can be made here
|
|
@@ -265,25 +265,25 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
265
265
|
// Judge whether the current node is related to the lambda function of CPP
|
|
266
266
|
isNodeRelatedToCXXLambdaFunc(node) {
|
|
267
267
|
var _a, _b, _c, _d;
|
|
268
|
-
return ((_b = (_a = node.type) === null || _a === void 0 ? void 0 : _a.qualType) === null || _b === void 0 ? void 0 : _b.startsWith('(lambda at')) || ((_d = (_c = node.inner) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.kind) ===
|
|
268
|
+
return ((_b = (_a = node.type) === null || _a === void 0 ? void 0 : _a.qualType) === null || _b === void 0 ? void 0 : _b.startsWith('(lambda at')) || ((_d = (_c = node.inner) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.kind) === ast_1.astKind.LambdaExpr;
|
|
269
269
|
}
|
|
270
270
|
isNodeRelatedToImplicitNode(node) {
|
|
271
271
|
var _a, _b;
|
|
272
272
|
if (node.inner) {
|
|
273
|
-
return (((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
273
|
+
return (((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.ImplicitCastExpr && (node.name === '__tree_const_iterator'));
|
|
274
274
|
}
|
|
275
275
|
return false;
|
|
276
276
|
}
|
|
277
277
|
// Judge whether the child nodes of the current node are materializing temporary variables
|
|
278
278
|
isNodeRelatedToMaterializeTemporaryExpr(node) {
|
|
279
279
|
var _a, _b;
|
|
280
|
-
return ((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
280
|
+
return ((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.MaterializeTemporaryExpr;
|
|
281
281
|
}
|
|
282
282
|
// Check if the child nodes of the current node are member function calls
|
|
283
283
|
isNodeRelatedToCXXMember(node) {
|
|
284
284
|
var _a, _b;
|
|
285
|
-
return ((((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
286
|
-
(node.inner[0].kind ===
|
|
285
|
+
return ((((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.CXXMemberCallExpr) ||
|
|
286
|
+
(node.inner[0].kind === ast_1.astKind.ImplicitCastExpr && node.inner[0].inner[0] && node.inner[0].inner[0].kind === ast_1.astKind.CXXMemberCallExpr));
|
|
287
287
|
}
|
|
288
288
|
// Construction of std::pair type
|
|
289
289
|
isPairConstructExpr(node) {
|
|
@@ -292,7 +292,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
292
292
|
// Multi-layer std::pair construction
|
|
293
293
|
isNodeRelatedToTemporary(node) {
|
|
294
294
|
var _a, _b;
|
|
295
|
-
return ((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
295
|
+
return ((_b = (_a = node.inner) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.CXXBindTemporaryExpr && node.code === node.inner[0].code;
|
|
296
296
|
}
|
|
297
297
|
// Expressions that are not new statements (excluding constructors as parameters)
|
|
298
298
|
isNotNewExpression(newExpression) {
|
|
@@ -301,14 +301,14 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
301
301
|
return false;
|
|
302
302
|
}
|
|
303
303
|
const targetKinds = [
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
304
|
+
ast_1.astKind.IntegerLiteral,
|
|
305
|
+
ast_1.astKind.InitListExpr,
|
|
306
|
+
ast_1.astKind.CompoundLiteralExpr,
|
|
307
|
+
ast_1.astKind.CXXOperatorCallExpr,
|
|
308
|
+
ast_1.astKind.BinaryOperator
|
|
309
309
|
];
|
|
310
310
|
return (targetKinds.includes(firstChildKind) ||
|
|
311
|
-
(firstChildKind ===
|
|
311
|
+
(firstChildKind === ast_1.astKind.ImplicitCastExpr && !newExpression.inner[0].code.includes('(')));
|
|
312
312
|
}
|
|
313
313
|
isNodeRelatedToCXXFuncCast(node) {
|
|
314
314
|
var _a;
|
|
@@ -344,10 +344,10 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
344
344
|
// instead, the object is directly constructed at the return value location. Therefore, it is processed here as a ConstructExpr.
|
|
345
345
|
const parentNode = (_a = node.getParent) === null || _a === void 0 ? void 0 : _a.call(node, false);
|
|
346
346
|
// case: Vector{1,2,3} Implicit call to destructor
|
|
347
|
-
if (((_b = parentNode === null || parentNode === void 0 ? void 0 : parentNode.dtor) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
347
|
+
if (((_b = parentNode === null || parentNode === void 0 ? void 0 : parentNode.dtor) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.CXXDestructorDecl && node.inner.length > 0) {
|
|
348
348
|
return this.cxxConstructExprToValueAndStmts(node.inner[0]);
|
|
349
349
|
}
|
|
350
|
-
if (!parentNode || parentNode.kind !==
|
|
350
|
+
if (!parentNode || parentNode.kind !== ast_1.astKind.ExprWithCleanups && parentNode.kind !== ast_1.astKind.ReturnStmt) {
|
|
351
351
|
return this.unprocessedNodeToValueAndStmts(node);
|
|
352
352
|
}
|
|
353
353
|
return this.cxxConstructExprToValueAndStmts(node);
|
|
@@ -397,7 +397,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
397
397
|
stmts.push(...innerStmts);
|
|
398
398
|
let index = 0;
|
|
399
399
|
for (let i = 0; i < length; i++) {
|
|
400
|
-
if (node.inner[i].kind !==
|
|
400
|
+
if (node.inner[i].kind !== ast_1.astKind.BindingDecl) {
|
|
401
401
|
continue;
|
|
402
402
|
}
|
|
403
403
|
const leftValueAndStmts = this.cxxIdentifierToValueAndStmts(node.inner[i]);
|
|
@@ -446,7 +446,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
446
446
|
return this.cxxNodeToValueAndStmts(node.inner[0]);
|
|
447
447
|
}
|
|
448
448
|
// Handle the scenario: using Color::RED; Color c = RED;
|
|
449
|
-
if (((_b = node.referencedDecl) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
449
|
+
if (((_b = node.referencedDecl) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.EnumConstantDecl && node.inner.length === 0) {
|
|
450
450
|
const typeRefNode = {
|
|
451
451
|
kind: 'TypeRef',
|
|
452
452
|
name: node.referencedDecl.name,
|
|
@@ -458,7 +458,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
458
458
|
return this.staticMemberExprToValueAndStmts(node);
|
|
459
459
|
}
|
|
460
460
|
// when node.referencedDecl?.kind === astKind.NonTypeTemplateParmDecl ,this value is a const expr
|
|
461
|
-
if (((_c = node.referencedDecl) === null || _c === void 0 ? void 0 : _c.kind) ===
|
|
461
|
+
if (((_c = node.referencedDecl) === null || _c === void 0 ? void 0 : _c.kind) === ast_1.astKind.NonTypeTemplateParmDecl) {
|
|
462
462
|
return {
|
|
463
463
|
value: ValueUtil_1.CxxValueUtil.createCompileConst(node.name, (0, builderUtils_1.cxxNode2Type)(node, this.declaringMethod)),
|
|
464
464
|
valueOriginalPositions: [],
|
|
@@ -467,13 +467,13 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
467
467
|
}
|
|
468
468
|
// Handle the invocation of static members of a class, such as A::a
|
|
469
469
|
if (((_d = node.code) === null || _d === void 0 ? void 0 : _d.includes('::')) && node.inner.length > 0 &&
|
|
470
|
-
(((_e = node.inner[0]) === null || _e === void 0 ? void 0 : _e.kind) ===
|
|
470
|
+
(((_e = node.inner[0]) === null || _e === void 0 ? void 0 : _e.kind) === ast_1.astKind.TypeRef || ((_f = node.inner[0]) === null || _f === void 0 ? void 0 : _f.kind) === ast_1.astKind.NamespaceRef && ((_g = node.inner[0]) === null || _g === void 0 ? void 0 : _g.name) !== Builtin_2.BuiltinCxx.CXXSTD)) {
|
|
471
471
|
return this.staticMemberExprToValueAndStmts(node);
|
|
472
472
|
}
|
|
473
473
|
return this.cxxIdentifierToValueAndStmts(node);
|
|
474
474
|
}
|
|
475
475
|
staticMemberExprToValueAndStmts(declRefExpr) {
|
|
476
|
-
declRefExpr.kind =
|
|
476
|
+
declRefExpr.kind = ast_1.astKind.MemberExpr; // Replace the type with "member invocation"
|
|
477
477
|
return this.memberExpressionToValueAndStmts(declRefExpr);
|
|
478
478
|
}
|
|
479
479
|
materializeTemporaryExprToValueAndStmts(node) {
|
|
@@ -498,7 +498,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
498
498
|
}
|
|
499
499
|
let pNode = (_e = ((_c = node.parent) !== null && _c !== void 0 ? _c : (_d = node.getParent) === null || _d === void 0 ? void 0 : _d.call(node, true))) !== null && _e !== void 0 ? _e : null;
|
|
500
500
|
if (pNode && ((_f = pNode === null || pNode === void 0 ? void 0 : pNode.inner) === null || _f === void 0 ? void 0 : _f.length) > 0 &&
|
|
501
|
-
(((_g = pNode.inner[0]) === null || _g === void 0 ? void 0 : _g.kind) ===
|
|
501
|
+
(((_g = pNode.inner[0]) === null || _g === void 0 ? void 0 : _g.kind) === ast_1.astKind.TypeRef || !node.type.qualType.includes('[') || (0, builderUtils_1.cxxNode2Type)(node, this.declaringMethod) instanceof Type_1.ClassType)) {
|
|
502
502
|
try {
|
|
503
503
|
return this.cxxAggregateToValueAndStmts(node);
|
|
504
504
|
}
|
|
@@ -593,18 +593,18 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
593
593
|
return this.unprocessedNodeToValueAndStmts(cxxCtorInitializer);
|
|
594
594
|
}
|
|
595
595
|
const firstInnerNode = cxxCtorInitializer.inner[0];
|
|
596
|
-
if (firstInnerNode.kind ===
|
|
596
|
+
if (firstInnerNode.kind === ast_1.astKind.CXXInheritedCtorInitExpr) {
|
|
597
597
|
// Processing of using parent:: parent
|
|
598
598
|
return this.cxxInheritedCtorInitExprToValueAndStmts(firstInnerNode);
|
|
599
599
|
}
|
|
600
|
-
else if (firstInnerNode.kind ===
|
|
600
|
+
else if (firstInnerNode.kind === ast_1.astKind.CXXConstructExpr && cxxCtorInitializer.baseInit) {
|
|
601
601
|
// Processing of case: Left(const char& name) : Base(name) // call base class constructor
|
|
602
602
|
return this.cxxSuperExpressionToValueAndStmts(firstInnerNode);
|
|
603
603
|
}
|
|
604
604
|
// If the kind of firstNode is CXXConstructExpr and firstNode does not correspond to a parent class initialization call,
|
|
605
605
|
// it is equivalent to directly assigning a value to the class member.
|
|
606
606
|
// For example, the constructor of class Circle in file 'tests/cppResources/exports/crossFileCase/include/myHeader.h'.
|
|
607
|
-
const assignRight = (firstInnerNode.kind ===
|
|
607
|
+
const assignRight = (firstInnerNode.kind === ast_1.astKind.CXXConstructExpr && firstInnerNode.inner.length > 0) ? firstInnerNode.inner[0] : firstInnerNode;
|
|
608
608
|
const CtorInit2ThisMemberExpr = {
|
|
609
609
|
kind: 'MemberExpr',
|
|
610
610
|
name: (_b = (_a = cxxCtorInitializer.anyInit) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '',
|
|
@@ -708,10 +708,10 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
708
708
|
let dimensionSizes = [];
|
|
709
709
|
let op = null;
|
|
710
710
|
for (let i = 0; i < ArrayTypeTraitExpr.inner.length; i++) {
|
|
711
|
-
if (ArrayTypeTraitExpr.inner[i].kind ===
|
|
711
|
+
if (ArrayTypeTraitExpr.inner[i].kind === ast_1.astKind.IntegerLiteral) {
|
|
712
712
|
dimensionSizes.push(Number(ArrayTypeTraitExpr.inner[i].value));
|
|
713
713
|
}
|
|
714
|
-
else if (ArrayTypeTraitExpr.inner[i].kind ===
|
|
714
|
+
else if (ArrayTypeTraitExpr.inner[i].kind === ast_1.astKind.DeclRefExpr) {
|
|
715
715
|
const innerValueAndStmts = this.cxxNodeToValueAndStmts(ArrayTypeTraitExpr.inner[i]);
|
|
716
716
|
op = innerValueAndStmts.value;
|
|
717
717
|
stmts.push(...innerValueAndStmts.stmts);
|
|
@@ -860,7 +860,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
860
860
|
const stmts = [];
|
|
861
861
|
const currConditionalOperatorIndex = this.conditionalOperatorNo++;
|
|
862
862
|
// Peel off 'ImplicitCastExpr'
|
|
863
|
-
const conditionNode = conditionalExpression.inner[InnerIdx].kind ===
|
|
863
|
+
const conditionNode = conditionalExpression.inner[InnerIdx].kind === ast_1.astKind.ImplicitCastExpr ?
|
|
864
864
|
conditionalExpression.inner[InnerIdx].inner[0] : conditionalExpression.inner[InnerIdx];
|
|
865
865
|
let conditionExpr;
|
|
866
866
|
const context = { conditionExpr: conditionExpr };
|
|
@@ -871,7 +871,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
871
871
|
// inner[1] is a value whose expression is true
|
|
872
872
|
InnerIdx++;
|
|
873
873
|
let whenTrueValueAndStmts;
|
|
874
|
-
if (conditionalExpression.kind ===
|
|
874
|
+
if (conditionalExpression.kind === ast_1.astKind.ConditionalOperator) {
|
|
875
875
|
whenTrueValueAndStmts = this.cxxNodeToValueAndStmts(conditionalExpression.inner[InnerIdx]);
|
|
876
876
|
// else kind is BinaryConditionalOperator,No need to parse the node again, the result of the judgment is its value
|
|
877
877
|
}
|
|
@@ -927,16 +927,16 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
927
927
|
}
|
|
928
928
|
// Several callable kinds
|
|
929
929
|
const CALLABLE_KINDS = new Set([
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
930
|
+
ast_1.astKind.DeclRefExpr,
|
|
931
|
+
ast_1.astKind.MemberExpr,
|
|
932
|
+
ast_1.astKind.OverloadedDeclRef,
|
|
933
|
+
ast_1.astKind.ArraySubscriptExpr,
|
|
934
|
+
ast_1.astKind.CXXOperatorCallExpr,
|
|
935
|
+
ast_1.astKind.UnresolvedLookupExpr,
|
|
936
936
|
]);
|
|
937
937
|
function unwrapImplicit(n) {
|
|
938
938
|
var _a;
|
|
939
|
-
while (n && n.kind ===
|
|
939
|
+
while (n && n.kind === ast_1.astKind.ImplicitCastExpr) {
|
|
940
940
|
n = (_a = n.inner) === null || _a === void 0 ? void 0 : _a[0];
|
|
941
941
|
}
|
|
942
942
|
return n;
|
|
@@ -965,7 +965,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
965
965
|
getDeclRef(astNode) {
|
|
966
966
|
let n = astNode;
|
|
967
967
|
while (n) {
|
|
968
|
-
if (n.kind ===
|
|
968
|
+
if (n.kind === ast_1.astKind.DeclRefExpr) {
|
|
969
969
|
return n;
|
|
970
970
|
}
|
|
971
971
|
// No child node or empty child node, end
|
|
@@ -1043,7 +1043,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1043
1043
|
else {
|
|
1044
1044
|
varNode = identifier;
|
|
1045
1045
|
}
|
|
1046
|
-
let varName = varNode.kind ===
|
|
1046
|
+
let varName = varNode.kind === ast_1.astKind.TypeRef ? varNode.code : varNode.name;
|
|
1047
1047
|
const varType = (0, builderUtils_1.cxxNode2Type)(identifier, this.declaringMethod);
|
|
1048
1048
|
if (varName === Type_1.UndefinedType.getInstance().getName()) {
|
|
1049
1049
|
identifierValue = ValueUtil_1.CxxValueUtil.getUndefinedConst();
|
|
@@ -1076,7 +1076,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1076
1076
|
const stmts = [];
|
|
1077
1077
|
// [Scenario 1] Process this ->field or this ->method calls in C++code
|
|
1078
1078
|
// If it's a class member reference (MemberExpr/MemberRef) but has no inner[0], it means implicit this, need to supplement this node
|
|
1079
|
-
if ((memberExpression.kind ===
|
|
1079
|
+
if ((memberExpression.kind === ast_1.astKind.MemberExpr || memberExpression.kind === ast_1.astKind.MemberRef) && memberExpression.inner[0] === undefined) {
|
|
1080
1080
|
memberExpression.inner[0] = {
|
|
1081
1081
|
kind: 'CXXThisExpr',
|
|
1082
1082
|
name: memberExpression.name,
|
|
@@ -1090,7 +1090,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1090
1090
|
let { value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts, } = this.cxxNodeToValueAndStmts(memberExpression.inner[0]);
|
|
1091
1091
|
// [Scenario 3] Processing chained member access, such as a.b.c or (* ptr). field
|
|
1092
1092
|
// If the base is a member access, generate an assignment statement to ensure the validity of SSA
|
|
1093
|
-
if (((_a = memberExpression.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) ===
|
|
1093
|
+
if (((_a = memberExpression.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) === ast_1.astKind.MemberExpr || memberExpression.kind === ast_1.astKind.MemberRef) {
|
|
1094
1094
|
({ value: baseValue, valueOriginalPositions: basePositions, stmts: baseStmts } =
|
|
1095
1095
|
this.ArkCxxIRTransformer.generateAssignStmtForValue(baseValue, basePositions));
|
|
1096
1096
|
}
|
|
@@ -1106,7 +1106,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1106
1106
|
const fieldSignature = this.buildFieldSignatureFromMemberExpr(baseValue, memberExpression);
|
|
1107
1107
|
// [Scenario 6] Generate the field reference object of IR layer (such as testMap. insert)
|
|
1108
1108
|
let fieldRef;
|
|
1109
|
-
if (((_b = memberExpression.referencedDecl) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
1109
|
+
if (((_b = memberExpression.referencedDecl) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.EnumConstantDecl) {
|
|
1110
1110
|
fieldRef = new Ref_1.ArkStaticFieldRef(fieldSignature);
|
|
1111
1111
|
}
|
|
1112
1112
|
else {
|
|
@@ -1124,7 +1124,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1124
1124
|
let fieldSignature;
|
|
1125
1125
|
const memberName = ((_a = memberExpression.referencedDecl) === null || _a === void 0 ? void 0 : _a.name) || memberExpression.name || memberExpression.code;
|
|
1126
1126
|
// ==Scenarios for Special Handling of Enum Members==
|
|
1127
|
-
if (((_b = memberExpression.referencedDecl) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
1127
|
+
if (((_b = memberExpression.referencedDecl) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.EnumConstantDecl) {
|
|
1128
1128
|
const enumClassName = memberExpression.type.qualType.replace('enum', '').trim();
|
|
1129
1129
|
const enumArkClass = ModelUtils_2.CxxModelUtils.findSymbolInFileWithName(enumClassName, this.declaringMethod.getDeclaringArkClass());
|
|
1130
1130
|
const enumSignature = (enumArkClass instanceof ArkClass_1.ArkClass) ?
|
|
@@ -1212,14 +1212,14 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1212
1212
|
}
|
|
1213
1213
|
cxxCallExpressionToValueAndStmts(callExpression) {
|
|
1214
1214
|
var _a, _b, _c, _d, _e, _f;
|
|
1215
|
-
if (callExpression.kind ===
|
|
1215
|
+
if (callExpression.kind === ast_1.astKind.CallExpr && ((_a = callExpression.inner) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
1216
1216
|
if (((_e = (_d = ((_b = callExpression.parent) !== null && _b !== void 0 ? _b : (_c = callExpression.getParent) === null || _c === void 0 ? void 0 : _c.call(callExpression, true))) === null || _d === void 0 ? void 0 : _d.type) === null || _e === void 0 ? void 0 : _e.qualType) === 'std::thread') {
|
|
1217
1217
|
return this.cxxNewExpressionToValueAndStmts(callExpression);
|
|
1218
1218
|
}
|
|
1219
|
-
else if (callExpression.inner[0].kind ===
|
|
1219
|
+
else if (callExpression.inner[0].kind === ast_1.astKind.CXXPseudoDestructorExpression) {
|
|
1220
1220
|
return this.cxxCallExpressionToValueAndStmts(callExpression.inner[0]);
|
|
1221
1221
|
}
|
|
1222
|
-
else if (callExpression.name === 'basic_string' || callExpression.inner[0].kind ===
|
|
1222
|
+
else if (callExpression.name === 'basic_string' || callExpression.inner[0].kind === ast_1.astKind.MaterializeTemporaryExpr) {
|
|
1223
1223
|
return this.cxxNodeToValueAndStmts(callExpression.inner[0]);
|
|
1224
1224
|
}
|
|
1225
1225
|
}
|
|
@@ -1265,7 +1265,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1265
1265
|
!callExpression.code.startsWith(innerNode.code)) {
|
|
1266
1266
|
callArgus.push(innerNode);
|
|
1267
1267
|
}
|
|
1268
|
-
if (innerNode.kind ===
|
|
1268
|
+
if (innerNode.kind === ast_1.astKind.CXXOperatorCallExpr) {
|
|
1269
1269
|
// Recursive call processing CXXOperatorCallExpr
|
|
1270
1270
|
if (innerNode.type.qualType !== 'std::ostream') {
|
|
1271
1271
|
return this.streamOrLambdaExprToValueAndStmts(innerNode, callArgus);
|
|
@@ -1273,16 +1273,16 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1273
1273
|
// When the type is std:: ostream, it indicates an overloaded stream operator and records the overloaded node of the stream operator
|
|
1274
1274
|
callArgus.push(innerNode);
|
|
1275
1275
|
// Recursive call to process CXXOperatorCallExpr nested in the inner of CXXOperatorCallExpr
|
|
1276
|
-
if (innerNode.inner[1].kind ===
|
|
1276
|
+
if (innerNode.inner[1].kind === ast_1.astKind.CXXOperatorCallExpr) {
|
|
1277
1277
|
return this.streamOrLambdaExprToValueAndStmts(innerNode.inner[1], callArgus);
|
|
1278
1278
|
}
|
|
1279
1279
|
// If there is no nested CXXOperatorCallExpr, the ValueAndStmts of overloaded stream operators will be built directly
|
|
1280
1280
|
return this.buildValueAndStmtsForStreamOrLambdaCall(innerNode.inner[1], callArgus.reverse(), stmts, callExpression);
|
|
1281
1281
|
}
|
|
1282
|
-
while (innerNode.kind ===
|
|
1282
|
+
while (innerNode.kind === ast_1.astKind.ImplicitCastExpr && innerNode.valueCategory === 'lvalue' && innerNode.inner.length > 0) {
|
|
1283
1283
|
innerNode = innerNode.inner[0];
|
|
1284
1284
|
}
|
|
1285
|
-
if (innerNode.kind ===
|
|
1285
|
+
if (innerNode.kind === ast_1.astKind.DeclRefExpr &&
|
|
1286
1286
|
(innerNode.type.qualType.includes('iostream') ||
|
|
1287
1287
|
innerNode.type.qualType.includes('ostream') ||
|
|
1288
1288
|
innerNode.type.qualType.includes('istream') ||
|
|
@@ -1311,7 +1311,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1311
1311
|
};
|
|
1312
1312
|
for (let i = 0; i < args.length; i += 1) {
|
|
1313
1313
|
let arg = args[i];
|
|
1314
|
-
if (arg.kind ===
|
|
1314
|
+
if (arg.kind === ast_1.astKind.CXXOperatorCallExpr) {
|
|
1315
1315
|
// Standard stream operator+overloaded stream operator
|
|
1316
1316
|
// 1. Object of standard stream operator, call std:: stream function
|
|
1317
1317
|
this.buildValueAndStmtsForStdStreamOrLambdaCall(streamNode, nonOverloadedArgs, streamExpr, currValueAndStmts);
|
|
@@ -1446,25 +1446,25 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1446
1446
|
return overloadedOpToValueAndStmts;
|
|
1447
1447
|
}
|
|
1448
1448
|
// operator<< / operator>> and lambda cout scenario
|
|
1449
|
-
if ((((_a = callExpression.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) ===
|
|
1449
|
+
if ((((_a = callExpression.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) === ast_1.astKind.ImplicitCastExpr && ((_b = callExpression.inner[0]) === null || _b === void 0 ? void 0 : _b.name) === 'operator>>') ||
|
|
1450
1450
|
callExpression.name === 'operator<<' ||
|
|
1451
1451
|
((_c = callExpression.inner[0]) === null || _c === void 0 ? void 0 : _c.name) === 'operator<<' ||
|
|
1452
1452
|
((_d = callExpression.inner[1]) === null || _d === void 0 ? void 0 : _d.type.qualType.toString().includes('(lambda at'))) {
|
|
1453
1453
|
return this.streamOrLambdaExprToValueAndStmts(callExpression, []);
|
|
1454
1454
|
}
|
|
1455
1455
|
// Relational binary operator or assignment operator
|
|
1456
|
-
if (((_e = callExpression.inner[0]) === null || _e === void 0 ? void 0 : _e.kind) ===
|
|
1456
|
+
if (((_e = callExpression.inner[0]) === null || _e === void 0 ? void 0 : _e.kind) === ast_1.astKind.ImplicitCastExpr &&
|
|
1457
1457
|
(ArkCxxValueTransformer.isRelationalBinaryOperator((_f = callExpression.inner[0]) === null || _f === void 0 ? void 0 : _f.code) ||
|
|
1458
1458
|
this.getOverloadOpName(callExpression) === 'operator=')) {
|
|
1459
1459
|
return this.CXXOperatorExpressionToBinaryOperator(callExpression);
|
|
1460
1460
|
}
|
|
1461
1461
|
// Unary operators (++ / --)
|
|
1462
|
-
if (((_g = callExpression.inner[0]) === null || _g === void 0 ? void 0 : _g.kind) ===
|
|
1462
|
+
if (((_g = callExpression.inner[0]) === null || _g === void 0 ? void 0 : _g.kind) === ast_1.astKind.ImplicitCastExpr &&
|
|
1463
1463
|
['++', '--', '*'].includes((_h = callExpression.inner[0]) === null || _h === void 0 ? void 0 : _h.code)) {
|
|
1464
1464
|
return this.CXXOperatorExpressionToUnaryOperator(callExpression);
|
|
1465
1465
|
}
|
|
1466
1466
|
// Arrow operator (->) in iteration
|
|
1467
|
-
if (((_j = callExpression.inner[0]) === null || _j === void 0 ? void 0 : _j.kind) ===
|
|
1467
|
+
if (((_j = callExpression.inner[0]) === null || _j === void 0 ? void 0 : _j.kind) === ast_1.astKind.ImplicitCastExpr &&
|
|
1468
1468
|
((_k = callExpression.inner[0]) === null || _k === void 0 ? void 0 : _k.code) === '->') {
|
|
1469
1469
|
return this.cxxNodeToValueAndStmts(callExpression.inner[1]);
|
|
1470
1470
|
}
|
|
@@ -1477,19 +1477,19 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1477
1477
|
for (let innerNode of callExpression.inner) {
|
|
1478
1478
|
// 将第一组递归表达式类型定义为 string 数组
|
|
1479
1479
|
const recursiveKinds = [
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1480
|
+
ast_1.astKind.CXXOperatorCallExpr,
|
|
1481
|
+
ast_1.astKind.MaterializeTemporaryExpr,
|
|
1482
|
+
ast_1.astKind.CXXBindTemporaryExpr,
|
|
1483
|
+
ast_1.astKind.CXXConstructExpr
|
|
1484
1484
|
];
|
|
1485
1485
|
if (recursiveKinds.includes(innerNode.kind) ||
|
|
1486
|
-
(innerNode.kind ===
|
|
1486
|
+
(innerNode.kind === ast_1.astKind.ImplicitCastExpr && innerNode.castKind !== 'FunctionToPointerDecay')) {
|
|
1487
1487
|
innerStmts.push(...this.cxxOperatorExpressionToValueAndStmts(innerNode, false));
|
|
1488
1488
|
}
|
|
1489
|
-
else if (innerNode.kind ===
|
|
1489
|
+
else if (innerNode.kind === ast_1.astKind.DeclRefExpr) {
|
|
1490
1490
|
innerStmts.push(this.cxxIdentifierToValueAndStmts(innerNode));
|
|
1491
1491
|
}
|
|
1492
|
-
else if (innerNode.kind ===
|
|
1492
|
+
else if (innerNode.kind === ast_1.astKind.IntegerLiteral || innerNode.kind === ast_1.astKind.StringLiteral) {
|
|
1493
1493
|
let literalNode = this.cxxLiteralNodeToValueAndStmts(innerNode);
|
|
1494
1494
|
if (literalNode) {
|
|
1495
1495
|
innerStmts.push(literalNode);
|
|
@@ -1515,7 +1515,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1515
1515
|
// Handling Recursive function, e.g. Case10 in lambdaFuncSample.cpp
|
|
1516
1516
|
if ((_d = cxxOperatorCallExpr.inner) === null || _d === void 0 ? void 0 : _d[1]) {
|
|
1517
1517
|
let callNode = cxxOperatorCallExpr.inner[1];
|
|
1518
|
-
while (callNode.kind ===
|
|
1518
|
+
while (callNode.kind === ast_1.astKind.ImplicitCastExpr && callNode.valueCategory === 'lvalue' && callNode.inner.length > 0) {
|
|
1519
1519
|
callNode = callNode.inner[0];
|
|
1520
1520
|
}
|
|
1521
1521
|
if (callNode.type.qualType.includes('std::function') || this.isNodeRelatedToCXXLambdaFunc(callNode)) {
|
|
@@ -1658,7 +1658,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1658
1658
|
const callerName = callerValue.getName();
|
|
1659
1659
|
let classSignature = ArkSignatureBuilder_1.ArkSignatureBuilder.buildClassSignatureFromClassName(callerName);
|
|
1660
1660
|
let cls = ModelUtils_1.ModelUtils.getClass(this.declaringMethod, classSignature);
|
|
1661
|
-
const callExprs = [
|
|
1661
|
+
const callExprs = [ast_1.astKind.CallExpr, ast_1.astKind.CXXOperatorCallExpr];
|
|
1662
1662
|
if ((cls === null || cls === void 0 ? void 0 : cls.hasComponentDecorator()) && callExprs.includes(callExpression.kind)) {
|
|
1663
1663
|
return this.cxxGenerateCustomViewStmt(callerName, args, argPositions, callExpression, stmts);
|
|
1664
1664
|
}
|
|
@@ -1859,7 +1859,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1859
1859
|
const argPositions = [];
|
|
1860
1860
|
if (argumentNodes) {
|
|
1861
1861
|
for (let i = 0; i < argumentNodes.length; i++) {
|
|
1862
|
-
if (argumentNodes[i].kind ===
|
|
1862
|
+
if (argumentNodes[i].kind === ast_1.astKind.CXXDefaultArgExpr) {
|
|
1863
1863
|
continue;
|
|
1864
1864
|
}
|
|
1865
1865
|
const argument = argumentNodes[i];
|
|
@@ -1908,7 +1908,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1908
1908
|
const stmts = [];
|
|
1909
1909
|
let realGenericTypes = this.getRealGenericTypes(newExpression);
|
|
1910
1910
|
// Handle the scenarios of namespace::Member and class::member
|
|
1911
|
-
const parentClassOrNs = (_a = newExpression.getParent) === null || _a === void 0 ? void 0 : _a.call(newExpression, true).inner.filter(inn => [
|
|
1911
|
+
const parentClassOrNs = (_a = newExpression.getParent) === null || _a === void 0 ? void 0 : _a.call(newExpression, true).inner.filter(inn => [ast_1.astKind.TypeRef, ast_1.astKind.NamespaceRef].includes(inn.kind));
|
|
1912
1912
|
let refType = null;
|
|
1913
1913
|
// If the parent node has a namespaceRef or TypeRef, it indicates a constructor call,
|
|
1914
1914
|
// and should infer the type of the corresponding namespace/class.
|
|
@@ -1931,7 +1931,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1931
1931
|
const expr = new Expr_1.ArkNewExpr(classType);
|
|
1932
1932
|
const { value: newLocal, valueOriginalPositions: newLocalPositions, stmts: newExprStmts } = this.ArkCxxIRTransformer.generateAssignStmtForValue(expr, [Position_1.FullPosition.cxxBuildFromNode(newExpression, this.cxxSourceFile)]);
|
|
1933
1933
|
// When using the new keyword, the type of Local should be a pointer type.
|
|
1934
|
-
if (newExpression.kind ===
|
|
1934
|
+
if (newExpression.kind === ast_1.astKind.CXXNewExpr) {
|
|
1935
1935
|
newLocal.setType(new Type_2.PointerType(classType, 1));
|
|
1936
1936
|
}
|
|
1937
1937
|
stmts.push(...newExprStmts);
|
|
@@ -1953,25 +1953,25 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
1953
1953
|
const constructArgs = (() => {
|
|
1954
1954
|
var _a, _b;
|
|
1955
1955
|
let args = newExpression.inner;
|
|
1956
|
-
if (newExpression.kind ===
|
|
1956
|
+
if (newExpression.kind === ast_1.astKind.CXXNewExpr && ((_a = newExpression.inner[0]) === null || _a === void 0 ? void 0 : _a.kind) === ast_1.astKind.CXXConstructExpr) {
|
|
1957
1957
|
return [...newExpression.inner[0].inner];
|
|
1958
1958
|
}
|
|
1959
|
-
else if (newExpression.kind ===
|
|
1959
|
+
else if (newExpression.kind === ast_1.astKind.CompoundLiteralExpr) {
|
|
1960
1960
|
return this.getConstructArgs(args);
|
|
1961
1961
|
}
|
|
1962
1962
|
else if (
|
|
1963
1963
|
// if case : struct LargeStruct s;, inner.length is 0, so we need to avoid it
|
|
1964
|
-
newExpression.kind ===
|
|
1964
|
+
newExpression.kind === ast_1.astKind.CXXConstructExpr &&
|
|
1965
1965
|
newExpression.type.qualType.startsWith('struct') &&
|
|
1966
|
-
args.length > 0 && ((_b = args[0].inner[0]) === null || _b === void 0 ? void 0 : _b.kind) ===
|
|
1966
|
+
args.length > 0 && ((_b = args[0].inner[0]) === null || _b === void 0 ? void 0 : _b.kind) === ast_1.astKind.CompoundLiteralExpr) {
|
|
1967
1967
|
return this.getConstructArgs(args[0].inner[0].inner);
|
|
1968
1968
|
}
|
|
1969
|
-
else if (newExpression.kind ===
|
|
1969
|
+
else if (newExpression.kind === ast_1.astKind.InitListExpr) {
|
|
1970
1970
|
return this.getConstructArgs(newExpression);
|
|
1971
1971
|
}
|
|
1972
|
-
return args.filter(arg => (arg === null || arg === void 0 ? void 0 : arg.kind) !==
|
|
1973
|
-
(arg === null || arg === void 0 ? void 0 : arg.kind) !==
|
|
1974
|
-
(arg === null || arg === void 0 ? void 0 : arg.kind) !==
|
|
1972
|
+
return args.filter(arg => (arg === null || arg === void 0 ? void 0 : arg.kind) !== ast_1.astKind.TemplateRef &&
|
|
1973
|
+
(arg === null || arg === void 0 ? void 0 : arg.kind) !== ast_1.astKind.NamespaceRef &&
|
|
1974
|
+
(arg === null || arg === void 0 ? void 0 : arg.kind) !== ast_1.astKind.TypeRef);
|
|
1975
1975
|
})();
|
|
1976
1976
|
const { args: argValues, argPositions } = this.cxxParseArguments(stmts, constructArgs);
|
|
1977
1977
|
const constructorMethodSignature = this.getConstructorSignatureByClassTypeAndArgs(classType, argValues);
|
|
@@ -2024,7 +2024,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2024
2024
|
if (Array.isArray(constructArgs)) {
|
|
2025
2025
|
arr = constructArgs;
|
|
2026
2026
|
}
|
|
2027
|
-
else if (constructArgs.kind ===
|
|
2027
|
+
else if (constructArgs.kind === ast_1.astKind.InitListExpr) {
|
|
2028
2028
|
arr = (_a = constructArgs.inner) !== null && _a !== void 0 ? _a : [];
|
|
2029
2029
|
}
|
|
2030
2030
|
else {
|
|
@@ -2032,11 +2032,11 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2032
2032
|
arr = (_b = constructArgs.inner) !== null && _b !== void 0 ? _b : [];
|
|
2033
2033
|
}
|
|
2034
2034
|
// 2) If the second element itself is InitListExpr, take its inner as the real parameter
|
|
2035
|
-
if (((_c = arr[1]) === null || _c === void 0 ? void 0 : _c.kind) ===
|
|
2035
|
+
if (((_c = arr[1]) === null || _c === void 0 ? void 0 : _c.kind) === ast_1.astKind.InitListExpr) {
|
|
2036
2036
|
arr = (_d = arr[1].inner) !== null && _d !== void 0 ? _d : [];
|
|
2037
2037
|
}
|
|
2038
2038
|
// 3) If there is "implicit conversion" (original logic: check whether the second element is ImplicitCastExpr)
|
|
2039
|
-
const useInner1 = ((_e = arr[1]) === null || _e === void 0 ? void 0 : _e.kind) ===
|
|
2039
|
+
const useInner1 = ((_e = arr[1]) === null || _e === void 0 ? void 0 : _e.kind) === ast_1.astKind.ImplicitCastExpr;
|
|
2040
2040
|
// 4) Generate a new parameter list (equivalent to the original logic)
|
|
2041
2041
|
const newConstructArgs = [];
|
|
2042
2042
|
for (let i = 0; i < arr.length; i++) {
|
|
@@ -2345,8 +2345,8 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2345
2345
|
// Use temporary variables to store the value before self increment, and avoid this expression for some non assignment operation scenarios
|
|
2346
2346
|
if (operatorToken === '++' || operatorToken === '--') {
|
|
2347
2347
|
const needAssign = [
|
|
2348
|
-
|
|
2349
|
-
|
|
2348
|
+
ast_1.astKind.VarDecl, ast_1.astKind.BinaryOperator, ast_1.astKind.BinaryConditionalOperator,
|
|
2349
|
+
ast_1.astKind.ConditionalOperator, ast_1.astKind.ArraySubscriptExpr,
|
|
2350
2350
|
];
|
|
2351
2351
|
let parent = (_c = ((_a = postfixUnaryExpression.parent) !== null && _a !== void 0 ? _a : (_b = postfixUnaryExpression.getParent) === null || _b === void 0 ? void 0 : _b.call(postfixUnaryExpression, true))) !== null && _c !== void 0 ? _c : null;
|
|
2352
2352
|
if (parent && needAssign.includes(parent.kind)) {
|
|
@@ -2403,7 +2403,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2403
2403
|
rightOpNode = nodeInnerNode(variableDeclaration);
|
|
2404
2404
|
}
|
|
2405
2405
|
// In this case, the non assigned information on the right node needs to be discarded
|
|
2406
|
-
if (this.isCxxArray(leftOpNode.type.qualType) && (rightOpNode === null || rightOpNode === void 0 ? void 0 : rightOpNode.kind) ===
|
|
2406
|
+
if (this.isCxxArray(leftOpNode.type.qualType) && (rightOpNode === null || rightOpNode === void 0 ? void 0 : rightOpNode.kind) === ast_1.astKind.IntegerLiteral) {
|
|
2407
2407
|
rightOpNode = undefined;
|
|
2408
2408
|
}
|
|
2409
2409
|
const declarationType = variableDeclaration.type ? (0, builderUtils_1.cxxNode2Type)(variableDeclaration, this.declaringMethod) : Type_1.UnknownType.getInstance();
|
|
@@ -2430,7 +2430,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2430
2430
|
*/
|
|
2431
2431
|
cxxAssignmentToValueAndStmts(leftOpNode, rightOpNode, variableDefFlag, isConst, declarationType, needRightOp = true) {
|
|
2432
2432
|
let leftValueAndStmts;
|
|
2433
|
-
if (leftOpNode.kind.toString() ===
|
|
2433
|
+
if (leftOpNode.kind.toString() === ast_1.astKind.VarDecl) {
|
|
2434
2434
|
leftValueAndStmts = this.cxxIdentifierToValueAndStmts(leftOpNode, variableDefFlag);
|
|
2435
2435
|
}
|
|
2436
2436
|
else {
|
|
@@ -2452,7 +2452,7 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2452
2452
|
}
|
|
2453
2453
|
const assignStmt = new Stmt_1.ArkAssignStmt(leftValue, rightValue);
|
|
2454
2454
|
assignStmt.setOperandOriginalPositions([...leftPositions, ...rightPositions]);
|
|
2455
|
-
if (leftOpNode.kind ===
|
|
2455
|
+
if (leftOpNode.kind === ast_1.astKind.InitListExpr) {
|
|
2456
2456
|
stmts.push(...rightStmts);
|
|
2457
2457
|
stmts.push(assignStmt);
|
|
2458
2458
|
stmts.push(...leftStmts);
|
|
@@ -2702,31 +2702,31 @@ class ArkCxxValueTransformer extends ArkValueTransformer_1.ArkValueTransformer {
|
|
|
2702
2702
|
const pos = [Position_1.FullPosition.cxxBuildFromNode(literalNode, this.cxxSourceFile)];
|
|
2703
2703
|
const S = (v) => v !== null && v !== void 0 ? v : '';
|
|
2704
2704
|
switch (literalNode.kind) {
|
|
2705
|
-
case
|
|
2705
|
+
case ast_1.astKind.IntegerLiteral: {
|
|
2706
2706
|
const num = (S(literalNode.value) || S(literalNode.code));
|
|
2707
2707
|
const constant = ValueUtil_1.CxxValueUtil.getOrCreateNumberConst(num ? num : 0);
|
|
2708
2708
|
return { value: constant, valueOriginalPositions: pos, stmts };
|
|
2709
2709
|
}
|
|
2710
|
-
case
|
|
2710
|
+
case ast_1.astKind.FloatingLiteral: {
|
|
2711
2711
|
const num = this.parseFloatAsCxxFloat(S(literalNode.value) || S(literalNode.code));
|
|
2712
2712
|
const constant = ValueUtil_1.CxxValueUtil.getOrCreateNumberConst(Number.isFinite(num) ? num : 0);
|
|
2713
2713
|
return { value: constant, valueOriginalPositions: pos, stmts };
|
|
2714
2714
|
}
|
|
2715
|
-
case
|
|
2715
|
+
case ast_1.astKind.StringLiteral: {
|
|
2716
2716
|
const constant = ValueUtil_1.CxxValueUtil.createStringConst(S(literalNode.value) || S(literalNode.code));
|
|
2717
2717
|
return { value: constant, valueOriginalPositions: pos, stmts };
|
|
2718
2718
|
}
|
|
2719
|
-
case
|
|
2719
|
+
case ast_1.astKind.CharacterLiteral: {
|
|
2720
2720
|
const constant = ValueUtil_1.CxxValueUtil.createCharConst(S(literalNode.code));
|
|
2721
2721
|
return { value: constant, valueOriginalPositions: pos, stmts };
|
|
2722
2722
|
}
|
|
2723
|
-
case
|
|
2723
|
+
case ast_1.astKind.CXXBoolLiteralExpr: {
|
|
2724
2724
|
const raw = ((_b = (_a = literalNode.value) !== null && _a !== void 0 ? _a : literalNode.code) !== null && _b !== void 0 ? _b : '').toString().trim().toLowerCase();
|
|
2725
2725
|
const b = raw === 'true' || raw === '1';
|
|
2726
2726
|
const constant = ValueUtil_1.CxxValueUtil.getBooleanConstant(b);
|
|
2727
2727
|
return { value: constant, valueOriginalPositions: pos, stmts };
|
|
2728
2728
|
}
|
|
2729
|
-
case
|
|
2729
|
+
case ast_1.astKind.CXXNullPtrLiteralExpr: {
|
|
2730
2730
|
const constant = Constant_1.NullConstant.getInstance();
|
|
2731
2731
|
return { value: constant, valueOriginalPositions: pos, stmts };
|
|
2732
2732
|
}
|