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)