Lines Matching +full:checker +full:-
2 * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
7 * http://www.apache.org/licenses/LICENSE-2.0
18 #include "checker/TSchecker.h"
24 checker::Type *ForOfStatement::CreateUnionIteratorTypes(checker::ETSChecker *checker, checker::Type… in CreateUnionIteratorTypes() argument
26 ArenaVector<checker::Type *> types(checker->Allocator()->Adapter()); in CreateUnionIteratorTypes()
28 for (auto it : exprType->AsETSUnionType()->ConstituentTypes()) { in CreateUnionIteratorTypes()
29 if (it->IsETSStringType()) { in CreateUnionIteratorTypes()
30 types.push_back(checker->GetGlobalTypesHolder()->GlobalCharType()); in CreateUnionIteratorTypes()
31 } else if (it->IsETSObjectType()) { in CreateUnionIteratorTypes()
32 types.push_back(this->CheckIteratorMethodForObject(checker, it->AsETSObjectType())); in CreateUnionIteratorTypes()
33 } else if (it->IsETSArrayType()) { in CreateUnionIteratorTypes()
34 …types.push_back(it->AsETSArrayType()->ElementType()->Instantiate(checker->Allocator(), checker->Re… in CreateUnionIteratorTypes()
35 … checker->GetGlobalTypesHolder())); in CreateUnionIteratorTypes()
36 types.back()->RemoveTypeFlag(checker::TypeFlag::CONSTANT); in CreateUnionIteratorTypes()
38 return checker->GlobalTypeError(); in CreateUnionIteratorTypes()
42 return checker->CreateETSUnionType(std::move(types)); in CreateUnionIteratorTypes()
48 left_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
53 right_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
54 right_ = transformedNode->AsExpression(); in TransformChildren()
58 body_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
59 body_ = transformedNode->AsStatement(); in TransformChildren()
72 …dumper->Add({{"type", "ForOfStatement"}, {"await", isAwait_}, {"left", left_}, {"right", right_}, … in Dump()
79 dumper->Add("for "); in Dump()
81 dumper->Add("await "); in Dump()
83 dumper->Add("("); in Dump()
84 left_->Dump(dumper); in Dump()
85 dumper->Add(" of "); in Dump()
86 right_->Dump(dumper); in Dump()
87 dumper->Add(") {"); in Dump()
89 dumper->IncrIndent(); in Dump()
90 dumper->Endl(); in Dump()
91 body_->Dump(dumper); in Dump()
92 dumper->DecrIndent(); in Dump()
93 dumper->Endl(); in Dump()
95 dumper->Add("}"); in Dump()
100 pg->GetAstCompiler()->Compile(this); in Compile()
105 etsg->GetAstCompiler()->Compile(this); in Compile()
108 checker::Type *ForOfStatement::Check(checker::TSChecker *checker) in Check() argument
110 return checker->GetAnalyzer()->Check(this); in Check()
113 checker::VerifiedType ForOfStatement::Check(checker::ETSChecker *checker) in Check() argument
115 return {this, checker->GetAnalyzer()->Check(this)}; in Check()
120 auto *const left = left_ != nullptr ? left_->Clone(allocator, nullptr) : nullptr; in Clone()
121 …auto *const right = right_ != nullptr ? right_->Clone(allocator, nullptr)->AsExpression() : nullpt… in Clone()
122 auto *const body = body_ != nullptr ? body_->Clone(allocator, nullptr)->AsStatement() : nullptr; in Clone()
123 auto *const clone = allocator->New<ForOfStatement>(left, right, body, isAwait_); in Clone()
127 left->SetParent(clone); in Clone()
131 right->SetParent(clone); in Clone()
135 body->SetParent(clone); in Clone()
139 clone->SetParent(parent); in Clone()
142 clone->SetRange(Range()); in Clone()
146 checker::Type *ForOfStatement::CheckIteratorMethodForObject(checker::ETSChecker *checker, in CheckIteratorMethodForObject() argument
147 checker::ETSObjectType *sourceType) in CheckIteratorMethodForObject()
149 auto const &position = right_->Start(); in CheckIteratorMethodForObject()
151 checker::PropertySearchFlags searchFlag = checker::PropertySearchFlags::SEARCH_METHOD; in CheckIteratorMethodForObject()
152 …searchFlag |= checker::PropertySearchFlags::SEARCH_IN_BASE | checker::PropertySearchFlags::SEARCH_… in CheckIteratorMethodForObject()
153 …// NOTE: maybe we need to exclude static methods: search_flag &= ~(checker::PropertySearchFlags::S… in CheckIteratorMethodForObject()
155 if (sourceType->HasTypeFlag(checker::TypeFlag::GENERIC)) { in CheckIteratorMethodForObject()
156 searchFlag |= checker::PropertySearchFlags::SEARCH_ALL; in CheckIteratorMethodForObject()
159 auto *const method = sourceType->GetProperty(compiler::Signatures::ITERATOR_METHOD, searchFlag); in CheckIteratorMethodForObject()
160 if (method == nullptr || !method->HasFlag(varbinder::VariableFlags::METHOD)) { in CheckIteratorMethodForObject()
161 checker->LogError(diagnostic::MISSING_ITERATOR_METHOD, {}, position); in CheckIteratorMethodForObject()
162 return checker->GlobalTypeError(); in CheckIteratorMethodForObject()
165 ArenaVector<Expression *> arguments {checker->Allocator()->Adapter()}; in CheckIteratorMethodForObject()
166 auto &signatures = checker->GetTypeOfVariable(method)->AsETSFunctionType()->CallSignatures(); in CheckIteratorMethodForObject()
167 …checker::Signature *signature = checker->ValidateSignatures(signatures, nullptr, arguments, positi… in CheckIteratorMethodForObject()
168 … checker::TypeRelationFlag::NO_THROW); in CheckIteratorMethodForObject()
170 checker->LogError(diagnostic::MISSING_ITERATOR_METHOD_WITH_SIG, {}, position); in CheckIteratorMethodForObject()
171 return checker->GlobalTypeError(); in CheckIteratorMethodForObject()
173 …checker->ValidateSignatureAccessibility(sourceType, signature, position, {{diagnostic::INVISIBLE_I… in CheckIteratorMethodForObject()
175 ES2PANDA_ASSERT(signature->Function() != nullptr); in CheckIteratorMethodForObject()
177 if (!CheckReturnTypeOfIteratorMethod(checker, sourceType, signature, position)) { in CheckIteratorMethodForObject()
178 return checker->GlobalTypeError(); in CheckIteratorMethodForObject()
181 if (checker->IsClassStaticMethod(sourceType, signature)) { in CheckIteratorMethodForObject()
182 …checker->LogError(diagnostic::PROP_IS_STATIC, {compiler::Signatures::ITERATOR_METHOD, sourceType->… in CheckIteratorMethodForObject()
184 return checker->GlobalTypeError(); in CheckIteratorMethodForObject()
188 … signature->ReturnType()->AsETSObjectType()->GetProperty(ITERATOR_INTERFACE_METHOD, searchFlag); in CheckIteratorMethodForObject()
189 if (nextMethod == nullptr || !nextMethod->HasFlag(varbinder::VariableFlags::METHOD)) { in CheckIteratorMethodForObject()
190 checker->LogError(diagnostic::ITERATOR_MISSING_NEXT, {}, position); in CheckIteratorMethodForObject()
191 return checker->GlobalTypeError(); in CheckIteratorMethodForObject()
194 …auto &nextSignatures = checker->GetTypeOfVariable(nextMethod)->AsETSFunctionType()->CallSignatures… in CheckIteratorMethodForObject()
195 …auto const *const nextSignature = checker->ValidateSignatures(nextSignatures, nullptr, arguments, … in CheckIteratorMethodForObject()
196 … "iterator", checker::TypeRelationFlag::NO_THROW); in CheckIteratorMethodForObject()
197 if (nextSignature != nullptr && nextSignature->ReturnType()->IsETSObjectType()) { in CheckIteratorMethodForObject()
198 if (auto const *const resultType = nextSignature->ReturnType()->AsETSObjectType(); in CheckIteratorMethodForObject()
199 resultType->Name().Is(ITERATOR_RESULT_NAME)) { in CheckIteratorMethodForObject()
200 return resultType->TypeArguments()[0]; in CheckIteratorMethodForObject()
204 return checker->GlobalTypeError(); in CheckIteratorMethodForObject()
207 bool ForOfStatement::CheckReturnTypeOfIteratorMethod(checker::ETSChecker *checker, checker::ETSObje… in CheckReturnTypeOfIteratorMethod() argument
208 checker::Signature *signature, in CheckReturnTypeOfIteratorMethod()
211 …if ((signature->ReturnType() == nullptr || signature->ReturnType() == checker->GlobalVoidType()) && in CheckReturnTypeOfIteratorMethod()
212 signature->Function()->HasBody() && signature->Function()->Body()->IsBlockStatement()) { in CheckReturnTypeOfIteratorMethod()
213 for (auto *const it : signature->Function()->Body()->AsBlockStatement()->Statements()) { in CheckReturnTypeOfIteratorMethod()
214 if (it->IsReturnStatement()) { in CheckReturnTypeOfIteratorMethod()
215 … checker::SavedCheckerContext savedContext(checker, checker::CheckerStatus::IN_CLASS, sourceType); in CheckReturnTypeOfIteratorMethod()
216 it->AsReturnStatement()->Check(checker); in CheckReturnTypeOfIteratorMethod()
222 if (signature->ReturnType() != nullptr && signature->ReturnType()->IsETSObjectType() && in CheckReturnTypeOfIteratorMethod()
223 …ForOfStatement::CheckIteratorInterfaceForObject(checker, signature->ReturnType()->AsETSObjectType(… in CheckReturnTypeOfIteratorMethod()
227 checker->LogError(diagnostic::ITERATOR_DOESNT_RETURN_ITERABLE, {}, position); in CheckReturnTypeOfIteratorMethod()
231 bool ForOfStatement::CheckIteratorInterfaceForObject(checker::ETSChecker *checker, checker::ETSObje… in CheckIteratorInterfaceForObject() argument
233 if (obj->Name().Is(ITERATOR_INTERFACE_NAME)) { in CheckIteratorInterfaceForObject()
237 for (auto *const it : obj->Interfaces()) { in CheckIteratorInterfaceForObject()
238 if (it->Name().Is(ITERATOR_INTERFACE_NAME)) { in CheckIteratorInterfaceForObject()
243 return obj->SuperType() != nullptr && obj->SuperType()->IsETSObjectType() && in CheckIteratorInterfaceForObject()
244 CheckIteratorInterfaceForObject(checker, obj->SuperType()->AsETSObjectType()); in CheckIteratorInterfaceForObject()
247 checker::Type *ForOfStatement::CheckIteratorMethod(checker::ETSChecker *const checker) in CheckIteratorMethod() argument
249 if (auto *exprType = right_->TsType(); exprType != nullptr) { in CheckIteratorMethod()
250 if (exprType->IsETSObjectType()) { in CheckIteratorMethod()
251 return CheckIteratorMethodForObject(checker, exprType->AsETSObjectType()); in CheckIteratorMethod()
254 if (exprType->IsETSUnionType()) { in CheckIteratorMethod()
255 return this->CreateUnionIteratorTypes(checker, exprType); in CheckIteratorMethod()
259 return checker->GlobalTypeError(); in CheckIteratorMethod()