diff --git a/CMakeLists.txt b/CMakeLists.txt index ba8638dd..6e5ccaff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,7 +76,8 @@ add_subdirectory(src/lib) add_subdirectory(src/external) set_source_files_properties(${CLANG_FILES} PROPERTIES COMPILE_FLAGS "-fno-rtti") -set_source_files_properties(${EXTERNAL_C_FILES} PROPERTIES COMPILE_FLAGS "-std=gnu89") +set_source_files_properties(${EXTERNAL_FILES} PROPERTIES COMPILE_FLAGS "-w") +set_source_files_properties(${EXTERNAL_C_FILES} PROPERTIES COMPILE_FLAGS "-std=gnu89 -w") add_library(${LIB_PROJECT_NAME} ${LIB_FILES} ${CLANG_FILES} ${EXTERNAL_FILES} ${EXTERNAL_C_FILES}) diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt index b35c4877..2c35af7c 100644 --- a/bin/test/data/log/test_log.txt +++ b/bin/test/data/log/test_log.txt @@ -4,7 +4,6 @@ Node.cpp WARNING: Cannot change NodeType after it was already set from namespace Edge.cpp ERROR: Nodes are not plain copies. Edge.cpp ERROR: Edge usage can't go from Node undefined to Node undefined Edge.cpp ERROR: Edge usage can't go from Node undefined to Node undefined -Edge.cpp ERROR: Edge usage can't go from Node undefined to Node undefined Settings.cpp WARNING: File for Settings not found. ConfigManager.cpp WARNING: value Bool is not present in config. ConfigManager.cpp WARNING: value Int is not present in config. @@ -20,28 +19,28 @@ ConfigManager.cpp WARNING: value Int is not present in config. ConfigManager.cpp WARNING: value Float is not present in config. ConfigManager.cpp WARNING: value String is not present in config. ConfigManager.cpp WARNING: value NewBool is not present in config. -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp -Storage.cpp ERROR: NO filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp +Storage.cpp ERROR: No filenode created for file: file.cpp TextAccess.cpp WARNING: Index 'firstLine' has to be lower or equal index 'lastLine', is 3 > 2 TextAccess.cpp WARNING: Tried to access index 10. Maximum index is 8 TextAccess.cpp WARNING: Tried to access index 10. Maximum index is 8 diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp index 97a7b825..2bc8d5dc 100644 --- a/src/lib/Project.cpp +++ b/src/lib/Project.cpp @@ -88,8 +88,6 @@ void Project::clearStorage() { m_storage = std::make_shared(); m_storageAccessProxy->setSubject(m_storage.get()); - - Token::resetNextId(); } void Project::parseCode() diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index f29d9b2a..e6d34e0d 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -537,8 +537,6 @@ Id Storage::getIdForEdgeWithName(const std::string& name) const int sourceId = getIdForNodeWithName(sourceName); int targetId = getIdForNodeWithName(targetName); - int sourceId2 = m_sqliteStorage.getNodeByName(sourceName).id; - int targetId2 = m_sqliteStorage.getNodeByName(targetName).id; return m_sqliteStorage.getEdgeBySourceTargetType(sourceId, targetId, type).id; } @@ -586,13 +584,10 @@ std::vector Storage::getAutocompletionMatches(const std::string& qu std::shared_ptr Storage::getGraphForActiveTokenIds(const std::vector& tokenIds) const { - std::shared_ptr graph = std::make_shared(); + std::shared_ptr g = std::make_shared(); + Graph* graph = g.get(); - if (tokenIds.size() == 0) - { - return graph; - } - else if (tokenIds.size() == 1) + if (tokenIds.size() == 1) { const Id elementId = tokenIds[0]; @@ -605,16 +600,12 @@ std::shared_ptr Storage::getGraphForActiveTokenIds(const std::vector& std::vector edges = m_sqliteStorage.getEdgesBySourceId(node.id); utility::append(edges, m_sqliteStorage.getEdgesByTargetId(node.id)); - const Node::NodeTypeMask varFuncMask = - Node::NODE_UNDEFINED_FUNCTION | Node::NODE_FUNCTION | Node::NODE_METHOD | - Node::NODE_UNDEFINED_VARIABLE | Node::NODE_GLOBAL_VARIABLE | Node::NODE_FIELD; - - const Node::NodeTypeMask typeMask = Node::NODE_STRUCT | Node::NODE_CLASS; + const Node::NodeTypeMask nodeTypeMask = Node::NODE_STRUCT | Node::NODE_CLASS; + const Edge::EdgeTypeMask edgeTypeMask = Edge::EDGE_TYPE_USAGE | Edge::EDGE_TYPE_OF; for (size_t i = 0; i < edges.size(); i++) { - if (((node.type & varFuncMask) > 0 && ((edges[i].type & Edge::EDGE_AGGREGATION) > 0)) || // TODO: remove this since we do not save any aggregation edges - ((node.type & typeMask) > 0 && ((edges[i].type & (Edge::EDGE_TYPE_USAGE | Edge::EDGE_TYPE_OF)) > 0))) + if ((node.type & nodeTypeMask) > 0 && (edges[i].type & edgeTypeMask) > 0) { continue; } @@ -645,7 +636,7 @@ std::shared_ptr Storage::getGraphForActiveTokenIds(const std::vector& } } - return graph; + return g; } std::vector Storage::getActiveTokenIdsForId(Id tokenId, Id* declarationId) const // TODO: rename: getActiveElementIdsForId; TODO: make separate function for declarationId @@ -695,7 +686,7 @@ std::vector Storage::getTokenIdsForQuery(std::string query) const // TODO: r } std::string tokenName = tokenizedQuery[0]; tokenName.erase(std::remove(tokenName.begin(), tokenName.end(), '"'), tokenName.end()); - const int delimiterPos = tokenName.rfind(','); + const size_t delimiterPos = tokenName.rfind(','); if (delimiterPos != tokenName.npos) { @@ -1031,6 +1022,7 @@ int Storage::addSourceLocation(int elementNodeId, const ParseLocation& location, if (location.filePath.empty()) { LOG_ERROR("no filename set!"); + return 0; } else { @@ -1095,7 +1087,7 @@ std::vector Storage::getAllChildNodeIds(const Id nodeId) const return childNodeIds; } -void Storage::addEdgeAndAllChildrenToGraph(const Id edgeId, std::shared_ptr graph) const +void Storage::addEdgeAndAllChildrenToGraph(const Id edgeId, Graph* graph) const { StorageEdge storageEdge = m_sqliteStorage.getEdgeById(edgeId); @@ -1105,15 +1097,14 @@ void Storage::addEdgeAndAllChildrenToGraph(const Id edgeId, std::shared_ptrgetNodeById(storageEdge.sourceNodeId); Node* targetNode = graph->getNodeById(storageEdge.targetNodeId); - std::shared_ptr edge = std::make_shared(edgeId, Edge::intToType(storageEdge.type), sourceNode, targetNode); - graph->addEdge(edge.get()); + graph->addEdge(edgeId, Edge::intToType(storageEdge.type), sourceNode, targetNode); } -void Storage::addNodeAndAllChildrenToGraph(const Id nodeId, std::shared_ptr graph) const +void Storage::addNodeAndAllChildrenToGraph(const Id nodeId, Graph* graph) const { if (!graph->getNodeById(nodeId)) { - graph->addNode(createNodeForNodeId(nodeId)); + addNodeToGraph(nodeId, graph); } std::queue unprocessedEdges; @@ -1133,19 +1124,16 @@ void Storage::addNodeAndAllChildrenToGraph(const Id nodeId, std::shared_ptrgetNodeById(storageEdge.sourceNodeId); if (!sourceNode) { - sourceNode = createNodeForNodeId(storageEdge.sourceNodeId); - graph->addNode(sourceNode); + sourceNode = addNodeToGraph(storageEdge.sourceNodeId, graph); } Node* targetNode = graph->getNodeById(storageEdge.targetNodeId); if (!targetNode) { - targetNode = createNodeForNodeId(storageEdge.targetNodeId); - graph->addNode(targetNode); + targetNode = addNodeToGraph(storageEdge.targetNodeId, graph); } - std::shared_ptr edge = std::make_shared(storageEdge.id, Edge::intToType(storageEdge.type), sourceNode, targetNode); - graph->addEdge(edge.get()); + graph->addEdge(storageEdge.id, Edge::intToType(storageEdge.type), sourceNode, targetNode); { std::vector edges = m_sqliteStorage.getEdgesBySourceType(storageEdge.targetNodeId, Edge::EDGE_MEMBER); @@ -1157,7 +1145,7 @@ void Storage::addNodeAndAllChildrenToGraph(const Id nodeId, std::shared_ptr graph) const +void Storage::addAggregationEdgesToGraph(const Id nodeId, Graph* graph) const { struct EdgeInfo { @@ -1245,8 +1233,7 @@ void Storage::addAggregationEdgesToGraph(const Id nodeId, std::shared_ptr Node* sourceNode = graph->getNodeById(nodeId); if (!sourceNode) { - sourceNode = createNodeForNodeId(nodeId); - graph->addNode(sourceNode); + sourceNode = addNodeToGraph(nodeId, graph); } for (std::map>::const_iterator it = connectedParentNodeIds.begin(); it != connectedParentNodeIds.end(); it++) @@ -1255,8 +1242,7 @@ void Storage::addAggregationEdgesToGraph(const Id nodeId, std::shared_ptr Node* targetNode = graph->getNodeById(aggregationTargetNodeId); if (!targetNode) { - targetNode = createNodeForNodeId(aggregationTargetNodeId); - graph->addNode(targetNode); + targetNode = addNodeToGraph(aggregationTargetNodeId, graph); } std::shared_ptr componentAggregation = std::make_shared(); @@ -1265,19 +1251,18 @@ void Storage::addAggregationEdgesToGraph(const Id nodeId, std::shared_ptr componentAggregation->addAggregationId(edgeInfo.edgeId, edgeInfo.forward); } - std::shared_ptr edge = std::make_shared(0, Edge::EDGE_AGGREGATION, sourceNode, targetNode); + Edge* edge = graph->addEdge(0, Edge::EDGE_AGGREGATION, sourceNode, targetNode); edge->addComponentAggregation(componentAggregation); - graph->addEdge(edge.get()); } } -Node* Storage::createNodeForNodeId(const Id nodeId) const +Node* Storage::addNodeToGraph(const Id nodeId, Graph* graph) const { StorageNode storageNode = m_sqliteStorage.getNodeById(nodeId); - Node* n = new Node( // TODO: causes memory leaks. refactor graph to operate on shared ptrs. + + return graph->addNode( storageNode.id, Node::intToType(storageNode.type), std::make_shared(m_sqliteStorage.getNameHierarchyById(storageNode.nameId)) ); - return n; } diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index 5160d5bb..84ceda2b 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -149,10 +149,10 @@ private: std::vector getDirectChildNodeIds(const Id nodeId) const; std::vector getAllChildNodeIds(const Id nodeId) const; - void addEdgeAndAllChildrenToGraph(const Id edgeId, std::shared_ptr graph) const; - void addNodeAndAllChildrenToGraph(const Id nodeId, std::shared_ptr graph) const; - void addAggregationEdgesToGraph(const Id nodeId, std::shared_ptr graph) const; - Node* createNodeForNodeId(const Id nodeId) const; + void addEdgeAndAllChildrenToGraph(const Id edgeId, Graph* graph) const; + void addNodeAndAllChildrenToGraph(const Id nodeId, Graph* graph) const; + void addAggregationEdgesToGraph(const Id nodeId, Graph* graph) const; + Node* addNodeToGraph(const Id nodeId, Graph* graph) const; SearchIndex m_tokenIndex; SqliteStorage m_sqliteStorage; diff --git a/src/lib/data/graph/Edge.cpp b/src/lib/data/graph/Edge.cpp index 262ee50a..a1bda188 100644 --- a/src/lib/data/graph/Edge.cpp +++ b/src/lib/data/graph/Edge.cpp @@ -50,17 +50,8 @@ Edge::EdgeType Edge::intToType(int value) case 0x8000: return EDGE_AGGREGATION; } -} -Edge::Edge(EdgeType type, Node* from, Node* to) - : m_type(type) - , m_from(from) - , m_to(to) -{ - m_from->addEdge(this); - m_to->addEdge(this); - - checkType(); + return EDGE_NONE; } Edge::Edge(Id id, EdgeType type, Node* from, Node* to) @@ -189,6 +180,8 @@ std::string Edge::getTypeString(EdgeType type) { switch (type) { + case EDGE_NONE: + return "none"; case EDGE_MEMBER: return "child"; case EDGE_TYPE_OF: @@ -265,6 +258,9 @@ bool Edge::checkType() const switch (m_type) { + case EDGE_NONE: + break; + case EDGE_MEMBER: if (!m_from->isType(typeMask | Node::NODE_NAMESPACE | functionMask) || (!m_from->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE) && m_to->isType(Node::NODE_NAMESPACE)) || diff --git a/src/lib/data/graph/Edge.h b/src/lib/data/graph/Edge.h index d79ac4a1..ca4380f3 100644 --- a/src/lib/data/graph/Edge.h +++ b/src/lib/data/graph/Edge.h @@ -11,12 +11,14 @@ class TokenComponentAggregation; class TokenComponentAccess; class TokenComponentDataType; -class Edge: public Token +class Edge + : public Token { public: typedef int EdgeTypeMask; enum EdgeType : EdgeTypeMask { + EDGE_NONE = 0x0, EDGE_MEMBER = 0x1, EDGE_TYPE_OF = 0x2, EDGE_RETURN_TYPE_OF = 0x4, // unused: see Storage::addFunctionNode() @@ -36,10 +38,10 @@ public: EDGE_AGGREGATION = 0x8000 }; + static int typeToInt(EdgeType type); static EdgeType intToType(int value); - Edge(EdgeType type, Node* from, Node* to); Edge(Id id, EdgeType type, Node* from, Node* to); Edge(const Edge& other, Node* from, Node* to); virtual ~Edge(); diff --git a/src/lib/data/graph/Graph.cpp b/src/lib/data/graph/Graph.cpp index 3f88fb2e..748e6144 100644 --- a/src/lib/data/graph/Graph.cpp +++ b/src/lib/data/graph/Graph.cpp @@ -12,24 +12,12 @@ Graph::~Graph() m_nodes.clear(); } -void Graph::copy(const Graph* other) -{ - clear(); - add(other); -} - void Graph::clear() { m_edges.clear(); m_nodes.clear(); } -void Graph::add(const Graph* other) -{ - other->forEachNode(std::bind(&Graph::addNode, this, std::placeholders::_1)); - other->forEachEdge(std::bind(&Graph::addEdge, this, std::placeholders::_1)); -} - void Graph::forEachNode(std::function func) const { for (const std::pair>& node : m_nodes) @@ -52,17 +40,36 @@ void Graph::forEachToken(std::function func) const forEachEdge(func); } -void Graph::addNode(Node* node) +Node* Graph::addNode(Id id, Node::NodeType type, std::shared_ptr nameComponent) { - addNodeAsPlainCopy(node); + Node* n = getNodeById(id); + if (n) + { + return n; + } + + std::shared_ptr node = std::make_shared(id, type, nameComponent); + m_nodes.emplace(node->getId(), node); + return node.get(); } -void Graph::addEdge(Edge* edge) +Edge* Graph::addEdge(Id id, Edge::EdgeType type, Node* from, Node* to) { - if (getNodeById(edge->getFrom()->getId()) && getNodeById(edge->getTo()->getId())) + Edge* e = getEdgeById(id); + if (e) { - addEdgeAsPlainCopy(edge); + return e; } + + if (!getNodeById(from->getId()) || !getNodeById(to->getId())) + { + LOG_ERROR("Can't add edge, without adding the nodes first."); + return nullptr; + } + + std::shared_ptr edge = std::make_shared(id, type, from, to); + m_edges.emplace(edge->getId(), edge); + return edge.get(); } size_t Graph::getNodeCount() const diff --git a/src/lib/data/graph/Graph.h b/src/lib/data/graph/Graph.h index 1e948694..095f9562 100644 --- a/src/lib/data/graph/Graph.h +++ b/src/lib/data/graph/Graph.h @@ -14,24 +14,20 @@ public: Graph(); virtual ~Graph(); - // FilterableGraph implementation // deprecated - virtual void copy(const Graph* other); - virtual void clear(); + void clear(); - virtual void add(const Graph* other); + void forEachNode(std::function func) const; + void forEachEdge(std::function func) const; + void forEachToken(std::function func) const; - virtual void forEachNode(std::function func) const; - virtual void forEachEdge(std::function func) const; - virtual void forEachToken(std::function func) const; + Node* addNode(Id id, Node::NodeType type, std::shared_ptr nameComponent); + Edge* addEdge(Id id, Edge::EdgeType type, Node* from, Node* to); - virtual void addNode(Node* node); - virtual void addEdge(Edge* edge); + size_t getNodeCount() const; + size_t getEdgeCount() const; - virtual size_t getNodeCount() const; - virtual size_t getEdgeCount() const; - - virtual Node* getNodeById(Id id) const; - virtual Edge* getEdgeById(Id id) const; + Node* getNodeById(Id id) const; + Edge* getEdgeById(Id id) const; const std::map>& getNodes() const; const std::map>& getEdges() const; @@ -57,15 +53,14 @@ public: void print(std::ostream& ostream) const; void printBasic(std::ostream& ostream) const; -protected: - std::map> m_nodes; - std::map> m_edges; - private: Graph(const Graph&); void operator=(const Graph&); void removeEdgeInternal(Edge* edge); + + std::map> m_nodes; + std::map> m_edges; }; std::ostream& operator<<(std::ostream& ostream, const Graph& graph); diff --git a/src/lib/data/graph/Node.cpp b/src/lib/data/graph/Node.cpp index dc17caaa..b02250ce 100644 --- a/src/lib/data/graph/Node.cpp +++ b/src/lib/data/graph/Node.cpp @@ -2,7 +2,6 @@ #include -#include "utility/file/FileSystem.h" #include "utility/logging/logging.h" #include "data/graph/token_component/TokenComponentAbstraction.h" @@ -12,10 +11,89 @@ #include "data/graph/token_component/TokenComponentSignature.h" #include "data/graph/token_component/TokenComponentFilePath.h" -Node::Node(NodeType type, std::shared_ptr nameComponent) - : m_type(type) - , m_nameComponent(nameComponent) +std::string Node::getTypeString(NodeType type) { + switch (type) + { + case NODE_UNDEFINED: + return "undefined"; + case NODE_UNDEFINED_FUNCTION: + return "undefined_function"; + case NODE_UNDEFINED_VARIABLE: + return "undefined_variable"; + case NODE_UNDEFINED_TYPE: + return "undefined_type"; + case NODE_CLASS: + return "class"; + case NODE_STRUCT: + return "struct"; + case NODE_GLOBAL_VARIABLE: + return "global"; + case NODE_FIELD: + return "field"; + case NODE_FUNCTION: + return "function"; + case NODE_METHOD: + return "method"; + case NODE_NAMESPACE: + return "namespace"; + case NODE_ENUM: + return "enum"; + case NODE_ENUM_CONSTANT: + return "enum_constant"; + case NODE_TYPEDEF: + return "typedef"; + case NODE_TEMPLATE_PARAMETER_TYPE: + return "template_parameter_type"; + case NODE_FILE: + return "file"; + } + return ""; +} + +int Node::typeToInt(NodeType type) +{ + return type; +} + +Node::NodeType Node::intToType(int value) +{ + switch (value) + { + case 0x1: + return NODE_UNDEFINED; + case 0x2: + return NODE_UNDEFINED_TYPE; + case 0x4: + return NODE_UNDEFINED_VARIABLE; + case 0x8: + return NODE_UNDEFINED_FUNCTION; + case 0x10: + return NODE_STRUCT; + case 0x20: + return NODE_CLASS; + case 0x40: + return NODE_GLOBAL_VARIABLE; + case 0x80: + return NODE_FIELD; + case 0x100: + return NODE_FUNCTION; + case 0x200: + return NODE_METHOD; + case 0x400: + return NODE_NAMESPACE; + case 0x800: + return NODE_ENUM; + case 0x1000: + return NODE_ENUM_CONSTANT; + case 0x2000: + return NODE_TYPEDEF; + case 0x4000: + return NODE_TEMPLATE_PARAMETER_TYPE; + case 0x8000: + return NODE_FILE; + } + return NODE_UNDEFINED; } Node::Node(Id id, NodeType type, std::shared_ptr nameComponent) @@ -338,91 +416,6 @@ void Node::addComponentFilePath(std::shared_ptr componen } } -std::string Node::getTypeString(NodeType type) -{ - switch (type) - { - case NODE_UNDEFINED: - return "undefined"; - case NODE_UNDEFINED_FUNCTION: - return "undefined_function"; - case NODE_UNDEFINED_VARIABLE: - return "undefined_variable"; - case NODE_UNDEFINED_TYPE: - return "undefined_type"; - case NODE_CLASS: - return "class"; - case NODE_STRUCT: - return "struct"; - case NODE_GLOBAL_VARIABLE: - return "global"; - case NODE_FIELD: - return "field"; - case NODE_FUNCTION: - return "function"; - case NODE_METHOD: - return "method"; - case NODE_NAMESPACE: - return "namespace"; - case NODE_ENUM: - return "enum"; - case NODE_ENUM_CONSTANT: - return "enum_constant"; - case NODE_TYPEDEF: - return "typedef"; - case NODE_TEMPLATE_PARAMETER_TYPE: - return "template_parameter_type"; - case NODE_FILE: - return "file"; - } - return ""; -} - -int Node::typeToInt(NodeType type) -{ - return type; -} - -Node::NodeType Node::intToType(int value) -{ - switch (value) - { - case 0x1: - return NODE_UNDEFINED; - case 0x2: - return NODE_UNDEFINED_TYPE; - case 0x4: - return NODE_UNDEFINED_VARIABLE; - case 0x8: - return NODE_UNDEFINED_FUNCTION; - case 0x10: - return NODE_STRUCT; - case 0x20: - return NODE_CLASS; - case 0x40: - return NODE_GLOBAL_VARIABLE; - case 0x80: - return NODE_FIELD; - case 0x100: - return NODE_FUNCTION; - case 0x200: - return NODE_METHOD; - case 0x400: - return NODE_NAMESPACE; - case 0x800: - return NODE_ENUM; - case 0x1000: - return NODE_ENUM_CONSTANT; - case 0x2000: - return NODE_TYPEDEF; - case 0x4000: - return NODE_TEMPLATE_PARAMETER_TYPE; - case 0x8000: - return NODE_FILE; - } - return NODE_UNDEFINED; -} - std::string Node::getTypeString() const { return getTypeString(m_type); diff --git a/src/lib/data/graph/Node.h b/src/lib/data/graph/Node.h index a9279c58..16256f23 100644 --- a/src/lib/data/graph/Node.h +++ b/src/lib/data/graph/Node.h @@ -16,7 +16,8 @@ class TokenComponentStatic; class TokenComponentSignature; class TokenComponentFilePath; -class Node: public Token +class Node + : public Token { public: typedef int NodeTypeMask; @@ -47,7 +48,6 @@ public: static int typeToInt(NodeType type); static NodeType intToType(int value); - Node(NodeType type, std::shared_ptr nameComponent); Node(Id id, NodeType type, std::shared_ptr nameComponent); Node(const Node& other); virtual ~Node(); diff --git a/src/lib/data/graph/Token.cpp b/src/lib/data/graph/Token.cpp index 32af0fbf..69014910 100644 --- a/src/lib/data/graph/Token.cpp +++ b/src/lib/data/graph/Token.cpp @@ -3,16 +3,6 @@ #include "data/location/TokenLocation.h" #include "utility/logging/logging.h" -void Token::resetNextId() -{ - s_nextId = 1; -} - -Token::Token() // TODO: remove this constructor - : m_id(s_nextId++) -{ -} - Token::Token(Id id) : m_id(id) { @@ -64,5 +54,3 @@ void Token::addComponent(std::shared_ptr component) { m_components.push_back(component); } - -Id Token::s_nextId = 1; diff --git a/src/lib/data/graph/Token.h b/src/lib/data/graph/Token.h index 35d65557..6fc94dc7 100644 --- a/src/lib/data/graph/Token.h +++ b/src/lib/data/graph/Token.h @@ -10,10 +10,7 @@ class Token { public: - static void resetNextId(); - - Token(); - Token(Id id); + explicit Token(Id id); virtual ~Token(); Id getId() const; @@ -42,8 +39,6 @@ protected: void copyComponentsFrom(const Token& other); private: - static Id s_nextId; - void operator=(const Token&); const Id m_id; // own id diff --git a/src/test/GraphTestSuite.h b/src/test/GraphTestSuite.h index 1873875f..3408b64f 100644 --- a/src/test/GraphTestSuite.h +++ b/src/test/GraphTestSuite.h @@ -8,17 +8,6 @@ class GraphTestSuite : public CxxTest::TestSuite { public: - void test_tokens_get_unique_id() - { - TestToken a; - TestToken b; - TestToken c; - - TS_ASSERT_DIFFERS(a.getId(), c.getId()); - TS_ASSERT_DIFFERS(a.getId(), b.getId()); - TS_ASSERT_DIFFERS(b.getId(), c.getId()); - } - void test_tokens_save_location_ids() { TestToken a; @@ -104,7 +93,7 @@ public: void test_nodes_are_nodes() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); TS_ASSERT(a.isNode()); TS_ASSERT(!a.isEdge()); @@ -112,9 +101,9 @@ public: void test_edges_are_edges() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Edge e(Edge::EDGE_TYPE_OF, &a, &b); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); TS_ASSERT(!e.isNode()); TS_ASSERT(e.isEdge()); @@ -122,27 +111,27 @@ public: void test_set_type_of_node_from_constructor() { - Node n(Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("A", "::"))); + Node n(1, Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("A", "::"))); TS_ASSERT_EQUALS(Node::NODE_FUNCTION, n.getType()); } void test_set_type_of_node_from_undefined() { - Node n(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node n(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("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(Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); + Node n(3, Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("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(Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); + Node n(4, Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); Node n2(n); TS_ASSERT_DIFFERS(&n, &n2); @@ -153,25 +142,25 @@ public: void test_node_type_bit_masking() { - Node n(Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("A", "::"))); + Node n(1, Node::NODE_NAMESPACE, std::make_shared(utility::splitToVector("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(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Edge e(Edge::EDGE_TYPE_OF, &a, &b); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); TS_ASSERT_EQUALS(Edge::EDGE_TYPE_OF, e.getType()); } void test_edge_can_be_copied_and_keeps_same_id() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Edge e(Edge::EDGE_TYPE_OF, &a, &b); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); Edge e2(e, &a, &b); TS_ASSERT_DIFFERS(&e, &e2); @@ -181,9 +170,9 @@ public: void test_edge_type_bit_masking() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Edge e(Edge::EDGE_TYPE_OF, &a, &b); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Edge e(3, Edge::EDGE_TYPE_OF, &a, &b); TS_ASSERT(e.isType(Edge::EDGE_MEMBER | Edge::EDGE_CALL | Edge::EDGE_TYPE_OF)); TS_ASSERT(!e.isType(Edge::EDGE_USAGE | Edge::EDGE_MEMBER | Edge::EDGE_CALL)); @@ -191,11 +180,11 @@ public: void test_node_finds_child_node() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Edge e(Edge::EDGE_MEMBER, &a, &b); - Edge e2(Edge::EDGE_MEMBER, &a, &c); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Edge e(4, Edge::EDGE_MEMBER, &a, &b); + Edge e2(5, Edge::EDGE_MEMBER, &a, &c); Node* x = a.findChildNode( [](Node* n) @@ -210,11 +199,11 @@ public: void test_node_can_not_find_child_node() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Edge e(Edge::EDGE_MEMBER, &a, &b); - Edge e2(Edge::EDGE_MEMBER, &a, &c); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Edge e(4, Edge::EDGE_MEMBER, &a, &b); + Edge e2(5, Edge::EDGE_MEMBER, &a, &c); Node* x = a.findChildNode( [](Node* n) @@ -228,11 +217,11 @@ public: void test_node_visits_child_nodes() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Edge e(Edge::EDGE_MEMBER, &a, &b); - Edge e2(Edge::EDGE_MEMBER, &a, &c); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Edge e(4, Edge::EDGE_MEMBER, &a, &b); + Edge e2(5, Edge::EDGE_MEMBER, &a, &c); std::vector children; a.forEachChildNode( @@ -249,13 +238,13 @@ public: void test_node_has_references() { - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Node d(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("D", "::"))); - Edge e(Edge::EDGE_MEMBER, &a, &b); - Edge e2(Edge::EDGE_MEMBER, &a, &c); - Edge e3(Edge::EDGE_USAGE, &c, &d); + Node a(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node b(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node c(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Node d(4, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("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); TS_ASSERT(a.hasReferences()); TS_ASSERT(!b.hasReferences()); @@ -265,20 +254,17 @@ public: void test_graph_saves_nodes() { Graph graph; - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - - graph.addNode(&a); - graph.addNode(&b); + Node* a = graph.addNode(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node* b = graph.addNode(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); TS_ASSERT_EQUALS(2, graph.getNodeCount()); TS_ASSERT_EQUALS(0, graph.getEdgeCount()); - TS_ASSERT(graph.getNodeById(a.getId())); - TS_ASSERT_EQUALS("A", graph.getNodeById(a.getId())->getName()); + TS_ASSERT(graph.getNodeById(a->getId())); + TS_ASSERT_EQUALS("A", graph.getNodeById(a->getId())->getName()); - TS_ASSERT(graph.getNodeById(b.getId())); - TS_ASSERT_EQUALS("B", graph.getNodeById(b.getId())->getName()); + TS_ASSERT(graph.getNodeById(b->getId())); + TS_ASSERT_EQUALS("B", graph.getNodeById(b->getId())->getName()); TS_ASSERT(!graph.getNodeById(0)); } @@ -287,43 +273,29 @@ public: { Graph graph; - Node a(Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("B", "::"))); + Node* a = graph.addNode(1, Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("A", "::"))); + Node* b = graph.addNode(2, Node::NODE_FUNCTION, std::make_shared(utility::splitToVector("B", "::"))); - Edge e(Edge::EDGE_CALL, &a, &b); - - graph.addEdge(&e); - - TS_ASSERT_EQUALS(0, graph.getNodeCount()); - TS_ASSERT_EQUALS(0, graph.getEdgeCount()); - - TS_ASSERT(!graph.getEdgeById(e.getId())); - - graph.addNode(&a); - graph.addNode(&b); - - graph.addEdge(&e); + Edge* e = graph.addEdge(3, Edge::EDGE_CALL, a, b); TS_ASSERT_EQUALS(2, graph.getNodeCount()); TS_ASSERT_EQUALS(1, graph.getEdgeCount()); - TS_ASSERT(graph.getEdgeById(e.getId())); - TS_ASSERT_EQUALS(Edge::EDGE_CALL, graph.getEdgeById(e.getId())->getType()); + TS_ASSERT(graph.getEdgeById(e->getId())); + TS_ASSERT_EQUALS(Edge::EDGE_CALL, graph.getEdgeById(e->getId())->getType()); } void test_graph_removes_nodes() { Graph graph; - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - graph.addNode(&a); - graph.addNode(&b); + Node* a = graph.addNode(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + graph.addNode(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); TS_ASSERT_EQUALS(2, graph.getNodeCount()); TS_ASSERT_EQUALS(0, graph.getEdgeCount()); - graph.removeNode(graph.getNodeById(a.getId())); + graph.removeNode(graph.getNodeById(a->getId())); TS_ASSERT_EQUALS(1, graph.getNodeCount()); } @@ -331,33 +303,23 @@ public: void test_graph_removes_unreferenced_nodes() { Graph graph; - Node a(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); - Node b(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); - Node c(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); - Node d(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("D", "::"))); - Node e(Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("E", "::"))); - Edge e1(Edge::EDGE_MEMBER, &a, &b); - Edge e2(Edge::EDGE_MEMBER, &a, &c); - Edge e3(Edge::EDGE_USAGE, &c, &d); - Edge e4(Edge::EDGE_MEMBER, &b, &e); + Node* a = graph.addNode(1, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("A", "::"))); + Node* b = graph.addNode(2, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("B", "::"))); + Node* c = graph.addNode(3, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("C", "::"))); + Node* d = graph.addNode(4, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("D", "::"))); + Node* e = graph.addNode(5, Node::NODE_UNDEFINED, std::make_shared(utility::splitToVector("E", "::"))); - graph.addNode(&a); - graph.addNode(&b); - graph.addNode(&c); - graph.addNode(&d); - graph.addNode(&e); - - graph.addEdge(&e1); - graph.addEdge(&e2); - graph.addEdge(&e3); - graph.addEdge(&e4); + graph.addEdge(6, Edge::EDGE_MEMBER, a, b); + graph.addEdge(7, Edge::EDGE_MEMBER, a, c); + graph.addEdge(8, Edge::EDGE_USAGE, c, d); + graph.addEdge(9, Edge::EDGE_MEMBER, b, e); TS_ASSERT_EQUALS(5, graph.getNodeCount()); TS_ASSERT_EQUALS(4, graph.getEdgeCount()); - TS_ASSERT(!graph.removeNodeIfUnreferencedRecursive(graph.getNodeById(a.getId()))); - TS_ASSERT(graph.removeNodeIfUnreferencedRecursive(graph.getNodeById(b.getId()))); + TS_ASSERT(!graph.removeNodeIfUnreferencedRecursive(graph.getNodeById(a->getId()))); + TS_ASSERT(graph.removeNodeIfUnreferencedRecursive(graph.getNodeById(b->getId()))); TS_ASSERT_EQUALS(3, graph.getNodeCount()); TS_ASSERT_EQUALS(2, graph.getEdgeCount()); @@ -368,6 +330,7 @@ private: { public: TestToken() + :Token(0) { } diff --git a/src/test/SqliteStorageTestSuite.h b/src/test/SqliteStorageTestSuite.h index 2c79602f..508b2110 100644 --- a/src/test/SqliteStorageTestSuite.h +++ b/src/test/SqliteStorageTestSuite.h @@ -87,7 +87,6 @@ public: SqliteStorage storage(databasePath); storage.beginTransaction(); int parentId = storage.addNameHierarchyElement("a"); - int childId = storage.addNameHierarchyElement("b", parentId); storage.removeNameHierarchyElement(parentId); storage.commitTransaction(); elementCount = storage.getNameHierarchyElementCount(); diff --git a/src/test/StorageTestSuite.h b/src/test/StorageTestSuite.h index 03bfaac7..44a85141 100644 --- a/src/test/StorageTestSuite.h +++ b/src/test/StorageTestSuite.h @@ -197,7 +197,7 @@ public: void test_storage_saves_method_as_member() { TestStorage storage; - Id id = storage.onMethodParsed( + storage.onMethodParsed( validLocation(1), ParseFunction(typeUsage("void"), createNameHierarchy("Class::isMethod"), parameters("bool")), ParserClient::ACCESS_PROTECTED, @@ -247,8 +247,8 @@ public: void test_storage_saves_enum_as_member() { TestStorage storage; - Id id = - storage.onEnumParsed(validLocation(1), createNameHierarchy("Class::Category"), + storage.onEnumParsed( + validLocation(1), createNameHierarchy("Class::Category"), ParserClient::ACCESS_PRIVATE, validLocation(2) ); @@ -319,7 +319,7 @@ public: storage.onMethodParsed(validLocation(9), a, ParserClient::ACCESS_PRIVATE, ParserClient::ABSTRACTION_VIRTUAL, validLocation(4)); storage.onMethodParsed(validLocation(7), b, ParserClient::ACCESS_PRIVATE, ParserClient::ABSTRACTION_NONE, validLocation(3)); - Id id = storage.onMethodOverrideParsed(validLocation(4), a, b); + storage.onMethodOverrideParsed(validLocation(4), a, b); TS_ASSERT(storage.getIdForEdgeWithName(Edge::getTypeString(Edge::EDGE_OVERRIDE) + ":A::isMethod->B::isMethod") != 0); }