From c553e29ff8c250694f7d4cbdc4b0d0364558d4fd Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Thu, 8 Oct 2015 23:12:37 +0200 Subject: [PATCH] data: save undefined in database field instead of using different node types * expand toggle also for undefined classes * changed direction of some template edges * save same access component to specialized template functions and classes --- bin/app/data/color_schemes/bright.xml | 20 +- bin/app/data/color_schemes/dark.xml | 20 +- src/app/qt/element/QtAutocompletionList.cpp | 2 +- .../qt/view/graphElements/QtGraphNodeData.cpp | 10 +- src/lib/Project.cpp | 1 + src/lib/Project.h | 2 +- .../component/controller/GraphController.cpp | 10 +- src/lib/component/view/GraphViewStyle.cpp | 29 +-- src/lib/component/view/GraphViewStyle.h | 2 +- src/lib/data/SqliteStorage.cpp | 101 +++-------- src/lib/data/SqliteStorage.h | 4 +- src/lib/data/Storage.cpp | 171 +++++++++++------- src/lib/data/Storage.h | 8 +- src/lib/data/StorageTypes.h | 5 +- src/lib/data/graph/Edge.cpp | 32 ++-- src/lib/data/graph/Edge.h | 6 +- src/lib/data/graph/Graph.cpp | 4 +- src/lib/data/graph/Graph.h | 2 +- src/lib/data/graph/Node.cpp | 82 ++++----- src/lib/data/graph/Node.h | 39 ++-- 20 files changed, 249 insertions(+), 301 deletions(-) diff --git a/bin/app/data/color_schemes/bright.xml b/bin/app/data/color_schemes/bright.xml index 45bafba2..8203db9f 100644 --- a/bin/app/data/color_schemes/bright.xml +++ b/bin/app/data/color_schemes/bright.xml @@ -111,6 +111,10 @@ white + + #ededed + #ededed + #ededed #ededed @@ -123,10 +127,6 @@ #ededed #ededed - - #ededed - #ededed - #ededed #ededed @@ -144,10 +144,6 @@ #F4D07D #F4BC3D - - #F4D07D - #F4BC3D - #7BB5D4 @@ -157,10 +153,6 @@ #7BB5D4 #42A1D4 - - #7BB5D4 - #42A1D4 - #7BB5D4 #42A1D4 @@ -180,10 +172,6 @@ #CCC - - #DDD - #CCC - #DDD #CCC diff --git a/bin/app/data/color_schemes/dark.xml b/bin/app/data/color_schemes/dark.xml index 76a7c5b8..8fbd9513 100644 --- a/bin/app/data/color_schemes/dark.xml +++ b/bin/app/data/color_schemes/dark.xml @@ -111,6 +111,10 @@ #272728 + + #4D4D4D + #4D4D4D + #4D4D4D #4D4D4D @@ -123,10 +127,6 @@ #4D4D4D #4D4D4D - - #4D4D4D - #4D4D4D - #4D4D4D #4D4D4D @@ -144,10 +144,6 @@ #7A681F #9C8528 - - #7A681F - #9C8528 - #21516B @@ -157,10 +153,6 @@ #21516B #2A6484 - - #21516B - #2A6484 - #21516B #2A6484 @@ -180,10 +172,6 @@ #247368 - - #1B564E - #247368 - #1B564E #247368 diff --git a/src/app/qt/element/QtAutocompletionList.cpp b/src/app/qt/element/QtAutocompletionList.cpp index 0b7375d8..247f26b6 100644 --- a/src/app/qt/element/QtAutocompletionList.cpp +++ b/src/app/qt/element/QtAutocompletionList.cpp @@ -104,7 +104,7 @@ void QtAutocompletionDelegate::paint(QPainter* painter, const QStyleOptionViewIt QColor color("#FFFFFF"); Node::NodeType nodeType = static_cast(index.sibling(index.row(), index.column() + 3).data().toInt()); - if (type.size() && nodeType) + if (type.size()) { color = QColor(scheme->getNodeTypeColor(nodeType).c_str()); } diff --git a/src/app/qt/view/graphElements/QtGraphNodeData.cpp b/src/app/qt/view/graphElements/QtGraphNodeData.cpp index 30be1b8e..7d25be30 100644 --- a/src/app/qt/view/graphElements/QtGraphNodeData.cpp +++ b/src/app/qt/view/graphElements/QtGraphNodeData.cpp @@ -20,7 +20,13 @@ QtGraphNodeData::QtGraphNodeData(const Node* data, bool hasParent, bool childVis this->setName(data->getName()); } - this->setToolTip(QString::fromStdString(data->getTypeString())); + std::string toolTip = data->getTypeString(); + if (!data->isDefined() && !data->isType(Node::NODE_UNDEFINED)) + { + toolTip = "undefined " + toolTip; + } + + this->setToolTip(QString::fromStdString(toolTip)); } QtGraphNodeData::~QtGraphNodeData() @@ -59,7 +65,7 @@ void QtGraphNodeData::moved(const Vec2i& oldPosition) void QtGraphNodeData::updateStyle() { GraphViewStyle::NodeStyle style = - GraphViewStyle::getStyleForNodeType(m_data->getType(), m_isActive, m_isHovering, m_childVisible); + GraphViewStyle::getStyleForNodeType(m_data->getType(), m_data->isDefined(), m_isActive, m_isHovering, m_childVisible); setStyle(style); } diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp index 3b7e33d9..f86a9f32 100644 --- a/src/lib/Project.cpp +++ b/src/lib/Project.cpp @@ -7,6 +7,7 @@ #include "data/access/StorageAccessProxy.h" #include "data/graph/Token.h" #include "data/parser/cxx/TaskParseCxx.h" +#include "data/Storage.h" #include "data/TaskCleanStorage.h" #include "settings/ApplicationSettings.h" #include "settings/ProjectSettings.h" diff --git a/src/lib/Project.h b/src/lib/Project.h index e5de2aba..2fe177e0 100644 --- a/src/lib/Project.h +++ b/src/lib/Project.h @@ -6,8 +6,8 @@ #include "utility/file/FileManager.h" #include "data/parser/Parser.h" -#include "data/Storage.h" +class Storage; class StorageAccessProxy; class Project diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 3e0a8d4a..475f91d6 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -240,7 +240,7 @@ DummyNode GraphController::createDummyNodeTopDown(Node* node) } else { - if (node->isType(Node::NODE_CLASS | Node::NODE_STRUCT)) + if (node->isType(Node::NODE_TYPE | Node::NODE_CLASS | Node::NODE_STRUCT)) { accessType = TokenComponentAccess::ACCESS_PUBLIC; } @@ -448,11 +448,7 @@ void GraphController::bundleNodes() bundleNodesMatching( [](const DummyNode& node) { - const Node::NodeTypeMask undefinedMask = - Node::NODE_UNDEFINED | Node::NODE_UNDEFINED_TYPE | - Node::NODE_UNDEFINED_VARIABLE | Node::NODE_UNDEFINED_FUNCTION; - - if (node.visible && node.isGraphNode() && !node.hasActiveSubNode() && node.data->isType(undefinedMask)) + if (node.visible && node.isGraphNode() && !node.hasActiveSubNode() && !node.data->isDefined()) { return true; } @@ -671,7 +667,7 @@ void GraphController::layoutNestingRecursive(DummyNode& node) const width = margins.charWidth * node.data->getName().size(); } - if (node.data->isType(Node::NODE_CLASS | Node::NODE_STRUCT | Node::NODE_ENUM) && node.subNodes.size()) + if (node.data->isType(Node::NODE_TYPE | Node::NODE_CLASS | Node::NODE_STRUCT | Node::NODE_ENUM) && node.subNodes.size()) { addExpandToggleNode(node); } diff --git a/src/lib/component/view/GraphViewStyle.cpp b/src/lib/component/view/GraphViewStyle.cpp index 5b75471e..9188126b 100644 --- a/src/lib/component/view/GraphViewStyle.cpp +++ b/src/lib/component/view/GraphViewStyle.cpp @@ -105,19 +105,16 @@ size_t GraphViewStyle::getFontSizeForNodeType(Node::NodeType type) case Node::NODE_NAMESPACE: return s_fontSize - 2; - case Node::NODE_UNDEFINED_TYPE: + case Node::NODE_TYPE: case Node::NODE_STRUCT: case Node::NODE_CLASS: case Node::NODE_ENUM: case Node::NODE_TYPEDEF: case Node::NODE_TEMPLATE_PARAMETER_TYPE: case Node::NODE_FILE: - case Node::NODE_UNDEFINED_MACRO: case Node::NODE_MACRO: return s_fontSize; - case Node::NODE_UNDEFINED_FUNCTION: - case Node::NODE_UNDEFINED_VARIABLE: case Node::NODE_FUNCTION: case Node::NODE_METHOD: case Node::NODE_GLOBAL_VARIABLE: @@ -175,10 +172,9 @@ GraphViewStyle::NodeMargins GraphViewStyle::getMarginsForNodeType(Node::NodeType case Node::NODE_FILE: case Node::NODE_ENUM: case Node::NODE_TYPEDEF: - case Node::NODE_UNDEFINED_MACRO: case Node::NODE_MACRO: margins.iconWidth = s_fontSize + 11; - case Node::NODE_UNDEFINED_TYPE: + case Node::NODE_TYPE: case Node::NODE_STRUCT: case Node::NODE_CLASS: case Node::NODE_TEMPLATE_PARAMETER_TYPE: @@ -195,10 +191,8 @@ GraphViewStyle::NodeMargins GraphViewStyle::getMarginsForNodeType(Node::NodeType } break; - case Node::NODE_UNDEFINED_FUNCTION: case Node::NODE_FUNCTION: case Node::NODE_METHOD: - case Node::NODE_UNDEFINED_VARIABLE: case Node::NODE_GLOBAL_VARIABLE: case Node::NODE_FIELD: case Node::NODE_ENUM_CONSTANT: @@ -257,7 +251,7 @@ GraphViewStyle::NodeMargins GraphViewStyle::getMarginsOfBundleNode() } GraphViewStyle::NodeStyle GraphViewStyle::getStyleForNodeType( - Node::NodeType type, bool isActive, bool isFocused, bool hasChildren + Node::NodeType type, bool defined, bool isActive, bool isFocused, bool hasChildren ){ NodeStyle style; @@ -294,10 +288,7 @@ GraphViewStyle::NodeStyle GraphViewStyle::getStyleForNodeType( style.textOffset.y = 6; break; - case Node::NODE_UNDEFINED_TYPE: - case Node::NODE_UNDEFINED_MACRO: - style.hatchingColor = scheme->getColor("graph/hatching"); - + case Node::NODE_TYPE: case Node::NODE_STRUCT: case Node::NODE_CLASS: case Node::NODE_ENUM: @@ -338,10 +329,6 @@ GraphViewStyle::NodeStyle GraphViewStyle::getStyleForNodeType( style.textOffset.y = 9; break; - case Node::NODE_UNDEFINED_FUNCTION: - case Node::NODE_UNDEFINED_VARIABLE: - style.hatchingColor = scheme->getColor("graph/hatching"); - case Node::NODE_FUNCTION: case Node::NODE_METHOD: case Node::NODE_GLOBAL_VARIABLE: @@ -363,6 +350,11 @@ GraphViewStyle::NodeStyle GraphViewStyle::getStyleForNodeType( style.fontBold = true; } + if (!defined) + { + style.hatchingColor = scheme->getColor("graph/hatching"); + } + addIcon(type, hasChildren, &style); return style; @@ -412,7 +404,7 @@ GraphViewStyle::NodeStyle GraphViewStyle::getStyleOfExpandToggleNode() GraphViewStyle::NodeStyle GraphViewStyle::getStyleOfBundleNode(bool isFocused) { - NodeStyle style = getStyleForNodeType(Node::NODE_CLASS, false, isFocused, false); + NodeStyle style = getStyleForNodeType(Node::NODE_CLASS, true, false, isFocused, false); addIcon(Node::NODE_ENUM, false, &style); style.iconPath = "data/gui/graph_view/images/bundle.png"; @@ -530,7 +522,6 @@ void GraphViewStyle::addIcon(Node::NodeType type, bool hasChildren, NodeStyle* s case Node::NODE_TYPEDEF: style->iconPath = "data/gui/graph_view/images/typedef_2.png"; break; - case Node::NODE_UNDEFINED_MACRO: case Node::NODE_MACRO: style->iconPath = "data/gui/graph_view/images/macro_3.png"; break; diff --git a/src/lib/component/view/GraphViewStyle.h b/src/lib/component/view/GraphViewStyle.h index af472c58..9fea3f3c 100644 --- a/src/lib/component/view/GraphViewStyle.h +++ b/src/lib/component/view/GraphViewStyle.h @@ -105,7 +105,7 @@ public: static NodeMargins getMarginsOfExpandToggleNode(); static NodeMargins getMarginsOfBundleNode(); - static NodeStyle getStyleForNodeType(Node::NodeType type, bool isActive, bool isFocused, bool hasChildren); + static NodeStyle getStyleForNodeType(Node::NodeType type, bool defined, bool isActive, bool isFocused, bool hasChildren); static NodeStyle getStyleOfAccessNode(); static NodeStyle getStyleOfExpandToggleNode(); static NodeStyle getStyleOfBundleNode(bool isFocused); diff --git a/src/lib/data/SqliteStorage.cpp b/src/lib/data/SqliteStorage.cpp index 1adb5694..e415f068 100644 --- a/src/lib/data/SqliteStorage.cpp +++ b/src/lib/data/SqliteStorage.cpp @@ -63,7 +63,7 @@ Id SqliteStorage::addEdge(int type, Id sourceNodeId, Id targetNodeId) return id; } -Id SqliteStorage::addNode(int type, Id nameId) +Id SqliteStorage::addNode(int type, Id nameId, bool defined) { m_database.execDML( "INSERT INTO element(id) VALUES(NULL);" @@ -71,8 +71,8 @@ Id SqliteStorage::addNode(int type, Id nameId) Id id = m_database.lastRowId(); m_database.execDML(( - "INSERT INTO node(id, type, name_id) VALUES(" - + std::to_string(id) + ", " + std::to_string(type) + ", " + std::to_string(nameId) + ");" + "INSERT INTO node(id, type, name_id, defined) VALUES(" + + std::to_string(id) + ", " + std::to_string(type) + ", " + std::to_string(nameId) + ", " + std::to_string(defined) + ");" ).c_str()); return id; @@ -80,7 +80,7 @@ Id SqliteStorage::addNode(int type, Id nameId) Id SqliteStorage::addFile(Id nameId, const std::string& filePath, const std::string& modificationTime) { - Id id = addNode(Node::NODE_FILE, nameId); + Id id = addNode(Node::NODE_FILE, nameId, true); std::shared_ptr content = TextAccess::createFromFile(filePath); CppSQLite3Statement stmt = m_database.compileStatement(( @@ -196,32 +196,12 @@ StorageNode SqliteStorage::getFirstNode() const return nodes[0]; } - return StorageNode(0, 0, 0); + return StorageNode(0, 0, 0, false); } std::vector SqliteStorage::getAllNodes() const { - std::vector nodes; - - CppSQLite3Query q = m_database.execQuery( - "SELECT id, type, name_id FROM node;" - ); - - while (!q.eof()) - { - const Id id = q.getIntField(0, 0); - const int type = q.getIntField(1, -1); - const Id nameId = q.getIntField(2, 0); - - if (id != 0 && type != -1 && nameId != 0) - { - nodes.push_back(StorageNode(id, type, nameId)); - } - - q.nextRow(); - } - - return nodes; + return getAllNodes(""); } bool SqliteStorage::isEdge(Id elementId) const @@ -364,60 +344,24 @@ std::vector SqliteStorage::getEdgesByTargetType(Id targetId, int ty StorageNode SqliteStorage::getNodeById(Id id) const { - CppSQLite3Query q = m_database.execQuery(( - "SELECT type, name_id FROM node WHERE id == " + std::to_string(id) + ";" - ).c_str()); - - if (!q.eof()) + std::vector nodes = getAllNodes("WHERE id == " + std::to_string(id)); + if (nodes.size()) { - const int type = q.getIntField(0, -1); - const Id nameId = q.getIntField(1, 0); - - if (type != -1 && nameId != 0 ) - { - return StorageNode(id, type, nameId); - } + return nodes[0]; } - return StorageNode(0, -1, 0); + + return StorageNode(0, 0, 0, false); } StorageNode SqliteStorage::getNodeByNameId(Id nameId) const { - CppSQLite3Query q = m_database.execQuery(( - "SELECT id, type FROM node WHERE name_id == " + std::to_string(nameId) + ";" - ).c_str()); - - if (!q.eof()) + std::vector nodes = getAllNodes("WHERE name_id == " + std::to_string(nameId)); + if (nodes.size()) { - const Id id = q.getIntField(0, 0); - const int type = q.getIntField(1, -1); - - if (id != 0 && type != -1) - { - return StorageNode(id, type, nameId); - } + return nodes[0]; } - return StorageNode(0, -1, 0); -} -StorageNode SqliteStorage::getNodeByName(const std::string& nodeName) const -{ - CppSQLite3Query q = m_database.execQuery(( - "SELECT node.id, node.type, node.name_id FROM node INNER JOIN name_hierarchy_element ON node.name_id = name_hierarchy_element.id WHERE name_hierarchy_element.name = '" + nodeName + "';" - ).c_str()); - - if (!q.eof()) - { - const Id id = q.getIntField(0, 0); - const int type = q.getIntField(1, -1); - const Id nameId = q.getIntField(2, 0); - - if (id != 0 && type != -1 && nameId != 0) - { - return StorageNode(id, type, nameId); - } - } - return StorageNode(0, -1, 0); + return StorageNode(0, 0, 0, false); } std::vector SqliteStorage::getNodesByIds(const std::vector& nodeIds) const @@ -486,6 +430,13 @@ void SqliteStorage::setNodeType(int type, Id nodeId) ).c_str()); } +void SqliteStorage::setNodeDefined(bool defined, Id nodeId) +{ + m_database.execDML(( + "UPDATE node SET defined = " + std::to_string(defined) + " WHERE id == " + std::to_string(nodeId) + ";" + ).c_str()); +} + Id SqliteStorage::getNameHierarchyElementIdByName(const std::string& name, Id parentId) const { if (parentId) @@ -579,7 +530,7 @@ std::shared_ptr SqliteStorage::getTokenLocationsForFile(const { std::shared_ptr ret = std::make_shared(filePath); - const Id fileNodeId = getNodeByName(filePath.fileName()).id; + const Id fileNodeId = getFileByPath(filePath.str()).id; if (fileNodeId == 0) // early out { return ret; @@ -759,6 +710,7 @@ void SqliteStorage::setupTables() "id INTEGER NOT NULL, " "type INTEGER NOT NULL, " "name_id INTEGER NOT NULL, " + "defined INTEGER NOT NULL, " "PRIMARY KEY(id), " "FOREIGN KEY(id) REFERENCES element(id) ON DELETE CASCADE, " "FOREIGN KEY(name_id) REFERENCES name_hierarchy_element(id) ON DELETE CASCADE);" // maybe use restrict here @@ -941,7 +893,7 @@ std::vector SqliteStorage::getAllEdges(const std::string& query) co std::vector SqliteStorage::getAllNodes(const std::string& query) const { CppSQLite3Query q = m_database.execQuery(( - "SELECT id, type, name_id FROM node " + query + ";" + "SELECT id, type, name_id, defined FROM node " + query + ";" ).c_str()); std::vector nodes; @@ -950,10 +902,11 @@ std::vector SqliteStorage::getAllNodes(const std::string& query) co const Id id = q.getIntField(0, 0); const int type = q.getIntField(1, -1); const Id nameId = q.getIntField(2, 0); + const bool defined = q.getIntField(3, 0); if (id != 0 && type != -1) { - nodes.push_back(StorageNode(id, type, nameId)); + nodes.push_back(StorageNode(id, type, nameId, defined)); } q.nextRow(); diff --git a/src/lib/data/SqliteStorage.h b/src/lib/data/SqliteStorage.h index 10b0dbd2..48e3ac12 100644 --- a/src/lib/data/SqliteStorage.h +++ b/src/lib/data/SqliteStorage.h @@ -30,7 +30,7 @@ public: void rollbackTransaction(); Id addEdge(int type, Id sourceNodeId, Id targetNodeId); - Id addNode(int type, Id nameId); + Id addNode(int type, Id nameId, bool defined); Id addFile(Id nameId, const std::string& filePath, const std::string& modificationTime); int addSourceLocation(Id elementId, Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, bool isScope); Id addNameHierarchyElement(const std::string& name, Id parentId = 0); @@ -67,7 +67,6 @@ public: StorageNode getNodeById(Id id) const; StorageNode getNodeByNameId(Id nameId) const; - StorageNode getNodeByName(const std::string& nodeName) const; // hmm... we need to use name hierarchy here...?? std::vector getNodesByIds(const std::vector& nodeIds) const; StorageFile getFileById(const Id id) const; @@ -77,6 +76,7 @@ public: std::shared_ptr getFileContentByPath(const std::string& filePath) const; void setNodeType(int type, Id nodeId); + void setNodeDefined(bool defined, Id nodeId); Id getNameHierarchyElementIdByName(const std::string& name, Id parentId = 0) const; Id getNameHierarchyElementIdByNodeId(const Id nodeId) const; diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index b86b4c07..78247c2d 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -217,11 +217,11 @@ Id Storage::onTypedefParsed( ){ log("typedef", nameHierarchy.getFullName() + " -> " + underlyingType.dataType->getFullTypeName(), location); - Id typedefNodeId = addNodeHierarchy(Node::NODE_TYPEDEF, nameHierarchy); + Id typedefNodeId = addNodeHierarchy(Node::NODE_TYPEDEF, nameHierarchy, true); addSourceLocation(typedefNodeId, location); addAccess(typedefNodeId, access); - Id underlyingTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, underlyingType.dataType->getTypeNameHierarchy()); + Id underlyingTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, underlyingType.dataType->getTypeNameHierarchy(), false); addEdge(typedefNodeId, underlyingTypeNodeId, Edge::EDGE_TYPEDEF_OF, location); return typedefNodeId; @@ -233,7 +233,7 @@ Id Storage::onClassParsed( ){ log("class", nameHierarchy.getFullName(), location); - Id nodeId = addNodeHierarchy(scopeLocation.isValid() ? Node::NODE_CLASS : Node::NODE_UNDEFINED_TYPE, nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_CLASS, nameHierarchy, scopeLocation.isValid()); addSourceLocation(nodeId, location); addSourceLocation(nodeId, scopeLocation, true); @@ -249,7 +249,7 @@ Id Storage::onStructParsed( ){ log("struct", nameHierarchy.getFullName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_STRUCT, nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_STRUCT, nameHierarchy, true); addSourceLocation(nodeId, location); addSourceLocation(nodeId, scopeLocation, true); @@ -263,10 +263,10 @@ Id Storage::onGlobalVariableParsed(const ParseLocation& location, const ParseVar { log("global", variable.getFullName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, variable.nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, variable.nameHierarchy, true); addSourceLocation(nodeId, location); - Id typeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, variable.type.dataType->getTypeNameHierarchy()); + Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, variable.type.dataType->getTypeNameHierarchy(), false); addEdge(nodeId, typeNodeId, Edge::EDGE_TYPE_OF, location); return nodeId; @@ -276,11 +276,11 @@ Id Storage::onFieldParsed(const ParseLocation& location, const ParseVariable& va { log("field", variable.getFullName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_FIELD, variable.nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_FIELD, variable.nameHierarchy, true); addSourceLocation(nodeId, location); addAccess(nodeId, access); - Id typeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, variable.type.dataType->getTypeNameHierarchy()); + Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, variable.type.dataType->getTypeNameHierarchy(), false); addEdge(nodeId, typeNodeId, Edge::EDGE_TYPE_OF, variable.type.location); return nodeId; @@ -291,15 +291,15 @@ Id Storage::onFunctionParsed( ){ log("function", function.getFullName(), location); - Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function); + Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function, true); - Id returnTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, function.returnType.dataType->getTypeNameHierarchy()); + Id returnTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, function.returnType.dataType->getTypeNameHierarchy(), false); addEdge(nodeId, returnTypeNodeId, Edge::EDGE_TYPE_USAGE, function.returnType.location); // addEdge(nodeId, returnTypeNodeId, Edge::EDGE_RETURN_TYPE_OF, function.returnType.location); for (size_t i = 0; i < function.parameters.size(); i++) { - Id parameternTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, function.parameters[i].dataType->getTypeNameHierarchy()); + Id parameternTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, function.parameters[i].dataType->getTypeNameHierarchy(), false); addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_TYPE_USAGE, function.parameters[i].location); // addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_PARAMETER_TYPE_OF, function.parameters[i].location); } @@ -316,18 +316,18 @@ Id Storage::onMethodParsed( ){ log("method", method.getFullName(), location); - Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_METHOD, method); + Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_METHOD, method, true); addSourceLocation(nodeId, location); addSourceLocation(nodeId, scopeLocation, true); addAccess(nodeId, access); - Id returnTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, method.returnType.dataType->getTypeNameHierarchy()); + Id returnTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, method.returnType.dataType->getTypeNameHierarchy(), false); addEdge(nodeId, returnTypeNodeId, Edge::EDGE_TYPE_USAGE, method.returnType.location); // addEdge(nodeId, returnTypeNodeId, Edge::EDGE_RETURN_TYPE_OF, method.returnType.location); for (size_t i = 0; i < method.parameters.size(); i++) { - Id parameternTypeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, method.parameters[i].dataType->getTypeNameHierarchy()); + Id parameternTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, method.parameters[i].dataType->getTypeNameHierarchy(), false); addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_TYPE_USAGE, method.parameters[i].location); // addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_PARAMETER_TYPE_OF, method.parameters[i].location); } @@ -340,7 +340,7 @@ Id Storage::onNamespaceParsed( ){ log("namespace", nameHierarchy.getFullName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_NAMESPACE, nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_NAMESPACE, nameHierarchy, true); addSourceLocation(nodeId, location); addSourceLocation(nodeId, scopeLocation, true); @@ -354,7 +354,7 @@ Id Storage::onEnumParsed( ){ log("enum", nameHierarchy.getFullName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_ENUM, nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_ENUM, nameHierarchy, true); addSourceLocation(nodeId, location); addSourceLocation(nodeId, scopeLocation, true); @@ -367,7 +367,7 @@ Id Storage::onEnumConstantParsed(const ParseLocation& location, const NameHierar { log("enum constant", nameHierarchy.getFullName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, nameHierarchy); + Id nodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, nameHierarchy, true); addSourceLocation(nodeId, location); @@ -380,8 +380,8 @@ Id Storage::onInheritanceParsed( ){ log("inheritance", childNameHierarchy.getFullName() + " : " + parentNameHierarchy.getFullName(), location); - Id childNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, childNameHierarchy); - Id parentNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, parentNameHierarchy); + Id childNodeId = addNodeHierarchy(Node::NODE_TYPE, childNameHierarchy, false); + Id parentNodeId = addNodeHierarchy(Node::NODE_TYPE, parentNameHierarchy, false); Id edgeId = addEdge(childNodeId, parentNodeId, Edge::EDGE_INHERITANCE, location); @@ -393,8 +393,8 @@ Id Storage::onMethodOverrideParsed( { log("override", base.getFullName() + " -> " + overrider.getFullName(), location); - Id baseNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, base); // TODO: call this overridden - Id overriderNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, overrider); + Id baseNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, base, false); // TODO: call this overridden + Id overriderNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, overrider, false); Id edgeId = addEdge(overriderNodeId, baseNodeId, Edge::EDGE_OVERRIDE, location); @@ -405,8 +405,8 @@ Id Storage::onCallParsed(const ParseLocation& location, const ParseFunction& cal { log("call", caller.getFullName() + " -> " + callee.getFullName(), location); - Id callerNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, caller); - Id calleeNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, callee); + Id callerNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, caller, false); + Id calleeNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, callee, false); Id edgeId = addEdge(callerNodeId, calleeNodeId, Edge::EDGE_CALL, location); @@ -417,8 +417,8 @@ Id Storage::onCallParsed(const ParseLocation& location, const ParseVariable& cal { log("call", caller.getFullName() + " -> " + callee.getFullName(), location); - Id callerNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, caller.nameHierarchy); - Id calleeNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, callee); + Id callerNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, caller.nameHierarchy, false); + Id calleeNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, callee, false); Id edgeId = addEdge(callerNodeId, calleeNodeId, Edge::EDGE_CALL, location); @@ -430,8 +430,8 @@ Id Storage::onFieldUsageParsed( ){ log("field usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location); - Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, user); - Id usedNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, usedNameHierarchy); + Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, user, false); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location); @@ -443,8 +443,8 @@ Id Storage::onFieldUsageParsed( ){ log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location); - Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_FUNCTION, user.nameHierarchy); - Id usedNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, usedNameHierarchy); + Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user.nameHierarchy, false); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location); @@ -456,8 +456,8 @@ Id Storage::onGlobalVariableUsageParsed( // or static variable used ){ log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location); - Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, user); - Id usedNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, usedNameHierarchy); + Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, user, false); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location); @@ -469,8 +469,8 @@ Id Storage::onGlobalVariableUsageParsed( { log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location); - Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, user.nameHierarchy); - Id usedNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, usedNameHierarchy); + Id userNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, user.nameHierarchy, false); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location); @@ -482,8 +482,8 @@ Id Storage::onEnumConstantUsageParsed( ){ log("enum constant usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location); - Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, user); - Id usedNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, usedNameHierarchy); + Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, user, false); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location); @@ -495,8 +495,8 @@ Id Storage::onEnumConstantUsageParsed( ){ log("enum constant usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location); - Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_FUNCTION, user.nameHierarchy); - Id usedNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_VARIABLE, usedNameHierarchy); + Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user.nameHierarchy, false); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location); @@ -512,8 +512,8 @@ Id Storage::onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseFuncti return 0; } - Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, function); - Id typeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, typeUsage.dataType->getTypeNameHierarchy()); + Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function, false); + Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, typeUsage.dataType->getTypeNameHierarchy(), false); Id edgeId = addEdge(functionNodeId, typeNodeId, Edge::EDGE_TYPE_USAGE, typeUsage.location); @@ -529,8 +529,8 @@ Id Storage::onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseVariab return 0; } - Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, variable.nameHierarchy); - Id typeNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, typeUsage.dataType->getTypeNameHierarchy()); + Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, variable.nameHierarchy, false); + Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, typeUsage.dataType->getTypeNameHierarchy(), false); Id edgeId = addEdge(functionNodeId, typeNodeId, Edge::EDGE_TYPE_USAGE, typeUsage.location); @@ -547,12 +547,12 @@ Id Storage::onTemplateArgumentTypeParsed( location ); - Id argumentNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, argumentNameHierarchy); + Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentNameHierarchy, false); // does not need a source location because this type that is already defined (and therefore has a location). - Id templateNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, templateNameHierarchy); + Id templateNodeId = addNodeHierarchy(Node::NODE_TYPE, templateNameHierarchy, false); - addEdge(argumentNodeId, templateNodeId, Edge::EDGE_TEMPLATE_ARGUMENT_OF, location); + addEdge(templateNodeId, argumentNodeId, Edge::EDGE_TEMPLATE_ARGUMENT, location); return argumentNodeId; } @@ -567,12 +567,12 @@ Id Storage::onTemplateDefaultArgumentTypeParsed( defaultArgumentTypeUsage.location ); - Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, defaultArgumentTypeUsage.dataType->getTypeNameHierarchy()); + Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeUsage.dataType->getTypeNameHierarchy(), false); // does not need a source location because this type that is already defined (and therefore has a location). - Id argumentNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, templateArgumentTypeNameHierarchy); + Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, templateArgumentTypeNameHierarchy, false); - addEdge(defaultArgumentNodeId, argumentNodeId, Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF, defaultArgumentTypeUsage.location); + addEdge(argumentNodeId, defaultArgumentNodeId, Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT, defaultArgumentTypeUsage.location); return defaultArgumentNodeId; } @@ -583,12 +583,12 @@ Id Storage::onTemplateRecordParameterTypeParsed( ){ log("template record type parameter", templateParameterTypeNameHierarchy.getFullName(), location); - Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy); + Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, true); addSourceLocation(parameterNodeId, location, false); - Id recordNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, templateRecordNameHierarchy); + Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, templateRecordNameHierarchy, false); - addEdge(parameterNodeId, recordNodeId, Edge::EDGE_TEMPLATE_PARAMETER_OF, location); + addEdge(recordNodeId, parameterNodeId, Edge::EDGE_TEMPLATE_PARAMETER, location); return parameterNodeId; } @@ -609,10 +609,11 @@ Id Storage::onTemplateRecordSpecializationParsed( specializedRecordNodeType = Node::NODE_STRUCT; } - Id specializedNodeId = addNodeHierarchy(specializedRecordNodeType, specializedRecordNameHierarchy); + Id specializedNodeId = addNodeHierarchy(specializedRecordNodeType, specializedRecordNameHierarchy, true); addSourceLocation(specializedNodeId, location, false); - Id recordNodeId = addNodeHierarchy(Node::NODE_UNDEFINED_TYPE, specializedFromNameHierarchy); + Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFromNameHierarchy, false); + addAccess(specializedNodeId, getAccess(recordNodeId)); addEdge(specializedNodeId, recordNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location); @@ -624,12 +625,11 @@ Id Storage::onTemplateFunctionParameterTypeParsed( ){ log("template function type parameter", templateParameterTypeNameHierarchy.getFullName(), location); - Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy); + Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, true); addSourceLocation(parameterNodeId, location, false); - Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, function); - - addEdge(parameterNodeId, functionNodeId, Edge::EDGE_TEMPLATE_PARAMETER_OF, location); + Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function, false); + addEdge(functionNodeId, parameterNodeId, Edge::EDGE_TEMPLATE_PARAMETER, location); return parameterNodeId; } @@ -639,10 +639,11 @@ Id Storage::onTemplateFunctionSpecializationParsed( ){ log("function template specialization", specializedFunction.getFullName(), location); - Id specializedNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, specializedFunction); + Id specializedNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, specializedFunction, true); addSourceLocation(specializedNodeId, location, false); - Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_UNDEFINED_FUNCTION, templateFunction); + Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, templateFunction, false); + addAccess(specializedNodeId, getAccess(functionNodeId)); addEdge(specializedNodeId, functionNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location); @@ -693,7 +694,7 @@ Id Storage::onMacroDefineParsed(const ParseLocation& location, const NameHierarc { log("macro", macroNameHierarchy.getFullName(), location); - Id macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy); + Id macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, true); addSourceLocation(macroId, location); Id fileNodeId = getFileNodeId(location.filePath); @@ -706,7 +707,7 @@ Id Storage::onMacroExpandParsed(const ParseLocation &location, const NameHierarc { log("macro use", macroNameHierarchy.getFullName(), location); - Id macroExpandId = addNodeHierarchy(Node::NODE_UNDEFINED_MACRO, macroNameHierarchy); + Id macroExpandId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, false); Id fileNodeId = getFileNodeId(location.filePath); Id edgeId = addEdge(fileNodeId, macroExpandId, Edge::EDGE_MACRO_USAGE, location); @@ -768,8 +769,14 @@ std::vector Storage::getAutocompletionMatches(const std::string& qu Id elementId = *(match.tokenIds.cbegin()); if (m_sqliteStorage.isNode(elementId)) { - match.nodeType = Node::intToType(m_sqliteStorage.getNodeById(elementId).type); + StorageNode node = m_sqliteStorage.getNodeById(elementId); + match.nodeType = Node::intToType(node.type); match.typeName = Node::getTypeString(match.nodeType); + + if (!node.defined && match.nodeType != Node::NODE_UNDEFINED) + { + match.typeName = "undefined " + match.typeName; + } } else { @@ -1169,7 +1176,7 @@ std::shared_ptr Storage::getFileContent(const FilePath& filePath) co return m_sqliteStorage.getFileContentByPath(filePath.str()); } -Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool distinct) +Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined, bool distinct) { std::vector nameIds = addNameHierarchyElements(nameHierarchy); @@ -1184,9 +1191,14 @@ Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarch const StorageNode node = m_sqliteStorage.getNodeByNameId(nameId); Id nodeId = node.id; + if (nodeId && !node.defined && lastName && defined) + { + m_sqliteStorage.setNodeDefined(true, nodeId); + } + if (nodeId == 0 || (lastName && distinct)) { - nodeId = m_sqliteStorage.addNode(Node::typeToInt(type), nameId); + nodeId = m_sqliteStorage.addNode(Node::typeToInt(type), nameId, lastName & defined); if (parentNodeId != 0) { @@ -1208,16 +1220,20 @@ Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarch return parentNodeId; } -Id Storage::addNodeHierarchyWithDistinctSignature(Node::NodeType type, const ParseFunction& function) +Id Storage::addNodeHierarchyWithDistinctSignature(Node::NodeType type, const ParseFunction& function, bool defined) { std::string signature = ParserClient::functionSignatureStr(function); Id nodeId = m_sqliteStorage.getNodeIdBySignature(signature); if (!nodeId) { - nodeId = addNodeHierarchy(type, function.nameHierarchy, true); + nodeId = addNodeHierarchy(type, function.nameHierarchy, defined, true); m_sqliteStorage.addSignature(nodeId, signature); } + else if (defined) + { + m_sqliteStorage.setNodeDefined(true, nodeId); + } return nodeId; } @@ -1486,7 +1502,8 @@ void Storage::addNodesToGraph(const std::vector nodeIds, Graph* graph) const graph->createNode( storageNode.id, Node::intToType(storageNode.type), - m_tokenIndex.getNameHierarchyForTokenId(storageNode.id) + m_tokenIndex.getNameHierarchyForTokenId(storageNode.id), + storageNode.defined ); } } @@ -1525,9 +1542,9 @@ TokenComponentAccess::AccessType Storage::convertAccessType(ParserClient::Access } } -void Storage::addAccess(const Id nodeId, ParserClient::AccessType access) +void Storage::addAccess(Id nodeId, TokenComponentAccess::AccessType access) { - if (access == ACCESS_NONE) + if (access == TokenComponentAccess::ACCESS_NONE) { return; } @@ -1539,7 +1556,23 @@ void Storage::addAccess(const Id nodeId, ParserClient::AccessType access) return; } - m_sqliteStorage.addComponentAccess(memberEdges[0].id, convertAccessType(access)); + m_sqliteStorage.addComponentAccess(memberEdges[0].id, access); +} + +void Storage::addAccess(Id nodeId, ParserClient::AccessType access) +{ + addAccess(nodeId, convertAccessType(access)); +} + +TokenComponentAccess::AccessType Storage::getAccess(Id nodeId) const +{ + std::vector memberEdges = m_sqliteStorage.getEdgesByTargetType(nodeId, Edge::EDGE_MEMBER); + if (memberEdges.size() == 1) + { + return TokenComponentAccess::intToType(m_sqliteStorage.getComponentAccessByMemberEdgeId(memberEdges[0].id).type); + } + + return TokenComponentAccess::ACCESS_NONE; } void Storage::addComponentAccessToGraph(Graph* graph) const diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index 0c6e319d..50efac70 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -161,8 +161,8 @@ public: private: - Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool distinct = false); - Id addNodeHierarchyWithDistinctSignature(Node::NodeType type, const ParseFunction& function); + Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined, bool distinct = false); + Id addNodeHierarchyWithDistinctSignature(Node::NodeType type, const ParseFunction& function, bool defined); std::vector addNameHierarchyElements(NameHierarchy nameHierarchy); int addSourceLocation(int elementNodeId, const ParseLocation& location, bool isScope = false); @@ -183,7 +183,9 @@ private: void addEdgesToGraph(const std::vector edgeIds, Graph* graph) const; TokenComponentAccess::AccessType convertAccessType(ParserClient::AccessType access) const; - void addAccess(const Id nodeId, ParserClient::AccessType access); + void addAccess(Id nodeId, TokenComponentAccess::AccessType access); + void addAccess(Id nodeId, ParserClient::AccessType access); + TokenComponentAccess::AccessType getAccess(Id nodeId) const; void addComponentAccessToGraph(Graph* graph) const; diff --git a/src/lib/data/StorageTypes.h b/src/lib/data/StorageTypes.h index afcc6a75..621f9d9d 100644 --- a/src/lib/data/StorageTypes.h +++ b/src/lib/data/StorageTypes.h @@ -19,13 +19,14 @@ struct StorageEdge struct StorageNode { - StorageNode(Id id, int type, Id nameId) - : id(id), type(type), nameId(nameId) + StorageNode(Id id, int type, Id nameId, bool defined) + : id(id), type(type), nameId(nameId), defined(defined) {} Id id; int type; Id nameId; + bool defined; }; struct StorageFile diff --git a/src/lib/data/graph/Edge.cpp b/src/lib/data/graph/Edge.cpp index 17ff3446..2392ade9 100644 --- a/src/lib/data/graph/Edge.cpp +++ b/src/lib/data/graph/Edge.cpp @@ -38,11 +38,11 @@ Edge::EdgeType Edge::intToType(int value) case 0x200: return EDGE_TYPEDEF_OF; case 0x400: - return EDGE_TEMPLATE_PARAMETER_OF; + return EDGE_TEMPLATE_PARAMETER; case 0x800: - return EDGE_TEMPLATE_ARGUMENT_OF; + return EDGE_TEMPLATE_ARGUMENT; case 0x1000: - return EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF; + return EDGE_TEMPLATE_DEFAULT_ARGUMENT; case 0x2000: return EDGE_TEMPLATE_SPECIALIZATION_OF; case 0x4000: @@ -186,11 +186,11 @@ std::string Edge::getTypeString(EdgeType type) return "use"; case EDGE_TYPEDEF_OF: return "typedef"; - case EDGE_TEMPLATE_PARAMETER_OF: + case EDGE_TEMPLATE_PARAMETER: return "template_parameter"; - case EDGE_TEMPLATE_ARGUMENT_OF: + case EDGE_TEMPLATE_ARGUMENT: return "template_argument"; - case EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF: + case EDGE_TEMPLATE_DEFAULT_ARGUMENT: return "template_default_argument"; case EDGE_TEMPLATE_SPECIALIZATION_OF: return "template_specialization"; @@ -238,10 +238,10 @@ std::ostream& operator<<(std::ostream& ostream, const Edge& edge) bool Edge::checkType() const { - Node::NodeTypeMask complexTypeMask = Node::NODE_UNDEFINED_TYPE | Node::NODE_CLASS | Node::NODE_STRUCT | Node:: NODE_TEMPLATE_PARAMETER_TYPE; - Node::NodeTypeMask typeMask = Node::NODE_UNDEFINED | Node::NODE_ENUM | Node::NODE_TYPEDEF | complexTypeMask; - Node::NodeTypeMask variableMask = Node::NODE_UNDEFINED | Node::NODE_UNDEFINED_VARIABLE | Node::NODE_GLOBAL_VARIABLE | Node::NODE_FIELD; - Node::NodeTypeMask functionMask = Node::NODE_UNDEFINED_FUNCTION | Node::NODE_FUNCTION | Node::NODE_METHOD; + Node::NodeTypeMask complexTypeMask = Node::NODE_CLASS | Node::NODE_STRUCT | Node:: NODE_TEMPLATE_PARAMETER_TYPE; + Node::NodeTypeMask typeMask = Node::NODE_ENUM | Node::NODE_TYPEDEF | complexTypeMask; + Node::NodeTypeMask variableMask = Node::NODE_GLOBAL_VARIABLE | Node::NODE_FIELD; + Node::NodeTypeMask functionMask = Node::NODE_FUNCTION | Node::NODE_METHOD; switch (m_type) { @@ -282,8 +282,8 @@ bool Edge::checkType() const return true; case EDGE_OVERRIDE: - if (!m_from->isType(Node::NODE_UNDEFINED_FUNCTION | Node::NODE_METHOD) || - !m_to->isType(Node::NODE_UNDEFINED_FUNCTION | Node::NODE_METHOD)) + if (!m_from->isType(Node::NODE_METHOD) || + !m_to->isType(Node::NODE_METHOD)) { break; } @@ -310,15 +310,15 @@ bool Edge::checkType() const } return true; - case EDGE_TEMPLATE_PARAMETER_OF: + case EDGE_TEMPLATE_PARAMETER: if (!m_from->isType(Node::NODE_TEMPLATE_PARAMETER_TYPE) || !m_to->isType(typeMask | functionMask)) { break; } return true; - case EDGE_TEMPLATE_ARGUMENT_OF: - case EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF: + case EDGE_TEMPLATE_ARGUMENT: + case EDGE_TEMPLATE_DEFAULT_ARGUMENT: if (!m_from->isType(typeMask) || !m_to->isType(typeMask | functionMask)) { break; @@ -346,7 +346,7 @@ bool Edge::checkType() const } return true; case EDGE_MACRO_USAGE: - if(!m_to->isType(Node::NODE_MACRO | Node::NODE_UNDEFINED_MACRO) || !m_from->isType(Node::NODE_FILE)) + if (!m_to->isType(Node::NODE_MACRO) || !m_from->isType(Node::NODE_FILE)) { break; } diff --git a/src/lib/data/graph/Edge.h b/src/lib/data/graph/Edge.h index 38a59e1b..92e5b7c9 100644 --- a/src/lib/data/graph/Edge.h +++ b/src/lib/data/graph/Edge.h @@ -29,9 +29,9 @@ public: EDGE_INHERITANCE = 0x80, EDGE_OVERRIDE = 0x100, EDGE_TYPEDEF_OF = 0x200, - EDGE_TEMPLATE_PARAMETER_OF = 0x400, - EDGE_TEMPLATE_ARGUMENT_OF = 0x800, - EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF = 0x1000, + EDGE_TEMPLATE_PARAMETER = 0x400, + EDGE_TEMPLATE_ARGUMENT = 0x800, + EDGE_TEMPLATE_DEFAULT_ARGUMENT = 0x1000, EDGE_TEMPLATE_SPECIALIZATION_OF = 0x2000, EDGE_INCLUDE = 0x4000, diff --git a/src/lib/data/graph/Graph.cpp b/src/lib/data/graph/Graph.cpp index 8477052e..9bd2f06b 100644 --- a/src/lib/data/graph/Graph.cpp +++ b/src/lib/data/graph/Graph.cpp @@ -40,7 +40,7 @@ void Graph::forEachToken(std::function func) const forEachEdge(func); } -Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy) +Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy, bool defined) { Node* n = getNodeById(id); if (n) @@ -48,7 +48,7 @@ Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy) return n; } - std::shared_ptr node = std::make_shared(id, type, nameHierarchy); + std::shared_ptr node = std::make_shared(id, type, nameHierarchy, defined); m_nodes.emplace(node->getId(), node); return node.get(); } diff --git a/src/lib/data/graph/Graph.h b/src/lib/data/graph/Graph.h index 504744cf..39daa411 100644 --- a/src/lib/data/graph/Graph.h +++ b/src/lib/data/graph/Graph.h @@ -20,7 +20,7 @@ public: void forEachEdge(std::function func) const; void forEachToken(std::function func) const; - Node* createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy); + Node* createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy, bool defined); Edge* createEdge(Id id, Edge::EdgeType type, Node* from, Node* to); size_t getNodeCount() const; diff --git a/src/lib/data/graph/Node.cpp b/src/lib/data/graph/Node.cpp index a8425a79..54d9f3c4 100644 --- a/src/lib/data/graph/Node.cpp +++ b/src/lib/data/graph/Node.cpp @@ -17,12 +17,10 @@ std::string Node::getTypeString(NodeType 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_TYPE: + return "type"; + case NODE_NAMESPACE: + return "namespace"; case NODE_CLASS: return "class"; case NODE_STRUCT: @@ -35,8 +33,6 @@ std::string Node::getTypeString(NodeType type) return "function"; case NODE_METHOD: return "method"; - case NODE_NAMESPACE: - return "namespace"; case NODE_ENUM: return "enum"; case NODE_ENUM_CONSTANT: @@ -47,8 +43,6 @@ std::string Node::getTypeString(NodeType type) return "template_parameter_type"; case NODE_FILE: return "file"; - case NODE_UNDEFINED_MACRO: - return "undefined_macro"; case NODE_MACRO: return "macro"; } @@ -65,58 +59,44 @@ Node::NodeType Node::intToType(int value) { switch (value) { - case 0x1: - return NODE_UNDEFINED; case 0x2: - return NODE_UNDEFINED_TYPE; + return NODE_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: + case 0x8: + return NODE_STRUCT; + case 0x10: + return NODE_CLASS; + case 0x20: + return NODE_GLOBAL_VARIABLE; + case 0x40: + return NODE_FIELD; + case 0x80: + return NODE_FUNCTION; + case 0x100: + return NODE_METHOD; + case 0x200: return NODE_ENUM; - case 0x1000: + case 0x400: return NODE_ENUM_CONSTANT; - case 0x2000: + case 0x800: return NODE_TYPEDEF; - case 0x4000: + case 0x1000: return NODE_TEMPLATE_PARAMETER_TYPE; - case 0x8000: + case 0x2000: return NODE_FILE; - case 0x10000: - return NODE_UNDEFINED_MACRO; - case 0x20000: + case 0x4000: return NODE_MACRO; } return NODE_UNDEFINED; } -Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy) +Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy, bool defined) : Token(id) , m_type(type) , m_nameHierarchy(nameHierarchy) -{ -} - -Node::Node(const Node& other) - : Token(other) - , m_type(other.m_type) - , m_nameHierarchy(other.m_nameHierarchy) + , m_defined(defined) { } @@ -131,7 +111,7 @@ Node::NodeType Node::getType() const void Node::setType(NodeType type) { - if (!isType(type | NODE_UNDEFINED | NODE_UNDEFINED_FUNCTION | NODE_UNDEFINED_VARIABLE | NODE_UNDEFINED_TYPE)) + if (!isType(type | NODE_UNDEFINED)) { LOG_WARNING( "Cannot change NodeType after it was already set from " + getTypeString() + " to " + getTypeString(type) @@ -161,6 +141,16 @@ NameHierarchy Node::getNameHierarchy() const return m_nameHierarchy; } +bool Node::isDefined() const +{ + return m_defined; +} + +void Node::setDefined(bool defined) +{ + m_defined = defined; +} + const std::vector& Node::getEdges() const { return m_edges; diff --git a/src/lib/data/graph/Node.h b/src/lib/data/graph/Node.h index e9bc067c..76c8fe1a 100644 --- a/src/lib/data/graph/Node.h +++ b/src/lib/data/graph/Node.h @@ -20,30 +20,26 @@ class Node { public: typedef int NodeTypeMask; - // list undefined types first to ensure that they get replaced by their defined counterparts when it is parsed. enum NodeType : NodeTypeMask { NODE_UNDEFINED = 0x1, - NODE_UNDEFINED_TYPE = 0x2, - NODE_UNDEFINED_VARIABLE = 0x4, - NODE_UNDEFINED_FUNCTION = 0x8, + NODE_TYPE = 0x2, - NODE_STRUCT = 0x10, - NODE_CLASS = 0x20, - NODE_GLOBAL_VARIABLE = 0x40, - NODE_FIELD = 0x80, - NODE_FUNCTION = 0x100, - NODE_METHOD = 0x200, - NODE_NAMESPACE = 0x400, - NODE_ENUM = 0x800, - NODE_ENUM_CONSTANT = 0x1000, - NODE_TYPEDEF = 0x2000, - NODE_TEMPLATE_PARAMETER_TYPE = 0x4000, + NODE_NAMESPACE = 0x4, + NODE_STRUCT = 0x8, + NODE_CLASS = 0x10, + NODE_GLOBAL_VARIABLE = 0x20, + NODE_FIELD = 0x40, + NODE_FUNCTION = 0x80, + NODE_METHOD = 0x100, - NODE_FILE = 0x8000, + NODE_ENUM = 0x200, + NODE_ENUM_CONSTANT = 0x400, + NODE_TYPEDEF = 0x800, + NODE_TEMPLATE_PARAMETER_TYPE = 0x1000, - NODE_UNDEFINED_MACRO = 0x10000, - NODE_MACRO = 0x20000, + NODE_FILE = 0x2000, + NODE_MACRO = 0x4000 }; static std::string getTypeString(NodeType type); @@ -52,8 +48,7 @@ public: static const NodeTypeMask NODE_NOT_VISIBLE; - Node(Id id, NodeType type, NameHierarchy nameHierarchy); - Node(const Node& other); + Node(Id id, NodeType type, NameHierarchy nameHierarchy, bool defined); virtual ~Node(); NodeType getType() const; @@ -64,6 +59,9 @@ public: std::string getFullName() const; NameHierarchy getNameHierarchy() const; + bool isDefined() const; + void setDefined(bool defined); + const std::vector& getEdges() const; void addEdge(Edge* edge); @@ -105,6 +103,7 @@ private: NodeType m_type; NameHierarchy m_nameHierarchy; + bool m_defined; }; std::ostream& operator<<(std::ostream& ostream, const Node& node);