From eab703cb0d9814ba612eac1c73813358515ce744 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Fri, 18 Mar 2016 13:33:34 +0100 Subject: [PATCH] data: implicit in database * storing the information if a node is defined implicitly in the database * the analysis however does not visit implicit nodes directly. Currently they are just recorded when used somewhere in the code. This should be changed once implicit nodes are hidde in the UI. * removed error logs for unnamed template parameters and function parameters since it is ok when they are anonymous. --- bin/test/data/log/test_log.txt | 18 --- src/lib/CMakeLists.txt | 2 + src/lib/data/DefinitionType.cpp | 19 +++ src/lib/data/DefinitionType.h | 14 ++ src/lib/data/IntermediateStorage.cpp | 31 ++-- src/lib/data/IntermediateStorage.h | 2 +- src/lib/data/SqliteStorage.cpp | 27 ++-- src/lib/data/SqliteStorage.h | 4 +- src/lib/data/Storage.cpp | 124 +--------------- src/lib/data/Storage.h | 6 - src/lib/data/StorageTypes.h | 6 +- src/lib/data/parser/ParserClient.h | 24 +-- src/lib/data/parser/ParserClientImpl.cpp | 137 ++++++++++-------- src/lib/data/parser/ParserClientImpl.h | 29 ++-- src/lib_parser/data/parser/cxx/ASTVisitor.cpp | 69 ++++++--- src/lib_parser/data/parser/cxx/ASTVisitor.h | 8 +- .../cxx/name_resolver/CxxDeclNameResolver.cpp | 22 ++- src/test/CxxParserTestSuite.h | 38 ++--- 18 files changed, 271 insertions(+), 309 deletions(-) create mode 100644 src/lib/data/DefinitionType.cpp create mode 100644 src/lib/data/DefinitionType.h diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt index bf6594a6..c99f7782 100644 --- a/bin/test/data/log/test_log.txt +++ b/bin/test/data/log/test_log.txt @@ -1,21 +1,3 @@ -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:11 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:1:13 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:7:15 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:5:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:48 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:7:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:3:20 -CxxDeclNameResolver.cpp ERROR: could not resolve name of decl at: input.cc:4:20 Token.cpp ERROR: Location Id was not referenced by this Token. Node.cpp WARNING: Cannot change NodeType after it was already set from namespace to class Edge.cpp ERROR: Nodes are not plain copies. diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 8f7f47eb..116c0b88 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -154,6 +154,8 @@ add_files( data/type/ReferenceModifiedDataType.cpp data/type/ReferenceModifiedDataType.h + data/DefinitionType.cpp + data/DefinitionType.h data/ErrorCountInfo.h data/HierarchyCache.cpp data/HierarchyCache.h diff --git a/src/lib/data/DefinitionType.cpp b/src/lib/data/DefinitionType.cpp new file mode 100644 index 00000000..47ce98b4 --- /dev/null +++ b/src/lib/data/DefinitionType.cpp @@ -0,0 +1,19 @@ +#include "data/DefinitionType.h" + +int definitionTypeToInt(DefinitionType definitionType) +{ + return definitionType; +} + +DefinitionType intToDefinitionType(int definitionType) +{ + switch (definitionType) + { + case 0: + return DEFINITION_NONE; + case 1: + return DEFINITION_IMPLICIT; + case 2: + return DEFINITION_EXPLICIT; + } +} diff --git a/src/lib/data/DefinitionType.h b/src/lib/data/DefinitionType.h new file mode 100644 index 00000000..49284e86 --- /dev/null +++ b/src/lib/data/DefinitionType.h @@ -0,0 +1,14 @@ +#ifndef DEFINITION_TYPE_H +#define DEFINITION_TYPE_H + +enum DefinitionType +{ + DEFINITION_NONE = 0, + DEFINITION_IMPLICIT = 1, + DEFINITION_EXPLICIT = 2 +}; + +int definitionTypeToInt(DefinitionType definitionType); +DefinitionType intToDefinitionType(int definitionType); + +#endif // DEFINITION_TYPE_H diff --git a/src/lib/data/IntermediateStorage.cpp b/src/lib/data/IntermediateStorage.cpp index b2a45a8d..bc4a5ffe 100644 --- a/src/lib/data/IntermediateStorage.cpp +++ b/src/lib/data/IntermediateStorage.cpp @@ -35,26 +35,28 @@ Id IntermediateStorage::addEdge(int type, Id sourceId, Id targetId) return id; } -Id IntermediateStorage::addNode(int type, const NameHierarchy& nameHierarchy, bool defined) +Id IntermediateStorage::addNode(int type, const NameHierarchy& nameHierarchy, int definitionType) { - std::shared_ptr node = std::make_shared(0, type, NameHierarchy::serialize(nameHierarchy), defined); + std::shared_ptr node = std::make_shared(0, type, NameHierarchy::serialize(nameHierarchy), definitionType); std::string serialized = serialize(*(node.get())); std::unordered_map::const_iterator it = m_nodeNamesToIds.find(serialized); if (it != m_nodeNamesToIds.end()) { - // refine stored information - if (defined) + // update stored information + if (definitionType > 0) { std::map>::const_iterator it2 = m_nodeIdsToData.find(it->second); std::shared_ptr storageNode = it2->second; - if (!storageNode->defined && storageNode->type < type) + if (storageNode->definitionType == 0) { - storageNode->type = type; + storageNode->definitionType = definitionType; + if (storageNode->type < type) + { + storageNode->type = type; + } } - storageNode->defined = true; } - return it->second; } @@ -191,18 +193,21 @@ void IntermediateStorage::transferToStorage(SqliteStorage& storage) Id storageNodeId = storageNode.id; if (storageNodeId) { - if (clientNode.defined) + if (clientNode.definitionType > 0) { - storage.setNodeDefined(true, storageNode.id); - if (!storageNode.defined && storageNode.type < clientNode.type) + if (storageNode.definitionType == 0) { - storage.setNodeType(clientNode.type, storageNode.id); + storage.setNodeDefinitionType(clientNode.definitionType, storageNode.id); + if(storageNode.type < clientNode.type) + { + storage.setNodeType(clientNode.type, storageNode.id); + } } } } else { - storageNodeId = storage.addNode(clientNode.type, clientNode.serializedName, clientNode.defined); + storageNodeId = storage.addNode(clientNode.type, clientNode.serializedName, clientNode.definitionType); } clientIdToStorageId[it->first] = storageNodeId; } diff --git a/src/lib/data/IntermediateStorage.h b/src/lib/data/IntermediateStorage.h index cb0efdd7..88ba96a6 100644 --- a/src/lib/data/IntermediateStorage.h +++ b/src/lib/data/IntermediateStorage.h @@ -18,7 +18,7 @@ public: IntermediateStorage(); ~IntermediateStorage(); Id addEdge(int type, Id sourceId, Id targetId); - Id addNode(int type, const NameHierarchy& nameHierarchy, bool defined); + Id addNode(int type, const NameHierarchy& nameHierarchy, int definitionType); Id addFile(const std::string& name, const std::string& filePath, const std::string& modificationTime); Id addFile(const std::string& filePath); void addSourceLocation(Id elementId, const ParseLocation& location, bool isScope); diff --git a/src/lib/data/SqliteStorage.cpp b/src/lib/data/SqliteStorage.cpp index 2f131e13..1a810871 100644 --- a/src/lib/data/SqliteStorage.cpp +++ b/src/lib/data/SqliteStorage.cpp @@ -2,6 +2,7 @@ #include "data/graph/Node.h" #include "data/location/TokenLocation.h" +#include "data/DefinitionType.h" #include "data/SqliteIndex.h" #include "utility/logging/logging.h" #include "utility/text/TextAccess.h" @@ -103,7 +104,7 @@ Id SqliteStorage::addEdge(int type, Id sourceNodeId, Id targetNodeId) return id; } -Id SqliteStorage::addNode(int type, const std::string& serializedName, bool defined) +Id SqliteStorage::addNode(int type, const std::string& serializedName, int definitionType) { m_database.execDML( "INSERT INTO element(id) VALUES(NULL);" @@ -111,8 +112,8 @@ Id SqliteStorage::addNode(int type, const std::string& serializedName, bool defi Id id = m_database.lastRowId(); m_database.execDML(( - "INSERT INTO node(id, type, serialized_name, defined) VALUES(" - + std::to_string(id) + ", " + std::to_string(type) + ", '" + serializedName + "', " + std::to_string(defined) + ");" + "INSERT INTO node(id, type, serialized_name, definition_type) VALUES(" + + std::to_string(id) + ", " + std::to_string(type) + ", '" + serializedName + "', " + std::to_string(definitionType) + ");" ).c_str()); return id; @@ -120,7 +121,7 @@ Id SqliteStorage::addNode(int type, const std::string& serializedName, bool defi Id SqliteStorage::addFile(const std::string& serializedName, const std::string& filePath, const std::string& modificationTime) { - Id id = addNode(Node::NODE_FILE, serializedName, true); + Id id = addNode(Node::NODE_FILE, serializedName, definitionTypeToInt(DEFINITION_EXPLICIT)); std::shared_ptr content = TextAccess::createFromFile(filePath); unsigned int loc = content->getLineCount(); @@ -251,7 +252,7 @@ StorageNode SqliteStorage::getFirstNode() const return nodes[0]; } - return StorageNode(0, 0, "", false); + return StorageNode(0, 0, "", definitionTypeToInt(DEFINITION_NONE)); } std::vector SqliteStorage::getAllNodes() const @@ -407,7 +408,7 @@ StorageNode SqliteStorage::getNodeById(Id id) const return nodes[0]; } } - return StorageNode(0, 0, 0, false); + return StorageNode(0, 0, 0, definitionTypeToInt(DEFINITION_NONE)); } StorageNode SqliteStorage::getNodeBySerializedName(const std::string& serializedName) const @@ -417,7 +418,7 @@ StorageNode SqliteStorage::getNodeBySerializedName(const std::string& serialized { return nodes[0]; } - return StorageNode(0, 0, "", 0); + return StorageNode(0, 0, "", definitionTypeToInt(DEFINITION_NONE)); } std::vector SqliteStorage::getNodesByIds(const std::vector& nodeIds) const @@ -469,10 +470,10 @@ void SqliteStorage::setNodeType(int type, Id nodeId) ).c_str()); } -void SqliteStorage::setNodeDefined(bool defined, Id nodeId) +void SqliteStorage::setNodeDefinitionType(int definitionType, Id nodeId) { m_database.execDML(( - "UPDATE node SET defined = " + std::to_string(defined) + " WHERE id == " + std::to_string(nodeId) + ";" + "UPDATE node SET definition_type = " + std::to_string(definitionType) + " WHERE id == " + std::to_string(nodeId) + ";" ).c_str()); } @@ -749,7 +750,7 @@ void SqliteStorage::setupTables() "id INTEGER NOT NULL, " "type INTEGER NOT NULL, " "serialized_name TEXT, " - "defined INTEGER NOT NULL, " + "definition_type INTEGER NOT NULL, " "PRIMARY KEY(id), " "FOREIGN KEY(id) REFERENCES element(id) ON DELETE CASCADE);" ); @@ -952,7 +953,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, serialized_name, defined FROM node " + query + ";" + "SELECT id, type, serialized_name, definition_type FROM node " + query + ";" ).c_str()); std::vector nodes; @@ -961,11 +962,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 std::string serializedName = q.getStringField(2, ""); - const bool defined = q.getIntField(3, 0); + const int definitionType = q.getIntField(3, 0); if (id != 0 && type != -1) { - nodes.push_back(StorageNode(id, type, serializedName, defined)); + nodes.push_back(StorageNode(id, type, serializedName, definitionType)); } q.nextRow(); diff --git a/src/lib/data/SqliteStorage.h b/src/lib/data/SqliteStorage.h index eab308cb..32b2e477 100644 --- a/src/lib/data/SqliteStorage.h +++ b/src/lib/data/SqliteStorage.h @@ -35,7 +35,7 @@ public: void setVersion(const Version& version); Id addEdge(int type, Id sourceNodeId, Id targetNodeId); - Id addNode(int type, const std::string& serializedName, bool defined); + Id addNode(int type, const std::string& serializedName, int definitionType); Id addFile(const std::string& serializedName, const std::string& filePath, const std::string& modificationTime); Id addSourceLocation(Id elementId, Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, bool isScope); @@ -81,7 +81,7 @@ public: std::shared_ptr getFileContentByPath(const std::string& filePath) const; void setNodeType(int type, Id nodeId); - void setNodeDefined(bool defined, Id nodeId); + void setNodeDefinitionType(int definitionType, Id nodeId); StorageSourceLocation getSourceLocationById(const Id id) const; std::shared_ptr getTokenLocationsForFile(const FilePath& filePath) const; diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 95143a85..a39f6d94 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -271,7 +271,7 @@ std::vector Storage::getAutocompletionMatches(const std::string& qu match.nodeType = Node::intToType(node.type); match.typeName = Node::getTypeString(match.nodeType); - if (!node.defined && match.nodeType != Node::NODE_UNDEFINED) + if (intToDefinitionType(node.definitionType) == DEFINITION_NONE && match.nodeType != Node::NODE_UNDEFINED) { match.typeName = "undefined " + match.typeName; } @@ -326,7 +326,7 @@ std::shared_ptr Storage::getGraphForAll() const std::vector tokenIds; for (StorageNode node: m_sqliteStorage.getAllNodes()) { - if (node.defined && (!m_hierarchyCache.isChildOfVisibleNodeOrInvisible(node.id) || + if (intToDefinitionType(node.definitionType) != DEFINITION_NONE && (!m_hierarchyCache.isChildOfVisibleNodeOrInvisible(node.id) || Node::intToType(node.type) == Node::NODE_NAMESPACE)) { tokenIds.push_back(node.id); @@ -704,124 +704,6 @@ StorageStats Storage::getStorageStats() const return stats; } -Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined) -{ - if (nameHierarchy.size() == 0) - { - return 0; - } - - Id parentNodeId = 0; - bool nodeMayExist = true; - NameHierarchy currentNameHierarchy; - - for (size_t i = 0; i < nameHierarchy.size(); i++) - { - currentNameHierarchy.push(nameHierarchy[i]); - const bool isLastElement = (i == nameHierarchy.size() - 1); - Node::NodeType type = (isLastElement ? nodeType : Node::NODE_UNDEFINED); - - StorageNode node(0, 0, "", false); - - if (nodeMayExist) - { - node = m_sqliteStorage.getNodeBySerializedName(NameHierarchy::serialize(currentNameHierarchy)); - } - - Id nodeId = node.id; - - if (nodeId && !node.defined && isLastElement && defined) // todo: move this down! - { - m_sqliteStorage.setNodeDefined(true, nodeId); - } - - if (nodeId == 0) - { - nodeMayExist = false; - nodeId = m_sqliteStorage.addNode(Node::typeToInt(type), NameHierarchy::serialize(currentNameHierarchy), isLastElement && defined); - - if (parentNodeId != 0) - { - addEdge(parentNodeId, nodeId, Edge::EDGE_MEMBER); - } - } - else if (isLastElement) // Update the type of the last node if the new type is more specific. - { - Node::NodeType storedType = Node::intToType(node.type); - if (!node.defined && type > storedType) - { - m_sqliteStorage.setNodeType(Node::typeToInt(type), nodeId); - } - } - - parentNodeId = nodeId; - } - - return parentNodeId; -} - -Id Storage::addSourceLocation(Id elementNodeId, const ParseLocation &location, bool isScope) -{ - if (!location.isValid()) - { - return 0; - } - - if (location.filePath.empty()) - { - LOG_ERROR("no filename set!"); - return 0; - } - else - { - Id fileNodeId = getFileNodeId(location.filePath); - - if (!fileNodeId) - { - LOG_ERROR("Can't create source location, file node does not exist for: " + location.filePath.str()); - return 0; - } - - Id locationId = m_sqliteStorage.addSourceLocation( - elementNodeId, fileNodeId, location.startLineNumber, location.startColumnNumber, - location.endLineNumber, location.endColumnNumber, isScope - ); - - return locationId; - } -} - -Id Storage::addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type) -{ - if (!sourceNodeId || !targetNodeId) - { - return 0; - } - - Id edgeId = m_sqliteStorage.getEdgeBySourceTargetType(sourceNodeId, targetNodeId, type).id; - - if (!edgeId) - { - edgeId = m_sqliteStorage.addEdge(type, sourceNodeId, targetNodeId); - } - - return edgeId; -} - -Id Storage::addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type, ParseLocation location) -{ - if (!sourceNodeId || !targetNodeId) - { - return 0; - } - - Id edgeId = addEdge(sourceNodeId, targetNodeId, type); - - addSourceLocation(edgeId, location, false); - - return edgeId; -} - Id Storage::getFileNodeId(const FilePath& filePath) const { std::map::const_iterator it = m_fileNodeIds.find(filePath); @@ -1010,7 +892,7 @@ void Storage::addNodesToGraph(const std::vector nodeIds, Graph* graph) const storageNode.id, type, nameHierarchy, - storageNode.defined + intToDefinitionType(storageNode.definitionType) != DEFINITION_NONE ); if (type == Node::NODE_FUNCTION || type == Node::NODE_METHOD) diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index bcd86ebd..f748e004 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -87,12 +87,6 @@ public: virtual StorageStats getStorageStats() const; private: - Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined); - Id addSourceLocation(Id elementNodeId, const ParseLocation &location, bool isScope = false); - - Id addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type); - Id addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type, ParseLocation location); - Id getFileNodeId(const FilePath& filePath) const; FilePath getFileNodePath(Id fileId) const; diff --git a/src/lib/data/StorageTypes.h b/src/lib/data/StorageTypes.h index 62750f8c..8aea572c 100644 --- a/src/lib/data/StorageTypes.h +++ b/src/lib/data/StorageTypes.h @@ -22,17 +22,17 @@ struct StorageEdge struct StorageNode { - StorageNode(Id id, int type, const std::string& serializedName, bool defined) + StorageNode(Id id, int type, const std::string& serializedName, int definitionType) : id(id) , type(type) , serializedName(serializedName) - , defined(defined) + , definitionType(definitionType) {} Id id; int type; std::string serializedName; - bool defined; + int definitionType; }; struct StorageFile diff --git a/src/lib/data/parser/ParserClient.h b/src/lib/data/parser/ParserClient.h index ca20f28d..e898be68 100644 --- a/src/lib/data/parser/ParserClient.h +++ b/src/lib/data/parser/ParserClient.h @@ -54,27 +54,29 @@ public: virtual void onError(const ParseLocation& location, const std::string& message, bool fatal) = 0; virtual Id onTypedefParsed( - const ParseLocation& location, const NameHierarchy& typedefName, AccessType access) = 0; + const ParseLocation& location, const NameHierarchy& typedefName, AccessType access, bool isImplicit) = 0; virtual Id onClassParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) = 0; + const ParseLocation& scopeLocation, bool isImplicit) = 0; virtual Id onStructParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) = 0; - virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable) = 0; - virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access) = 0; + const ParseLocation& scopeLocation, bool isImplicit) = 0; + virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable, bool isImplicit) = 0; + virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access, bool isImplicit) = 0; virtual Id onFunctionParsed( - const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation) = 0; + const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation, bool isImplicit) = 0; virtual Id onMethodParsed( const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, - const ParseLocation& scopeLocation) = 0; + const ParseLocation& scopeLocation, bool isImplicit) = 0; virtual Id onNamespaceParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, - const ParseLocation& scopeLocation) = 0; + const ParseLocation& scopeLocation, bool isImplicit) = 0; virtual Id onEnumParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) = 0; - virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy) = 0; + const ParseLocation& scopeLocation, bool isImplicit) = 0; + virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy, bool isImplicit) = 0; + virtual Id onTemplateParameterTypeParsed( + const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy, bool isImplicit) = 0; virtual Id onInheritanceParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, @@ -97,8 +99,6 @@ public: virtual Id onTemplateDefaultArgumentTypeParsed( const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy, const NameHierarchy& templateArgumentTypeNameHierarchy) = 0; - virtual Id onTemplateParameterTypeParsed( - const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy) = 0; virtual Id onTemplateSpecializationParsed( const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const NameHierarchy& specializedFromNameHierarchy) = 0; diff --git a/src/lib/data/parser/ParserClientImpl.cpp b/src/lib/data/parser/ParserClientImpl.cpp index ba8a0ade..af596fb2 100644 --- a/src/lib/data/parser/ParserClientImpl.cpp +++ b/src/lib/data/parser/ParserClientImpl.cpp @@ -53,11 +53,11 @@ void ParserClientImpl::onError(const ParseLocation& location, const std::string& } Id ParserClientImpl::onTypedefParsed( - const ParseLocation& location, const NameHierarchy& typedefName, AccessType access) + const ParseLocation& location, const NameHierarchy& typedefName, AccessType access, bool isImplicit) { log("typedef", typedefName.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_TYPEDEF, typedefName, true); + Id nodeId = addNodeHierarchy(Node::NODE_TYPEDEF, typedefName, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); addAccess(nodeId, access); @@ -66,11 +66,15 @@ Id ParserClientImpl::onTypedefParsed( Id ParserClientImpl::onClassParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { log("class", nameHierarchy.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_CLASS, nameHierarchy, scopeLocation.isValid()); + Id nodeId = addNodeHierarchy( + Node::NODE_CLASS, + nameHierarchy, + (isImplicit ? DEFINITION_IMPLICIT : (scopeLocation.isValid() ? DEFINITION_EXPLICIT : DEFINITION_NONE)) + ); addSourceLocation(nodeId, location, false); addSourceLocation(nodeId, scopeLocation, true); addAccess(nodeId, access); @@ -80,11 +84,15 @@ Id ParserClientImpl::onClassParsed( Id ParserClientImpl::onStructParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { log("struct", nameHierarchy.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_STRUCT, nameHierarchy, scopeLocation.isValid()); + Id nodeId = addNodeHierarchy( + Node::NODE_STRUCT, + nameHierarchy, + (isImplicit ? DEFINITION_IMPLICIT : (scopeLocation.isValid() ? DEFINITION_EXPLICIT : DEFINITION_NONE)) + ); addSourceLocation(nodeId, location, false); addSourceLocation(nodeId, scopeLocation, true); addAccess(nodeId, access); @@ -92,21 +100,21 @@ Id ParserClientImpl::onStructParsed( return 0; } -Id ParserClientImpl::onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable) +Id ParserClientImpl::onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable, bool isImplicit) { log("global", variable.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, variable, true); + Id nodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, variable, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); return 0; } -Id ParserClientImpl::onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access) +Id ParserClientImpl::onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access, bool isImplicit) { log("field", field.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_FIELD, field, true); + Id nodeId = addNodeHierarchy(Node::NODE_FIELD, field, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); addAccess(nodeId, access); @@ -114,11 +122,11 @@ Id ParserClientImpl::onFieldParsed(const ParseLocation& location, const NameHier } Id ParserClientImpl::onFunctionParsed( - const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation) + const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation, bool isImplicit) { log("function", function.getQualifiedNameWithSignature(), location); - Id nodeId = addNodeHierarchy(Node::NODE_FUNCTION, function, true); + Id nodeId = addNodeHierarchy(Node::NODE_FUNCTION, function, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); addSourceLocation(nodeId, scopeLocation, true); @@ -127,11 +135,15 @@ Id ParserClientImpl::onFunctionParsed( Id ParserClientImpl::onMethodParsed( const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { log("method", method.getQualifiedNameWithSignature(), location); - Id nodeId = addNodeHierarchy(Node::NODE_METHOD, method, location.isValid() && scopeLocation.isValid()); + Id nodeId = addNodeHierarchy( + Node::NODE_METHOD, + method, + (isImplicit ? DEFINITION_IMPLICIT : ((location.isValid() && scopeLocation.isValid()) ? (DEFINITION_EXPLICIT) : DEFINITION_NONE)) + ); addSourceLocation(nodeId, location, false); addSourceLocation(nodeId, scopeLocation, true); addAccess(nodeId, access); @@ -140,11 +152,11 @@ Id ParserClientImpl::onMethodParsed( } Id ParserClientImpl::onNamespaceParsed( - const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& scopeLocation) + const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& scopeLocation, bool isImplicit) { log("namespace", nameHierarchy.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_NAMESPACE, nameHierarchy, true); + Id nodeId = addNodeHierarchy(Node::NODE_NAMESPACE, nameHierarchy, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); addSourceLocation(nodeId, scopeLocation, true); @@ -153,11 +165,11 @@ Id ParserClientImpl::onNamespaceParsed( Id ParserClientImpl::onEnumParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { log("enum", nameHierarchy.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_ENUM, nameHierarchy, true); + Id nodeId = addNodeHierarchy(Node::NODE_ENUM, nameHierarchy, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); addSourceLocation(nodeId, scopeLocation, true); addAccess(nodeId, access); @@ -165,24 +177,36 @@ Id ParserClientImpl::onEnumParsed( return 0; } -Id ParserClientImpl::onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy) +Id ParserClientImpl::onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy, bool isImplicit) { log("enum constant", nameHierarchy.getQualifiedName(), location); - Id nodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, nameHierarchy, true); + Id nodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, nameHierarchy, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); addSourceLocation(nodeId, location, false); return 0; } +Id ParserClientImpl::onTemplateParameterTypeParsed( + const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy, bool isImplicit) +{ + log("template parameter type", templateParameterTypeNameHierarchy.getQualifiedName(), location); + + Id nodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, (isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT)); + addSourceLocation(nodeId, location, false); + addAccess(nodeId, TokenComponentAccess::ACCESS_TEMPLATE); + + return 0; +} + Id ParserClientImpl::onInheritanceParsed( const ParseLocation& location, const NameHierarchy& childNameHierarchy, const NameHierarchy& parentNameHierarchy, AccessType access) { log("inheritance", childNameHierarchy.getQualifiedName() + " : " + parentNameHierarchy.getQualifiedName(), location); - Id childNodeId = addNodeHierarchy(Node::NODE_TYPE, childNameHierarchy, false); - Id parentNodeId = addNodeHierarchy(Node::NODE_TYPE, parentNameHierarchy, false); + Id childNodeId = addNodeHierarchy(Node::NODE_TYPE, childNameHierarchy, DEFINITION_NONE); + Id parentNodeId = addNodeHierarchy(Node::NODE_TYPE, parentNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_INHERITANCE, childNodeId, parentNodeId); addSourceLocation(edgeId, location, false); @@ -194,8 +218,8 @@ Id ParserClientImpl::onMethodOverrideParsed( { log("override", overridden.getQualifiedNameWithSignature() + " -> " + overrider.getQualifiedNameWithSignature(), location); - Id overriddenNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overridden, false); - Id overriderNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overrider, false); + Id overriddenNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overridden, DEFINITION_NONE); + Id overriderNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overrider, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_OVERRIDE, overriderNodeId, overriddenNodeId); addSourceLocation(edgeId, location, false); @@ -206,8 +230,8 @@ Id ParserClientImpl::onCallParsed(const ParseLocation& location, const NameHiera { log("call", caller.getQualifiedNameWithSignature() + " -> " + callee.getQualifiedNameWithSignature(), location); - Id callerNodeId = addNodeHierarchy(Node::NODE_FUNCTION, caller, false); - Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, false); + Id callerNodeId = addNodeHierarchy(Node::NODE_FUNCTION, caller, DEFINITION_NONE); + Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_CALL, callerNodeId, calleeNodeId); addSourceLocation(edgeId, location, false); @@ -219,8 +243,8 @@ Id ParserClientImpl::onFieldUsageParsed( { log("field usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedName(), location); - Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, false); - Id usedNodeId = addNodeHierarchy(Node::NODE_FIELD, usedNameHierarchy, false); + Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, DEFINITION_NONE); + Id usedNodeId = addNodeHierarchy(Node::NODE_FIELD, usedNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId); addSourceLocation(edgeId, location, false); @@ -232,8 +256,8 @@ Id ParserClientImpl::onGlobalVariableUsageParsed( // or static variable used { log("global usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location); - Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, false); - Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); + Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, DEFINITION_NONE); + Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId); addSourceLocation(edgeId, location, false); @@ -245,8 +269,8 @@ Id ParserClientImpl::onEnumConstantUsageParsed( { log("enum constant usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location); - Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, userNameHierarchy, false); - Id usedNodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, usedNameHierarchy, false); + Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, userNameHierarchy, DEFINITION_NONE); + Id usedNodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, usedNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId); addSourceLocation(edgeId, location, false); @@ -262,8 +286,8 @@ Id ParserClientImpl::onTypeUsageParsed(const ParseLocation& location, const Name return 0; } - Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, user, false); - Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, used, false); + Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, user, DEFINITION_NONE); + Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, used, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_TYPE_USAGE, functionNodeId, typeNodeId); addSourceLocation(edgeId, location, false); @@ -280,8 +304,8 @@ Id ParserClientImpl::onTemplateArgumentTypeParsed( location ); - Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentTypeNameHierarchy, false); - Id templateNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, templateNameHierarchy, false); + Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentTypeNameHierarchy, DEFINITION_NONE); + Id templateNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, templateNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_ARGUMENT, templateNodeId, argumentNodeId); addSourceLocation(edgeId, location, false); @@ -298,26 +322,14 @@ Id ParserClientImpl::onTemplateDefaultArgumentTypeParsed( location ); - Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeNameHierarchy, false); - Id parameterNodeId = addNodeHierarchy(Node::NODE_TYPE, templateParameterNameHierarchy, false); + Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeNameHierarchy, DEFINITION_NONE); + Id parameterNodeId = addNodeHierarchy(Node::NODE_TYPE, templateParameterNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT, parameterNodeId, defaultArgumentNodeId); addSourceLocation(edgeId, location, false); return defaultArgumentNodeId; } -Id ParserClientImpl::onTemplateParameterTypeParsed( // TODO: move this up to where nodes are created - const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy) -{ - log("template parameter type", templateParameterTypeNameHierarchy.getQualifiedName(), location); - - Id nodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, true); - addSourceLocation(nodeId, location, false); - addAccess(nodeId, TokenComponentAccess::ACCESS_TEMPLATE); - - return 0; -} - Id ParserClientImpl::onTemplateSpecializationParsed( const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const NameHierarchy& specializedFromNameHierarchy) @@ -328,8 +340,8 @@ Id ParserClientImpl::onTemplateSpecializationParsed( location ); - Id specializedId = addNodeHierarchy(Node::NODE_TYPE, specializedNameHierarchy, false); - Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFromNameHierarchy, false); + Id specializedId = addNodeHierarchy(Node::NODE_TYPE, specializedNameHierarchy, DEFINITION_NONE); + Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFromNameHierarchy, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, specializedId, recordNodeId); addSourceLocation(edgeId, location, false); @@ -345,8 +357,8 @@ Id ParserClientImpl::onTemplateMemberFunctionSpecializationParsed( location ); - Id instantiatedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, instantiatedFunction, false); - Id specializedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, false); + Id instantiatedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, instantiatedFunction, DEFINITION_NONE); + Id specializedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, DEFINITION_NONE); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_MEMBER_SPECIALIZATION_OF, instantiatedFunctionNodeId, specializedFunctionNodeId); addSourceLocation(edgeId, location, false); @@ -379,7 +391,7 @@ Id ParserClientImpl::onMacroDefineParsed( { log("macro", macroNameHierarchy.getQualifiedName(), location); - Id macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, true); + Id macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, DEFINITION_EXPLICIT); addSourceLocation(macroId, location, false); addSourceLocation(macroId, scopeLocation, true); //Id fileNodeId = getFileNodeId(location.filePath); // do we need this??? @@ -392,7 +404,7 @@ Id ParserClientImpl::onMacroExpandParsed(const ParseLocation &location, const Na { log("macro use", macroNameHierarchy.getQualifiedName(), location); - Id macroExpandId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, false); + Id macroExpandId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, DEFINITION_NONE); Id fileNodeId = addFile(location.filePath.str()); Id edgeId = addEdge(Edge::EDGE_MACRO_USAGE, fileNodeId, macroExpandId); addSourceLocation(edgeId, location, false); @@ -440,7 +452,7 @@ void ParserClientImpl::addAccess(Id nodeId, TokenComponentAccess::AccessType acc addComponentAccess(nodeId, access); } -Id ParserClientImpl::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined) +Id ParserClientImpl::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, DefinitionType definitionType) { if (nameHierarchy.size() == 0) { @@ -454,10 +466,11 @@ Id ParserClientImpl::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nam for (size_t i = 0; i < nameHierarchy.size(); i++) { currentNameHierarchy.push(nameHierarchy[i]); - const bool isLastElement = (i == nameHierarchy.size() - 1); - Node::NodeType type = (isLastElement ? nodeType : Node::NODE_UNDEFINED); + const bool currentIsLastElement = (i == nameHierarchy.size() - 1); + Node::NodeType currentType = (currentIsLastElement ? nodeType : Node::NODE_UNDEFINED); // TODO: rename to unknown! + DefinitionType currentDefinitionType = (currentIsLastElement ? definitionType : DEFINITION_NONE); - Id nodeId = addNode(type, currentNameHierarchy, isLastElement && defined); + Id nodeId = addNode(currentType, currentNameHierarchy, currentDefinitionType); // Todo: performance optimization: check if node exists. dont add edge if it existed before... if (parentNodeId != 0) @@ -493,14 +506,14 @@ Id ParserClientImpl::addFile(const std::string& filePath) return m_storage->addFile(filePath); } -Id ParserClientImpl::addNode(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined) +Id ParserClientImpl::addNode(Node::NodeType nodeType, NameHierarchy nameHierarchy, DefinitionType definitionType) { if (!m_storage) { return 0; } - return m_storage->addNode(Node::typeToInt(nodeType), nameHierarchy, defined); + return m_storage->addNode(Node::typeToInt(nodeType), nameHierarchy, definitionTypeToInt(definitionType)); } Id ParserClientImpl::addEdge(int type, Id sourceId, Id targetId) diff --git a/src/lib/data/parser/ParserClientImpl.h b/src/lib/data/parser/ParserClientImpl.h index b2f29eb9..04483145 100644 --- a/src/lib/data/parser/ParserClientImpl.h +++ b/src/lib/data/parser/ParserClientImpl.h @@ -6,6 +6,7 @@ #include "data/graph/token_component/TokenComponentAccess.h" #include "data/graph/Node.h" +#include "data/DefinitionType.h" #include "data/SqliteStorage.h" class ParserClientImpl: public ParserClient @@ -26,27 +27,29 @@ public: virtual void onError(const ParseLocation& location, const std::string& message, bool fatal); virtual Id onTypedefParsed( - const ParseLocation& location, const NameHierarchy& typedefName, AccessType access); + const ParseLocation& location, const NameHierarchy& typedefName, AccessType access, bool isImplicit); virtual Id onClassParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation); + const ParseLocation& scopeLocation, bool isImplicit); virtual Id onStructParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation); - virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable); - virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access); + const ParseLocation& scopeLocation, bool isImplicit); + virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable, bool isImplicit); + virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access, bool isImplicit); virtual Id onFunctionParsed( - const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation); + const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation, bool isImplicit); virtual Id onMethodParsed( const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, - const ParseLocation& scopeLocation); + const ParseLocation& scopeLocation, bool isImplicit); virtual Id onNamespaceParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, - const ParseLocation& scopeLocation); + const ParseLocation& scopeLocation, bool isImplicit); virtual Id onEnumParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation); - virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy); + const ParseLocation& scopeLocation, bool isImplicit); + virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy, bool isImplicit); + virtual Id onTemplateParameterTypeParsed( + const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy, bool isImplicit); virtual Id onInheritanceParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, @@ -69,8 +72,6 @@ public: virtual Id onTemplateDefaultArgumentTypeParsed( const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy, const NameHierarchy& templateArgumentTypeNameHierarchy); - virtual Id onTemplateParameterTypeParsed( - const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy); virtual Id onTemplateSpecializationParsed( const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const NameHierarchy& specializedFromNameHierarchy); @@ -92,11 +93,11 @@ private: TokenComponentAccess::AccessType convertAccessType(ParserClient::AccessType access) const; void addAccess(Id nodeId, ParserClient::AccessType access); void addAccess(Id nodeId, TokenComponentAccess::AccessType access); - Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined); + Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, DefinitionType definitionType); Id addFile(const std::string& name, const std::string& filePath, const std::string& modificationTime); Id addFile(const std::string& filePath); - Id addNode(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined); + Id addNode(Node::NodeType nodeType, NameHierarchy nameHierarchy, DefinitionType definitionType); Id addEdge(int type, Id sourceId, Id targetId); void addSourceLocation(Id elementId, const ParseLocation& location, bool isScope); void addComponentAccess(Id nodeId , int type); diff --git a/src/lib_parser/data/parser/cxx/ASTVisitor.cpp b/src/lib_parser/data/parser/cxx/ASTVisitor.cpp index 7af259c3..9a732934 100644 --- a/src/lib_parser/data/parser/cxx/ASTVisitor.cpp +++ b/src/lib_parser/data/parser/cxx/ASTVisitor.cpp @@ -666,6 +666,12 @@ void ASTVisitor::traverseDeclContextHelper(clang::DeclContext *d) // with the "Base-Class" kind. bool ASTVisitor::TraverseCXXRecordDecl(clang::CXXRecordDecl *d) { + if (d->isImplicit()) + { + // do nothing + return true; + } + // Traverse qualifiers on the record decl. TraverseNestedNameSpecifierLoc(d->getQualifierLoc()); @@ -1132,7 +1138,7 @@ void ASTVisitor::RecordTypeRef( } } -bool ASTVisitor::isImpliciit(clang::Decl* d) const +bool ASTVisitor::isPartOfImplicitTemplateSpecialization(clang::Decl* d) const { if (!d) { @@ -1146,8 +1152,20 @@ bool ASTVisitor::isImpliciit(clang::Decl* d) const return true; } } + else if (clang::FunctionDecl* fd = clang::dyn_cast_or_null(d)) + { + if (fd->isTemplateInstantiation() && fd->getTemplateSpecializationKind() != clang::TSK_ExplicitSpecialization) // or undefined?? + { + return true; + } + } - return isImpliciit(clang::dyn_cast_or_null(d->getDeclContext())); + return isPartOfImplicitTemplateSpecialization(clang::dyn_cast_or_null(d->getDeclContext())); +} + +bool ASTVisitor::isImplicit(clang::Decl* d) const +{ + return d->isImplicit() || isPartOfImplicitTemplateSpecialization(d); } void ASTVisitor::RecordDeclRef( @@ -1156,11 +1174,11 @@ void ASTVisitor::RecordDeclRef( RefType refType, SymbolType symbolType) { - bool isImplicit = isImpliciit(d); + bool declIsImplicit = isImplicit(d); if (!d || - (isImplicit && !isLocatedInProjectFile(beginLoc)) || - (!isImplicit && !isLocatedInUnparsedProjectFile(beginLoc))) + (declIsImplicit && !isLocatedInProjectFile(beginLoc)) || + (!declIsImplicit && !isLocatedInUnparsedProjectFile(beginLoc))) { return; } @@ -1183,7 +1201,8 @@ void ASTVisitor::RecordDeclRef( m_client->onTypedefParsed( parseLocation, declNameHierarchy, - convertAccessType(typedefDecl->getAccess())); + convertAccessType(typedefDecl->getAccess()), + declIsImplicit); } break; case ST_Class: @@ -1193,7 +1212,8 @@ void ASTVisitor::RecordDeclRef( parseLocation, declNameHierarchy, convertAccessType(recordDecl->getAccess()), - (refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation())); + (refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation()), + declIsImplicit); } break; case ST_Struct: @@ -1203,13 +1223,15 @@ void ASTVisitor::RecordDeclRef( parseLocation, declNameHierarchy, convertAccessType(recordDecl->getAccess()), - (refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation())); + (refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation()), + declIsImplicit); } break; case ST_GlobalVariable: m_client->onGlobalVariableParsed( parseLocation, - declNameHierarchy); + declNameHierarchy, + declIsImplicit); break; case ST_Field: //if (clang::VarDecl* varDecl = clang::dyn_cast(d)) @@ -1217,7 +1239,8 @@ void ASTVisitor::RecordDeclRef( m_client->onFieldParsed( parseLocation, declNameHierarchy, - convertAccessType(d->getAccess())); + convertAccessType(d->getAccess()), + declIsImplicit); } break; case ST_Function: @@ -1226,7 +1249,8 @@ void ASTVisitor::RecordDeclRef( m_client->onFunctionParsed( parseLocation, declNameHierarchy, - (refType == RT_Definition ? getParseLocationOfFunctionBody(functionDecl) : ParseLocation())); + (refType == RT_Definition ? getParseLocationOfFunctionBody(functionDecl) : ParseLocation()), + declIsImplicit); } break; case ST_Constructor: @@ -1239,7 +1263,8 @@ void ASTVisitor::RecordDeclRef( declNameHierarchy, convertAccessType(methodDecl->getAccess()), getAbstractionType(methodDecl), - (refType == RT_Definition ? getParseLocationOfFunctionBody(methodDecl) : ParseLocation())); + (refType == RT_Definition ? getParseLocationOfFunctionBody(methodDecl) : ParseLocation()), + declIsImplicit); for (clang::CXXMethodDecl::method_iterator it = methodDecl->begin_overridden_methods(); // iterate in traversal and use RT_Overridden or so.. it != methodDecl->end_overridden_methods(); it++) @@ -1270,14 +1295,16 @@ void ASTVisitor::RecordDeclRef( m_client->onNamespaceParsed( namespaceDecl->isAnonymousNamespace() ? ParseLocation() : parseLocation, declNameHierarchy, - getParseLocation(namespaceDecl->getSourceRange())); + getParseLocation(namespaceDecl->getSourceRange()), + declIsImplicit); } else if (clang::NamespaceAliasDecl* namespaceAliasDecl = clang::dyn_cast(d)) { m_client->onNamespaceParsed( parseLocation, declNameHierarchy, - getParseLocation(namespaceAliasDecl->getAliasedNamespace()->getSourceRange())); + getParseLocation(namespaceAliasDecl->getAliasedNamespace()->getSourceRange()), + declIsImplicit); } break; case ST_Enum: @@ -1287,20 +1314,23 @@ void ASTVisitor::RecordDeclRef( parseLocation, declNameHierarchy, convertAccessType(enumDecl->getAccess()), - getParseLocation(enumDecl->getSourceRange())); + getParseLocation(enumDecl->getSourceRange()), + declIsImplicit); } break; case ST_Enumerator: m_client->onEnumConstantParsed( parseLocation, - declNameHierarchy); + declNameHierarchy, + declIsImplicit); break; case ST_TemplateParameter: if (!d->getName().empty()) // We don't create symbols for unnamed template parameters. { m_client->onTemplateParameterTypeParsed( parseLocation, - declNameHierarchy); + declNameHierarchy, + declIsImplicit); } break; case ST_ClassTemplateSpecialization: @@ -1426,7 +1456,8 @@ void ASTVisitor::RecordDeclRef( m_client->onFunctionParsed( parseLocation, declNameHierarchy, - parseLocation + parseLocation, + declIsImplicit ); } @@ -1625,7 +1656,7 @@ ParseLocation ASTVisitor::getParseLocation(const clang::SourceRange& sourceRange ); } -NameHierarchy ASTVisitor::getContextName() +NameHierarchy ASTVisitor::getContextName() const { if (m_contextNameGenerator) { diff --git a/src/lib_parser/data/parser/cxx/ASTVisitor.h b/src/lib_parser/data/parser/cxx/ASTVisitor.h index 7c59fa3b..a5219dd5 100644 --- a/src/lib_parser/data/parser/cxx/ASTVisitor.h +++ b/src/lib_parser/data/parser/cxx/ASTVisitor.h @@ -163,6 +163,7 @@ private: // Misc routines bool shouldVisitTemplateInstantiations() const { return true; } bool shouldUseDataRecursionFor(clang::Stmt *s) const; + //bool shouldVisitImplicitCode() const { return true; } // TODO: uncomment this when implicit nodes are hidden in the ui // Dispatcher routines bool TraverseStmt(clang::Stmt *stmt); @@ -237,7 +238,8 @@ private: RefType refType, SymbolType symbolType = ST_Max); - bool isImpliciit(clang::Decl* d) const; + bool isPartOfImplicitTemplateSpecialization(clang::Decl* d) const; + bool isImplicit(clang::Decl* d) const; void RecordDeclRef( clang::NamedDecl *d, @@ -247,14 +249,14 @@ private: bool isLocatedInUnparsedProjectFile(clang::SourceLocation loc); bool isLocatedInProjectFile(clang::SourceLocation loc); - + ParserClient::AccessType convertAccessType(clang::AccessSpecifier access) const; ParserClient::AbstractionType getAbstractionType(const clang::CXXMethodDecl* methodDecl) const; ParseLocation getParseLocationOfRecordBody(clang::RecordDecl* decl) const; ParseLocation getParseLocationOfFunctionBody(const clang::FunctionDecl* decl) const; ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const; - NameHierarchy getContextName(); + NameHierarchy getContextName() const; struct FileIdHash { size_t operator()(clang::FileID fileID) const { diff --git a/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp b/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp index 4d3737c9..9732d5db 100644 --- a/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp +++ b/src/lib_parser/data/parser/cxx/name_resolver/CxxDeclNameResolver.cpp @@ -225,9 +225,8 @@ std::shared_ptr CxxDeclNameResolver::getDeclName() parameterString += ")"; return std::make_shared( - functionName, + functionName, NameElement::Signature((isStatic ? "static " : "") + returnTypeString, parameterString + (isConst ? " const" : ""))); - } else if (clang::isa(declaration)) // also triggers on TemplateTemplateParmDecl { @@ -253,7 +252,24 @@ std::shared_ptr CxxDeclNameResolver::getDeclName() const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart()); return std::make_shared("anonymous enum (" + FilePath(presumedBegin.getFilename()).fileName() + ")"); } - + else if ( + ( + clang::isa(declaration) || + clang::isa(declaration) || + clang::isa(declaration) + ) && declNameString.size() == 0) + { + const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager(); + const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart()); + return std::make_shared("anonymous template parameter (" + FilePath(presumedBegin.getFilename()).fileName() + ")"); + } + else if (clang::isa(declaration) && declNameString.size() == 0) + { + const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager(); + const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart()); + return std::make_shared("anonymous parameter (" + FilePath(presumedBegin.getFilename()).fileName() + ")"); + } + if (declNameString.size() > 0) { return std::make_shared(declNameString); diff --git a/src/test/CxxParserTestSuite.h b/src/test/CxxParserTestSuite.h index 07124a47..607f6fb4 100644 --- a/src/test/CxxParserTestSuite.h +++ b/src/test/CxxParserTestSuite.h @@ -2817,7 +2817,7 @@ private: } virtual Id onTypedefParsed( - const ParseLocation& location, const NameHierarchy& typedefName, AccessType access + const ParseLocation& location, const NameHierarchy& typedefName, AccessType access, bool isImplicit ) { std::string str = addAccessPrefix(typedefName.getQualifiedName(), access); @@ -2827,7 +2827,7 @@ private: virtual Id onClassParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { classes.push_back(addLocationSuffix(addAccessPrefix(nameHierarchy.getQualifiedName(), access), location, scopeLocation)); return 0; @@ -2835,26 +2835,26 @@ private: virtual Id onStructParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { structs.push_back(addLocationSuffix(addAccessPrefix(nameHierarchy.getQualifiedName(), access), location, scopeLocation)); return 0; } - virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable) + virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable, bool isImplicit) { globalVariables.push_back(addLocationSuffix(variable.getQualifiedName(), location)); return 0; } - virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access) + virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access, bool isImplicit) { fields.push_back(addLocationSuffix(addAccessPrefix(field.getQualifiedName(), access), location)); return 0; } virtual Id onFunctionParsed( - const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation) + const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation, bool isImplicit) { functions.push_back(addLocationSuffix(function.getQualifiedNameWithSignature(), location, scopeLocation)); return 0; @@ -2862,7 +2862,7 @@ private: virtual Id onMethodParsed( const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { std::string str = method.getQualifiedNameWithSignature(); str = addAbstractionPrefix(str, abstraction); @@ -2873,7 +2873,7 @@ private: } virtual Id onNamespaceParsed( - const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& scopeLocation) + const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& scopeLocation, bool isImplicit) { namespaces.push_back(addLocationSuffix(nameHierarchy.getQualifiedName(), location, scopeLocation)); return 0; @@ -2881,13 +2881,13 @@ private: virtual Id onEnumParsed( const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, - const ParseLocation& scopeLocation) + const ParseLocation& scopeLocation, bool isImplicit) { enums.push_back(addLocationSuffix(addAccessPrefix(nameHierarchy.getQualifiedName(), access), location, scopeLocation)); return 0; } - virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy) + virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy, bool isImplicit) { enumConstants.push_back(addLocationSuffix(nameHierarchy.getQualifiedName(), location)); return 0; @@ -2938,6 +2938,15 @@ private: return 0; } + virtual Id onTemplateParameterTypeParsed( + const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy, bool isImplicit) + { + templateParameterTypes.push_back( + addLocationSuffix(templateParameterTypeNameHierarchy.getQualifiedName(), location) + ); + return 0; + } + virtual Id onTypeUsageParsed(const ParseLocation& location, const NameHierarchy& user, const NameHierarchy& used) { typeUses.push_back(addLocationSuffix(user.getQualifiedNameWithSignature() + " -> " + used.getQualifiedNameWithSignature(), location)); @@ -2964,15 +2973,6 @@ private: return 0; } - virtual Id onTemplateParameterTypeParsed( - const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy) - { - templateParameterTypes.push_back( - addLocationSuffix(templateParameterTypeNameHierarchy.getQualifiedName(), location) - ); - return 0; - } - virtual Id onTemplateSpecializationParsed( const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const NameHierarchy& specializedFromNameHierarchy)