diff --git a/checker/types/ets/etsObjectType.cpp b/checker/types/ets/etsObjectType.cpp index c5512013c2b3266b056ee9d55b84e35031f27984..a370011594418c2e59f2a9c17354f59dc57e0198 100644 --- a/checker/types/ets/etsObjectType.cpp +++ b/checker/types/ets/etsObjectType.cpp @@ -361,6 +361,18 @@ void ETSObjectType::AssignmentTarget(TypeRelation *relation, Type *source) return; } +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 1 + FailKind.RUNTIME_FAIL: 2 + FailKind.VERIFIER_FAIL: 3 + same when adding last condition to if statement + */ + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE) && !source->HasTypeFlag(TypeFlag::GENERIC) && !this->HasTypeFlag(TypeFlag::GENERIC)) { + relation->Result(true); + return; + } + IsSubtype(relation, source); } @@ -561,7 +573,7 @@ void ETSObjectType::Cast(TypeRelation *const relation, Type *const target) void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) { - // TODO(mmartin): need check for interface types + ASSERT(this->IsETSObjectType()); // 3.8.3 Subtyping among Array Types if (this == relation->GetChecker()->AsETSChecker()->GlobalETSObjectType() && source->IsETSArrayType()) { @@ -569,10 +581,101 @@ void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) return; } + + +/* +Failed (new failures): 13 + FailKind.ES2PANDA_FAIL: 1 + FailKind.RUNTIME_FAIL: 9 + FailKind.VERIFIER_FAIL: 3 + + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC)) { + return; + } + relation->Result(true); + return; + } +*/ + + +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 6 + мои новые открытые тесты! + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + + relation->Result(true); + return; + } + + if (!(source->HasTypeFlag(TypeFlag::GENERIC) && HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + relation->Result(true); + return; + } + } +*/ + +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 6 + более короткая версия предыдущих улучшений + тоже только вновь открытые тесты падают + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) && HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + relation->Result(true); + return; + } + } +*/ + +/* +полная херня вариант +не работает даже для мною открытых тестов +то есть мои тесты выпдают на строке про sup == nullptr + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) && HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { // то есть тут + return; + } + } + relation->Result(true); + return; + } +*/ + +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 6 + + удивительно но тут тоже только мои тесты, хотя замена && -> || + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + relation->Result(true); + return; + } + } +*/ + if (!source->IsETSObjectType() || !source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::CLASS)) { return; } + ASSERT(source->IsETSObjectType()); + ETSObjectType *const source_obj = source->AsETSObjectType(); if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { @@ -626,6 +729,7 @@ Type *ETSObjectType::AsSuper(Checker *checker, binder::Variable *source_var) return this; } + // возможно надо чинить это место для суперов интерфейса if (HasObjectFlag(ETSObjectFlags::INTERFACE)) { Type *res = nullptr; for (auto *const it : checker->AsETSChecker()->GetInterfaces(this)) { @@ -661,7 +765,6 @@ Type *ETSObjectType::AsSuper(Checker *checker, binder::Variable *source_var) } } } - return nullptr; }