• Home
  • Raw
  • Download

Lines Matching +full:checker +full:-

7  * http://www.apache.org/licenses/LICENSE-2.0
17 #include "checker/ETSchecker.h"
18 #include "checker/ets/typeRelationContext.h"
29 static inline bool IsInterfaceType(const checker::Type *type) in IsInterfaceType()
31 return type != nullptr && type->IsETSObjectType() && in IsInterfaceType()
32 type->AsETSObjectType()->HasObjectFlag(checker::ETSObjectFlags::INTERFACE) && in IsInterfaceType()
33 !type->AsETSObjectType()->HasObjectFlag(checker::ETSObjectFlags::DYNAMIC); in IsInterfaceType()
36 static ir::AstNode *CreateAnonClassImplCtor(checker::ETSChecker *checker) in CreateAnonClassImplCtor() argument
38 checker::ETSChecker::ClassInitializerBuilder initBuilder = in CreateAnonClassImplCtor()
39 [checker]([[maybe_unused]] ArenaVector<ir::Statement *> *statements, in CreateAnonClassImplCtor()
41 checker->AddParam(varbinder::VarBinder::MANDATORY_PARAM_THIS, nullptr); in CreateAnonClassImplCtor()
44 return checker->CreateClassInstanceInitializer(initBuilder); in CreateAnonClassImplCtor()
47 …lassProperty *CreateAnonClassField(ir::MethodDefinition *ifaceMethod, checker::ETSChecker *checker) in CreateAnonClassField() argument
49 auto *const allocator = checker->Allocator(); in CreateAnonClassField()
52 auto *fieldType = ifaceMethod->Function()->Signature()->ReturnType(); in CreateAnonClassField()
54 auto *fieldTypeNode = checker->AllocNode<ir::OpaqueTypeNode>(fieldType); in CreateAnonClassField()
58 fieldName.Append(ifaceMethod->Id()->Name()); in CreateAnonClassField()
59 auto *fieldId = checker->AllocNode<ir::Identifier>(fieldName.View(), nullptr, allocator); in CreateAnonClassField()
65 if (ifaceMethod->Overloads().empty()) { in CreateAnonClassField()
70 …auto *field = checker->AllocNode<ir::ClassProperty>(fieldId, nullptr, fieldTypeNode->Clone(allocat… in CreateAnonClassField()
72 field->SetRange(ifaceMethod->Range()); in CreateAnonClassField()
77 static ir::MethodDefinition *CreateAnonClassFieldGetterSetter(checker::ETSChecker *checker, in CreateAnonClassFieldGetterSetter() argument
80 checker::ETSChecker::MethodBuilder methodBuilder = [checker, ifaceMethod, in CreateAnonClassFieldGetterSetter()
83 checker::Type **returnType) { in CreateAnonClassFieldGetterSetter()
84 auto *const allocator = checker->Allocator(); in CreateAnonClassFieldGetterSetter()
87 checker->AddParam(varbinder::VarBinder::MANDATORY_PARAM_THIS, nullptr); in CreateAnonClassFieldGetterSetter()
90 auto *retType = ifaceMethod->Function()->Signature()->ReturnType(); in CreateAnonClassFieldGetterSetter()
95 fieldName.Append(ifaceMethod->Id()->Name()); in CreateAnonClassFieldGetterSetter()
96 auto *fieldId = checker->AllocNode<ir::Identifier>(fieldName.View(), nullptr, allocator); in CreateAnonClassFieldGetterSetter()
101checker->AddParam(ifaceMethod->Id()->Name(), checker->AllocNode<ir::OpaqueTypeNode>(retType)); in CreateAnonClassFieldGetterSetter()
102 params->push_back(param); in CreateAnonClassFieldGetterSetter()
106 auto *thisExpr = checker->AllocNode<ir::ThisExpression>(); in CreateAnonClassFieldGetterSetter()
107 auto *lhs = checker->AllocNode<ir::MemberExpression>( in CreateAnonClassFieldGetterSetter()
108 …thisExpr, fieldId->Clone(allocator, nullptr), ir::MemberExpressionKind::PROPERTY_ACCESS, false, fa… in CreateAnonClassFieldGetterSetter()
109 auto *rhs = param->Ident()->CloneReference(allocator, nullptr); in CreateAnonClassFieldGetterSetter()
112checker->AllocNode<ir::AssignmentExpression>(lhs, rhs, lexer::TokenType::PUNCTUATOR_SUBSTITUTION); in CreateAnonClassFieldGetterSetter()
113 auto *statement = checker->AllocNode<ir::ExpressionStatement>(assignment); in CreateAnonClassFieldGetterSetter()
114 statements->push_back(statement); in CreateAnonClassFieldGetterSetter()
117 *returnType = checker->GlobalVoidType(); in CreateAnonClassFieldGetterSetter()
123 auto *thisExpr = checker->AllocNode<ir::ThisExpression>(); in CreateAnonClassFieldGetterSetter()
124 auto *argument = checker->AllocNode<ir::MemberExpression>( in CreateAnonClassFieldGetterSetter()
125 …thisExpr, fieldId->Clone(allocator, nullptr), ir::MemberExpressionKind::PROPERTY_ACCESS, false, fa… in CreateAnonClassFieldGetterSetter()
127 auto *statement = checker->AllocNode<ir::ReturnStatement>(argument); in CreateAnonClassFieldGetterSetter()
128 statements->push_back(statement); in CreateAnonClassFieldGetterSetter()
140 …return checker->CreateClassMethod(ifaceMethod->Id()->Name().Utf8(), funcFlags, modifierFlags, meth… in CreateAnonClassFieldGetterSetter()
143 static void FillClassBody(checker::ETSChecker *checker, ArenaVector<ir::AstNode *> *classBody, in FillClassBody() argument
147 ASSERT(it->IsMethodDefinition()); in FillClassBody()
148 auto *ifaceMethod = it->AsMethodDefinition(); in FillClassBody()
150 if (!ifaceMethod->Function()->IsGetter() && !ifaceMethod->Function()->IsSetter()) { in FillClassBody()
151 checker->LogTypeError("Interface has methods", objExpr->Start()); in FillClassBody()
152 objExpr->SetTsType(checker->GlobalTypeError()); in FillClassBody()
156 if (!ifaceMethod->Function()->IsGetter()) { in FillClassBody()
160 auto *field = CreateAnonClassField(ifaceMethod, checker); in FillClassBody()
161 classBody->push_back(field); in FillClassBody()
163 auto *getter = CreateAnonClassFieldGetterSetter(checker, ifaceMethod, false); in FillClassBody()
164 classBody->push_back(getter); in FillClassBody()
166 … if (ifaceMethod->Overloads().size() == 1 && ifaceMethod->Overloads()[0]->Function()->IsSetter()) { in FillClassBody()
167 auto *setter = CreateAnonClassFieldGetterSetter(checker, ifaceMethod, true); in FillClassBody()
168 classBody->push_back(setter); in FillClassBody()
173 static void FillAnonClassBody(checker::ETSChecker *checker, ArenaVector<ir::AstNode *> *classBody, in FillAnonClassBody() argument
176 for (auto *extendedIface : ifaceNode->TsType()->AsETSObjectType()->Interfaces()) { in FillAnonClassBody()
177 … auto extendedIfaceBody = extendedIface->GetDeclNode()->AsTSInterfaceDeclaration()->Body()->Body(); in FillAnonClassBody()
178 FillClassBody(checker, classBody, extendedIfaceBody, objExpr); in FillAnonClassBody()
181 FillClassBody(checker, classBody, ifaceNode->Body()->Body(), objExpr); in FillAnonClassBody()
184 static checker::Type *GenerateAnonClassTypeFromInterface(checker::ETSChecker *checker, in GenerateAnonClassTypeFromInterface() argument
188 if (ifaceNode->GetAnonClass() != nullptr) { in GenerateAnonClassTypeFromInterface()
189 return ifaceNode->GetAnonClass()->Definition()->TsType()->AsETSObjectType(); in GenerateAnonClassTypeFromInterface()
192 auto classBodyBuilder = [checker, ifaceNode, objExpr](ArenaVector<ir::AstNode *> *classBody) { in GenerateAnonClassTypeFromInterface()
193 if (ifaceNode->TsType() == nullptr) { in GenerateAnonClassTypeFromInterface()
194 ifaceNode->Check(checker); in GenerateAnonClassTypeFromInterface()
197 FillAnonClassBody(checker, classBody, ifaceNode, objExpr); in GenerateAnonClassTypeFromInterface()
198 classBody->push_back(CreateAnonClassImplCtor(checker)); in GenerateAnonClassTypeFromInterface()
201 util::UString className(util::StringView("$anonymous_class$"), checker->Allocator()); in GenerateAnonClassTypeFromInterface()
202 className.Append(ifaceNode->Id()->Name()); in GenerateAnonClassTypeFromInterface()
203 auto *classDecl = checker->BuildClass(className.View(), classBodyBuilder); in GenerateAnonClassTypeFromInterface()
204 auto *classDef = classDecl->Definition(); in GenerateAnonClassTypeFromInterface()
205 auto *classType = classDef->TsType()->AsETSObjectType(); in GenerateAnonClassTypeFromInterface()
208 if (ifaceNode->TypeParams() != nullptr) { in GenerateAnonClassTypeFromInterface()
210 checker->LogTypeError("Object literal cannot be of typed interface type", objExpr->Start()); in GenerateAnonClassTypeFromInterface()
211 return checker->GlobalTypeError(); in GenerateAnonClassTypeFromInterface()
216checker->AllocNode<ir::TSClassImplements>(checker->AllocNode<ir::OpaqueTypeNode>(ifaceNode->TsType… in GenerateAnonClassTypeFromInterface()
217 classImplements->SetParent(classDef); in GenerateAnonClassTypeFromInterface()
218 classDef->Implements().emplace_back(classImplements); in GenerateAnonClassTypeFromInterface()
219 classType->RemoveObjectFlag(checker::ETSObjectFlags::RESOLVED_INTERFACES); in GenerateAnonClassTypeFromInterface()
220 checker->GetInterfacesOfClass(classType); in GenerateAnonClassTypeFromInterface()
222 ifaceNode->SetAnonClass(classDecl); in GenerateAnonClassTypeFromInterface()
226 static void HandleInterfaceLowering(checker::ETSChecker *checker, ir::ObjectExpression *objExpr) in HandleInterfaceLowering() argument
228 const auto *const targetType = objExpr->TsType(); in HandleInterfaceLowering()
229 ASSERT(targetType->AsETSObjectType()->GetDeclNode()->IsTSInterfaceDeclaration()); in HandleInterfaceLowering()
230 auto *ifaceNode = targetType->AsETSObjectType()->GetDeclNode()->AsTSInterfaceDeclaration(); in HandleInterfaceLowering()
231 checker::Type *resultType = GenerateAnonClassTypeFromInterface(checker, ifaceNode, objExpr); in HandleInterfaceLowering()
233 if (const auto *const parent = objExpr->Parent(); parent->IsArrayExpression()) { in HandleInterfaceLowering()
234 for (auto *elem : parent->AsArrayExpression()->Elements()) { in HandleInterfaceLowering()
235 if (!elem->IsObjectExpression()) { in HandleInterfaceLowering()
239 elem->AsObjectExpression()->SetTsType(resultType); in HandleInterfaceLowering()
242 objExpr->SetTsType(resultType); in HandleInterfaceLowering()
247 for (auto &[_, extPrograms] : program->ExternalSources()) { in Perform()
254 auto *checker = ctx->checker->AsETSChecker(); in Perform() local
256 program->Ast()->IterateRecursivelyPostorder([checker](ir::AstNode *ast) -> void { in Perform()
257 if (ast->IsObjectExpression() && IsInterfaceType(ast->AsObjectExpression()->TsType())) { in Perform()
258 HandleInterfaceLowering(checker, ast->AsObjectExpression()); in Perform()
267 for (auto &[_, extPrograms] : program->ExternalSources()) { in Postcondition()
276 return !program->Ast()->IsAnyChild([](const ir::AstNode *ast) -> bool { in Postcondition()
277 return ast->IsObjectExpression() && IsInterfaceType(ast->AsObjectExpression()->TsType()); in Postcondition()