data: start adding node name hierarchy from bottom and stop when a name was already added
This commit is contained in:
@@ -201,22 +201,33 @@ Edge::EdgeType ParserClientImpl::referenceKindToEdgeType(ReferenceKind reference
|
||||
|
||||
Id ParserClientImpl::addNodeHierarchy(const NameHierarchy& nameHierarchy, NodeType nodeType)
|
||||
{
|
||||
Id parentNodeId = 0;
|
||||
for (size_t i = 1; i <= nameHierarchy.size(); i++)
|
||||
Id childNodeId = 0;
|
||||
Id firstNodeId = 0;
|
||||
for (size_t i = nameHierarchy.size(); i > 0; i--)
|
||||
{
|
||||
const NodeType currentType = (i == nameHierarchy.size() ? nodeType : NodeType::NODE_SYMBOL); // TODO: rename to unknown!
|
||||
|
||||
Id nodeId = m_storage->addNode(StorageNodeData(
|
||||
std::pair<Id, bool> ret = m_storage->addNode(StorageNodeData(
|
||||
NodeType::typeToInt(currentType.getType()), NameHierarchy::serializeRange(nameHierarchy, 0, i)));
|
||||
|
||||
if (parentNodeId != 0)
|
||||
if (!firstNodeId)
|
||||
{
|
||||
addEdge(Edge::EDGE_MEMBER, parentNodeId, nodeId);
|
||||
firstNodeId = ret.first;
|
||||
}
|
||||
|
||||
parentNodeId = nodeId;
|
||||
if (childNodeId != 0)
|
||||
{
|
||||
addEdge(Edge::EDGE_MEMBER, ret.first, childNodeId);
|
||||
}
|
||||
|
||||
if (!ret.second)
|
||||
{
|
||||
return firstNodeId;
|
||||
}
|
||||
|
||||
childNodeId = ret.first;
|
||||
}
|
||||
return parentNodeId;
|
||||
return firstNodeId;
|
||||
}
|
||||
|
||||
Id ParserClientImpl::addFileName(const FilePath& filePath)
|
||||
|
||||
@@ -102,7 +102,7 @@ void IntermediateStorage::setFilesWithErrorsIncomplete()
|
||||
}
|
||||
}
|
||||
|
||||
Id IntermediateStorage::addNode(const StorageNodeData& nodeData)
|
||||
std::pair<Id, bool> IntermediateStorage::addNode(const StorageNodeData& nodeData)
|
||||
{
|
||||
auto it = m_nodesIndex.find(nodeData);
|
||||
if (it != m_nodesIndex.end())
|
||||
@@ -112,13 +112,13 @@ Id IntermediateStorage::addNode(const StorageNodeData& nodeData)
|
||||
{
|
||||
storedNode.type = nodeData.type;
|
||||
}
|
||||
return storedNode.id;
|
||||
return std::make_pair(storedNode.id, false);
|
||||
}
|
||||
|
||||
Id nodeId = m_nextId++;
|
||||
m_nodes.emplace_back(nodeId, nodeData);
|
||||
m_nodesIndex.emplace(nodeData, m_nodes.size() - 1);
|
||||
return nodeId;
|
||||
return std::make_pair(nodeId, true);
|
||||
}
|
||||
|
||||
void IntermediateStorage::addSymbol(const StorageSymbol& symbol)
|
||||
|
||||
@@ -30,7 +30,7 @@ public:
|
||||
void setAllFilesIncomplete();
|
||||
void setFilesWithErrorsIncomplete();
|
||||
|
||||
Id addNode(const StorageNodeData& nodeData) override;
|
||||
std::pair<Id, bool> addNode(const StorageNodeData& nodeData) override;
|
||||
void addSymbol(const StorageSymbol& symbol) override;
|
||||
void addFile(const StorageFile& file) override;
|
||||
Id addEdge(const StorageEdgeData& edgeData) override;
|
||||
|
||||
@@ -46,9 +46,9 @@ PersistentStorage::PersistentStorage(const FilePath& dbPath, const FilePath& boo
|
||||
m_commandIndex.finishSetup();
|
||||
}
|
||||
|
||||
Id PersistentStorage::addNode(const StorageNodeData& data)
|
||||
std::pair<Id, bool> PersistentStorage::addNode(const StorageNodeData& data)
|
||||
{
|
||||
return m_sqliteIndexStorage.addNode(data).id;
|
||||
return std::make_pair(m_sqliteIndexStorage.addNode(data).id, true);
|
||||
}
|
||||
|
||||
void PersistentStorage::addSymbol(const StorageSymbol& data)
|
||||
|
||||
@@ -19,7 +19,7 @@ class PersistentStorage
|
||||
public:
|
||||
PersistentStorage(const FilePath& dbPath, const FilePath& bookmarkPath);
|
||||
|
||||
Id addNode(const StorageNodeData& data) override;
|
||||
std::pair<Id, bool> addNode(const StorageNodeData& data) override;
|
||||
void addSymbol(const StorageSymbol& data) override;
|
||||
void addFile(const StorageFile& data) override;
|
||||
Id addEdge(const StorageEdgeData& data) override;
|
||||
|
||||
@@ -37,7 +37,7 @@ void Storage::inject(Storage* injected)
|
||||
injected->forEachNode(
|
||||
[&](const StorageNode& injectedData)
|
||||
{
|
||||
const Id ownId = addNode(injectedData);
|
||||
const Id ownId = addNode(injectedData).first;
|
||||
if (ownId != 0)
|
||||
{
|
||||
injectedIdToOwnElementId[injectedData.id] = ownId;
|
||||
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
Storage();
|
||||
virtual ~Storage() = default;
|
||||
|
||||
virtual Id addNode(const StorageNodeData& data) = 0;
|
||||
virtual std::pair<Id, bool> addNode(const StorageNodeData& data) = 0;
|
||||
virtual void addSymbol(const StorageSymbol& data) = 0;
|
||||
virtual void addFile(const StorageFile& data) = 0;
|
||||
virtual Id addEdge(const StorageEdgeData& data) = 0;
|
||||
|
||||
@@ -906,7 +906,7 @@ private:
|
||||
|
||||
Id addFileToStorage(const FilePath& filePath, const std::string& modificationTime, bool indexed, bool complete, std::shared_ptr<PersistentStorage> storage)
|
||||
{
|
||||
const Id id = storage->addNode(StorageNodeData(NodeType::NODE_FILE, NameHierarchy::serialize(NameHierarchy(filePath.wstr(), NAME_DELIMITER_FILE))));
|
||||
const Id id = storage->addNode(StorageNodeData(NodeType::NODE_FILE, NameHierarchy::serialize(NameHierarchy(filePath.wstr(), NAME_DELIMITER_FILE)))).first;
|
||||
storage->addFile(StorageFile(id, filePath.wstr(), modificationTime, indexed, complete));
|
||||
return id;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public:
|
||||
std::wstring filePath = L"path/to/test.h";
|
||||
|
||||
std::shared_ptr<IntermediateStorage> intermetiateStorage = std::make_shared<IntermediateStorage>();
|
||||
Id id = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FILE), NameHierarchy::serialize(NameHierarchy(filePath, NAME_DELIMITER_FILE))));
|
||||
Id id = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FILE), NameHierarchy::serialize(NameHierarchy(filePath, NAME_DELIMITER_FILE)))).first;
|
||||
intermetiateStorage->addFile(StorageFile(id, filePath, "someTime", true, true));
|
||||
|
||||
storage.inject(intermetiateStorage.get());
|
||||
@@ -57,10 +57,10 @@ public:
|
||||
|
||||
std::shared_ptr<IntermediateStorage> intermetiateStorage = std::make_shared<IntermediateStorage>();
|
||||
|
||||
Id aId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_STRUCT), NameHierarchy::serialize(a)));
|
||||
Id aId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_STRUCT), NameHierarchy::serialize(a))).first;
|
||||
intermetiateStorage->addSymbol(StorageSymbol(aId, DEFINITION_EXPLICIT));
|
||||
|
||||
Id bId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FIELD), NameHierarchy::serialize(b)));
|
||||
Id bId = intermetiateStorage->addNode(StorageNodeData(NodeType::typeToInt(NodeType::NODE_FIELD), NameHierarchy::serialize(b))).first;
|
||||
intermetiateStorage->addSymbol(StorageSymbol(bId, DEFINITION_EXPLICIT));
|
||||
intermetiateStorage->addEdge(StorageEdgeData(Edge::typeToInt(Edge::EDGE_MEMBER), aId, bId));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user