diff --git a/ets2panda/bindings/src/generated/Es2pandaEnums.ts b/ets2panda/bindings/src/generated/Es2pandaEnums.ts index 5638cddfaff08abd6bb89807cd16965825611186..3ecfd13775604818e1146162c2ff44b3f86c8f71 100644 --- a/ets2panda/bindings/src/generated/Es2pandaEnums.ts +++ b/ets2panda/bindings/src/generated/Es2pandaEnums.ts @@ -88,17 +88,16 @@ export enum Es2pandaCheckerStatus { CHECKER_STATUS_IGNORE_VISIBILITY = 16384, CHECKER_STATUS_IN_INSTANCE_EXTENSION_METHOD = 32768, CHECKER_STATUS_IN_LOCAL_CLASS = 65536, - CHECKER_STATUS_IN_INSTANCEOF_CONTEXT = 131072, - CHECKER_STATUS_IN_TEST_EXPRESSION = 262144, - CHECKER_STATUS_IN_LOOP = 524288, - CHECKER_STATUS_MEET_RETURN = 1048576, - CHECKER_STATUS_MEET_BREAK = 2097152, - CHECKER_STATUS_MEET_CONTINUE = 4194304, - CHECKER_STATUS_MEET_THROW = 8388608, - CHECKER_STATUS_IN_EXTERNAL = 16777216, - CHECKER_STATUS_IN_BRIDGE_TEST = 33554432, - CHECKER_STATUS_IN_GETTER = 67108864, - CHECKER_STATUS_IN_SETTER = 134217728 + CHECKER_STATUS_IN_TEST_EXPRESSION = 131072, + CHECKER_STATUS_IN_TEST_LOOP = 262144, + CHECKER_STATUS_MEET_RETURN = 524288, + CHECKER_STATUS_MEET_BREAK = 1048576, + CHECKER_STATUS_MEET_CONTINUE = 2097152, + CHECKER_STATUS_MEET_THROW = 4194304, + CHECKER_STATUS_IN_EXTERNAL = 8388608, + CHECKER_STATUS_IN_BRIDGE_TEST = 16777216, + CHECKER_STATUS_IN_GETTER = 33554432, + CHECKER_STATUS_IN_SETTER = 67108864 } export enum Es2pandaLexicalScopeType { diff --git a/ets2panda/checker/checkerContext.h b/ets2panda/checker/checkerContext.h index aa5e6b26fcdbad5213fec9eecbe6e003013339d3..43dc34aed9f365aa36f2b8ec777770aede8beddc 100644 --- a/ets2panda/checker/checkerContext.h +++ b/ets2panda/checker/checkerContext.h @@ -64,19 +64,18 @@ enum class CheckerStatus : uint32_t { IGNORE_VISIBILITY = 1U << 14U, IN_EXTENSION_METHOD = 1U << 15U, IN_LOCAL_CLASS = 1U << 16U, - IN_INSTANCEOF_CONTEXT = 1U << 17U, - IN_TEST_EXPRESSION = 1U << 18U, - IN_LOOP = 1U << 19U, - MEET_RETURN = 1U << 20U, - MEET_BREAK = 1U << 21U, - MEET_CONTINUE = 1U << 22U, - MEET_THROW = 1U << 23U, - IN_EXTERNAL = 1U << 24U, - IN_BRIDGE_TEST = 1U << 25U, - IN_GETTER = 1U << 26U, - IN_SETTER = 1U << 27U, - IN_EXTENSION_ACCESSOR_CHECK = 1U << 28U, - IN_TYPE_INFER = 1U << 29U, + IN_TEST_EXPRESSION = 1U << 17U, + IN_LOOP = 1U << 18U, + MEET_RETURN = 1U << 19U, + MEET_BREAK = 1U << 20U, + MEET_CONTINUE = 1U << 21U, + MEET_THROW = 1U << 22U, + IN_EXTERNAL = 1U << 23U, + IN_BRIDGE_TEST = 1U << 24U, + IN_GETTER = 1U << 25U, + IN_SETTER = 1U << 26U, + IN_EXTENSION_ACCESSOR_CHECK = 1U << 27U, + IN_TYPE_INFER = 1U << 28U, }; } // namespace ark::es2panda::checker diff --git a/ets2panda/checker/ets/arithmetic.cpp b/ets2panda/checker/ets/arithmetic.cpp index af988225667f962a3b651b611859bbeaf34fba7a..5d930ac84891993bd070b5b17510cfe99d988def 100644 --- a/ets2panda/checker/ets/arithmetic.cpp +++ b/ets2panda/checker/ets/arithmetic.cpp @@ -824,7 +824,6 @@ std::tuple ETSChecker::CheckBinaryOperatorInstanceOf(lexer::Sour } checker::Type *opType = GlobalETSObjectType(); - RemoveStatus(checker::CheckerStatus::IN_INSTANCEOF_CONTEXT); return {GlobalETSBooleanBuiltinType(), opType}; } @@ -1187,16 +1186,14 @@ std::tuple ETSChecker::CheckBinaryOperator(ir::Expression *left, return {rightType, rightType}; } - if (operationType == lexer::TokenType::KEYW_INSTANCEOF) { - AddStatus(checker::CheckerStatus::IN_INSTANCEOF_CONTEXT); - } - Context().CheckTestSmartCastCondition(operationType); // SUPPRESS_CSA_NEXTLINE(alpha.core.AllocatorETSCheckerHint) - checker::Type *rightType = right->Check(this); + checker::Type *rightType; if (right->IsTypeNode()) { - rightType = right->AsTypeNode()->GetType(this); + rightType = right->AsTypeNode()->GetType(this, false); + } else { + rightType = right->Check(this); } if (rightType == nullptr) { diff --git a/ets2panda/checker/ets/typeRelationContext.cpp b/ets2panda/checker/ets/typeRelationContext.cpp index bfcd8ef61af7936503c974f504988e0bee77c4ef..e4ed3ddecfc34f3b4a72a4a1436ba6d85bd01412 100644 --- a/ets2panda/checker/ets/typeRelationContext.cpp +++ b/ets2panda/checker/ets/typeRelationContext.cpp @@ -45,13 +45,6 @@ bool AssignmentContext::ValidateArrayTypeInitializerByElement(TypeRelation *rela bool InstantiationContext::ValidateTypeArguments(ETSObjectType *type, ir::TSTypeParameterInstantiation *typeArgs, const lexer::SourcePosition &pos) { - if (checker_->HasStatus(CheckerStatus::IN_INSTANCEOF_CONTEXT)) { - if (typeArgs != nullptr) { - checker_->LogDiagnostic(diagnostic::INSTANCEOF_ERASED, {type->Name()}, pos); - } - result_ = type; - return true; - } if (!checker_->CheckNumberOfTypeArguments(type, typeArgs, pos)) { result_ = checker_->GlobalTypeError(); return true; diff --git a/ets2panda/ir/brokenTypeNode.cpp b/ets2panda/ir/brokenTypeNode.cpp index 7194b87d8d659ea51abadab44fb811445c0aae07..f634184bf605c1d27221d7d4194c2483b48b5e2d 100644 --- a/ets2panda/ir/brokenTypeNode.cpp +++ b/ets2panda/ir/brokenTypeNode.cpp @@ -59,7 +59,8 @@ checker::Type *BrokenTypeNode::GetType([[maybe_unused]] checker::TSChecker *chec return nullptr; } -checker::Type *BrokenTypeNode::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *BrokenTypeNode::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { return checker->GlobalTypeError(); } diff --git a/ets2panda/ir/brokenTypeNode.h b/ets2panda/ir/brokenTypeNode.h index 81df2eeea820df0c5363aca2e6c6da049d1a42c1..01fbd54bd530e5691e1c51e94159278307f08d03 100644 --- a/ets2panda/ir/brokenTypeNode.h +++ b/ets2panda/ir/brokenTypeNode.h @@ -41,7 +41,7 @@ public: checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsFunctionType.cpp b/ets2panda/ir/ets/etsFunctionType.cpp index ef128fde8a20fb09aa5bb682ee70d0470ae135d7..ef3e62b9146504ff8d460072ebe3b496eb30c741 100644 --- a/ets2panda/ir/ets/etsFunctionType.cpp +++ b/ets2panda/ir/ets/etsFunctionType.cpp @@ -110,7 +110,7 @@ checker::VerifiedType ETSFunctionType::Check(checker::ETSChecker *checker) return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSFunctionType::GetType(checker::ETSChecker *checker) +checker::Type *ETSFunctionType::GetType(checker::ETSChecker *checker, [[maybe_unused]] bool expectTypeArguments) { return Check(checker); } diff --git a/ets2panda/ir/ets/etsFunctionType.h b/ets2panda/ir/ets/etsFunctionType.h index 142e16671c030f44110dc26e1fdf04be458432fb..73a88b60a953d881d6ee964e2bf51f8766dd6221 100644 --- a/ets2panda/ir/ets/etsFunctionType.h +++ b/ets2panda/ir/ets/etsFunctionType.h @@ -134,7 +134,7 @@ public: checker::Type *Check(checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check(checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsKeyofType.cpp b/ets2panda/ir/ets/etsKeyofType.cpp index d266214e5bf495de704a4e7d552ea5450dedc295..60173406ea835e62b7367cb1a69c1b974eb17429 100644 --- a/ets2panda/ir/ets/etsKeyofType.cpp +++ b/ets2panda/ir/ets/etsKeyofType.cpp @@ -57,7 +57,7 @@ checker::VerifiedType ETSKeyofType::Check([[maybe_unused]] checker::ETSChecker * return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSKeyofType::GetType(checker::ETSChecker *checker) +checker::Type *ETSKeyofType::GetType(checker::ETSChecker *checker, [[maybe_unused]] bool expectTypeArguments) { if (TsType() != nullptr) { return TsType(); @@ -89,4 +89,4 @@ ETSKeyofType *ETSKeyofType::Clone(ArenaAllocator *const allocator, AstNode *cons clone->type_->SetParent(clone); return clone; } -} // namespace ark::es2panda::ir \ No newline at end of file +} // namespace ark::es2panda::ir diff --git a/ets2panda/ir/ets/etsKeyofType.h b/ets2panda/ir/ets/etsKeyofType.h index 9e063e798b1bfb814c24f831b3d07e0330e606ef..28eef9a04d10923795ad23b87386def524ae0381 100644 --- a/ets2panda/ir/ets/etsKeyofType.h +++ b/ets2panda/ir/ets/etsKeyofType.h @@ -38,7 +38,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { @@ -52,4 +52,4 @@ private: }; } // namespace ark::es2panda::ir -#endif \ No newline at end of file +#endif diff --git a/ets2panda/ir/ets/etsNeverType.cpp b/ets2panda/ir/ets/etsNeverType.cpp index 3f40e3475075ab2a1bc7613410322b7179f01387..d3478215601c57c4b9ae0e829a6e48f3be15b57c 100644 --- a/ets2panda/ir/ets/etsNeverType.cpp +++ b/ets2panda/ir/ets/etsNeverType.cpp @@ -59,7 +59,8 @@ checker::VerifiedType ETSNeverType::Check([[maybe_unused]] checker::ETSChecker * return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSNeverType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSNeverType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { SetTsType(checker->GlobalETSNeverType()); return TsType(); diff --git a/ets2panda/ir/ets/etsNeverType.h b/ets2panda/ir/ets/etsNeverType.h index 8f7a231b4886f22c5d41e823f0a4fc7e29b1ac78..788b22f7463e5b9d661d2b23f737421fed93a880 100644 --- a/ets2panda/ir/ets/etsNeverType.h +++ b/ets2panda/ir/ets/etsNeverType.h @@ -30,7 +30,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsNonNullishTypeNode.cpp b/ets2panda/ir/ets/etsNonNullishTypeNode.cpp index 14226f3c0fb1e0cf9030546b1d811e7864319a89..9e46ad5ad55092381394c873dc654eda68135ffd 100644 --- a/ets2panda/ir/ets/etsNonNullishTypeNode.cpp +++ b/ets2panda/ir/ets/etsNonNullishTypeNode.cpp @@ -60,7 +60,8 @@ checker::VerifiedType ETSNonNullishTypeNode::Check([[maybe_unused]] checker::ETS return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSNonNullishTypeNode::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSNonNullishTypeNode::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { return TsType() != nullptr ? TsType() : Check(checker); } diff --git a/ets2panda/ir/ets/etsNonNullishTypeNode.h b/ets2panda/ir/ets/etsNonNullishTypeNode.h index 2de8462ca079483ca0960b98b297c7849bbb731a..7fa07fc8e8f3a265409b4dec4d200706a6a9b686 100644 --- a/ets2panda/ir/ets/etsNonNullishTypeNode.h +++ b/ets2panda/ir/ets/etsNonNullishTypeNode.h @@ -38,7 +38,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { @@ -52,4 +52,4 @@ private: }; } // namespace ark::es2panda::ir -#endif \ No newline at end of file +#endif diff --git a/ets2panda/ir/ets/etsNullishTypes.cpp b/ets2panda/ir/ets/etsNullishTypes.cpp index 0957d162a44a9493faa2b1eeae1410807b7609ee..2adaccba82cfe28e7d41539b6833217c903ede09 100644 --- a/ets2panda/ir/ets/etsNullishTypes.cpp +++ b/ets2panda/ir/ets/etsNullishTypes.cpp @@ -59,7 +59,8 @@ checker::VerifiedType ETSUndefinedType::Check([[maybe_unused]] checker::ETSCheck return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSUndefinedType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSUndefinedType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { SetTsType(checker->GlobalETSUndefinedType()); return TsType(); @@ -125,7 +126,8 @@ checker::VerifiedType ETSNullType::Check([[maybe_unused]] checker::ETSChecker *c return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSNullType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSNullType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { SetTsType(checker->GlobalETSNullType()); return TsType(); diff --git a/ets2panda/ir/ets/etsNullishTypes.h b/ets2panda/ir/ets/etsNullishTypes.h index 54f40e1c0e44a579335295fd7caada36ac4c51a6..b0ca0bffcf3a26177fc684ac8b2a5d90cb99fd7a 100644 --- a/ets2panda/ir/ets/etsNullishTypes.h +++ b/ets2panda/ir/ets/etsNullishTypes.h @@ -31,7 +31,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { @@ -51,7 +51,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsPrimitiveType.cpp b/ets2panda/ir/ets/etsPrimitiveType.cpp index 6fc11fec680beb738d0a26b6067bb55d22595025..b133dd6989c479ac41100d2e9effed0c81d331d5 100644 --- a/ets2panda/ir/ets/etsPrimitiveType.cpp +++ b/ets2panda/ir/ets/etsPrimitiveType.cpp @@ -102,7 +102,8 @@ checker::VerifiedType ETSPrimitiveType::Check(checker::ETSChecker *checker) return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSPrimitiveType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSPrimitiveType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { switch (GetPrimitiveType()) { case PrimitiveType::BYTE: { diff --git a/ets2panda/ir/ets/etsPrimitiveType.h b/ets2panda/ir/ets/etsPrimitiveType.h index e26ae82974b0d964dccf4b8f9fd30ae9e4f50c38..9ab15fd9c823ae5a87752688f8cf71311899435f 100644 --- a/ets2panda/ir/ets/etsPrimitiveType.h +++ b/ets2panda/ir/ets/etsPrimitiveType.h @@ -44,7 +44,7 @@ public: checker::Type *Check(checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check(checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsStringLiteralType.cpp b/ets2panda/ir/ets/etsStringLiteralType.cpp index 178160de40224715787949b5f9dbb6308edd51ea..d96eb4ce60f4c7a345b4895cabd0fd7c71424582 100644 --- a/ets2panda/ir/ets/etsStringLiteralType.cpp +++ b/ets2panda/ir/ets/etsStringLiteralType.cpp @@ -60,7 +60,8 @@ checker::VerifiedType ETSStringLiteralType::Check([[maybe_unused]] checker::ETSC return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSStringLiteralType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSStringLiteralType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { SetTsType(checker->CreateETSStringLiteralType(value_)); return TsType(); diff --git a/ets2panda/ir/ets/etsStringLiteralType.h b/ets2panda/ir/ets/etsStringLiteralType.h index 0144bf17e173e5c7acdccf84d3ffb9fe3286418c..7b1904f0e05f5b9df29e96fc5e35b592f467d0f4 100644 --- a/ets2panda/ir/ets/etsStringLiteralType.h +++ b/ets2panda/ir/ets/etsStringLiteralType.h @@ -34,7 +34,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsTuple.cpp b/ets2panda/ir/ets/etsTuple.cpp index 3b143a0872be34026de52c55f93c1d4a00ac8912..cfdcd0d6d3bfa986b0c046490d5468668653dee5 100644 --- a/ets2panda/ir/ets/etsTuple.cpp +++ b/ets2panda/ir/ets/etsTuple.cpp @@ -73,7 +73,7 @@ checker::Type *ETSTuple::Check([[maybe_unused]] checker::TSChecker *const checke return nullptr; } -checker::VerifiedType ETSTuple::Check([[maybe_unused]] checker::ETSChecker *const checker) +checker::VerifiedType ETSTuple::Check(checker::ETSChecker *const checker) { return {this, GetType(checker)}; } @@ -96,7 +96,7 @@ checker::Type *ETSTuple::GetHolderTypeForTuple(checker::ETSChecker *const checke return checker->GlobalETSAnyType(); } -checker::Type *ETSTuple::GetType(checker::ETSChecker *const checker) +checker::Type *ETSTuple::GetType(checker::ETSChecker *const checker, [[maybe_unused]] bool expectTypeArguments) { if (TsType() != nullptr) { return TsType(); diff --git a/ets2panda/ir/ets/etsTuple.h b/ets2panda/ir/ets/etsTuple.h index 6039a546e5eaea6cefb1fdb7ebbe710ce2f24c40..6973a984f38fc63f8d3a73af0a11d61c7aeaa1c6 100644 --- a/ets2panda/ir/ets/etsTuple.h +++ b/ets2panda/ir/ets/etsTuple.h @@ -67,7 +67,7 @@ public: void Compile([[maybe_unused]] compiler::ETSGen *etsg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - [[nodiscard]] checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + [[nodiscard]] checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsTypeReference.cpp b/ets2panda/ir/ets/etsTypeReference.cpp index 7986198c729d4d33902ce54239119b9df91e4c72..a7e30ea944fbb240560201abaf029566799fbbe5 100644 --- a/ets2panda/ir/ets/etsTypeReference.cpp +++ b/ets2panda/ir/ets/etsTypeReference.cpp @@ -102,12 +102,12 @@ checker::VerifiedType ETSTypeReference::Check(checker::ETSChecker *checker) { return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSTypeReference::GetType(checker::ETSChecker *checker) +checker::Type *ETSTypeReference::GetType(checker::ETSChecker *checker, bool expectTypeArguments) { if (TsType() != nullptr) { return TsType(); } - auto *type = Part()->GetType(checker); + auto *type = Part()->GetType(checker, expectTypeArguments); if (IsReadonlyType()) { type = checker->GetReadonlyType(type); } diff --git a/ets2panda/ir/ets/etsTypeReference.h b/ets2panda/ir/ets/etsTypeReference.h index a69e3679fe4f8969e809befd9706345f0e86bd23..9073e651ccb9d7f1d5bc2311ef98c0d5de0a9aa7 100644 --- a/ets2panda/ir/ets/etsTypeReference.h +++ b/ets2panda/ir/ets/etsTypeReference.h @@ -58,7 +58,7 @@ public: void Compile(compiler::ETSGen *etsg) const override; checker::Type *Check(checker::TSChecker *checker) override; checker::VerifiedType Check(checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsTypeReferencePart.cpp b/ets2panda/ir/ets/etsTypeReferencePart.cpp index 9dbef072a275a2e41a81acddb471b649f2ec868a..5519227a053f796040bb3ca3df18ea8b90b6436e 100644 --- a/ets2panda/ir/ets/etsTypeReferencePart.cpp +++ b/ets2panda/ir/ets/etsTypeReferencePart.cpp @@ -208,7 +208,7 @@ checker::Type *ETSTypeReferencePart::HandleInternalTypes(checker::ETSChecker *co return nullptr; } -checker::Type *ETSTypeReferencePart::GetType(checker::ETSChecker *checker) +checker::Type *ETSTypeReferencePart::GetType(checker::ETSChecker *checker, bool expectTypeArguments) { if (TypeParams() != nullptr) { for (auto *param : TypeParams()->Params()) { @@ -228,15 +228,19 @@ checker::Type *ETSTypeReferencePart::GetType(checker::ETSChecker *checker) checker::Type *baseType = checker->GetReferencedTypeBase(name); ES2PANDA_ASSERT(baseType != nullptr); - if (baseType->IsETSObjectType()) { + if (baseType->IsETSObjectType() && expectTypeArguments) { checker::InstantiationContext ctx(checker, baseType->AsETSObjectType(), TypeParams(), Start()); SetTsType(ctx.Result()); } else { + if (baseType->IsETSObjectType() && !expectTypeArguments && TypeParams() != nullptr) { + checker->LogDiagnostic(diagnostic::INSTANCEOF_ERASED, {baseType->AsETSObjectType()->Name()}, + Start()); + } SetTsType(baseType); } } } else { - checker::Type *baseType = Previous()->GetType(checker); + checker::Type *baseType = Previous()->GetType(checker, expectTypeArguments); SetTsType(checker->GetReferencedTypeFromBase(baseType, name)); } return TsType(); diff --git a/ets2panda/ir/ets/etsTypeReferencePart.h b/ets2panda/ir/ets/etsTypeReferencePart.h index 9fe657e9302608ebbc02c8b032041c5127466597..123ad6a780e417027c5d2da1ae8a32b6320773fe 100644 --- a/ets2panda/ir/ets/etsTypeReferencePart.h +++ b/ets2panda/ir/ets/etsTypeReferencePart.h @@ -95,7 +95,7 @@ public: void Compile(compiler::ETSGen *etsg) const override; checker::Type *Check(checker::TSChecker *checker) override; checker::VerifiedType Check(checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; ir::Identifier *GetIdent(); void Accept(ASTVisitorT *v) override diff --git a/ets2panda/ir/ets/etsUnionType.cpp b/ets2panda/ir/ets/etsUnionType.cpp index de035bcd614e25de7767a2deb57d10ecdda0008f..a79a20597cb21dd787e98b0c841afecb040bd9c0 100644 --- a/ets2panda/ir/ets/etsUnionType.cpp +++ b/ets2panda/ir/ets/etsUnionType.cpp @@ -86,7 +86,7 @@ static bool CheckConstituentTypesValid(ArenaVector const &const return true; } -checker::Type *ETSUnionType::GetType(checker::ETSChecker *checker) +checker::Type *ETSUnionType::GetType(checker::ETSChecker *checker, bool expectTypeArguments) { if (TsType() != nullptr) { return TsType(); @@ -96,7 +96,7 @@ checker::Type *ETSUnionType::GetType(checker::ETSChecker *checker) ArenaVector types(checker->Allocator()->Adapter()); for (auto *it : Types()) { - types.push_back(it->GetType(checker)); + types.push_back(it->GetType(checker, expectTypeArguments)); } checker->Relation()->SetNode(this); diff --git a/ets2panda/ir/ets/etsUnionType.h b/ets2panda/ir/ets/etsUnionType.h index 21a06d8ef19059da34d02921994798ebd554808e..1d0ac82044dc4c01a12bc929e2787ca340d337c6 100644 --- a/ets2panda/ir/ets/etsUnionType.h +++ b/ets2panda/ir/ets/etsUnionType.h @@ -44,7 +44,7 @@ public: void Compile([[maybe_unused]] compiler::PandaGen *pg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ets/etsWildcardType.cpp b/ets2panda/ir/ets/etsWildcardType.cpp index ab5ffc9e50fbb072feb58b2639252def5c8c2610..fe59543565acb5da688da10fb24f83559021e3bf 100644 --- a/ets2panda/ir/ets/etsWildcardType.cpp +++ b/ets2panda/ir/ets/etsWildcardType.cpp @@ -85,7 +85,8 @@ checker::VerifiedType ETSWildcardType::Check(checker::ETSChecker *checker) return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *ETSWildcardType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *ETSWildcardType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { return checker->GlobalWildcardType(); } diff --git a/ets2panda/ir/ets/etsWildcardType.h b/ets2panda/ir/ets/etsWildcardType.h index d97e155308457adae50a52caf60d728b24a3e15d..9adb4467c7ad55b2fc394e48c4be42152c0ffd5b 100644 --- a/ets2panda/ir/ets/etsWildcardType.h +++ b/ets2panda/ir/ets/etsWildcardType.h @@ -48,7 +48,7 @@ public: checker::Type *Check(checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check(checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/opaqueTypeNode.cpp b/ets2panda/ir/opaqueTypeNode.cpp index 4a74b389756ec682bc543df34f615d8380870601..9dd2a1518ab41eae476f772378390b42658d2222 100644 --- a/ets2panda/ir/opaqueTypeNode.cpp +++ b/ets2panda/ir/opaqueTypeNode.cpp @@ -68,7 +68,8 @@ checker::Type *OpaqueTypeNode::GetType([[maybe_unused]] checker::TSChecker *chec return nullptr; } -checker::Type *OpaqueTypeNode::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *OpaqueTypeNode::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { return TsType(); } diff --git a/ets2panda/ir/opaqueTypeNode.h b/ets2panda/ir/opaqueTypeNode.h index f4871890a39d217d1704c00232e2fce6d08ebe26..605f4ab90bc354a2492cc8b5251b71df4ab28875 100644 --- a/ets2panda/ir/opaqueTypeNode.h +++ b/ets2panda/ir/opaqueTypeNode.h @@ -47,7 +47,7 @@ public: checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ts/tsArrayType.cpp b/ets2panda/ir/ts/tsArrayType.cpp index fe5c8a30495f35427f0f0ffc07fad05e90b65acf..bf3157565262d8fa5eafd0a6724112ae7c6a1040 100644 --- a/ets2panda/ir/ts/tsArrayType.cpp +++ b/ets2panda/ir/ts/tsArrayType.cpp @@ -87,7 +87,7 @@ checker::VerifiedType TSArrayType::Check(checker::ETSChecker *checker) return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *TSArrayType::GetType(checker::ETSChecker *checker) +checker::Type *TSArrayType::GetType(checker::ETSChecker *checker, [[maybe_unused]] bool expectTypeArguments) { checker::Type *type = checker->CreateETSArrayType(elementType_->GetType(checker), IsReadonlyType()); if (IsReadonlyType()) { diff --git a/ets2panda/ir/ts/tsArrayType.h b/ets2panda/ir/ts/tsArrayType.h index 39f5b4872db1c27b65d0541534b657c216cd64d5..fd6ab13ee2108fe41df9a60dd8b4407eee399df5 100644 --- a/ets2panda/ir/ts/tsArrayType.h +++ b/ets2panda/ir/ts/tsArrayType.h @@ -49,7 +49,7 @@ public: checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ts/tsFunctionType.cpp b/ets2panda/ir/ts/tsFunctionType.cpp index 89e4751aeb965dd49d3133f81e7346ea7512f16d..556fc447e1d8e3038340e5ef071cdca8522a4af7 100644 --- a/ets2panda/ir/ts/tsFunctionType.cpp +++ b/ets2panda/ir/ts/tsFunctionType.cpp @@ -80,7 +80,8 @@ checker::VerifiedType TSFunctionType::Check([[maybe_unused]] checker::ETSChecker return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *TSFunctionType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *TSFunctionType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { return nullptr; } diff --git a/ets2panda/ir/ts/tsFunctionType.h b/ets2panda/ir/ts/tsFunctionType.h index b66474ef0ee9e61a68413734a5d58f92ccb4c5fb..c90c71d389b59072620047d2bf7bc8df5b649bcc 100644 --- a/ets2panda/ir/ts/tsFunctionType.h +++ b/ets2panda/ir/ts/tsFunctionType.h @@ -93,7 +93,7 @@ public: checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; void Accept(ASTVisitorT *v) override { diff --git a/ets2panda/ir/ts/tsIntersectionType.cpp b/ets2panda/ir/ts/tsIntersectionType.cpp index 6dc630a18a4c57e98d0250cdf88bddca4abed7b9..15583a151f0f7c14d2251a3814e855f7c344dcd3 100644 --- a/ets2panda/ir/ts/tsIntersectionType.cpp +++ b/ets2panda/ir/ts/tsIntersectionType.cpp @@ -78,7 +78,8 @@ checker::Type *TSIntersectionType::GetType([[maybe_unused]] checker::TSChecker * return nullptr; } -checker::Type *TSIntersectionType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *TSIntersectionType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { // NOTE: validate return checker->GlobalETSObjectType(); diff --git a/ets2panda/ir/ts/tsIntersectionType.h b/ets2panda/ir/ts/tsIntersectionType.h index 11abbca84815504ce0132c45d77edb91bf6c69b0..3475bdd3b4d60608fc560353035029578161eee2 100644 --- a/ets2panda/ir/ts/tsIntersectionType.h +++ b/ets2panda/ir/ts/tsIntersectionType.h @@ -39,7 +39,7 @@ public: void Compile(compiler::ETSGen *etsg) const override; checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; void Accept(ASTVisitorT *v) override diff --git a/ets2panda/ir/ts/tsThisType.cpp b/ets2panda/ir/ts/tsThisType.cpp index 9af97be93c8b9f01a491a356b0e06e153cc7b6ec..2ff08edaf92e8839b1e251094e9c23ef15f0a3c9 100644 --- a/ets2panda/ir/ts/tsThisType.cpp +++ b/ets2panda/ir/ts/tsThisType.cpp @@ -68,7 +68,8 @@ checker::VerifiedType TSThisType::Check([[maybe_unused]] checker::ETSChecker *ch return {this, checker->GetAnalyzer()->Check(this)}; } -checker::Type *TSThisType::GetType([[maybe_unused]] checker::ETSChecker *checker) +checker::Type *TSThisType::GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments) { return checker->Context().ContainingClass(); } diff --git a/ets2panda/ir/ts/tsThisType.h b/ets2panda/ir/ts/tsThisType.h index e5367ce02ff527dec0cfc5903812dfc081c23eef..a43fedd6aff078cf23fb527a11014c5448eba63d 100644 --- a/ets2panda/ir/ts/tsThisType.h +++ b/ets2panda/ir/ts/tsThisType.h @@ -32,7 +32,7 @@ public: checker::Type *Check([[maybe_unused]] checker::TSChecker *checker) override; checker::Type *GetType([[maybe_unused]] checker::TSChecker *checker) override; checker::VerifiedType Check([[maybe_unused]] checker::ETSChecker *checker) override; - checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) override; + checker::Type *GetType(checker::ETSChecker *checker, bool expectTypeArguments = true) override; TSThisType *Clone(ArenaAllocator *allocator, AstNode *parent) override; void Accept(ASTVisitorT *v) override diff --git a/ets2panda/ir/typeNode.h b/ets2panda/ir/typeNode.h index a3adb7e09c8d0d63c14bfa964ca6979933e20147..53850c582f2c5256e5bf4e539328625fe9f3f330 100644 --- a/ets2panda/ir/typeNode.h +++ b/ets2panda/ir/typeNode.h @@ -43,7 +43,8 @@ public: return nullptr; } - [[nodiscard]] virtual checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker) + [[nodiscard]] virtual checker::Type *GetType([[maybe_unused]] checker::ETSChecker *checker, + [[maybe_unused]] bool expectTypeArguments = true) { return nullptr; } diff --git a/ets2panda/test/runtime/ets/27016.ets b/ets2panda/test/runtime/ets/27016.ets new file mode 100644 index 0000000000000000000000000000000000000000..e5514785130aad3ff814b9fba046958109ebabbe --- /dev/null +++ b/ets2panda/test/runtime/ets/27016.ets @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +function f(a: Object) { + return a instanceof B +} + +interface A { + get(): TA +} +interface B extends A { +} + +class D implements B { + constructor(d: TD) { + this.d = d + } + get(): TD { + return this.d + } + d: TD +} + +function main() { + let a: A = new D(5) + arktest.assertEQ(a.get(), 5) +} diff --git a/ets2panda/util/perfMetrics.cpp b/ets2panda/util/perfMetrics.cpp index 981ec934c40d631b1461b4f71c4f1e24e5b40a8e..91cbcbe7a536141f9e3d465f76ae9396d573ee02 100644 --- a/ets2panda/util/perfMetrics.cpp +++ b/ets2panda/util/perfMetrics.cpp @@ -18,6 +18,7 @@ #include "libpandabase/utils/logger.h" #include "libpandabase/utils/type_converter.h" #include "libpandabase/mem/mem.h" +#include #include #include #include