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"
19 #include "checker/ets/castingContext.h"
20 #include "checker/types/ets/etsTupleType.h"
31 …object_ = other.object_ != nullptr ? other.object_->Clone(allocator, this)->AsExpression() : nullp… in MemberExpression()
32 …property_ = other.property_ != nullptr ? other.property_->Clone(allocator, this)->AsExpression() :… in MemberExpression()
37 return property_->IsIdentifier() && property_->AsIdentifier()->IsPrivateIdent(); in IsPrivateReference()
43 object_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
44 object_ = transformedNode->AsExpression(); in TransformChildren()
48 property_->SetTransformedNode(transformationName, transformedNode); in TransformChildren()
49 property_ = transformedNode->AsExpression(); in TransformChildren()
61 dumper->Add({{"type", "MemberExpression"}, in Dump()
73 object_->Dump(dumper); in Dump()
75 dumper->Add("?"); in Dump()
77 dumper->Add("."); in Dump()
81 dumper->Add("["); in Dump()
82 property_->Dump(dumper); in Dump()
83 dumper->Add("]"); in Dump()
85 dumper->Add("."); in Dump()
86 property_->Dump(dumper); in Dump()
88 if ((parent_ != nullptr) && (parent_->IsBlockStatement() || parent_->IsBlockExpression())) { in Dump()
89 dumper->Add(";"); in Dump()
90 dumper->Endl(); in Dump()
97 bool isSuper = object_->IsSuperExpression(); in LoadRhs()
98 compiler::Operand prop = pg->ToPropertyKey(property_, computed_, isSuper); in LoadRhs()
101 pg->LoadSuperProperty(this, prop); in LoadRhs()
103 const auto &name = property_->AsIdentifier()->Name(); in LoadRhs()
104 compiler::VReg objReg = pg->AllocReg(); in LoadRhs()
105 pg->StoreAccumulator(this, objReg); in LoadRhs()
106 compiler::VReg ctor = pg->AllocReg(); in LoadRhs()
108 pg->ClassPrivateFieldGet(this, ctor, objReg, name); in LoadRhs()
110 pg->LoadObjProperty(this, prop); in LoadRhs()
116 object_->Compile(pg); in CompileToRegs()
117 pg->StoreAccumulator(this, object); in CompileToRegs()
119 pg->OptionalChainCheck(IsOptional(), object); in CompileToRegs()
122 pg->LoadAccumulatorString(this, property_->AsIdentifier()->Name()); in CompileToRegs()
124 property_->Compile(pg); in CompileToRegs()
127 pg->StoreAccumulator(this, property); in CompileToRegs()
132 pg->GetAstCompiler()->Compile(this); in Compile()
137 object_->Compile(pg); in CompileToReg()
138 pg->StoreAccumulator(this, objReg); in CompileToReg()
139 pg->OptionalChainCheck(IsOptional(), objReg); in CompileToReg()
145 etsg->GetAstCompiler()->Compile(this); in Compile()
148 checker::Type *MemberExpression::Check(checker::TSChecker *checker) in Check() argument
150 return checker->GetAnalyzer()->Check(this); in Check()
153 static varbinder::LocalVariable *GetEnumMethodVariable(checker::ETSEnumType const *const enumInterf… in GetEnumMethodVariable()
158 const auto *const boxedClass = enumInterface->GetDecl()->BoxedClass(); in GetEnumMethodVariable()
159 ASSERT(boxedClass->TsType()->IsETSObjectType()); in GetEnumMethodVariable()
160 const auto *const obj = boxedClass->TsType()->AsETSObjectType(); in GetEnumMethodVariable()
163 …if (enumInterface->IsETSStringEnumType() && (propName == checker::ETSEnumType::VALUE_OF_METHOD_NAM… in GetEnumMethodVariable()
165 methodName = checker::ETSEnumType::TO_STRING_METHOD_NAME; in GetEnumMethodVariable()
169 …checker::PropertySearchFlags::SEARCH_METHOD | checker::PropertySearchFlags::DISALLOW_SYNTHETIC_MET… in GetEnumMethodVariable()
170 methodVar = obj->GetProperty(methodName, searchFlags); in GetEnumMethodVariable()
175 std::pair<checker::Type *, varbinder::LocalVariable *> MemberExpression::ResolveEnumMember( in ResolveEnumMember()
176 checker::ETSChecker *checker, checker::ETSEnumType *type) const in ResolveEnumMember() argument
178 …if (parent_->Type() == ir::AstNodeType::CALL_EXPRESSION && parent_->AsCallExpression()->Callee() =… in ResolveEnumMember()
179 auto *const memberType = type->LookupMethod(checker, object_, property_->AsIdentifier()); in ResolveEnumMember()
180 …r::LocalVariable *const memberVar = GetEnumMethodVariable(type, property_->AsIdentifier()->Name()); in ResolveEnumMember()
184 auto *const literalType = type->LookupConstant(checker, object_, property_->AsIdentifier()); in ResolveEnumMember()
188 return {literalType, literalType->GetMemberVar()}; in ResolveEnumMember()
191 std::pair<checker::Type *, varbinder::LocalVariable *> MemberExpression::ResolveObjectMember( in ResolveObjectMember()
192 checker::ETSChecker *checker) const in ResolveObjectMember()
194 auto resolveRes = checker->ResolveMemberReference(this, objType_); in ResolveObjectMember()
201 if (resolveRes[0]->Kind() == checker::ResolvedKind::PROPERTY) { in ResolveObjectMember()
202 auto var = resolveRes[0]->Variable()->AsLocalVariable(); in ResolveObjectMember()
203 checker->ValidatePropertyAccess(var, objType_, property_->Start()); in ResolveObjectMember()
204 return {checker->GetTypeOfVariable(var), var}; in ResolveObjectMember()
206 return {checker->GetTypeOfVariable(resolveRes[0]->Variable()), nullptr}; in ResolveObjectMember()
209 auto classMethodType = checker->GetTypeOfVariable(resolveRes[1]->Variable()); in ResolveObjectMember()
210 auto extensionMethodType = checker->GetTypeOfVariable(resolveRes[0]->Variable()); in ResolveObjectMember()
212 if (classMethodType->IsETSFunctionType()) { in ResolveObjectMember()
213 ASSERT(extensionMethodType->IsETSFunctionType()); in ResolveObjectMember()
214 … resolvedType = checker->CreateETSExtensionFuncHelperType(classMethodType->AsETSFunctionType(), in ResolveObjectMember()
215 … extensionMethodType->AsETSFunctionType()); in ResolveObjectMember()
225 checker::Type *MemberExpression::TraverseUnionMember(checker::ETSChecker *checker, checker::ETSUnio… in TraverseUnionMember() argument
226 checker::Type *commonPropType) in TraverseUnionMember()
229 auto const addPropType = [this, checker, &commonPropType](checker::Type *memberType) { in TraverseUnionMember()
231 checker->LogTypeError("Member type must be the same for all union objects.", Start()); in TraverseUnionMember()
236 for (auto *const type : unionType->ConstituentTypes()) { in TraverseUnionMember()
237 auto *const apparent = checker->GetApparentType(type); in TraverseUnionMember()
238 if (apparent->IsETSObjectType()) { in TraverseUnionMember()
239 SetObjectType(apparent->AsETSObjectType()); in TraverseUnionMember()
240 addPropType(ResolveObjectMember(checker).first); in TraverseUnionMember()
242 … checker->LogTypeError({"Type ", unionType, " is illegal in union member expression."}, Start()); in TraverseUnionMember()
248 checker::Type *MemberExpression::CheckUnionMember(checker::ETSChecker *checker, checker::Type *base… in CheckUnionMember() argument
250 auto *const unionType = baseType->AsETSUnionType(); in CheckUnionMember()
251 auto *const commonPropType = TraverseUnionMember(checker, unionType, nullptr); in CheckUnionMember()
252 SetObjectType(checker->GlobalETSObjectType()); in CheckUnionMember()
256 checker::Type *MemberExpression::AdjustType(checker::ETSChecker *checker, checker::Type *type) in AdjustType() argument
258 auto *const objType = checker->GetApparentType(Object()->TsType()); in AdjustType()
260 uncheckedType_ = checker->GuaranteedTypeForUncheckedPropertyAccess(PropVar()); in AdjustType()
261 } else if (IsComputed() && objType->IsETSArrayType()) { // access erased array or tuple type in AdjustType()
262 …uncheckedType_ = checker->GuaranteedTypeForUncheckedCast(objType->AsETSArrayType()->ElementType(),… in AdjustType()
264 SetTsType(type == nullptr ? checker->GlobalTypeError() : type); in AdjustType()
268 checker::Type *MemberExpression::SetAndAdjustType(checker::ETSChecker *checker, checker::ETSObjectT… in SetAndAdjustType() argument
271 auto [resType, resVar] = ResolveObjectMember(checker); in SetAndAdjustType()
273 SetTsType(checker->GlobalTypeError()); in SetAndAdjustType()
274 return checker->GlobalTypeError(); in SetAndAdjustType()
277 return AdjustType(checker, resType); in SetAndAdjustType()
280 bool MemberExpression::CheckArrayIndexValue(checker::ETSChecker *checker) const in CheckArrayIndexValue()
284 auto const &number = property_->AsNumberLiteral()->Number(); in CheckArrayIndexValue()
289 checker->LogTypeError("Index value cannot be less than zero.", property_->Start()); in CheckArrayIndexValue()
297 … checker->LogTypeError("Index value cannot be less than zero or fractional.", property_->Start()); in CheckArrayIndexValue()
305 if (object_->IsArrayExpression() && object_->AsArrayExpression()->Elements().size() <= index) { in CheckArrayIndexValue()
306 …checker->LogTypeError("Index value cannot be greater than or equal to the array size.", property_-… in CheckArrayIndexValue()
313 checker::Type *MemberExpression::CheckIndexAccessMethod(checker::ETSChecker *checker) in CheckIndexAccessMethod() argument
315 checker::PropertySearchFlags searchFlag = in CheckIndexAccessMethod()
316 checker::PropertySearchFlags::SEARCH_METHOD | checker::PropertySearchFlags::IS_FUNCTIONAL; in CheckIndexAccessMethod()
317 …searchFlag |= checker::PropertySearchFlags::SEARCH_IN_BASE | checker::PropertySearchFlags::SEARCH_… in CheckIndexAccessMethod()
318 …// NOTE(DZ) maybe we need to exclude static methods: search_flag &= ~(checker::PropertySearchFlags… in CheckIndexAccessMethod()
320 if (objType_->HasTypeFlag(checker::TypeFlag::GENERIC)) { in CheckIndexAccessMethod()
321 searchFlag |= checker::PropertySearchFlags::SEARCH_ALL; in CheckIndexAccessMethod()
324 …bool const isSetter = Parent()->IsAssignmentExpression() && Parent()->AsAssignmentExpression()->Le… in CheckIndexAccessMethod()
328 auto *const method = objType_->GetProperty(methodName, searchFlag); in CheckIndexAccessMethod()
329 if (method == nullptr || !method->HasFlag(varbinder::VariableFlags::METHOD)) { in CheckIndexAccessMethod()
330 checker->LogTypeError("Object type doesn't have proper index access method.", Start()); in CheckIndexAccessMethod()
334 ArenaVector<Expression *> arguments {checker->Allocator()->Adapter()}; in CheckIndexAccessMethod()
339 auto *value = Parent()->AsAssignmentExpression()->Right(); in CheckIndexAccessMethod()
340 value->SetParent(this); in CheckIndexAccessMethod()
344 auto &signatures = checker->GetTypeOfVariable(method)->AsETSFunctionType()->CallSignatures(); in CheckIndexAccessMethod()
346 …checker::Signature *signature = checker->ValidateSignatures(signatures, nullptr, arguments, Start(… in CheckIndexAccessMethod()
347 … checker::TypeRelationFlag::NO_THROW); in CheckIndexAccessMethod()
349 …checker->LogTypeError("Cannot find index access method with the required signature.", Property()->… in CheckIndexAccessMethod()
352 checker->ValidateSignatureAccessibility(objType_, nullptr, signature, Start(), in CheckIndexAccessMethod()
355 ASSERT(signature->Function() != nullptr); in CheckIndexAccessMethod()
357 if (signature->Function()->IsThrowing() || signature->Function()->IsRethrowing()) { in CheckIndexAccessMethod()
358 checker->CheckThrowingStatements(this); in CheckIndexAccessMethod()
363 Parent()->AsAssignmentExpression()->Right()->SetParent(Parent()); in CheckIndexAccessMethod()
364 return signature->Params()[1]->TsType(); in CheckIndexAccessMethod()
367 return signature->ReturnType(); in CheckIndexAccessMethod()
370 checker::Type *MemberExpression::CheckTupleAccessMethod(checker::ETSChecker *checker, checker::Type… in CheckTupleAccessMethod() argument
372 ASSERT(baseType->IsETSTupleType()); in CheckTupleAccessMethod()
374 auto idxIfAny = checker->GetTupleElementAccessValue(Property()->TsType(), Property()->Start()); in CheckTupleAccessMethod()
378 auto *const tupleTypeAtIdx = baseType->AsETSTupleType()->GetTypeAtIndex(*idxIfAny); in CheckTupleAccessMethod()
380 … if ((!Parent()->IsAssignmentExpression() || Parent()->AsAssignmentExpression()->Left() != this) && in CheckTupleAccessMethod()
381 (!Parent()->IsUpdateExpression())) { in CheckTupleAccessMethod()
384 const checker::CastingContext cast( in CheckTupleAccessMethod()
385 checker->Relation(), {"Tuple type couldn't be converted "}, in CheckTupleAccessMethod()
386 …checker::CastingContext::ConstructorData {this, baseType->AsETSArrayType()->ElementType(), tupleTy… in CheckTupleAccessMethod()
393 checker::Type *MemberExpression::CheckComputed(checker::ETSChecker *checker, checker::Type *baseTyp… in CheckComputed() argument
395 if (baseType->IsETSDynamicType()) { in CheckComputed()
396 checker->ValidateArrayIndex(property_); in CheckComputed()
397 return checker->GlobalBuiltinDynamicType(baseType->AsETSDynamicType()->Language()); in CheckComputed()
400 if (baseType->IsETSArrayType()) { in CheckComputed()
401 auto *dflt = baseType->AsETSArrayType()->ElementType(); in CheckComputed()
402 if (!baseType->IsETSTupleType() && !checker->ValidateArrayIndex(property_)) { in CheckComputed()
407 …if (baseType->IsETSTupleType() && !checker->ValidateTupleIndex(baseType->AsETSTupleType(), this)) { in CheckComputed()
413 if (property_->IsNumberLiteral() && !CheckArrayIndexValue(checker)) { in CheckComputed()
419 if (baseType->IsETSTupleType()) { in CheckComputed()
420 auto *res = CheckTupleAccessMethod(checker, baseType); in CheckComputed()
427 if (baseType->IsETSObjectType()) { in CheckComputed()
428 SetObjectType(baseType->AsETSObjectType()); in CheckComputed()
429 return CheckIndexAccessMethod(checker); in CheckComputed()
432 if (baseType->IsETSEnumType()) { in CheckComputed()
433 property_->Check(checker); in CheckComputed()
434 if (property_->TsType()->IsETSEnumType()) { in CheckComputed()
436 return checker->GlobalBuiltinETSStringType(); in CheckComputed()
439 …checker->LogTypeError("Indexed access is not supported for such expression type.", Object()->Start… in CheckComputed()
443 checker::Type *MemberExpression::Check(checker::ETSChecker *checker) in Check() argument
445 return checker->GetAnalyzer()->Check(this); in Check()
450 …if (auto *const clone = allocator->New<MemberExpression>(Tag {}, *this, allocator); clone != nullp… in Clone()
452 clone->SetParent(parent); in Clone()
455 clone->SetRange(Range()); in Clone()