QmlDesigner: Add source cache name id getter

To test if a source name exists we add a getter to the id.

Change-Id: If5d430402189474b85897dbe0b47f3558916d096
Reviewed-by: Burak Hancerli <burak.hancerli@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2025-03-13 16:22:27 +01:00
committed by Thomas Hartmann
parent 72faa129c3
commit ee05b2a65a
6 changed files with 126 additions and 11 deletions

View File

@@ -43,9 +43,9 @@ public:
void populateIfEmpty() override
{
if (m_sourcePathCache.isEmpty()) {
if (m_sourceNameCache.isEmpty()) {
m_sourceContextPathCache.populate();
m_sourcePathCache.populate();
m_sourceNameCache.populate();
}
}
@@ -57,15 +57,19 @@ public:
Utils::SmallStringView sourceName = sourcePath.name();
auto sourceId = m_sourcePathCache.id(sourceName);
auto sourceNameId = m_sourceNameCache.id(sourceName);
return SourceId::create(sourceId, sourceContextId);
return SourceId::create(sourceNameId, sourceContextId);
}
SourceId sourceId(SourceContextId sourceContextId,
Utils::SmallStringView sourceName) const override
SourceNameId sourceNameId(Utils::SmallStringView sourceName) const override
{
SourceNameId sourceNameId = m_sourcePathCache.id(sourceName);
return m_sourceNameCache.id(sourceName);
}
SourceId sourceId(SourceContextId sourceContextId, Utils::SmallStringView sourceName) const override
{
SourceNameId sourceNameId = m_sourceNameCache.id(sourceName);
return SourceId::create(sourceNameId, sourceContextId);
}
@@ -81,10 +85,10 @@ public:
SourcePath sourcePath(SourceId sourceId) const override
{
if (Q_UNLIKELY(!sourceId.isValid()))
if (!sourceId) [[unlikely]]
throw NoSourcePathForInvalidSourceId();
auto sourceName = m_sourcePathCache.value(sourceId.mainId());
auto sourceName = m_sourceNameCache.value(sourceId.mainId());
Utils::PathString sourceContextPath = m_sourceContextPathCache.value(sourceId.contextId());
@@ -93,12 +97,20 @@ public:
Utils::PathString sourceContextPath(SourceContextId sourceContextId) const override
{
if (Q_UNLIKELY(!sourceContextId.isValid()))
if (!sourceContextId) [[unlikely]]
throw NoSourceContextPathForInvalidSourceContextId();
return m_sourceContextPathCache.value(sourceContextId);
}
Utils::SmallString sourceName(SourceNameId sourceNameId) const override
{
if (!sourceNameId) [[unlikely]]
throw NoSourceNameForInvalidSourceNameId();
return m_sourceNameCache.value(sourceNameId);
}
private:
class SourceContextStorageAdapter
{
@@ -157,7 +169,7 @@ private:
SourceContextStorageAdapter m_sourceContextStorageAdapter;
SourceNameStorageAdapter m_sourceNameStorageAdapter;
mutable SourceContextPathCache m_sourceContextPathCache{m_sourceContextStorageAdapter};
mutable SourceNameCache m_sourcePathCache{m_sourceNameStorageAdapter};
mutable SourceNameCache m_sourceNameCache{m_sourceNameStorageAdapter};
};
} // namespace QmlDesigner

View File

@@ -28,12 +28,16 @@ public:
Utils::SmallStringView sourceName) const
= 0;
virtual SourceNameId sourceNameId(Utils::SmallStringView sourceName) const = 0;
virtual SourceContextId sourceContextId(Utils::SmallStringView sourceContextPath) const = 0;
virtual SourcePath sourcePath(SourceId sourceId) const = 0;
virtual Utils::PathString sourceContextPath(SourceContextId sourceContextId) const = 0;
virtual Utils::SmallString sourceName(SourceNameId sourceNameId) const = 0;
protected:
~SourcePathCacheInterface() = default;
};

View File

@@ -56,4 +56,14 @@ const char *SourceNameIdDoesNotExists::what() const noexcept
return "The source id does not exist in the database!";
}
NoSourceNameForInvalidSourceNameId::NoSourceNameForInvalidSourceNameId()
{
category().threadEvent("NoSourceNameForInvalidSourceNameId");
}
const char *NoSourceNameForInvalidSourceNameId::what() const noexcept
{
return "You cannot get a source name for an invalid source name id!";
}
} // namespace QmlDesigner

View File

@@ -27,6 +27,13 @@ public:
const char *what() const noexcept override;
};
class QMLDESIGNERCORE_EXPORT NoSourceNameForInvalidSourceNameId : public SourcePathError
{
public:
NoSourceNameForInvalidSourceNameId();
const char *what() const noexcept override;
};
class QMLDESIGNERCORE_EXPORT NoSourceContextPathForInvalidSourceContextId : public SourcePathError
{
public:

View File

@@ -24,6 +24,10 @@ public:
sourceId,
(QmlDesigner::SourceContextId sourceContextId, Utils::SmallStringView sourceName),
(const, override));
MOCK_METHOD(QmlDesigner::SourceNameId,
sourceNameId,
(Utils::SmallStringView sourceName),
(const, override));
MOCK_METHOD(QmlDesigner::SourcePath,
sourcePath,
(QmlDesigner::SourceId sourceId),
@@ -36,6 +40,10 @@ public:
sourceContextPath,
(QmlDesigner::SourceContextId directoryPathId),
(const, override));
MOCK_METHOD(Utils::SmallString,
sourceName,
(QmlDesigner::SourceNameId sourceName),
(const, override));
MOCK_METHOD(void, populateIfEmpty, (), (override));
};

View File

@@ -372,4 +372,78 @@ TEST_F(SourcePathCache, get_file_path_after_populate_if_empty)
ASSERT_THAT(path, Eq("/path/to/file.cpp"));
}
TEST_F(SourcePathCache, source_name_id_calls_fetch_source_name_id)
{
EXPECT_CALL(storageMock, fetchSourceNameId(Eq("file.cpp")));
cache.sourceNameId(Utils::SmallString("file.cpp"));
}
TEST_F(SourcePathCache, second_source_name_id_calls_not_fetch_source_name_id)
{
cache.sourceNameId(Utils::SmallString("file.cpp"));
EXPECT_CALL(storageMock, fetchSourceNameId(Eq("file.cpp"))).Times(0);
cache.sourceNameId(Utils::SmallString("file.cpp"));
}
TEST_F(SourcePathCache, source_name_id)
{
auto id = cache.sourceNameId(Utils::SmallString("file.cpp"));
ASSERT_THAT(id, Eq(sourceNameId42));
}
TEST_F(SourcePathCache, source_name_id_is_already_in_cache)
{
auto firstId = cache.sourceNameId(Utils::SmallString("file.cpp"));
auto secondId = cache.sourceNameId(Utils::SmallString("file.cpp"));
ASSERT_THAT(secondId, firstId);
}
TEST_F(SourcePathCache, throw_for_getting_source_name_with_an_invalid_id)
{
SourceNameId sourceNameId;
ASSERT_THROW(cache.sourceName(sourceNameId), QmlDesigner::NoSourceNameForInvalidSourceNameId);
}
TEST_F(SourcePathCache, get_a_source_name)
{
SourceNameId sourceNameId{sourceNameId42};
auto sourceName = cache.sourceName(sourceNameId);
ASSERT_THAT(sourceName, Eq(Utils::SmallStringView{"file.cpp"}));
}
TEST_F(SourcePathCache, get_a_source_name_with_cached_source_name_id)
{
SourceNameId sourceNameId{sourceNameId42};
cache.sourceName(sourceNameId);
auto sourceName = cache.sourceName(sourceNameId);
ASSERT_THAT(sourceName, Eq(Utils::SmallStringView{"file.cpp"}));
}
TEST_F(SourcePathCache, source_name_calls_fetch_source_name)
{
EXPECT_CALL(storageMock, fetchSourceName(Eq(sourceNameId42)));
cache.sourceName(sourceNameId42);
}
TEST_F(SourcePathCache, second_source_name_calls_not_fetch_source_name)
{
cache.sourceName(sourceNameId42);
EXPECT_CALL(storageMock, fetchSourceName(_)).Times(0);
cache.sourceName(sourceNameId42);
}
} // namespace