data: saving NameHierarchy directly to Node without TokenComponentName

This commit is contained in:
Eberhard Graether
2015-09-23 12:45:58 +02:00
parent b07bc7ed19
commit 391082160c
13 changed files with 69 additions and 219 deletions
-2
View File
@@ -113,8 +113,6 @@ add_files(
data/graph/token_component/TokenComponentConst.h
data/graph/token_component/TokenComponentFilePath.cpp
data/graph/token_component/TokenComponentFilePath.h
data/graph/token_component/TokenComponentName.cpp
data/graph/token_component/TokenComponentName.h
data/graph/token_component/TokenComponentStatic.cpp
data/graph/token_component/TokenComponentStatic.h
+1 -2
View File
@@ -9,7 +9,6 @@
#include "utility/utilityString.h"
#include "data/graph/token_component/TokenComponentAggregation.h"
#include "data/graph/token_component/TokenComponentName.h"
#include "data/graph/Graph.h"
#include "data/location/TokenLocation.h"
#include "data/location/TokenLocationFile.h"
@@ -1442,7 +1441,7 @@ Node* Storage::addNodeToGraph(const Id nodeId, Graph* graph) const
node = graph->createNode(
storageNode.id,
Node::intToType(storageNode.type),
std::make_shared<TokenComponentNameCached>(m_tokenIndex.getNameHierarchyForTokenId(nodeId))
m_tokenIndex.getNameHierarchyForTokenId(nodeId)
);
}
+2 -2
View File
@@ -40,7 +40,7 @@ void Graph::forEachToken(std::function<void(Token*)> func) const
forEachEdge(func);
}
Node* Graph::createNode(Id id, Node::NodeType type, std::shared_ptr<TokenComponentName> nameComponent)
Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy)
{
Node* n = getNodeById(id);
if (n)
@@ -48,7 +48,7 @@ Node* Graph::createNode(Id id, Node::NodeType type, std::shared_ptr<TokenCompone
return n;
}
std::shared_ptr<Node> node = std::make_shared<Node>(id, type, nameComponent);
std::shared_ptr<Node> node = std::make_shared<Node>(id, type, nameHierarchy);
m_nodes.emplace(node->getId(), node);
return node.get();
}
+1 -1
View File
@@ -20,7 +20,7 @@ public:
void forEachEdge(std::function<void(Edge*)> func) const;
void forEachToken(std::function<void(Token*)> func) const;
Node* createNode(Id id, Node::NodeType type, std::shared_ptr<TokenComponentName> nameComponent);
Node* createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy);
Edge* createEdge(Id id, Edge::EdgeType type, Node* from, Node* to);
size_t getNodeCount() const;
+5 -16
View File
@@ -6,7 +6,6 @@
#include "data/graph/token_component/TokenComponentAbstraction.h"
#include "data/graph/token_component/TokenComponentConst.h"
#include "data/graph/token_component/TokenComponentName.h"
#include "data/graph/token_component/TokenComponentStatic.h"
#include "data/graph/token_component/TokenComponentFilePath.h"
@@ -97,17 +96,17 @@ Node::NodeType Node::intToType(int value)
return NODE_UNDEFINED;
}
Node::Node(Id id, NodeType type, std::shared_ptr<TokenComponentName> nameComponent)
Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy)
: Token(id)
, m_type(type)
, m_nameComponent(nameComponent)
, m_nameHierarchy(nameHierarchy)
{
}
Node::Node(const Node& other)
: Token(other)
, m_type(other.m_type)
, m_nameComponent(other.m_nameComponent->copyComponentName())
, m_nameHierarchy(other.m_nameHierarchy)
{
}
@@ -139,22 +138,12 @@ bool Node::isType(NodeTypeMask mask) const
std::string Node::getName() const
{
return m_nameComponent->getName();
return m_nameHierarchy.getName();
}
std::string Node::getFullName() const
{
return m_nameComponent->getFullName();
}
const TokenComponentName* Node::getTokenComponentName() const
{
if (m_nameComponent)
{
return m_nameComponent.get();
}
return nullptr;
return m_nameHierarchy.getFullName();
}
const std::vector<Edge*>& Node::getEdges() const
+3 -6
View File
@@ -8,12 +8,11 @@
#include "data/graph/Edge.h"
#include "data/graph/Token.h"
#include "data/name/NameHierarchy.h"
class TokenComponentAbstraction;
class TokenComponentConst;
class TokenComponentName;
class TokenComponentStatic;
class TokenComponentSignature;
class TokenComponentFilePath;
class Node
@@ -50,7 +49,7 @@ public:
static const NodeTypeMask NODE_NOT_VISIBLE;
Node(Id id, NodeType type, std::shared_ptr<TokenComponentName> nameComponent);
Node(Id id, NodeType type, NameHierarchy nameHierarchy);
Node(const Node& other);
virtual ~Node();
@@ -60,7 +59,6 @@ public:
std::string getName() const;
std::string getFullName() const;
const TokenComponentName* getTokenComponentName() const;
const std::vector<Edge*>& getEdges() const;
@@ -90,7 +88,6 @@ public:
void addComponentAbstraction(std::shared_ptr<TokenComponentAbstraction> component);
void addComponentConst(std::shared_ptr<TokenComponentConst> component);
void addComponentStatic(std::shared_ptr<TokenComponentStatic> component);
void addComponentSignature(std::shared_ptr<TokenComponentSignature> component);
void addComponentFilePath(std::shared_ptr<TokenComponentFilePath> component);
// Logging.
@@ -103,7 +100,7 @@ private:
std::vector<Edge*> m_edges;
NodeType m_type;
std::shared_ptr<TokenComponentName> m_nameComponent;
NameHierarchy m_nameHierarchy;
};
std::ostream& operator<<(std::ostream& ostream, const Node& node);
@@ -1,85 +0,0 @@
#include "data/graph/token_component/TokenComponentName.h"
#include "utility/utilityString.h"
#include "data/search/SearchIndex.h"
TokenComponentName::TokenComponentName()
{
}
TokenComponentName::~TokenComponentName()
{
}
std::shared_ptr<TokenComponentName> TokenComponentName::copyComponentName() const
{
return std::dynamic_pointer_cast<TokenComponentName>(copy());
}
TokenComponentNameReferenced::TokenComponentNameReferenced(const SearchNode* searchNode)
: m_searchNode(searchNode)
{
}
TokenComponentNameReferenced::~TokenComponentNameReferenced()
{
}
std::shared_ptr<TokenComponent> TokenComponentNameReferenced::copy() const
{
return std::make_shared<TokenComponentNameCached>(m_searchNode->getNameHierarchy());
}
std::string TokenComponentNameReferenced::getName() const
{
return m_searchNode->getName();
}
std::string TokenComponentNameReferenced::getFullName() const
{
return m_searchNode->getFullName();
}
const SearchNode* TokenComponentNameReferenced::getSearchNode() const
{
return m_searchNode;
}
TokenComponentNameCached::TokenComponentNameCached(const std::vector<std::string>& nameHierarchy)
: m_nameHierarchy(nameHierarchy)
{
}
TokenComponentNameCached::TokenComponentNameCached(const NameHierarchy& nameHierarchy)
{
for (size_t i = 0; i < nameHierarchy.size(); i++)
{
m_nameHierarchy.push_back(nameHierarchy[i]->getFullName());
}
}
TokenComponentNameCached::~TokenComponentNameCached()
{
}
std::shared_ptr<TokenComponent> TokenComponentNameCached::copy() const
{
return std::make_shared<TokenComponentNameCached>(m_nameHierarchy);
}
std::string TokenComponentNameCached::getName() const
{
return m_nameHierarchy.back();
}
std::string TokenComponentNameCached::getFullName() const
{
return utility::join(m_nameHierarchy, "::");
}
const SearchNode* TokenComponentNameCached::getSearchNode() const
{
return nullptr;
}
@@ -1,64 +0,0 @@
#ifndef TOKEN_COMPONENT_NAME_H
#define TOKEN_COMPONENT_NAME_H
#include <string>
#include "data/graph/token_component/TokenComponent.h"
#include "data/name/NameHierarchy.h"
#include "data/search/SearchNode.h"
class TokenComponentName
: public TokenComponent
{
public:
TokenComponentName();
virtual ~TokenComponentName();
std::shared_ptr<TokenComponentName> copyComponentName() const;
virtual std::string getName() const = 0;
virtual std::string getFullName() const = 0;
virtual const SearchNode* getSearchNode() const = 0;
};
class TokenComponentNameReferenced
: public TokenComponentName
{
public:
TokenComponentNameReferenced(const SearchNode* searchNode);
virtual ~TokenComponentNameReferenced();
virtual std::shared_ptr<TokenComponent> copy() const;
virtual std::string getName() const;
virtual std::string getFullName() const;
virtual const SearchNode* getSearchNode() const;
private:
const SearchNode* m_searchNode;
};
class TokenComponentNameCached
: public TokenComponentName
{
public:
TokenComponentNameCached(const std::vector<std::string>& nameHierarchy);
TokenComponentNameCached(const NameHierarchy& nameHierarchy);
virtual ~TokenComponentNameCached();
virtual std::shared_ptr<TokenComponent> copy() const;
virtual std::string getName() const;
virtual std::string getFullName() const;
virtual const SearchNode* getSearchNode() const;
private:
std::vector<std::string> m_nameHierarchy; // TODO: use const NameHierarchy here
};
#endif // TOKEN_COMPONENT_NAME_H
+1 -1
View File
@@ -1,6 +1,6 @@
#include "data/name/NameElement.h"
NameElement::NameElement(std::string name)
NameElement::NameElement(const std::string& name)
: m_name(name)
{
}
+1 -1
View File
@@ -6,7 +6,7 @@
class NameElement
{
public:
NameElement(std::string name);
NameElement(const std::string& name);
~NameElement();
std::string getFullName() const;
+15
View File
@@ -4,6 +4,11 @@ NameHierarchy::NameHierarchy()
{
}
NameHierarchy::NameHierarchy(const std::string& name)
{
push(std::make_shared<NameElement>(name));
}
NameHierarchy::~NameHierarchy()
{
}
@@ -46,3 +51,13 @@ std::string NameHierarchy::getFullName() const
}
return name;
}
std::string NameHierarchy::getName() const
{
if (m_elements.size())
{
return m_elements.back()->getFullName();
}
return "";
}
+2
View File
@@ -11,6 +11,7 @@ class NameHierarchy
{
public:
NameHierarchy();
NameHierarchy(const std::string& name);
~NameHierarchy();
void push(std::shared_ptr<NameElement> element);
@@ -20,6 +21,7 @@ public:
size_t size() const;
std::string getFullName() const;
std::string getName() const;
private:
std::vector<std::shared_ptr<NameElement>> m_elements;
+38 -39
View File
@@ -3,7 +3,6 @@
#include "utility/utilityString.h"
#include "data/graph/Graph.h"
#include "data/graph/token_component/TokenComponentName.h"
class GraphTestSuite : public CxxTest::TestSuite
{
@@ -93,7 +92,7 @@ public:
void test_nodes_are_nodes()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
TS_ASSERT(a.isNode());
TS_ASSERT(!a.isEdge());
@@ -101,8 +100,8 @@ public:
void test_edges_are_edges()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Edge e(3, Edge::EDGE_TYPE_OF, &a, &b);
TS_ASSERT(!e.isNode());
@@ -111,27 +110,27 @@ public:
void test_set_type_of_node_from_constructor()
{
Node n(1, Node::NODE_FUNCTION, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node n(1, Node::NODE_FUNCTION, NameHierarchy("A"));
TS_ASSERT_EQUALS(Node::NODE_FUNCTION, n.getType());
}
void test_set_type_of_node_from_undefined()
{
Node n(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node n(2, Node::NODE_UNDEFINED, NameHierarchy("A"));
n.setType(Node::NODE_CLASS);
TS_ASSERT_EQUALS(Node::NODE_CLASS, n.getType());
}
void test_can_not_change_type_of_node_after_it_was_set()
{
Node n(3, Node::NODE_NAMESPACE, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node n(3, Node::NODE_NAMESPACE, NameHierarchy("A"));
n.setType(Node::NODE_CLASS);
TS_ASSERT_DIFFERS(Node::NODE_CLASS, n.getType());
}
void test_node_can_be_copied_and_keeps_same_id()
{
Node n(4, Node::NODE_NAMESPACE, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node n(4, Node::NODE_NAMESPACE, NameHierarchy("A"));
Node n2(n);
TS_ASSERT_DIFFERS(&n, &n2);
@@ -142,15 +141,15 @@ public:
void test_node_type_bit_masking()
{
Node n(1, Node::NODE_NAMESPACE, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node n(1, Node::NODE_NAMESPACE, NameHierarchy("A"));
TS_ASSERT(n.isType(Node::NODE_FUNCTION | Node::NODE_NAMESPACE | Node::NODE_CLASS));
TS_ASSERT(!n.isType(Node::NODE_FUNCTION | Node::NODE_METHOD | Node::NODE_CLASS));
}
void test_get_type_of_edges()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Edge e(3, Edge::EDGE_TYPE_OF, &a, &b);
TS_ASSERT_EQUALS(Edge::EDGE_TYPE_OF, e.getType());
@@ -158,8 +157,8 @@ public:
void test_edge_can_be_copied_and_keeps_same_id()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Edge e(3, Edge::EDGE_TYPE_OF, &a, &b);
Edge e2(e, &a, &b);
@@ -170,8 +169,8 @@ public:
void test_edge_type_bit_masking()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Edge e(3, Edge::EDGE_TYPE_OF, &a, &b);
TS_ASSERT(e.isType(Edge::EDGE_MEMBER | Edge::EDGE_CALL | Edge::EDGE_TYPE_OF));
@@ -180,9 +179,9 @@ public:
void test_node_finds_child_node()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node c(3, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("C", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C"));
Edge e(4, Edge::EDGE_MEMBER, &a, &b);
Edge e2(5, Edge::EDGE_MEMBER, &a, &c);
@@ -199,9 +198,9 @@ public:
void test_node_can_not_find_child_node()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node c(3, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("C", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C"));
Edge e(4, Edge::EDGE_MEMBER, &a, &b);
Edge e2(5, Edge::EDGE_MEMBER, &a, &c);
@@ -217,9 +216,9 @@ public:
void test_node_visits_child_nodes()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node c(3, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("C", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C"));
Edge e(4, Edge::EDGE_MEMBER, &a, &b);
Edge e2(5, Edge::EDGE_MEMBER, &a, &c);
@@ -238,10 +237,10 @@ public:
void test_node_has_references()
{
Node a(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node b(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node c(3, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("C", "::")));
Node d(4, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("D", "::")));
Node a(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node b(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Node c(3, Node::NODE_UNDEFINED, NameHierarchy("C"));
Node d(4, Node::NODE_UNDEFINED, NameHierarchy("D"));
Edge e(5, Edge::EDGE_MEMBER, &a, &b);
Edge e2(6, Edge::EDGE_MEMBER, &a, &c);
Edge e3(7, Edge::EDGE_USAGE, &c, &d);
@@ -254,8 +253,8 @@ public:
void test_graph_saves_nodes()
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node* b = graph.createNode(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node* a = graph.createNode(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node* b = graph.createNode(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
TS_ASSERT_EQUALS(2, graph.getNodeCount());
TS_ASSERT_EQUALS(0, graph.getEdgeCount());
@@ -273,8 +272,8 @@ public:
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_FUNCTION, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node* b = graph.createNode(2, Node::NODE_FUNCTION, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node* a = graph.createNode(1, Node::NODE_FUNCTION, NameHierarchy("A"));
Node* b = graph.createNode(2, Node::NODE_FUNCTION, NameHierarchy("B"));
Edge* e = graph.createEdge(3, Edge::EDGE_CALL, a, b);
@@ -289,8 +288,8 @@ public:
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
graph.createNode(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node* a = graph.createNode(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
graph.createNode(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
TS_ASSERT_EQUALS(2, graph.getNodeCount());
TS_ASSERT_EQUALS(0, graph.getEdgeCount());
@@ -304,11 +303,11 @@ public:
{
Graph graph;
Node* a = graph.createNode(1, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("A", "::")));
Node* b = graph.createNode(2, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("B", "::")));
Node* c = graph.createNode(3, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("C", "::")));
Node* d = graph.createNode(4, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("D", "::")));
Node* e = graph.createNode(5, Node::NODE_UNDEFINED, std::make_shared<TokenComponentNameCached>(utility::splitToVector("E", "::")));
Node* a = graph.createNode(1, Node::NODE_UNDEFINED, NameHierarchy("A"));
Node* b = graph.createNode(2, Node::NODE_UNDEFINED, NameHierarchy("B"));
Node* c = graph.createNode(3, Node::NODE_UNDEFINED, NameHierarchy("C"));
Node* d = graph.createNode(4, Node::NODE_UNDEFINED, NameHierarchy("D"));
Node* e = graph.createNode(5, Node::NODE_UNDEFINED, NameHierarchy("E"));
graph.createEdge(6, Edge::EDGE_MEMBER, a, b);
graph.createEdge(7, Edge::EDGE_MEMBER, a, c);