data: compare signatures when storing overloaded functions and methods

Function and method nodes are now distincted by their signature when added to the graph. A different node for each
overloaded declaration is created with the signature as member field.

fortune cookie message = Deine harte Arbeit wird schnell belohnt werden.
This commit is contained in:
Eberhard Graether
2014-07-10 16:08:59 +02:00
parent cdeece6231
commit e2ec5ffee2
11 changed files with 283 additions and 106 deletions
+1 -1
View File
@@ -97,7 +97,7 @@ std::string Edge::getTypeString() const
return "is type of";
case EDGE_RETURN_TYPE_OF:
return "has return type";
case EDGE_PARAMETER_OF:
case EDGE_PARAMETER_TYPE_OF:
return "has parameter of type";
case EDGE_INHERITANCE:
return "is derived from";
+1 -1
View File
@@ -17,7 +17,7 @@ public:
EDGE_MEMBER,
EDGE_TYPE_OF,
EDGE_RETURN_TYPE_OF,
EDGE_PARAMETER_OF,
EDGE_PARAMETER_TYPE_OF,
EDGE_USAGE,
EDGE_CALL,
EDGE_INHERITANCE
+37 -8
View File
@@ -74,6 +74,27 @@ Node* Graph::createNodeHierarchy(const std::string& fullName)
return insertNodeHierarchy(fullName);
}
Node* Graph::createNodeHierarchyWithDistinctSignature(const std::string& fullName, const std::string& signature)
{
Node* node = getNode(fullName);
if (node)
{
if (node->getSignature() == signature)
{
return node;
}
node = insertNode(fullName, node->getParentNode());
}
else
{
node = insertNodeHierarchy(fullName);
}
node->setSignature(signature);
return node;
}
Edge* Graph::createEdge(Edge::EdgeType type, Node* from, Node* to)
{
Edge* edge = getEdge(type, from, to);
@@ -288,14 +309,7 @@ Node* Graph::insertNodeHierarchy(const std::string& fullName)
if (!childNode)
{
std::shared_ptr<Node> childNodePtr = std::make_shared<Node>(Node::NODE_UNDEFINED, name);
m_nodes.push_back(childNodePtr);
childNode = childNodePtr.get();
if (node)
{
createEdge(Edge::EDGE_MEMBER, node, childNode);
}
childNode = insertNode(name, node);
}
node = childNode;
@@ -304,6 +318,21 @@ Node* Graph::insertNodeHierarchy(const std::string& fullName)
return node;
}
Node* Graph::insertNode(const std::string& fullName, Node* parentNode)
{
std::shared_ptr<Node> nodePtr = std::make_shared<Node>(Node::NODE_UNDEFINED, fullName);
m_nodes.push_back(nodePtr);
Node* node = nodePtr.get();
if (parentNode)
{
createEdge(Edge::EDGE_MEMBER, parentNode, node);
}
return node;
}
Edge* Graph::insertEdge(Edge::EdgeType type, Node* from, Node* to)
{
std::shared_ptr<Edge> edgePtr = std::make_shared<Edge>(type, from, to);
+2
View File
@@ -22,6 +22,7 @@ public:
Token* getTokenById(Id id) const;
Node* createNodeHierarchy(const std::string& fullName);
Node* createNodeHierarchyWithDistinctSignature(const std::string& fullName, const std::string& signature);
Edge* createEdge(Edge::EdgeType type, Node* from, Node* to);
void removeNode(Node* node);
@@ -48,6 +49,7 @@ private:
static const std::string DELIMITER;
Node* insertNodeHierarchy(const std::string& fullName);
Node* insertNode(const std::string& fullName, Node* parentNode);
Edge* insertEdge(Edge::EdgeType type, Node* from, Node* to);
void removeEdgeInternal(Edge* edge);
+67 -11
View File
@@ -2,6 +2,8 @@
#include <sstream>
// #include "data/graph/edgeComponent/EdgeComponentDataType.h"
// #include "data/type/DataType.h"
#include "utility/logging/logging.h"
Node::Node(NodeType type, const std::string& name)
@@ -62,24 +64,24 @@ void Node::removeEdge(Edge* edge)
m_edges.erase(find(m_edges.begin(), m_edges.end(), edge));
}
Node* Node::getParentNode() const
{
Edge* edge = getMemberEdge();
if (edge)
{
return edge->getFrom();
}
return nullptr;
}
Edge* Node::getMemberEdge() const
{
Edge* edge = findEdgeOfType(Edge::EDGE_MEMBER,
return findEdgeOfType(Edge::EDGE_MEMBER,
[this](Edge* e)
{
return e->getTo() == this;
}
);
if (edge)
{
return edge;
}
else
{
LOG_WARNING("Child edge was not found, node " + getName() + " has no parent node.");
return nullptr;
}
}
Edge* Node::findEdge(std::function<bool(Edge*)> func) const
@@ -94,6 +96,11 @@ Edge* Node::findEdge(std::function<bool(Edge*)> func) const
return NULL;
}
Edge* Node::findEdgeOfType(Edge::EdgeType type) const
{
return findEdgeOfType(type, [](Edge* e){ return true; });
}
Edge* Node::findEdgeOfType(Edge::EdgeType type, std::function<bool(Edge*)> func) const
{
std::vector<Edge*>::const_iterator it = find_if(m_edges.begin(), m_edges.end(),
@@ -188,6 +195,55 @@ void Node::setStatic(bool isStatic)
m_isStatic = isStatic;
}
std::string Node::getSignature() const
{
// Signature generation from edges failed, because parameter edges to same type are bundled.
// std::string str;
// Edge* returnTypeEdge = findEdgeOfType(Edge::EDGE_RETURN_TYPE_OF);
// str += returnTypeEdge->getComponent<EdgeComponentDataType>()->getDataType().getFullTypeName() + " " + m_name + "(";
// forEachEdgeOfType(Edge::EDGE_PARAMETER_TYPE_OF,
// [&str](Edge* edge)
// {
// str += edge->getComponent<EdgeComponentDataType>()->getDataType().getFullTypeName() + ", ";
// }
// );
// if (*str.rbegin() == ' ')
// {
// str.pop_back();
// str.pop_back();
// }
// str += ")";
// if (isConst())
// {
// str += " const";
// }
// return str;
return m_signature;
}
void Node::setSignature(const std::string& signature)
{
if (m_type != NODE_FUNCTION && m_type != NODE_METHOD && m_type != NODE_UNDEFINED)
{
LOG_ERROR("Signature is not supported on node of type " + getTypeString(m_type));
return;
}
if (m_signature.size())
{
LOG_ERROR("Signature was already set before.");
return;
}
m_signature = signature;
}
std::string Node::getTypeString(NodeType type) const
{
switch (type)
+7
View File
@@ -39,9 +39,11 @@ public:
void addEdge(Edge* edge);
void removeEdge(Edge* edge);
Node* getParentNode() const;
Edge* getMemberEdge() const;
Edge* findEdge(std::function<bool(Edge*)> func) const;
Edge* findEdgeOfType(Edge::EdgeType type) const;
Edge* findEdgeOfType(Edge::EdgeType type, std::function<bool(Edge*)> func) const;
void forEachEdge(std::function<void(Edge*)> func) const;
@@ -60,6 +62,9 @@ public:
bool isStatic() const;
void setStatic(bool isStatic);
std::string getSignature() const;
void setSignature(const std::string& signature);
// Logging.
std::string getTypeString(NodeType type) const;
std::string getAsString() const;
@@ -76,6 +81,8 @@ private:
// Additional fields for different NodeTypes.
bool m_isConst;
bool m_isStatic;
std::string m_signature;
};
std::ostream& operator<<(std::ostream& ostream, const Node& node);