Lines Matching refs:ir
26 #include "ir/base/classProperty.h"
27 #include "ir/base/classStaticBlock.h"
28 #include "ir/base/methodDefinition.h"
29 #include "ir/base/scriptFunction.h"
30 #include "ir/expressions/assignmentExpression.h"
31 #include "ir/expressions/callExpression.h"
32 #include "ir/expressions/functionExpression.h"
33 #include "ir/expressions/identifier.h"
34 #include "ir/expressions/thisExpression.h"
35 #include "ir/expressions/memberExpression.h"
36 #include "ir/ets/etsPrimitiveType.h"
37 #include "ir/ts/tsAsExpression.h"
38 #include "ir/statements/blockStatement.h"
39 #include "ir/statements/classDeclaration.h"
40 #include "ir/statements/expressionStatement.h"
41 #include "ir/statements/returnStatement.h"
46 #include "ir/ets/etsParameterExpression.h"
50 void ProcessCheckerNode(ETSChecker *checker, ir::AstNode *node)
73 void ProcessScopesNode(ETSChecker *checker, ir::AstNode *node)
85 ir::ETSParameterExpression *ETSChecker::AddParam(util::StringView name, ir::TypeNode *type)
88 auto *paramIdent = AllocNode<ir::Identifier>(name, Allocator());
94 return AllocNode<ir::ETSParameterExpression>(paramIdent, nullptr);
98 ir::MethodDefinition *ETSChecker::CreateDynamicCallIntrinsic(ir::Expression *callee, const ArenaVector<T *> &arguments,
101 ArenaVector<ir::Expression *> params(Allocator()->Adapter());
103 auto dynamicTypeNode = AllocNode<ir::OpaqueTypeNode>(GlobalBuiltinDynamicType(lang));
104 auto intTypeNode = AllocNode<ir::ETSPrimitiveType>(ir::PrimitiveType::INT);
110 ir::ETSParameterExpression *param2;
128 : AllocNode<ir::OpaqueTypeNode>(arguments[i]->TsType());
134 ir::FunctionSignature(nullptr, std::move(params), dynamicTypeNode->Clone(Allocator(), nullptr));
135 auto *func = AllocNode<ir::ScriptFunction>(
136 Allocator(), ir::ScriptFunction::ScriptFunctionData {nullptr, std::move(funcSignature),
137 ir::ScriptFunctionFlags::METHOD, ir::ModifierFlags::NONE});
140 auto *name = AllocNode<ir::Identifier>("invoke", Allocator());
144 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
147 auto *method = AllocNode<ir::MethodDefinition>(
148 ir::MethodDefinitionKind::METHOD, func->Id()->Clone(Allocator(), nullptr), funcExpr,
149 ir::ModifierFlags::PUBLIC | ir::ModifierFlags::NATIVE | ir::ModifierFlags::STATIC, Allocator(), false);
153 static void ToString(ETSChecker *checker, const ArenaVector<ir::Expression *> &arguments, std::stringstream &ss)
173 Signature *ETSChecker::ResolveDynamicCallExpression(ir::Expression *callee, const ArenaVector<T *> &arguments,
202 auto props = ArenaVector<ir::AstNode *>(Allocator()->Adapter());
222 template Signature *ETSChecker::ResolveDynamicCallExpression<ir::Expression>(
223 ir::Expression *callee, const ArenaVector<ir::Expression *> &arguments, Language lang, bool isConstruct);
226 ir::Expression *callee, const ArenaVector<varbinder::LocalVariable *> &arguments, Language lang, bool isConstruct);
228 std::pair<ir::ScriptFunction *, ir::Identifier *> ETSChecker::CreateStaticScriptFunction(
231 ArenaVector<ir::Statement *> statements(Allocator()->Adapter());
232 ArenaVector<ir::Expression *> params(Allocator()->Adapter());
234 ir::ScriptFunction *func;
235 ir::Identifier *id;
239 auto *body = AllocNode<ir::BlockStatement>(Allocator(), std::move(statements));
241 id = AllocNode<ir::Identifier>(compiler::Signatures::CCTOR, Allocator());
242 auto signature = ir::FunctionSignature(nullptr, std::move(params), nullptr);
244 func = AllocNode<ir::ScriptFunction>(
245 Allocator(), ir::ScriptFunction::ScriptFunctionData {
248 ir::ScriptFunctionFlags::STATIC_BLOCK | ir::ScriptFunctionFlags::EXPRESSION,
249 ir::ModifierFlags::STATIC,
257 std::pair<ir::ScriptFunction *, ir::Identifier *> ETSChecker::CreateScriptFunction(
260 ArenaVector<ir::Statement *> statements(Allocator()->Adapter());
261 ArenaVector<ir::Expression *> params(Allocator()->Adapter());
263 ir::ScriptFunction *func;
264 ir::Identifier *id;
268 auto *body = AllocNode<ir::BlockStatement>(Allocator(), std::move(statements));
270 id = AllocNode<ir::Identifier>(compiler::Signatures::CTOR, Allocator());
271 auto funcSignature = ir::FunctionSignature(nullptr, std::move(params), nullptr);
272 func = AllocNode<ir::ScriptFunction>(Allocator(),
273 ir::ScriptFunction::ScriptFunctionData {
275 ir::ScriptFunctionFlags::CONSTRUCTOR | ir::ScriptFunctionFlags::EXPRESSION,
276 ir::ModifierFlags::PUBLIC});
282 ir::ClassStaticBlock *ETSChecker::CreateClassStaticInitializer(const ClassInitializerBuilder &builder,
289 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
292 auto *staticBlock = AllocNode<ir::ClassStaticBlock>(funcExpr, Allocator());
293 staticBlock->AddModifier(ir::ModifierFlags::STATIC);
298 ir::MethodDefinition *ETSChecker::CreateClassInstanceInitializer(const ClassInitializerBuilder &builder,
305 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
309 AllocNode<ir::MethodDefinition>(ir::MethodDefinitionKind::CONSTRUCTOR, id->Clone(Allocator(), nullptr),
310 funcExpr, ir::ModifierFlags::NONE, Allocator(), false);
314 ir::ClassStaticBlock *ETSChecker::CreateDynamicCallClassInitializer(Language lang, bool isConstruct)
318 isConstruct](ArenaVector<ir::Statement *> *statements,
319 [[maybe_unused]] ArenaVector<ir::Expression *> *params) {
324 auto *classId = AllocNode<ir::Identifier>(builtin_class_name, Allocator());
326 auto *methodId = AllocNode<ir::Identifier>(builtin_method_name, Allocator());
330 AllocNode<ir::MemberExpression>(classId, methodId, ir::MemberExpressionKind::PROPERTY_ACCESS, false, false);
333 auto *initCall = AllocNode<ir::CallExpression>(callee, ArenaVector<ir::Expression *>(Allocator()->Adapter()),
337 statements->push_back(AllocNode<ir::ExpressionStatement>(initCall));
341 ir::ClassDeclaration *ETSChecker::BuildClass(util::StringView name, const ClassBuilder &builder)
344 auto *classId = AllocNode<ir::Identifier>(name, Allocator());
347 auto *classDef = AllocNode<ir::ClassDefinition>(Allocator(), classId, ir::ClassDefinitionModifiers::CLASS_DECL,
348 ir::ModifierFlags::NONE, Language(Language::Id::ETS));
351 auto *classDecl = AllocNode<ir::ClassDeclaration>(classDef, Allocator());
358 ArenaVector<ir::AstNode *> classBody(Allocator()->Adapter());
369 ir::ClassProperty *ETSChecker::CreateStaticReadonlyField(const char *name)
371 auto *fieldIdent = AllocNode<ir::Identifier>(name, Allocator());
374 ir::ModifierFlags::STATIC | ir::ModifierFlags::PRIVATE | ir::ModifierFlags::READONLY | ir::ModifierFlags::CONST;
375 auto *field = AllocNode<ir::ClassProperty>(
376 fieldIdent, nullptr, AllocNode<ir::ETSPrimitiveType>(ir::PrimitiveType::INT), flags, Allocator(), false);
381 ir::ClassDeclaration *ETSChecker::GetDynamicClass(Language lang, bool isConstruct)
389 auto klass = BuildClass(className, [this, lang, isConstruct](ArenaVector<ir::AstNode *> *classBody) {
399 void ETSChecker::ClassInitializerFromImport(ir::ETSImportDeclaration *import, ArenaVector<ir::Statement *> *statements)
404 auto *classId = AllocNode<ir::Identifier>(builtin_class_name, Allocator());
406 auto *methodId = AllocNode<ir::Identifier>(builtin_method_name, Allocator());
410 AllocNode<ir::MemberExpression>(classId, methodId, ir::MemberExpressionKind::PROPERTY_ACCESS, false, false);
413 ArenaVector<ir::Expression *> callParams(Allocator()->Adapter());
415 callParams.push_back(AllocNode<ir::StringLiteral>(
421 auto *loadCall = AllocNode<ir::CallExpression>(callee, std::move(callParams), nullptr, false);
423 auto *moduleClassId = AllocNode<ir::Identifier>(compiler::Signatures::DYNAMIC_MODULE_CLASS, Allocator());
425 auto *fieldId = AllocNode<ir::Identifier>(import->AssemblerName(), Allocator());
428 auto *property = AllocNode<ir::MemberExpression>(moduleClassId, fieldId, ir::MemberExpressionKind::PROPERTY_ACCESS,
432 AllocNode<ir::AssignmentExpression>(property, loadCall, lexer::TokenType::PUNCTUATOR_SUBSTITUTION);
433 statements->push_back(AllocNode<ir::ExpressionStatement>(initializer));
436 ir::ClassStaticBlock *ETSChecker::CreateDynamicModuleClassInitializer(
437 const std::vector<ir::ETSImportDeclaration *> &imports)
440 return CreateClassStaticInitializer([this, imports](ArenaVector<ir::Statement *> *statements,
441 [[maybe_unused]] ArenaVector<ir::Expression *> *params) {
448 ir::MethodDefinition *ETSChecker::CreateClassMethod(const std::string_view name, ir::ScriptFunctionFlags funcFlags,
449 ir::ModifierFlags modifierFlags, const MethodBuilder &builder)
451 ArenaVector<ir::Expression *> params(Allocator()->Adapter());
452 auto *id = AllocNode<ir::Identifier>(name, Allocator());
454 ArenaVector<ir::Statement *> statements(Allocator()->Adapter());
460 auto *body = AllocNode<ir::BlockStatement>(Allocator(), std::move(statements));
461 auto funcSignature = ir::FunctionSignature(
462 nullptr, std::move(params), returnType == nullptr ? nullptr : AllocNode<ir::OpaqueTypeNode>(returnType));
463 auto *func = AllocNode<ir::ScriptFunction>(
464 Allocator(), ir::ScriptFunction::ScriptFunctionData {body, std::move(funcSignature), funcFlags, modifierFlags});
469 auto *funcExpr = AllocNode<ir::FunctionExpression>(func);
472 AllocNode<ir::MethodDefinition>(ir::MethodDefinitionKind::METHOD, func->Id()->Clone(Allocator(), nullptr),
478 ir::MethodDefinition *ETSChecker::CreateDynamicModuleClassInitMethod()
481 return CreateClassMethod(compiler::Signatures::DYNAMIC_MODULE_CLASS_INIT, ir::ScriptFunctionFlags::METHOD,
482 ir::ModifierFlags::PUBLIC | ir::ModifierFlags::STATIC,
483 [this]([[maybe_unused]] ArenaVector<ir::Statement *> *statements,
484 [[maybe_unused]] ArenaVector<ir::Expression *> *params,
488 ir::MethodDefinition *ETSChecker::CreateLambdaObjectClassInvokeMethod(Signature *invokeSignature,
489 ir::TypeNode *retTypeAnnotation)
493 compiler::Signatures::LAMBDA_OBJECT_INVOKE, ir::ScriptFunctionFlags::METHOD, ir::ModifierFlags::PUBLIC,
494 [this, invokeSignature, retTypeAnnotation](ArenaVector<ir::Statement *> *statements,
495 ArenaVector<ir::Expression *> *params, Type **returnType) {
498 ir::ETSParameterExpression *thisParam = AddParam(thisParamName.View(), nullptr);
501 ArenaVector<ir::Expression *> callParams(Allocator()->Adapter());
506 auto *param = AddParam(paramName, AllocNode<ir::OpaqueTypeNode>(invokeParam->TsType()));
512 auto *properyId = AllocNode<ir::Identifier>("jsvalue_lambda", Allocator());
514 auto *callee = AllocNode<ir::MemberExpression>(thisParam->Clone(Allocator(), nullptr), properyId,
515 ir::MemberExpressionKind::PROPERTY_ACCESS, false, false);
517 auto *callLambda = AllocNode<ir::CallExpression>(callee, std::move(callParams), nullptr, false);
521 AllocNode<ir::TSAsExpression>(callLambda, retTypeAnnotation->Clone(Allocator(), nullptr), false);
524 auto *retStatement = AllocNode<ir::ReturnStatement>(castToRetTypeExpr);
535 auto it = std::find_if(body.begin(), body.end(), [](ir::AstNode *node) { return node->IsClassStaticBlock(); });
543 auto *classId = AllocNode<ir::Identifier>(compiler::Signatures::DYNAMIC_MODULE_CLASS, Allocator());
545 auto *methodId = AllocNode<ir::Identifier>(compiler::Signatures::DYNAMIC_MODULE_CLASS_INIT, Allocator());
549 AllocNode<ir::MemberExpression>(classId, methodId, ir::MemberExpressionKind::PROPERTY_ACCESS, false, false);
551 ArenaVector<ir::Expression *> callParams(Allocator()->Adapter());
553 auto *initCall = AllocNode<ir::CallExpression>(callee, std::move(callParams), nullptr, false);
556 auto *const node = AllocNode<ir::ExpressionStatement>(initCall);
573 compiler::Signatures::DYNAMIC_MODULE_CLASS, [this, dynamicImports](ArenaVector<ir::AstNode *> *classBody) {
575 std::vector<ir::ETSImportDeclaration *> imports;
592 auto *fieldIdent = AllocNode<ir::Identifier>(import->AssemblerName(), Allocator());
594 auto flags = ir::ModifierFlags::STATIC | ir::ModifierFlags::PUBLIC | ir::ModifierFlags::READONLY |
595 ir::ModifierFlags::CONST;
596 auto *field = AllocNode<ir::ClassProperty>(
597 fieldIdent, nullptr, AllocNode<ir::OpaqueTypeNode>(GlobalBuiltinDynamicType(import->Language())),
609 ir::MethodDefinition *ETSChecker::CreateLambdaObjectClassInitializer(ETSObjectType *functionalInterface)
613 [this](ArenaVector<ir::Statement *> *statements, ArenaVector<ir::Expression *> *params) {
614 ir::ETSParameterExpression *thisParam = AddParam(varbinder::VarBinder::MANDATORY_PARAM_THIS, nullptr);
618 ir::ETSParameterExpression *jsvalueParam =
619 AddParam(jsvalueParamName.View(), AllocNode<ir::OpaqueTypeNode>(GlobalBuiltinJSValueType()));
622 auto *moduleClassId = AllocNode<ir::Identifier>(varbinder::VarBinder::MANDATORY_PARAM_THIS, Allocator());
624 auto *fieldId = AllocNode<ir::Identifier>("jsvalue_lambda", Allocator());
626 auto *property = AllocNode<ir::MemberExpression>(moduleClassId, fieldId,
627 ir::MemberExpressionKind::PROPERTY_ACCESS, false, false);
629 auto *initializer = AllocNode<ir::AssignmentExpression>(property, jsvalueParam->Clone(Allocator(), nullptr),
632 statements->push_back(AllocNode<ir::ExpressionStatement>(initializer));
637 void ETSChecker::BuildLambdaObjectClass(ETSObjectType *functionalInterface, ir::TypeNode *retTypeAnnotation)
652 functionalInterface](ArenaVector<ir::AstNode *> *classBody) {
655 auto *fieldIdent = AllocNode<ir::Identifier>(assemblyName, Allocator());
658 AllocNode<ir::ClassProperty>(fieldIdent, nullptr, AllocNode<ir::OpaqueTypeNode>(GlobalBuiltinJSValueType()),
659 ir::ModifierFlags::PRIVATE, Allocator(), false);