diff --git a/ets2panda/checker/ETSAnalyzer.cpp b/ets2panda/checker/ETSAnalyzer.cpp index 3aa4109c2eb8eb2d86c89482000a32026599fdd0..e7bd6ab9415c5f238c0a63c42cd8f11f05082de8 100644 --- a/ets2panda/checker/ETSAnalyzer.cpp +++ b/ets2panda/checker/ETSAnalyzer.cpp @@ -3563,6 +3563,7 @@ checker::Type *ETSAnalyzer::Check(ir::TSInterfaceDeclaration *st) const for (auto *it : st->Body()->Body()) { it->Check(checker); } + checker->CheckTypeParameterVariance(st); return st->TsType(); } diff --git a/ets2panda/checker/ETSchecker.h b/ets2panda/checker/ETSchecker.h index 7de58a472eae05ef500ffe336b287abbca60f4b6..503437df28102decb661ed2dc10bb1828395b6de 100644 --- a/ets2panda/checker/ETSchecker.h +++ b/ets2panda/checker/ETSchecker.h @@ -795,6 +795,7 @@ public: // Covariant and contravariant void CheckTypeParameterVariance(ir::ClassDefinition *classDef); + void CheckTypeParameterVariance(ir::TSInterfaceDeclaration *interfaceDec); checker::Type *CheckArrayElements(ir::ArrayExpression *init); void ResolveReturnStatement(checker::Type *funcReturnType, checker::Type *argumentType, diff --git a/ets2panda/checker/checkerContext.h b/ets2panda/checker/checkerContext.h index aa5e6b26fcdbad5213fec9eecbe6e003013339d3..04c276e23467de34d26269d6c636a2f5141f67dc 100644 --- a/ets2panda/checker/checkerContext.h +++ b/ets2panda/checker/checkerContext.h @@ -194,6 +194,11 @@ public: smartCasts_.clear(); } + Checker *GetParent() const + { + return parent_; + } + void RemoveSmartCast(varbinder::Variable const *const variable) noexcept { smartCasts_.erase(variable); diff --git a/ets2panda/checker/ets/helpers.cpp b/ets2panda/checker/ets/helpers.cpp index 553abd66e2047e601d4e4440b62db65fc8eadec5..266d304b305ac7eb1e5cb791b4077dac74942673 100644 --- a/ets2panda/checker/ets/helpers.cpp +++ b/ets2panda/checker/ets/helpers.cpp @@ -3049,6 +3049,33 @@ ir::CallExpression *ETSChecker::CreateExtensionAccessorCall(ETSChecker *checker, return callExpr->AsCallExpression(); } +void ETSChecker::CheckTypeParameterVariance(ir::TSInterfaceDeclaration *interfaceDec) +{ + if (interfaceDec == nullptr || interfaceDec->TypeParams() == nullptr) { + return; + } + + auto *const checker = Context().GetParent()->AsETSChecker(); + checker->Context().SetContainingClass(interfaceDec->TsType()->AsETSObjectType()); + checker::SavedCheckerContext savedContext(checker, checker->Context().Status(), + checker->Context().ContainingClass()); + + auto checkVariance = [this](VarianceFlag varianceFlag, ir::Expression *expression, Type *type) { + Relation()->Result(RelationResult::TRUE); + Relation()->SetNode(expression); + Relation()->CheckVarianceRecursively(type, varianceFlag); + Relation()->SetNode(nullptr); + }; + + for (auto *it : interfaceDec->Body()->Body()) { + if (!it->IsMethodDefinition() || it->AsMethodDefinition()->IsConstructor()) { + continue; + } + + checkVariance(VarianceFlag::COVARIANT, it->AsMethodDefinition()->Id(), it->Check(this)); + } +} + void ETSChecker::CheckTypeParameterVariance(ir::ClassDefinition *classDef) { if (classDef->TypeParams() == nullptr) { diff --git a/ets2panda/checker/types/ets/etsObjectType.cpp b/ets2panda/checker/types/ets/etsObjectType.cpp index f4626cb22ab48d6d03617c2eb65ba43967a25169..c8c38a92db5ef0a3cf4c0435294c9d1692be77c0 100644 --- a/ets2panda/checker/types/ets/etsObjectType.cpp +++ b/ets2panda/checker/types/ets/etsObjectType.cpp @@ -1418,8 +1418,14 @@ void ETSObjectType::CheckVarianceRecursively(TypeRelation *relation, VarianceFla return; } - auto *params = GetDeclNode()->IsClassDefinition() ? GetDeclNode()->AsClassDefinition()->TypeParams() - : GetDeclNode()->AsTSInterfaceDeclaration()->TypeParams(); + auto *declNode = GetDeclNode(); + + if (declNode == nullptr) { + return; + } + + auto *params = declNode->IsClassDefinition() ? GetDeclNode()->AsClassDefinition()->TypeParams() + : GetDeclNode()->AsTSInterfaceDeclaration()->TypeParams(); if (params == nullptr) { return; } diff --git a/ets2panda/scripts/arkui.properties b/ets2panda/scripts/arkui.properties index 54df76e0089e1aea4d19c22fd97c790d6066dd40..4b293c0936898a84ca71459fad457c34b6605336 100644 --- a/ets2panda/scripts/arkui.properties +++ b/ets2panda/scripts/arkui.properties @@ -1,3 +1,3 @@ ARKUI_DEV_REPO=https://gitee.com/rri_opensource/koala_projects.git -ARKUI_DEV_BRANCH=panda_rev_8-remove-primitives +ARKUI_DEV_BRANCH=panda_rev_8-array-as-invariant ARKUI_DEST=koala-sig diff --git a/ets2panda/test/runtime/ets/ObjectIterable_3.ets b/ets2panda/test/runtime/ets/ObjectIterable_3.ets index 80f811df62bde6542b82225fbbd652267d9e9d6b..596d5961de01a71d1e66c22c2b5a61c3c9cc7553 100644 --- a/ets2panda/test/runtime/ets/ObjectIterable_3.ets +++ b/ets2panda/test/runtime/ets/ObjectIterable_3.ets @@ -13,9 +13,9 @@ * limitations under the License. */ -interface MyIterator1 extends Iterator {} +interface MyIterator1 extends Iterator {} -interface MyIterator2 extends MyIterator1 {} +interface MyIterator2 extends MyIterator1 {} interface MyIter { $_iterator(): Iterator;