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.
This commit is contained in:
malte_langkabel
2016-03-18 13:33:34 +01:00
parent f6de07ecf1
commit 68c915e206
18 changed files with 271 additions and 309 deletions
-18
View File
@@ -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. 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 Node.cpp WARNING: Cannot change NodeType after it was already set from namespace to class
Edge.cpp ERROR: Nodes are not plain copies. Edge.cpp ERROR: Nodes are not plain copies.
+2
View File
@@ -154,6 +154,8 @@ add_files(
data/type/ReferenceModifiedDataType.cpp data/type/ReferenceModifiedDataType.cpp
data/type/ReferenceModifiedDataType.h data/type/ReferenceModifiedDataType.h
data/DefinitionType.cpp
data/DefinitionType.h
data/ErrorCountInfo.h data/ErrorCountInfo.h
data/HierarchyCache.cpp data/HierarchyCache.cpp
data/HierarchyCache.h data/HierarchyCache.h
+19
View File
@@ -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;
}
}
+14
View File
@@ -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
+18 -13
View File
@@ -35,26 +35,28 @@ Id IntermediateStorage::addEdge(int type, Id sourceId, Id targetId)
return id; 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<StorageNode> node = std::make_shared<StorageNode>(0, type, NameHierarchy::serialize(nameHierarchy), defined); std::shared_ptr<StorageNode> node = std::make_shared<StorageNode>(0, type, NameHierarchy::serialize(nameHierarchy), definitionType);
std::string serialized = serialize(*(node.get())); std::string serialized = serialize(*(node.get()));
std::unordered_map<std::string, Id>::const_iterator it = m_nodeNamesToIds.find(serialized); std::unordered_map<std::string, Id>::const_iterator it = m_nodeNamesToIds.find(serialized);
if (it != m_nodeNamesToIds.end()) if (it != m_nodeNamesToIds.end())
{ {
// refine stored information // update stored information
if (defined) if (definitionType > 0)
{ {
std::map<Id, std::shared_ptr<StorageNode>>::const_iterator it2 = m_nodeIdsToData.find(it->second); std::map<Id, std::shared_ptr<StorageNode>>::const_iterator it2 = m_nodeIdsToData.find(it->second);
std::shared_ptr<StorageNode> storageNode = it2->second; std::shared_ptr<StorageNode> 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; return it->second;
} }
@@ -191,18 +193,21 @@ void IntermediateStorage::transferToStorage(SqliteStorage& storage)
Id storageNodeId = storageNode.id; Id storageNodeId = storageNode.id;
if (storageNodeId) if (storageNodeId)
{ {
if (clientNode.defined) if (clientNode.definitionType > 0)
{ {
storage.setNodeDefined(true, storageNode.id); if (storageNode.definitionType == 0)
if (!storageNode.defined && storageNode.type < clientNode.type)
{ {
storage.setNodeType(clientNode.type, storageNode.id); storage.setNodeDefinitionType(clientNode.definitionType, storageNode.id);
if(storageNode.type < clientNode.type)
{
storage.setNodeType(clientNode.type, storageNode.id);
}
} }
} }
} }
else else
{ {
storageNodeId = storage.addNode(clientNode.type, clientNode.serializedName, clientNode.defined); storageNodeId = storage.addNode(clientNode.type, clientNode.serializedName, clientNode.definitionType);
} }
clientIdToStorageId[it->first] = storageNodeId; clientIdToStorageId[it->first] = storageNodeId;
} }
+1 -1
View File
@@ -18,7 +18,7 @@ public:
IntermediateStorage(); IntermediateStorage();
~IntermediateStorage(); ~IntermediateStorage();
Id addEdge(int type, Id sourceId, Id targetId); 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& name, const std::string& filePath, const std::string& modificationTime);
Id addFile(const std::string& filePath); Id addFile(const std::string& filePath);
void addSourceLocation(Id elementId, const ParseLocation& location, bool isScope); void addSourceLocation(Id elementId, const ParseLocation& location, bool isScope);
+14 -13
View File
@@ -2,6 +2,7 @@
#include "data/graph/Node.h" #include "data/graph/Node.h"
#include "data/location/TokenLocation.h" #include "data/location/TokenLocation.h"
#include "data/DefinitionType.h"
#include "data/SqliteIndex.h" #include "data/SqliteIndex.h"
#include "utility/logging/logging.h" #include "utility/logging/logging.h"
#include "utility/text/TextAccess.h" #include "utility/text/TextAccess.h"
@@ -103,7 +104,7 @@ Id SqliteStorage::addEdge(int type, Id sourceNodeId, Id targetNodeId)
return id; 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( m_database.execDML(
"INSERT INTO element(id) VALUES(NULL);" "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(); Id id = m_database.lastRowId();
m_database.execDML(( m_database.execDML((
"INSERT INTO node(id, type, serialized_name, defined) VALUES(" "INSERT INTO node(id, type, serialized_name, definition_type) VALUES("
+ std::to_string(id) + ", " + std::to_string(type) + ", '" + serializedName + "', " + std::to_string(defined) + ");" + std::to_string(id) + ", " + std::to_string(type) + ", '" + serializedName + "', " + std::to_string(definitionType) + ");"
).c_str()); ).c_str());
return id; 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 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<TextAccess> content = TextAccess::createFromFile(filePath); std::shared_ptr<TextAccess> content = TextAccess::createFromFile(filePath);
unsigned int loc = content->getLineCount(); unsigned int loc = content->getLineCount();
@@ -251,7 +252,7 @@ StorageNode SqliteStorage::getFirstNode() const
return nodes[0]; return nodes[0];
} }
return StorageNode(0, 0, "", false); return StorageNode(0, 0, "", definitionTypeToInt(DEFINITION_NONE));
} }
std::vector<StorageNode> SqliteStorage::getAllNodes() const std::vector<StorageNode> SqliteStorage::getAllNodes() const
@@ -407,7 +408,7 @@ StorageNode SqliteStorage::getNodeById(Id id) const
return nodes[0]; 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 StorageNode SqliteStorage::getNodeBySerializedName(const std::string& serializedName) const
@@ -417,7 +418,7 @@ StorageNode SqliteStorage::getNodeBySerializedName(const std::string& serialized
{ {
return nodes[0]; return nodes[0];
} }
return StorageNode(0, 0, "", 0); return StorageNode(0, 0, "", definitionTypeToInt(DEFINITION_NONE));
} }
std::vector<StorageNode> SqliteStorage::getNodesByIds(const std::vector<Id>& nodeIds) const std::vector<StorageNode> SqliteStorage::getNodesByIds(const std::vector<Id>& nodeIds) const
@@ -469,10 +470,10 @@ void SqliteStorage::setNodeType(int type, Id nodeId)
).c_str()); ).c_str());
} }
void SqliteStorage::setNodeDefined(bool defined, Id nodeId) void SqliteStorage::setNodeDefinitionType(int definitionType, Id nodeId)
{ {
m_database.execDML(( 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()); ).c_str());
} }
@@ -749,7 +750,7 @@ void SqliteStorage::setupTables()
"id INTEGER NOT NULL, " "id INTEGER NOT NULL, "
"type INTEGER NOT NULL, " "type INTEGER NOT NULL, "
"serialized_name TEXT, " "serialized_name TEXT, "
"defined INTEGER NOT NULL, " "definition_type INTEGER NOT NULL, "
"PRIMARY KEY(id), " "PRIMARY KEY(id), "
"FOREIGN KEY(id) REFERENCES element(id) ON DELETE CASCADE);" "FOREIGN KEY(id) REFERENCES element(id) ON DELETE CASCADE);"
); );
@@ -952,7 +953,7 @@ std::vector<StorageEdge> SqliteStorage::getAllEdges(const std::string& query) co
std::vector<StorageNode> SqliteStorage::getAllNodes(const std::string& query) const std::vector<StorageNode> SqliteStorage::getAllNodes(const std::string& query) const
{ {
CppSQLite3Query q = m_database.execQuery(( 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()); ).c_str());
std::vector<StorageNode> nodes; std::vector<StorageNode> nodes;
@@ -961,11 +962,11 @@ std::vector<StorageNode> SqliteStorage::getAllNodes(const std::string& query) co
const Id id = q.getIntField(0, 0); const Id id = q.getIntField(0, 0);
const int type = q.getIntField(1, -1); const int type = q.getIntField(1, -1);
const std::string serializedName = q.getStringField(2, ""); 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) if (id != 0 && type != -1)
{ {
nodes.push_back(StorageNode(id, type, serializedName, defined)); nodes.push_back(StorageNode(id, type, serializedName, definitionType));
} }
q.nextRow(); q.nextRow();
+2 -2
View File
@@ -35,7 +35,7 @@ public:
void setVersion(const Version& version); void setVersion(const Version& version);
Id addEdge(int type, Id sourceNodeId, Id targetNodeId); 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 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); Id addSourceLocation(Id elementId, Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, bool isScope);
@@ -81,7 +81,7 @@ public:
std::shared_ptr<TextAccess> getFileContentByPath(const std::string& filePath) const; std::shared_ptr<TextAccess> getFileContentByPath(const std::string& filePath) const;
void setNodeType(int type, Id nodeId); void setNodeType(int type, Id nodeId);
void setNodeDefined(bool defined, Id nodeId); void setNodeDefinitionType(int definitionType, Id nodeId);
StorageSourceLocation getSourceLocationById(const Id id) const; StorageSourceLocation getSourceLocationById(const Id id) const;
std::shared_ptr<TokenLocationFile> getTokenLocationsForFile(const FilePath& filePath) const; std::shared_ptr<TokenLocationFile> getTokenLocationsForFile(const FilePath& filePath) const;
+3 -121
View File
@@ -271,7 +271,7 @@ std::vector<SearchMatch> Storage::getAutocompletionMatches(const std::string& qu
match.nodeType = Node::intToType(node.type); match.nodeType = Node::intToType(node.type);
match.typeName = Node::getTypeString(match.nodeType); 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; match.typeName = "undefined " + match.typeName;
} }
@@ -326,7 +326,7 @@ std::shared_ptr<Graph> Storage::getGraphForAll() const
std::vector<Id> tokenIds; std::vector<Id> tokenIds;
for (StorageNode node: m_sqliteStorage.getAllNodes()) 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)) Node::intToType(node.type) == Node::NODE_NAMESPACE))
{ {
tokenIds.push_back(node.id); tokenIds.push_back(node.id);
@@ -704,124 +704,6 @@ StorageStats Storage::getStorageStats() const
return stats; 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 Id Storage::getFileNodeId(const FilePath& filePath) const
{ {
std::map<FilePath, Id>::const_iterator it = m_fileNodeIds.find(filePath); std::map<FilePath, Id>::const_iterator it = m_fileNodeIds.find(filePath);
@@ -1010,7 +892,7 @@ void Storage::addNodesToGraph(const std::vector<Id> nodeIds, Graph* graph) const
storageNode.id, storageNode.id,
type, type,
nameHierarchy, nameHierarchy,
storageNode.defined intToDefinitionType(storageNode.definitionType) != DEFINITION_NONE
); );
if (type == Node::NODE_FUNCTION || type == Node::NODE_METHOD) if (type == Node::NODE_FUNCTION || type == Node::NODE_METHOD)
-6
View File
@@ -87,12 +87,6 @@ public:
virtual StorageStats getStorageStats() const; virtual StorageStats getStorageStats() const;
private: 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; Id getFileNodeId(const FilePath& filePath) const;
FilePath getFileNodePath(Id fileId) const; FilePath getFileNodePath(Id fileId) const;
+3 -3
View File
@@ -22,17 +22,17 @@ struct StorageEdge
struct StorageNode 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) : id(id)
, type(type) , type(type)
, serializedName(serializedName) , serializedName(serializedName)
, defined(defined) , definitionType(definitionType)
{} {}
Id id; Id id;
int type; int type;
std::string serializedName; std::string serializedName;
bool defined; int definitionType;
}; };
struct StorageFile struct StorageFile
+12 -12
View File
@@ -54,27 +54,29 @@ public:
virtual void onError(const ParseLocation& location, const std::string& message, bool fatal) = 0; virtual void onError(const ParseLocation& location, const std::string& message, bool fatal) = 0;
virtual Id onTypedefParsed( 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( virtual Id onClassParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation) = 0; const ParseLocation& scopeLocation, bool isImplicit) = 0;
virtual Id onStructParsed( virtual Id onStructParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation) = 0; const ParseLocation& scopeLocation, bool isImplicit) = 0;
virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable) = 0; virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable, bool isImplicit) = 0;
virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access) = 0; virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access, bool isImplicit) = 0;
virtual Id onFunctionParsed( 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( virtual Id onMethodParsed(
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
const ParseLocation& scopeLocation) = 0; const ParseLocation& scopeLocation, bool isImplicit) = 0;
virtual Id onNamespaceParsed( virtual Id onNamespaceParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& location, const NameHierarchy& nameHierarchy,
const ParseLocation& scopeLocation) = 0; const ParseLocation& scopeLocation, bool isImplicit) = 0;
virtual Id onEnumParsed( virtual Id onEnumParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation) = 0; const ParseLocation& scopeLocation, bool isImplicit) = 0;
virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy) = 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( virtual Id onInheritanceParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& location, const NameHierarchy& nameHierarchy,
@@ -97,8 +99,6 @@ public:
virtual Id onTemplateDefaultArgumentTypeParsed( virtual Id onTemplateDefaultArgumentTypeParsed(
const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy, const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy,
const NameHierarchy& templateArgumentTypeNameHierarchy) = 0; const NameHierarchy& templateArgumentTypeNameHierarchy) = 0;
virtual Id onTemplateParameterTypeParsed(
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy) = 0;
virtual Id onTemplateSpecializationParsed( virtual Id onTemplateSpecializationParsed(
const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const ParseLocation& location, const NameHierarchy& specializedNameHierarchy,
const NameHierarchy& specializedFromNameHierarchy) = 0; const NameHierarchy& specializedFromNameHierarchy) = 0;
+75 -62
View File
@@ -53,11 +53,11 @@ void ParserClientImpl::onError(const ParseLocation& location, const std::string&
} }
Id ParserClientImpl::onTypedefParsed( 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); 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); addSourceLocation(nodeId, location, false);
addAccess(nodeId, access); addAccess(nodeId, access);
@@ -66,11 +66,15 @@ Id ParserClientImpl::onTypedefParsed(
Id ParserClientImpl::onClassParsed( Id ParserClientImpl::onClassParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation) const ParseLocation& scopeLocation, bool isImplicit)
{ {
log("class", nameHierarchy.getQualifiedName(), location); 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, location, false);
addSourceLocation(nodeId, scopeLocation, true); addSourceLocation(nodeId, scopeLocation, true);
addAccess(nodeId, access); addAccess(nodeId, access);
@@ -80,11 +84,15 @@ Id ParserClientImpl::onClassParsed(
Id ParserClientImpl::onStructParsed( Id ParserClientImpl::onStructParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation) const ParseLocation& scopeLocation, bool isImplicit)
{ {
log("struct", nameHierarchy.getQualifiedName(), location); 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, location, false);
addSourceLocation(nodeId, scopeLocation, true); addSourceLocation(nodeId, scopeLocation, true);
addAccess(nodeId, access); addAccess(nodeId, access);
@@ -92,21 +100,21 @@ Id ParserClientImpl::onStructParsed(
return 0; 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); 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); addSourceLocation(nodeId, location, false);
return 0; 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); 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); addSourceLocation(nodeId, location, false);
addAccess(nodeId, access); addAccess(nodeId, access);
@@ -114,11 +122,11 @@ Id ParserClientImpl::onFieldParsed(const ParseLocation& location, const NameHier
} }
Id ParserClientImpl::onFunctionParsed( 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); 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, location, false);
addSourceLocation(nodeId, scopeLocation, true); addSourceLocation(nodeId, scopeLocation, true);
@@ -127,11 +135,15 @@ Id ParserClientImpl::onFunctionParsed(
Id ParserClientImpl::onMethodParsed( Id ParserClientImpl::onMethodParsed(
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
const ParseLocation& scopeLocation) const ParseLocation& scopeLocation, bool isImplicit)
{ {
log("method", method.getQualifiedNameWithSignature(), location); 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, location, false);
addSourceLocation(nodeId, scopeLocation, true); addSourceLocation(nodeId, scopeLocation, true);
addAccess(nodeId, access); addAccess(nodeId, access);
@@ -140,11 +152,11 @@ Id ParserClientImpl::onMethodParsed(
} }
Id ParserClientImpl::onNamespaceParsed( 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); 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, location, false);
addSourceLocation(nodeId, scopeLocation, true); addSourceLocation(nodeId, scopeLocation, true);
@@ -153,11 +165,11 @@ Id ParserClientImpl::onNamespaceParsed(
Id ParserClientImpl::onEnumParsed( Id ParserClientImpl::onEnumParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation) const ParseLocation& scopeLocation, bool isImplicit)
{ {
log("enum", nameHierarchy.getQualifiedName(), location); 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, location, false);
addSourceLocation(nodeId, scopeLocation, true); addSourceLocation(nodeId, scopeLocation, true);
addAccess(nodeId, access); addAccess(nodeId, access);
@@ -165,24 +177,36 @@ Id ParserClientImpl::onEnumParsed(
return 0; 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); 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); addSourceLocation(nodeId, location, false);
return 0; 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( Id ParserClientImpl::onInheritanceParsed(
const ParseLocation& location, const NameHierarchy& childNameHierarchy, const ParseLocation& location, const NameHierarchy& childNameHierarchy,
const NameHierarchy& parentNameHierarchy, AccessType access) const NameHierarchy& parentNameHierarchy, AccessType access)
{ {
log("inheritance", childNameHierarchy.getQualifiedName() + " : " + parentNameHierarchy.getQualifiedName(), location); log("inheritance", childNameHierarchy.getQualifiedName() + " : " + parentNameHierarchy.getQualifiedName(), location);
Id childNodeId = addNodeHierarchy(Node::NODE_TYPE, childNameHierarchy, false); Id childNodeId = addNodeHierarchy(Node::NODE_TYPE, childNameHierarchy, DEFINITION_NONE);
Id parentNodeId = addNodeHierarchy(Node::NODE_TYPE, parentNameHierarchy, false); Id parentNodeId = addNodeHierarchy(Node::NODE_TYPE, parentNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_INHERITANCE, childNodeId, parentNodeId); Id edgeId = addEdge(Edge::EDGE_INHERITANCE, childNodeId, parentNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -194,8 +218,8 @@ Id ParserClientImpl::onMethodOverrideParsed(
{ {
log("override", overridden.getQualifiedNameWithSignature() + " -> " + overrider.getQualifiedNameWithSignature(), location); log("override", overridden.getQualifiedNameWithSignature() + " -> " + overrider.getQualifiedNameWithSignature(), location);
Id overriddenNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overridden, false); Id overriddenNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overridden, DEFINITION_NONE);
Id overriderNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overrider, false); Id overriderNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overrider, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_OVERRIDE, overriderNodeId, overriddenNodeId); Id edgeId = addEdge(Edge::EDGE_OVERRIDE, overriderNodeId, overriddenNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -206,8 +230,8 @@ Id ParserClientImpl::onCallParsed(const ParseLocation& location, const NameHiera
{ {
log("call", caller.getQualifiedNameWithSignature() + " -> " + callee.getQualifiedNameWithSignature(), location); log("call", caller.getQualifiedNameWithSignature() + " -> " + callee.getQualifiedNameWithSignature(), location);
Id callerNodeId = addNodeHierarchy(Node::NODE_FUNCTION, caller, false); Id callerNodeId = addNodeHierarchy(Node::NODE_FUNCTION, caller, DEFINITION_NONE);
Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, false); Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_CALL, callerNodeId, calleeNodeId); Id edgeId = addEdge(Edge::EDGE_CALL, callerNodeId, calleeNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -219,8 +243,8 @@ Id ParserClientImpl::onFieldUsageParsed(
{ {
log("field usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedName(), location); log("field usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedName(), location);
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, false); Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, DEFINITION_NONE);
Id usedNodeId = addNodeHierarchy(Node::NODE_FIELD, usedNameHierarchy, false); Id usedNodeId = addNodeHierarchy(Node::NODE_FIELD, usedNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId); Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -232,8 +256,8 @@ Id ParserClientImpl::onGlobalVariableUsageParsed( // or static variable used
{ {
log("global usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location); log("global usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location);
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, false); Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, DEFINITION_NONE);
Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false); Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId); Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -245,8 +269,8 @@ Id ParserClientImpl::onEnumConstantUsageParsed(
{ {
log("enum constant usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location); log("enum constant usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location);
Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, userNameHierarchy, false); Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, userNameHierarchy, DEFINITION_NONE);
Id usedNodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, usedNameHierarchy, false); Id usedNodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, usedNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId); Id edgeId = addEdge(Edge::EDGE_USAGE, userNodeId, usedNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -262,8 +286,8 @@ Id ParserClientImpl::onTypeUsageParsed(const ParseLocation& location, const Name
return 0; return 0;
} }
Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, user, false); Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, user, DEFINITION_NONE);
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, used, false); Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, used, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_TYPE_USAGE, functionNodeId, typeNodeId); Id edgeId = addEdge(Edge::EDGE_TYPE_USAGE, functionNodeId, typeNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -280,8 +304,8 @@ Id ParserClientImpl::onTemplateArgumentTypeParsed(
location location
); );
Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentTypeNameHierarchy, false); Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentTypeNameHierarchy, DEFINITION_NONE);
Id templateNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, templateNameHierarchy, false); Id templateNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, templateNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_TEMPLATE_ARGUMENT, templateNodeId, argumentNodeId); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_ARGUMENT, templateNodeId, argumentNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -298,26 +322,14 @@ Id ParserClientImpl::onTemplateDefaultArgumentTypeParsed(
location location
); );
Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeNameHierarchy, false); Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeNameHierarchy, DEFINITION_NONE);
Id parameterNodeId = addNodeHierarchy(Node::NODE_TYPE, templateParameterNameHierarchy, false); Id parameterNodeId = addNodeHierarchy(Node::NODE_TYPE, templateParameterNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT, parameterNodeId, defaultArgumentNodeId); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT, parameterNodeId, defaultArgumentNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
return defaultArgumentNodeId; 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( Id ParserClientImpl::onTemplateSpecializationParsed(
const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const ParseLocation& location, const NameHierarchy& specializedNameHierarchy,
const NameHierarchy& specializedFromNameHierarchy) const NameHierarchy& specializedFromNameHierarchy)
@@ -328,8 +340,8 @@ Id ParserClientImpl::onTemplateSpecializationParsed(
location location
); );
Id specializedId = addNodeHierarchy(Node::NODE_TYPE, specializedNameHierarchy, false); Id specializedId = addNodeHierarchy(Node::NODE_TYPE, specializedNameHierarchy, DEFINITION_NONE);
Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFromNameHierarchy, false); Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFromNameHierarchy, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, specializedId, recordNodeId); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, specializedId, recordNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -345,8 +357,8 @@ Id ParserClientImpl::onTemplateMemberFunctionSpecializationParsed(
location location
); );
Id instantiatedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, instantiatedFunction, false); Id instantiatedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, instantiatedFunction, DEFINITION_NONE);
Id specializedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, false); Id specializedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, DEFINITION_NONE);
Id edgeId = addEdge(Edge::EDGE_TEMPLATE_MEMBER_SPECIALIZATION_OF, instantiatedFunctionNodeId, specializedFunctionNodeId); Id edgeId = addEdge(Edge::EDGE_TEMPLATE_MEMBER_SPECIALIZATION_OF, instantiatedFunctionNodeId, specializedFunctionNodeId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -379,7 +391,7 @@ Id ParserClientImpl::onMacroDefineParsed(
{ {
log("macro", macroNameHierarchy.getQualifiedName(), location); 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, location, false);
addSourceLocation(macroId, scopeLocation, true); addSourceLocation(macroId, scopeLocation, true);
//Id fileNodeId = getFileNodeId(location.filePath); // do we need this??? //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); 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 fileNodeId = addFile(location.filePath.str());
Id edgeId = addEdge(Edge::EDGE_MACRO_USAGE, fileNodeId, macroExpandId); Id edgeId = addEdge(Edge::EDGE_MACRO_USAGE, fileNodeId, macroExpandId);
addSourceLocation(edgeId, location, false); addSourceLocation(edgeId, location, false);
@@ -440,7 +452,7 @@ void ParserClientImpl::addAccess(Id nodeId, TokenComponentAccess::AccessType acc
addComponentAccess(nodeId, access); 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) 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++) for (size_t i = 0; i < nameHierarchy.size(); i++)
{ {
currentNameHierarchy.push(nameHierarchy[i]); currentNameHierarchy.push(nameHierarchy[i]);
const bool isLastElement = (i == nameHierarchy.size() - 1); const bool currentIsLastElement = (i == nameHierarchy.size() - 1);
Node::NodeType type = (isLastElement ? nodeType : Node::NODE_UNDEFINED); 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... // Todo: performance optimization: check if node exists. dont add edge if it existed before...
if (parentNodeId != 0) if (parentNodeId != 0)
@@ -493,14 +506,14 @@ Id ParserClientImpl::addFile(const std::string& filePath)
return m_storage->addFile(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) if (!m_storage)
{ {
return 0; 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) Id ParserClientImpl::addEdge(int type, Id sourceId, Id targetId)
+15 -14
View File
@@ -6,6 +6,7 @@
#include "data/graph/token_component/TokenComponentAccess.h" #include "data/graph/token_component/TokenComponentAccess.h"
#include "data/graph/Node.h" #include "data/graph/Node.h"
#include "data/DefinitionType.h"
#include "data/SqliteStorage.h" #include "data/SqliteStorage.h"
class ParserClientImpl: public ParserClient class ParserClientImpl: public ParserClient
@@ -26,27 +27,29 @@ public:
virtual void onError(const ParseLocation& location, const std::string& message, bool fatal); virtual void onError(const ParseLocation& location, const std::string& message, bool fatal);
virtual Id onTypedefParsed( virtual Id onTypedefParsed(
const ParseLocation& location, const NameHierarchy& typedefName, AccessType access); const ParseLocation& location, const NameHierarchy& typedefName, AccessType access, bool isImplicit);
virtual Id onClassParsed( virtual Id onClassParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation); const ParseLocation& scopeLocation, bool isImplicit);
virtual Id onStructParsed( virtual Id onStructParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation); const ParseLocation& scopeLocation, bool isImplicit);
virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable); virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable, bool isImplicit);
virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access); virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access, bool isImplicit);
virtual Id onFunctionParsed( 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( virtual Id onMethodParsed(
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
const ParseLocation& scopeLocation); const ParseLocation& scopeLocation, bool isImplicit);
virtual Id onNamespaceParsed( virtual Id onNamespaceParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& location, const NameHierarchy& nameHierarchy,
const ParseLocation& scopeLocation); const ParseLocation& scopeLocation, bool isImplicit);
virtual Id onEnumParsed( virtual Id onEnumParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
const ParseLocation& scopeLocation); const ParseLocation& scopeLocation, bool isImplicit);
virtual Id onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy); 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( virtual Id onInheritanceParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& location, const NameHierarchy& nameHierarchy,
@@ -69,8 +72,6 @@ public:
virtual Id onTemplateDefaultArgumentTypeParsed( virtual Id onTemplateDefaultArgumentTypeParsed(
const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy, const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy,
const NameHierarchy& templateArgumentTypeNameHierarchy); const NameHierarchy& templateArgumentTypeNameHierarchy);
virtual Id onTemplateParameterTypeParsed(
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy);
virtual Id onTemplateSpecializationParsed( virtual Id onTemplateSpecializationParsed(
const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const ParseLocation& location, const NameHierarchy& specializedNameHierarchy,
const NameHierarchy& specializedFromNameHierarchy); const NameHierarchy& specializedFromNameHierarchy);
@@ -92,11 +93,11 @@ private:
TokenComponentAccess::AccessType convertAccessType(ParserClient::AccessType access) const; TokenComponentAccess::AccessType convertAccessType(ParserClient::AccessType access) const;
void addAccess(Id nodeId, ParserClient::AccessType access); void addAccess(Id nodeId, ParserClient::AccessType access);
void addAccess(Id nodeId, TokenComponentAccess::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& name, const std::string& filePath, const std::string& modificationTime);
Id addFile(const std::string& filePath); 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); Id addEdge(int type, Id sourceId, Id targetId);
void addSourceLocation(Id elementId, const ParseLocation& location, bool isScope); void addSourceLocation(Id elementId, const ParseLocation& location, bool isScope);
void addComponentAccess(Id nodeId , int type); void addComponentAccess(Id nodeId , int type);
+50 -19
View File
@@ -666,6 +666,12 @@ void ASTVisitor::traverseDeclContextHelper(clang::DeclContext *d)
// with the "Base-Class" kind. // with the "Base-Class" kind.
bool ASTVisitor::TraverseCXXRecordDecl(clang::CXXRecordDecl *d) bool ASTVisitor::TraverseCXXRecordDecl(clang::CXXRecordDecl *d)
{ {
if (d->isImplicit())
{
// do nothing
return true;
}
// Traverse qualifiers on the record decl. // Traverse qualifiers on the record decl.
TraverseNestedNameSpecifierLoc(d->getQualifierLoc()); 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) if (!d)
{ {
@@ -1146,8 +1152,20 @@ bool ASTVisitor::isImpliciit(clang::Decl* d) const
return true; return true;
} }
} }
else if (clang::FunctionDecl* fd = clang::dyn_cast_or_null<clang::FunctionDecl>(d))
{
if (fd->isTemplateInstantiation() && fd->getTemplateSpecializationKind() != clang::TSK_ExplicitSpecialization) // or undefined??
{
return true;
}
}
return isImpliciit(clang::dyn_cast_or_null<clang::Decl>(d->getDeclContext())); return isPartOfImplicitTemplateSpecialization(clang::dyn_cast_or_null<clang::Decl>(d->getDeclContext()));
}
bool ASTVisitor::isImplicit(clang::Decl* d) const
{
return d->isImplicit() || isPartOfImplicitTemplateSpecialization(d);
} }
void ASTVisitor::RecordDeclRef( void ASTVisitor::RecordDeclRef(
@@ -1156,11 +1174,11 @@ void ASTVisitor::RecordDeclRef(
RefType refType, RefType refType,
SymbolType symbolType) SymbolType symbolType)
{ {
bool isImplicit = isImpliciit(d); bool declIsImplicit = isImplicit(d);
if (!d || if (!d ||
(isImplicit && !isLocatedInProjectFile(beginLoc)) || (declIsImplicit && !isLocatedInProjectFile(beginLoc)) ||
(!isImplicit && !isLocatedInUnparsedProjectFile(beginLoc))) (!declIsImplicit && !isLocatedInUnparsedProjectFile(beginLoc)))
{ {
return; return;
} }
@@ -1183,7 +1201,8 @@ void ASTVisitor::RecordDeclRef(
m_client->onTypedefParsed( m_client->onTypedefParsed(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
convertAccessType(typedefDecl->getAccess())); convertAccessType(typedefDecl->getAccess()),
declIsImplicit);
} }
break; break;
case ST_Class: case ST_Class:
@@ -1193,7 +1212,8 @@ void ASTVisitor::RecordDeclRef(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
convertAccessType(recordDecl->getAccess()), convertAccessType(recordDecl->getAccess()),
(refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation())); (refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation()),
declIsImplicit);
} }
break; break;
case ST_Struct: case ST_Struct:
@@ -1203,13 +1223,15 @@ void ASTVisitor::RecordDeclRef(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
convertAccessType(recordDecl->getAccess()), convertAccessType(recordDecl->getAccess()),
(refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation())); (refType == RT_Definition ? getParseLocationOfRecordBody(recordDecl) : ParseLocation()),
declIsImplicit);
} }
break; break;
case ST_GlobalVariable: case ST_GlobalVariable:
m_client->onGlobalVariableParsed( m_client->onGlobalVariableParsed(
parseLocation, parseLocation,
declNameHierarchy); declNameHierarchy,
declIsImplicit);
break; break;
case ST_Field: case ST_Field:
//if (clang::VarDecl* varDecl = clang::dyn_cast<clang::VarDecl>(d)) //if (clang::VarDecl* varDecl = clang::dyn_cast<clang::VarDecl>(d))
@@ -1217,7 +1239,8 @@ void ASTVisitor::RecordDeclRef(
m_client->onFieldParsed( m_client->onFieldParsed(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
convertAccessType(d->getAccess())); convertAccessType(d->getAccess()),
declIsImplicit);
} }
break; break;
case ST_Function: case ST_Function:
@@ -1226,7 +1249,8 @@ void ASTVisitor::RecordDeclRef(
m_client->onFunctionParsed( m_client->onFunctionParsed(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
(refType == RT_Definition ? getParseLocationOfFunctionBody(functionDecl) : ParseLocation())); (refType == RT_Definition ? getParseLocationOfFunctionBody(functionDecl) : ParseLocation()),
declIsImplicit);
} }
break; break;
case ST_Constructor: case ST_Constructor:
@@ -1239,7 +1263,8 @@ void ASTVisitor::RecordDeclRef(
declNameHierarchy, declNameHierarchy,
convertAccessType(methodDecl->getAccess()), convertAccessType(methodDecl->getAccess()),
getAbstractionType(methodDecl), 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.. 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++) it != methodDecl->end_overridden_methods(); it++)
@@ -1270,14 +1295,16 @@ void ASTVisitor::RecordDeclRef(
m_client->onNamespaceParsed( m_client->onNamespaceParsed(
namespaceDecl->isAnonymousNamespace() ? ParseLocation() : parseLocation, namespaceDecl->isAnonymousNamespace() ? ParseLocation() : parseLocation,
declNameHierarchy, declNameHierarchy,
getParseLocation(namespaceDecl->getSourceRange())); getParseLocation(namespaceDecl->getSourceRange()),
declIsImplicit);
} }
else if (clang::NamespaceAliasDecl* namespaceAliasDecl = clang::dyn_cast<clang::NamespaceAliasDecl>(d)) else if (clang::NamespaceAliasDecl* namespaceAliasDecl = clang::dyn_cast<clang::NamespaceAliasDecl>(d))
{ {
m_client->onNamespaceParsed( m_client->onNamespaceParsed(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
getParseLocation(namespaceAliasDecl->getAliasedNamespace()->getSourceRange())); getParseLocation(namespaceAliasDecl->getAliasedNamespace()->getSourceRange()),
declIsImplicit);
} }
break; break;
case ST_Enum: case ST_Enum:
@@ -1287,20 +1314,23 @@ void ASTVisitor::RecordDeclRef(
parseLocation, parseLocation,
declNameHierarchy, declNameHierarchy,
convertAccessType(enumDecl->getAccess()), convertAccessType(enumDecl->getAccess()),
getParseLocation(enumDecl->getSourceRange())); getParseLocation(enumDecl->getSourceRange()),
declIsImplicit);
} }
break; break;
case ST_Enumerator: case ST_Enumerator:
m_client->onEnumConstantParsed( m_client->onEnumConstantParsed(
parseLocation, parseLocation,
declNameHierarchy); declNameHierarchy,
declIsImplicit);
break; break;
case ST_TemplateParameter: case ST_TemplateParameter:
if (!d->getName().empty()) // We don't create symbols for unnamed template parameters. if (!d->getName().empty()) // We don't create symbols for unnamed template parameters.
{ {
m_client->onTemplateParameterTypeParsed( m_client->onTemplateParameterTypeParsed(
parseLocation, parseLocation,
declNameHierarchy); declNameHierarchy,
declIsImplicit);
} }
break; break;
case ST_ClassTemplateSpecialization: case ST_ClassTemplateSpecialization:
@@ -1426,7 +1456,8 @@ void ASTVisitor::RecordDeclRef(
m_client->onFunctionParsed( m_client->onFunctionParsed(
parseLocation, parseLocation,
declNameHierarchy, 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) if (m_contextNameGenerator)
{ {
+4 -2
View File
@@ -163,6 +163,7 @@ private:
// Misc routines // Misc routines
bool shouldVisitTemplateInstantiations() const { return true; } bool shouldVisitTemplateInstantiations() const { return true; }
bool shouldUseDataRecursionFor(clang::Stmt *s) const; bool shouldUseDataRecursionFor(clang::Stmt *s) const;
//bool shouldVisitImplicitCode() const { return true; } // TODO: uncomment this when implicit nodes are hidden in the ui
// Dispatcher routines // Dispatcher routines
bool TraverseStmt(clang::Stmt *stmt); bool TraverseStmt(clang::Stmt *stmt);
@@ -237,7 +238,8 @@ private:
RefType refType, RefType refType,
SymbolType symbolType = ST_Max); SymbolType symbolType = ST_Max);
bool isImpliciit(clang::Decl* d) const; bool isPartOfImplicitTemplateSpecialization(clang::Decl* d) const;
bool isImplicit(clang::Decl* d) const;
void RecordDeclRef( void RecordDeclRef(
clang::NamedDecl *d, clang::NamedDecl *d,
@@ -254,7 +256,7 @@ private:
ParseLocation getParseLocationOfFunctionBody(const clang::FunctionDecl* decl) const; ParseLocation getParseLocationOfFunctionBody(const clang::FunctionDecl* decl) const;
ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const; ParseLocation getParseLocation(const clang::SourceRange& sourceRange) const;
NameHierarchy getContextName(); NameHierarchy getContextName() const;
struct FileIdHash { struct FileIdHash {
size_t operator()(clang::FileID fileID) const { size_t operator()(clang::FileID fileID) const {
@@ -227,7 +227,6 @@ std::shared_ptr<NameElement> CxxDeclNameResolver::getDeclName()
return std::make_shared<NameElement>( return std::make_shared<NameElement>(
functionName, functionName,
NameElement::Signature((isStatic ? "static " : "") + returnTypeString, parameterString + (isConst ? " const" : ""))); NameElement::Signature((isStatic ? "static " : "") + returnTypeString, parameterString + (isConst ? " const" : "")));
} }
else if (clang::isa<clang::TemplateDecl>(declaration)) // also triggers on TemplateTemplateParmDecl else if (clang::isa<clang::TemplateDecl>(declaration)) // also triggers on TemplateTemplateParmDecl
{ {
@@ -253,6 +252,23 @@ std::shared_ptr<NameElement> CxxDeclNameResolver::getDeclName()
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart()); const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart());
return std::make_shared<NameElement>("anonymous enum (" + FilePath(presumedBegin.getFilename()).fileName() + ")"); return std::make_shared<NameElement>("anonymous enum (" + FilePath(presumedBegin.getFilename()).fileName() + ")");
} }
else if (
(
clang::isa<clang::TemplateTypeParmDecl>(declaration) ||
clang::isa<clang::NonTypeTemplateParmDecl>(declaration) ||
clang::isa<clang::TemplateTemplateParmDecl>(declaration)
) && declNameString.size() == 0)
{
const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager();
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart());
return std::make_shared<NameElement>("anonymous template parameter (" + FilePath(presumedBegin.getFilename()).fileName() + ")");
}
else if (clang::isa<clang::ParmVarDecl>(declaration) && declNameString.size() == 0)
{
const clang::SourceManager& sourceManager = declaration->getASTContext().getSourceManager();
const clang::PresumedLoc& presumedBegin = sourceManager.getPresumedLoc(declaration->getLocStart());
return std::make_shared<NameElement>("anonymous parameter (" + FilePath(presumedBegin.getFilename()).fileName() + ")");
}
if (declNameString.size() > 0) if (declNameString.size() > 0)
{ {
+19 -19
View File
@@ -2817,7 +2817,7 @@ private:
} }
virtual Id onTypedefParsed( 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); std::string str = addAccessPrefix(typedefName.getQualifiedName(), access);
@@ -2827,7 +2827,7 @@ private:
virtual Id onClassParsed( virtual Id onClassParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, 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)); classes.push_back(addLocationSuffix(addAccessPrefix(nameHierarchy.getQualifiedName(), access), location, scopeLocation));
return 0; return 0;
@@ -2835,26 +2835,26 @@ private:
virtual Id onStructParsed( virtual Id onStructParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, 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)); structs.push_back(addLocationSuffix(addAccessPrefix(nameHierarchy.getQualifiedName(), access), location, scopeLocation));
return 0; 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)); globalVariables.push_back(addLocationSuffix(variable.getQualifiedName(), location));
return 0; 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)); fields.push_back(addLocationSuffix(addAccessPrefix(field.getQualifiedName(), access), location));
return 0; return 0;
} }
virtual Id onFunctionParsed( 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)); functions.push_back(addLocationSuffix(function.getQualifiedNameWithSignature(), location, scopeLocation));
return 0; return 0;
@@ -2862,7 +2862,7 @@ private:
virtual Id onMethodParsed( virtual Id onMethodParsed(
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction, const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
const ParseLocation& scopeLocation) const ParseLocation& scopeLocation, bool isImplicit)
{ {
std::string str = method.getQualifiedNameWithSignature(); std::string str = method.getQualifiedNameWithSignature();
str = addAbstractionPrefix(str, abstraction); str = addAbstractionPrefix(str, abstraction);
@@ -2873,7 +2873,7 @@ private:
} }
virtual Id onNamespaceParsed( 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)); namespaces.push_back(addLocationSuffix(nameHierarchy.getQualifiedName(), location, scopeLocation));
return 0; return 0;
@@ -2881,13 +2881,13 @@ private:
virtual Id onEnumParsed( virtual Id onEnumParsed(
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access, 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)); enums.push_back(addLocationSuffix(addAccessPrefix(nameHierarchy.getQualifiedName(), access), location, scopeLocation));
return 0; 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)); enumConstants.push_back(addLocationSuffix(nameHierarchy.getQualifiedName(), location));
return 0; return 0;
@@ -2938,6 +2938,15 @@ private:
return 0; 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) virtual Id onTypeUsageParsed(const ParseLocation& location, const NameHierarchy& user, const NameHierarchy& used)
{ {
typeUses.push_back(addLocationSuffix(user.getQualifiedNameWithSignature() + " -> " + used.getQualifiedNameWithSignature(), location)); typeUses.push_back(addLocationSuffix(user.getQualifiedNameWithSignature() + " -> " + used.getQualifiedNameWithSignature(), location));
@@ -2964,15 +2973,6 @@ private:
return 0; return 0;
} }
virtual Id onTemplateParameterTypeParsed(
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy)
{
templateParameterTypes.push_back(
addLocationSuffix(templateParameterTypeNameHierarchy.getQualifiedName(), location)
);
return 0;
}
virtual Id onTemplateSpecializationParsed( virtual Id onTemplateSpecializationParsed(
const ParseLocation& location, const NameHierarchy& specializedNameHierarchy, const ParseLocation& location, const NameHierarchy& specializedNameHierarchy,
const NameHierarchy& specializedFromNameHierarchy) const NameHierarchy& specializedFromNameHierarchy)