Lines Matching refs:checker

18 #include "checker/TSchecker.h"
19 #include "checker/ets/castingContext.h"
20 #include "checker/types/ets/etsTupleType.h"
148 checker::Type *MemberExpression::Check(checker::TSChecker *checker)
150 return checker->GetAnalyzer()->Check(this);
153 std::pair<checker::Type *, varbinder::LocalVariable *> MemberExpression::ResolveEnumMember(checker::ETSChecker *checker,
154 checker::Type *type) const
156 auto const *const enumInterface = [type]() -> checker::ETSEnumType const * {
164 return {enumInterface->LookupMethod(checker, object_, property_->AsIdentifier()), nullptr};
167 auto *const literalType = enumInterface->LookupConstant(checker, object_, property_->AsIdentifier());
174 std::pair<checker::Type *, varbinder::LocalVariable *> MemberExpression::ResolveObjectMember(
175 checker::ETSChecker *checker) const
177 auto resolveRes = checker->ResolveMemberReference(this, objType_);
184 if (resolveRes[0]->Kind() == checker::ResolvedKind::PROPERTY) {
186 checker->ValidatePropertyAccess(var, objType_, property_->Start());
187 return {checker->GetTypeOfVariable(var), var};
189 return {checker->GetTypeOfVariable(resolveRes[0]->Variable()), nullptr};
192 auto classMethodType = checker->GetTypeOfVariable(resolveRes[1]->Variable());
193 auto extensionMethodType = checker->GetTypeOfVariable(resolveRes[0]->Variable());
197 resolvedType = checker->CreateETSExtensionFuncHelperType(classMethodType->AsETSFunctionType(),
208 checker::Type *MemberExpression::TraverseUnionMember(checker::ETSChecker *checker, checker::ETSUnionType *unionType,
209 checker::Type *commonPropType)
212 auto const addPropType = [this, checker, &commonPropType](checker::Type *memberType) {
214 checker->LogTypeError("Member type must be the same for all union objects.", Start());
220 auto *const apparent = checker->GetApparentType(type);
223 addPropType(ResolveObjectMember(checker).first);
225 addPropType(ResolveEnumMember(checker, apparent).first);
227 checker->LogTypeError({"Type ", unionType, " is illegal in union member expression."}, Start());
233 checker::Type *MemberExpression::CheckUnionMember(checker::ETSChecker *checker, checker::Type *baseType)
236 auto *const commonPropType = TraverseUnionMember(checker, unionType, nullptr);
237 SetObjectType(checker->GlobalETSObjectType());
241 checker::Type *MemberExpression::AdjustType(checker::ETSChecker *checker, checker::Type *type)
243 auto *const objType = checker->GetApparentType(Object()->TsType());
245 uncheckedType_ = checker->GuaranteedTypeForUncheckedPropertyAccess(PropVar());
247 uncheckedType_ = checker->GuaranteedTypeForUncheckedCast(objType->AsETSArrayType()->ElementType(), type);
249 SetTsType(type == nullptr ? checker->GlobalTypeError() : type);
253 checker::Type *MemberExpression::SetAndAdjustType(checker::ETSChecker *checker, checker::ETSObjectType *objectType)
256 auto [resType, resVar] = ResolveObjectMember(checker);
258 SetTsType(checker->GlobalTypeError());
259 return checker->GlobalTypeError();
262 return AdjustType(checker, resType);
265 bool MemberExpression::CheckArrayIndexValue(checker::ETSChecker *checker) const
274 checker->LogTypeError("Index value cannot be less than zero.", property_->Start());
282 checker->LogTypeError("Index value cannot be less than zero or fractional.", property_->Start());
291 checker->LogTypeError("Index value cannot be greater than or equal to the array size.", property_->Start());
298 checker::Type *MemberExpression::CheckIndexAccessMethod(checker::ETSChecker *checker)
300 checker::PropertySearchFlags searchFlag =
301 checker::PropertySearchFlags::SEARCH_METHOD | checker::PropertySearchFlags::IS_FUNCTIONAL;
302 searchFlag |= checker::PropertySearchFlags::SEARCH_IN_BASE | checker::PropertySearchFlags::SEARCH_IN_INTERFACES;
303 // NOTE(DZ) maybe we need to exclude static methods: search_flag &= ~(checker::PropertySearchFlags::SEARCH_STATIC);
305 if (objType_->HasTypeFlag(checker::TypeFlag::GENERIC)) {
306 searchFlag |= checker::PropertySearchFlags::SEARCH_ALL;
315 checker->LogTypeError("Object type doesn't have proper index access method.", Start());
319 ArenaVector<Expression *> arguments {checker->Allocator()->Adapter()};
329 auto &signatures = checker->GetTypeOfVariable(method)->AsETSFunctionType()->CallSignatures();
331 checker::Signature *signature = checker->ValidateSignatures(signatures, nullptr, arguments, Start(), "indexing",
332 checker::TypeRelationFlag::NO_THROW);
334 checker->LogTypeError("Cannot find index access method with the required signature.", Property()->Start());
337 checker->ValidateSignatureAccessibility(objType_, nullptr, signature, Start(),
343 checker->CheckThrowingStatements(this);
355 checker::Type *MemberExpression::CheckTupleAccessMethod(checker::ETSChecker *checker, checker::Type *baseType)
359 auto idxIfAny = checker->GetTupleElementAccessValue(Property()->TsType(), Property()->Start());
369 const checker::CastingContext cast(
370 checker->Relation(), {"Tuple type couldn't be converted "},
371 checker::CastingContext::ConstructorData {this, baseType->AsETSArrayType()->ElementType(), tupleTypeAtIdx,
378 checker::Type *MemberExpression::CheckComputed(checker::ETSChecker *checker, checker::Type *baseType)
381 checker->ValidateArrayIndex(property_);
382 return checker->GlobalBuiltinDynamicType(baseType->AsETSDynamicType()->Language());
387 if (!baseType->IsETSTupleType() && !checker->ValidateArrayIndex(property_)) {
392 if (baseType->IsETSTupleType() && !checker->ValidateTupleIndex(baseType->AsETSTupleType(), this)) {
398 if (property_->IsNumberLiteral() && !CheckArrayIndexValue(checker)) {
405 auto *res = CheckTupleAccessMethod(checker, baseType);
414 return CheckIndexAccessMethod(checker);
417 property_->Check(checker);
420 return checker->GlobalBuiltinETSStringType();
423 checker->LogTypeError("Indexed access is not supported for such expression type.", Object()->Start());
427 checker::Type *MemberExpression::Check(checker::ETSChecker *checker)
429 return checker->GetAnalyzer()->Check(this);