diff --git a/libs/rtemodel/src/RteModel.cpp b/libs/rtemodel/src/RteModel.cpp index 69563023f..61ed83240 100644 --- a/libs/rtemodel/src/RteModel.cpp +++ b/libs/rtemodel/src/RteModel.cpp @@ -254,11 +254,17 @@ RteComponent* RteModel::GetComponent(RteComponentInstance* ci, bool matchVersion RteApi* RteModel::GetApi(const map& componentAttributes) const { + RteApi* api = nullptr; for (auto [_, a] : m_apiList) { - if (a && a->MatchApiAttributes(componentAttributes)) - return a; + if(a && a->MatchApiAttributes(componentAttributes)) { + if(a->GetPackage()->IsDominating()) { + return a; // first dominating API wins + } else if(!api) { + api = a; // keep latest + } + } } - return nullptr; + return api; } RteApi* RteModel::GetApi(const string& id) const @@ -277,13 +283,18 @@ RteApi* RteModel::GetApi(const string& id) const RteApi* RteModel::GetLatestApi(const string& id) const { string commonId = RteUtils::GetPrefix(id, RteConstants::PREFIX_CVERSION_CHAR); + RteApi* api = nullptr; // get highest API version - for (auto [key, api] : m_apiList) { + for (auto [key, a] : m_apiList) { if (RteUtils::GetPrefix(key, RteConstants::PREFIX_CVERSION_CHAR) == commonId) { - return api; + if(a->GetPackage()->IsDominating()) { + return a; // first dominating API wins + } else if(!api) { + api = a; // keep latest + } } } - return nullptr; + return api; } std::list RteModel::GetAvailableApis(const std::string& id) const diff --git a/libs/rtemodel/src/RtePackage.cpp b/libs/rtemodel/src/RtePackage.cpp index e0252076c..f0533b802 100644 --- a/libs/rtemodel/src/RtePackage.cpp +++ b/libs/rtemodel/src/RtePackage.cpp @@ -733,7 +733,7 @@ string RtePackage::ConstructID() m_commonID = RtePackage::GetPackageIDfromAttributes(*this, false); m_nDeprecated = IsDeprecated() ? 1 : 0; - m_nDominating = IsDominating() ? 1 : 0; + m_nDominating = !m_nDeprecated && GetItemByTag("dominate") != nullptr; return id; } diff --git a/libs/rtemodel/test/src/RteModelTest.cpp b/libs/rtemodel/test/src/RteModelTest.cpp index e483437e6..f3be733b5 100644 --- a/libs/rtemodel/test/src/RteModelTest.cpp +++ b/libs/rtemodel/test/src/RteModelTest.cpp @@ -248,6 +248,24 @@ TEST(RteModelTest, LoadPacks) { RteGenerator* gen = c->GetGenerator(); EXPECT_FALSE(gen != nullptr); + // get API + const string& apiId = "::RteTest:CORE(API)"; + RteApi* api = rteModel->GetLatestApi(apiId); + ASSERT_TRUE(api); + EXPECT_EQ(api->GetID(), "::RteTest:CORE(API)@1.1.2"); + EXPECT_EQ(api->GetPackageID(), "ARM::RteTest_DFP@0.2.0"); + + // make pack "dominant" + pack = rteModel->GetPackage("ARM::RteTest_DFP@0.1.1"); + ASSERT_TRUE(pack); + RteItem* dominateItem = new RteItem("dominate", pack); + pack->AddChild(dominateItem); + pack->Construct(); // refresh internal state + api = rteModel->GetLatestApi(apiId); + ASSERT_TRUE(api); + EXPECT_EQ(api->GetID(), "::RteTest:CORE(API)@1.1.1"); + EXPECT_EQ(api->GetPackageID(), "ARM::RteTest_DFP@0.1.1"); + ExtGenRteCallback extGenRteCallback; rteKernel.SetRteCallback(&extGenRteCallback); gen = c->GetGenerator(); diff --git a/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc b/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc index d06cef22b..55ec76b9e 100644 --- a/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc +++ b/test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc @@ -292,7 +292,7 @@ - + RteTest CORE API