data: start adding node name hierarchy from bottom and stop when a name was already added

This commit is contained in:
Eberhard Graether
2018-09-25 00:52:09 +02:00
parent a870858bb6
commit 83f41e04b1
9 changed files with 31 additions and 20 deletions
+18 -7
View File
@@ -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)
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
}
+3 -3
View File
@@ -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));