diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp index c9362a1a..59b1e831 100644 --- a/src/lib/Project.cpp +++ b/src/lib/Project.cpp @@ -122,6 +122,8 @@ void Project::parseCode() void Project::logStats() const { + // m_storage->logGraph(); + // m_storage->logLocations(); m_storage->logStats(); } diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 9af7566e..66cac021 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -307,16 +307,7 @@ Id Storage::onFunctionParsed( ){ log("function", function.getFullName(), location); - Node* node = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function); - - addTokenLocation(node, location); - addTokenLocation(node, scopeLocation, true); - - addTypeEdge(node, Edge::EDGE_RETURN_TYPE_OF, function.returnType); - for (const ParseTypeUsage& parameter : function.parameters) - { - addTypeEdge(node, Edge::EDGE_PARAMETER_TYPE_OF, parameter); - } + Node* node = addFunctionNode(Node::NODE_FUNCTION, function, location, scopeLocation); return node->getId(); } @@ -327,7 +318,7 @@ Id Storage::onMethodParsed( ){ log("method", method.getFullName(), location); - Node* node = addNodeHierarchyWithDistinctSignature(Node::NODE_METHOD, method); + Node* node = addFunctionNode(Node::NODE_METHOD, method, location, scopeLocation); if (!node->getMemberEdge()) { @@ -351,15 +342,6 @@ Id Storage::onMethodParsed( addAccess(node, access); addAbstraction(node, abstraction); - addTokenLocation(node, location); - addTokenLocation(node, scopeLocation, true); - - addTypeEdge(node, Edge::EDGE_RETURN_TYPE_OF, method.returnType); - for (const ParseTypeUsage& parameter : method.parameters) - { - addTypeEdge(node, Edge::EDGE_PARAMETER_TYPE_OF, parameter); - } - return node->getId(); } @@ -658,7 +640,7 @@ Id Storage::onTemplateFunctionSpecializationParsed( ){ log("function template specialization", specializedFunction.getFullName(), location); - Node* specializedFunctionNode = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, specializedFunction); + Node* specializedFunctionNode = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, specializedFunction); Node* templateFunctionNode = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, templateFunction); Edge* templateSpecializationEdge = @@ -1244,6 +1226,30 @@ TokenComponentAbstraction* Storage::addAbstraction(Node* node, ParserClient::Abs return nullptr; } +Node* Storage::addFunctionNode( + Node::NodeType nodeType, const ParseFunction& function, + const ParseLocation& location, const ParseLocation& scopeLocation +){ + Node* node = addNodeHierarchyWithDistinctSignature(nodeType, function); + + addTokenLocation(node, location); + addTokenLocation(node, scopeLocation, true); + + // Currently the edge types EDGE_RETURN_TYPE_OF and EDGE_PARAMETER_TYPE_OF don't get used, because they are not + // distinctly displayed compared to EDGE_TYPE_USAGE in the Graph, so they get drawn on top of each other, but only + // the upper one can be clicked. + + // addTypeEdge(node, Edge::EDGE_RETURN_TYPE_OF, function.returnType); + addTypeEdge(node, Edge::EDGE_TYPE_USAGE, function.returnType); + for (const ParseTypeUsage& parameter : function.parameters) + { + // addTypeEdge(node, Edge::EDGE_PARAMETER_TYPE_OF, parameter); + addTypeEdge(node, Edge::EDGE_TYPE_USAGE, parameter); + } + + return node; +} + Edge* Storage::addTypeEdge(Node* node, Edge::EdgeType edgeType, const ParseTypeUsage& typeUsage) { if (!typeUsage.location.isValid()) diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index d2639052..05c7fb66 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -150,6 +150,9 @@ private: TokenComponentAbstraction::AbstractionType convertAbstractionType(ParserClient::AbstractionType abstraction) const; TokenComponentAbstraction* addAbstraction(Node* node, ParserClient::AbstractionType abstraction); + Node* addFunctionNode( + Node::NodeType nodeType, const ParseFunction& function, + const ParseLocation& location, const ParseLocation& scopeLocation); Edge* addTypeEdge(Node* node, Edge::EdgeType edgeType, const ParseTypeUsage& typeUsage); TokenLocation* addTokenLocation(Token* token, const ParseLocation& location, bool isScope = false); diff --git a/src/lib/data/graph/Edge.h b/src/lib/data/graph/Edge.h index 22f5be5d..6eab0493 100644 --- a/src/lib/data/graph/Edge.h +++ b/src/lib/data/graph/Edge.h @@ -19,8 +19,8 @@ public: { EDGE_MEMBER = 0x1, EDGE_TYPE_OF = 0x2, - EDGE_RETURN_TYPE_OF = 0x4, - EDGE_PARAMETER_TYPE_OF = 0x8, + EDGE_RETURN_TYPE_OF = 0x4, // unused: see Storage::addFunctionNode() + EDGE_PARAMETER_TYPE_OF = 0x8, // unused: see Storage::addFunctionNode() EDGE_TYPE_USAGE = 0x10, EDGE_USAGE = 0x20, EDGE_CALL = 0x40,