Lines Matching +full:checker +full:-
2 * Copyright (c) 2021 - 2024 Huawei Device Co., Ltd.
7 * http://www.apache.org/licenses/LICENSE-2.0
18 #include "checker/TSchecker.h"
26 checker::Type *ForOfStatement::CreateUnionIteratorTypes(checker::ETSChecker *checker, checker::Type… in CreateUnionIteratorTypes() argument
28 ArenaVector<checker::Type *> types(checker->Allocator()->Adapter()); in CreateUnionIteratorTypes()
30 for (auto it : exprType->AsETSUnionType()->ConstituentTypes()) { in CreateUnionIteratorTypes()
31 if (it->IsETSStringType()) { in CreateUnionIteratorTypes()
32 types.push_back(checker->GetGlobalTypesHolder()->GlobalCharType()); in CreateUnionIteratorTypes()
33 } else if (it->IsETSObjectType()) { in CreateUnionIteratorTypes()
34 types.push_back(this->CheckIteratorMethodForObject(checker, it->AsETSObjectType())); in CreateUnionIteratorTypes()
35 } else if (it->IsETSArrayType()) { in CreateUnionIteratorTypes()
36 …types.push_back(it->AsETSArrayType()->ElementType()->Instantiate(checker->Allocator(), checker->Re… in CreateUnionIteratorTypes()
37 … checker->GetGlobalTypesHolder())); in CreateUnionIteratorTypes()
38 types.back()->RemoveTypeFlag(checker::TypeFlag::CONSTANT); in CreateUnionIteratorTypes()
44 return checker->CreateETSUnionType(std::move(types)); in CreateUnionIteratorTypes()
50 left_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
55 right_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
56 right_ = transformedNode->AsExpression(); in TransformChildren()
60 body_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
61 body_ = transformedNode->AsStatement(); in TransformChildren()
74 …dumper->Add({{"type", "ForOfStatement"}, {"await", isAwait_}, {"left", left_}, {"right", right_}, … in Dump()
81 dumper->Add("for "); in Dump()
83 dumper->Add("await "); in Dump()
85 dumper->Add("("); in Dump()
86 left_->Dump(dumper); in Dump()
87 dumper->Add(" of "); in Dump()
88 right_->Dump(dumper); in Dump()
89 dumper->Add(") {"); in Dump()
91 dumper->IncrIndent(); in Dump()
92 dumper->Endl(); in Dump()
93 body_->Dump(dumper); in Dump()
94 dumper->DecrIndent(); in Dump()
95 dumper->Endl(); in Dump()
97 dumper->Add("}"); in Dump()
102 pg->GetAstCompiler()->Compile(this); in Compile()
107 etsg->GetAstCompiler()->Compile(this); in Compile()
110 checker::Type *ForOfStatement::Check(checker::TSChecker *checker) in Check() argument
112 return checker->GetAnalyzer()->Check(this); in Check()
115 checker::Type *ForOfStatement::Check(checker::ETSChecker *checker) in Check() argument
117 return checker->GetAnalyzer()->Check(this); in Check()
122 auto *const left = left_ != nullptr ? left_->Clone(allocator, nullptr) : nullptr; in Clone()
123 …auto *const right = right_ != nullptr ? right_->Clone(allocator, nullptr)->AsExpression() : nullpt… in Clone()
124 auto *const body = body_ != nullptr ? body_->Clone(allocator, nullptr)->AsStatement() : nullptr; in Clone()
126 …if (auto *const clone = allocator->New<ForOfStatement>(left, right, body, isAwait_); clone != null… in Clone()
128 left->SetParent(clone); in Clone()
132 right->SetParent(clone); in Clone()
136 body->SetParent(clone); in Clone()
140 clone->SetParent(parent); in Clone()
143 clone->SetRange(Range()); in Clone()
150 checker::Type *ForOfStatement::CheckIteratorMethodForObject(checker::ETSChecker *checker, in CheckIteratorMethodForObject() argument
151 checker::ETSObjectType *sourceType) in CheckIteratorMethodForObject()
153 auto const &position = right_->Start(); in CheckIteratorMethodForObject()
155 checker::PropertySearchFlags searchFlag = in CheckIteratorMethodForObject()
156 checker::PropertySearchFlags::SEARCH_METHOD | checker::PropertySearchFlags::IS_FUNCTIONAL; in CheckIteratorMethodForObject()
157 …searchFlag |= checker::PropertySearchFlags::SEARCH_IN_BASE | checker::PropertySearchFlags::SEARCH_… in CheckIteratorMethodForObject()
158 …// NOTE: maybe we need to exclude static methods: search_flag &= ~(checker::PropertySearchFlags::S… in CheckIteratorMethodForObject()
160 if (sourceType->HasTypeFlag(checker::TypeFlag::GENERIC)) { in CheckIteratorMethodForObject()
161 searchFlag |= checker::PropertySearchFlags::SEARCH_ALL; in CheckIteratorMethodForObject()
164 auto *const method = sourceType->GetProperty(compiler::Signatures::ITERATOR_METHOD, searchFlag); in CheckIteratorMethodForObject()
165 if (method == nullptr || !method->HasFlag(varbinder::VariableFlags::METHOD)) { in CheckIteratorMethodForObject()
166 checker->LogTypeError("Object type doesn't have proper iterator method.", position); in CheckIteratorMethodForObject()
170 ArenaVector<Expression *> arguments {checker->Allocator()->Adapter()}; in CheckIteratorMethodForObject()
171 auto &signatures = checker->GetTypeOfVariable(method)->AsETSFunctionType()->CallSignatures(); in CheckIteratorMethodForObject()
173 …checker::Signature *signature = checker->ValidateSignatures(signatures, nullptr, arguments, positi… in CheckIteratorMethodForObject()
174 … checker::TypeRelationFlag::NO_THROW); in CheckIteratorMethodForObject()
176 checker->LogTypeError("Cannot find iterator method with the required signature.", position); in CheckIteratorMethodForObject()
179 checker->ValidateSignatureAccessibility(sourceType, nullptr, signature, position, in CheckIteratorMethodForObject()
182 ASSERT(signature->Function() != nullptr); in CheckIteratorMethodForObject()
184 if (signature->Function()->IsThrowing() || signature->Function()->IsRethrowing()) { in CheckIteratorMethodForObject()
185 checker->CheckThrowingStatements(this); in CheckIteratorMethodForObject()
188 if (!CheckReturnTypeOfIteratorMethod(checker, sourceType, signature, position)) { in CheckIteratorMethodForObject()
193 … signature->ReturnType()->AsETSObjectType()->GetProperty(ITERATOR_INTERFACE_METHOD, searchFlag); in CheckIteratorMethodForObject()
194 if (nextMethod == nullptr || !nextMethod->HasFlag(varbinder::VariableFlags::METHOD)) { in CheckIteratorMethodForObject()
195 checker->LogTypeError("Iterator object doesn't have proper next method.", position); in CheckIteratorMethodForObject()
199 …auto &nextSignatures = checker->GetTypeOfVariable(nextMethod)->AsETSFunctionType()->CallSignatures… in CheckIteratorMethodForObject()
201 …auto const *const nextSignature = checker->ValidateSignatures(nextSignatures, nullptr, arguments, … in CheckIteratorMethodForObject()
202 … "iterator", checker::TypeRelationFlag::NO_THROW); in CheckIteratorMethodForObject()
203 if (nextSignature != nullptr && nextSignature->ReturnType()->IsETSObjectType()) { in CheckIteratorMethodForObject()
204 if (auto const *const resultType = nextSignature->ReturnType()->AsETSObjectType(); in CheckIteratorMethodForObject()
205 resultType->Name().Is(ITERATOR_RESULT_NAME)) { in CheckIteratorMethodForObject()
206 return resultType->TypeArguments()[0]; in CheckIteratorMethodForObject()
213 bool ForOfStatement::CheckReturnTypeOfIteratorMethod(checker::ETSChecker *checker, checker::ETSObje… in CheckReturnTypeOfIteratorMethod() argument
214 checker::Signature *signature, in CheckReturnTypeOfIteratorMethod()
217 …if ((signature->ReturnType() == nullptr || signature->ReturnType() == checker->GlobalVoidType()) && in CheckReturnTypeOfIteratorMethod()
218 signature->Function()->HasBody() && signature->Function()->Body()->IsBlockStatement()) { in CheckReturnTypeOfIteratorMethod()
219 for (auto *const it : signature->Function()->Body()->AsBlockStatement()->Statements()) { in CheckReturnTypeOfIteratorMethod()
220 if (it->IsReturnStatement()) { in CheckReturnTypeOfIteratorMethod()
221 … checker::SavedCheckerContext savedContext(checker, checker::CheckerStatus::IN_CLASS, sourceType); in CheckReturnTypeOfIteratorMethod()
222 it->AsReturnStatement()->Check(checker); in CheckReturnTypeOfIteratorMethod()
228 if (signature->ReturnType() != nullptr && signature->ReturnType()->IsETSObjectType() && in CheckReturnTypeOfIteratorMethod()
229 …ForOfStatement::CheckIteratorInterfaceForObject(checker, signature->ReturnType()->AsETSObjectType(… in CheckReturnTypeOfIteratorMethod()
233 …checker->LogTypeError("Iterator method must return an object which implements Iterator<T>", positi… in CheckReturnTypeOfIteratorMethod()
237 bool ForOfStatement::CheckIteratorInterfaceForObject(checker::ETSChecker *checker, checker::ETSObje… in CheckIteratorInterfaceForObject() argument
239 for (auto *const it : obj->Interfaces()) { in CheckIteratorInterfaceForObject()
240 if (it->Name().Is(ITERATOR_INTERFACE_NAME)) { in CheckIteratorInterfaceForObject()
245 return obj->SuperType() != nullptr && obj->SuperType()->IsETSObjectType() && in CheckIteratorInterfaceForObject()
246 CheckIteratorInterfaceForObject(checker, obj->SuperType()->AsETSObjectType()); in CheckIteratorInterfaceForObject()
249 checker::Type *ForOfStatement::CheckIteratorMethod(checker::ETSChecker *const checker) in CheckIteratorMethod() argument
251 if (auto *exprType = right_->TsType(); exprType != nullptr) { in CheckIteratorMethod()
252 if (exprType->IsETSObjectType()) { in CheckIteratorMethod()
253 return CheckIteratorMethodForObject(checker, exprType->AsETSObjectType()); in CheckIteratorMethod()
256 if (exprType->IsETSUnionType()) { in CheckIteratorMethod()
257 return this->CreateUnionIteratorTypes(checker, exprType); in CheckIteratorMethod()