data: revised indexing
* increased performance. coati is now 1.55 times as fast as at version 0.4 * integrated sourceweb parsing code * removed astbodyvisitor * NameHierarchy now store signatures in a new format * storage does not allow to re-set the type of a node, once it is marked as "defined". * made onTemplateRecordSpecParsed just create the edge, not the node. * removed distinction between template specialitzations for functions and classes
This commit is contained in:
+78
-248
@@ -177,7 +177,7 @@ void Storage::finishParsing()
|
||||
buildHierarchyCache();
|
||||
}
|
||||
|
||||
void Storage::prepareParsingFile(const FilePath& filePath)
|
||||
void Storage::startParsingFile(const FilePath& filePath)
|
||||
{
|
||||
m_sqliteStorage.beginTransaction();
|
||||
}
|
||||
@@ -214,32 +214,26 @@ size_t Storage::getErrorCount() const
|
||||
}
|
||||
|
||||
Id Storage::onTypedefParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseTypeUsage& underlyingType,
|
||||
AccessType access
|
||||
const ParseLocation& location, const NameHierarchy& typedefName, AccessType access
|
||||
){
|
||||
log("typedef", nameHierarchy.getFullName() + " -> " + underlyingType.dataType->getFullTypeName(), location);
|
||||
log("typedef", typedefName.getQualifiedName(), location);
|
||||
|
||||
Id typedefNodeId = addNodeHierarchy(Node::NODE_TYPEDEF, nameHierarchy, true);
|
||||
addSourceLocation(typedefNodeId, location);
|
||||
addAccess(typedefNodeId, access);
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_TYPEDEF, typedefName, true);
|
||||
addSourceLocation(nodeId, location);
|
||||
addAccess(nodeId, access);
|
||||
|
||||
Id underlyingTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, underlyingType.dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(typedefNodeId, underlyingTypeNodeId, Edge::EDGE_TYPEDEF_OF, location);
|
||||
|
||||
return typedefNodeId;
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
Id Storage::onClassParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation
|
||||
){
|
||||
log("class", nameHierarchy.getFullName(), location);
|
||||
log("class", nameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_CLASS, nameHierarchy, scopeLocation.isValid());
|
||||
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
addAccess(nodeId, access);
|
||||
|
||||
return nodeId;
|
||||
@@ -249,63 +243,43 @@ Id Storage::onStructParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation
|
||||
){
|
||||
log("struct", nameHierarchy.getFullName(), location);
|
||||
log("struct", nameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_STRUCT, nameHierarchy, scopeLocation.isValid());
|
||||
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
addAccess(nodeId, access);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
Id Storage::onGlobalVariableParsed(const ParseLocation& location, const ParseVariable& variable)
|
||||
Id Storage::onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable)
|
||||
{
|
||||
log("global", variable.getFullName(), location);
|
||||
log("global", variable.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, variable.nameHierarchy, true);
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, variable, true);
|
||||
addSourceLocation(nodeId, location);
|
||||
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, variable.type.dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(nodeId, typeNodeId, Edge::EDGE_TYPE_OF, location);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
Id Storage::onFieldParsed(const ParseLocation& location, const ParseVariable& variable, AccessType access)
|
||||
Id Storage::onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access)
|
||||
{
|
||||
log("field", variable.getFullName(), location);
|
||||
log("field", field.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_FIELD, variable.nameHierarchy, true);
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_FIELD, field, true);
|
||||
addSourceLocation(nodeId, location);
|
||||
addAccess(nodeId, access);
|
||||
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, variable.type.dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(nodeId, typeNodeId, Edge::EDGE_TYPE_OF, variable.type.location);
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
Id Storage::onFunctionParsed(
|
||||
const ParseLocation& location, const ParseFunction& function, const ParseLocation& scopeLocation
|
||||
const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation
|
||||
){
|
||||
log("function", function.getFullName(), location);
|
||||
log("function", function.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_FUNCTION, function, true);
|
||||
|
||||
Id returnTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, function.returnType.dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(nodeId, returnTypeNodeId, Edge::EDGE_TYPE_USAGE, function.returnType.location);
|
||||
// addEdge(nodeId, returnTypeNodeId, Edge::EDGE_RETURN_TYPE_OF, function.returnType.location);
|
||||
|
||||
for (size_t i = 0; i < function.parameters.size(); i++)
|
||||
{
|
||||
Id parameternTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, function.parameters[i].dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_TYPE_USAGE, function.parameters[i].location);
|
||||
// addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_PARAMETER_TYPE_OF, function.parameters[i].location);
|
||||
}
|
||||
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
@@ -313,40 +287,25 @@ Id Storage::onFunctionParsed(
|
||||
}
|
||||
|
||||
Id Storage::onMethodParsed(
|
||||
const ParseLocation& location, const ParseFunction& method, AccessType access, AbstractionType abstraction,
|
||||
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
|
||||
const ParseLocation& scopeLocation
|
||||
){
|
||||
log("method", method.getFullName(), location);
|
||||
log("method", method.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_METHOD, method, location.isValid() && scopeLocation.isValid());
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
addAccess(nodeId, access);
|
||||
|
||||
if (method.returnType.location.isValid())
|
||||
{
|
||||
Id returnTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, method.returnType.dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(nodeId, returnTypeNodeId, Edge::EDGE_TYPE_USAGE, method.returnType.location);
|
||||
// addEdge(nodeId, returnTypeNodeId, Edge::EDGE_RETURN_TYPE_OF, method.returnType.location);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < method.parameters.size(); i++)
|
||||
{
|
||||
Id parameternTypeNodeId = addNodeHierarchy(Node::NODE_TYPE, method.parameters[i].dataType->getTypeNameHierarchy(), false);
|
||||
addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_TYPE_USAGE, method.parameters[i].location);
|
||||
// addEdge(nodeId, parameternTypeNodeId, Edge::EDGE_PARAMETER_TYPE_OF, method.parameters[i].location);
|
||||
}
|
||||
|
||||
return nodeId;
|
||||
}
|
||||
|
||||
Id Storage::onNamespaceParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& scopeLocation
|
||||
){
|
||||
log("namespace", nameHierarchy.getFullName(), location);
|
||||
log("namespace", nameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_NAMESPACE, nameHierarchy, true);
|
||||
|
||||
addSourceLocation(nodeId, location);
|
||||
addSourceLocation(nodeId, scopeLocation, true);
|
||||
|
||||
@@ -357,7 +316,7 @@ Id Storage::onEnumParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation
|
||||
){
|
||||
log("enum", nameHierarchy.getFullName(), location);
|
||||
log("enum", nameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_ENUM, nameHierarchy, true);
|
||||
|
||||
@@ -370,7 +329,7 @@ Id Storage::onEnumParsed(
|
||||
|
||||
Id Storage::onEnumConstantParsed(const ParseLocation& location, const NameHierarchy& nameHierarchy)
|
||||
{
|
||||
log("enum constant", nameHierarchy.getFullName(), location);
|
||||
log("enum constant", nameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id nodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, nameHierarchy, true);
|
||||
|
||||
@@ -383,7 +342,7 @@ Id Storage::onInheritanceParsed(
|
||||
const ParseLocation& location, const NameHierarchy& childNameHierarchy,
|
||||
const NameHierarchy& parentNameHierarchy, AccessType access
|
||||
){
|
||||
log("inheritance", childNameHierarchy.getFullName() + " : " + parentNameHierarchy.getFullName(), location);
|
||||
log("inheritance", childNameHierarchy.getQualifiedName() + " : " + parentNameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id childNodeId = addNodeHierarchy(Node::NODE_TYPE, childNameHierarchy, false);
|
||||
Id parentNodeId = addNodeHierarchy(Node::NODE_TYPE, parentNameHierarchy, false);
|
||||
@@ -394,11 +353,11 @@ Id Storage::onInheritanceParsed(
|
||||
}
|
||||
|
||||
Id Storage::onMethodOverrideParsed(
|
||||
const ParseLocation& location, const ParseFunction& base, const ParseFunction& overrider)
|
||||
const ParseLocation& location, const NameHierarchy& overridden, const NameHierarchy& overrider)
|
||||
{
|
||||
log("override", base.getFullName() + " -> " + overrider.getFullName(), location);
|
||||
log("override", overridden.getQualifiedNameWithSignature() + " -> " + overrider.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id baseNodeId = addNodeHierarchy(Node::NODE_FUNCTION, base, false); // TODO: call this overridden
|
||||
Id baseNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overridden, false);
|
||||
Id overriderNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overrider, false);
|
||||
|
||||
Id edgeId = addEdge(overriderNodeId, baseNodeId, Edge::EDGE_OVERRIDE, location);
|
||||
@@ -406,9 +365,9 @@ Id Storage::onMethodOverrideParsed(
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onCallParsed(const ParseLocation& location, const ParseFunction& caller, const ParseFunction& callee)
|
||||
Id Storage::onCallParsed(const ParseLocation& location, const NameHierarchy& caller, const NameHierarchy& callee)
|
||||
{
|
||||
log("call", caller.getFullName() + " -> " + callee.getFullName(), location);
|
||||
log("call", caller.getQualifiedNameWithSignature() + " -> " + callee.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id callerNodeId = addNodeHierarchy(Node::NODE_FUNCTION, caller, false);
|
||||
Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, false);
|
||||
@@ -418,37 +377,12 @@ Id Storage::onCallParsed(const ParseLocation& location, const ParseFunction& cal
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onCallParsed(const ParseLocation& location, const ParseVariable& caller, const ParseFunction& callee)
|
||||
{
|
||||
log("call", caller.getFullName() + " -> " + callee.getFullName(), location);
|
||||
|
||||
Id callerNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, caller.nameHierarchy, false);
|
||||
Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, false);
|
||||
|
||||
Id edgeId = addEdge(callerNodeId, calleeNodeId, Edge::EDGE_CALL, location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy
|
||||
){
|
||||
log("field usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
|
||||
log("field usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_FIELD, usedNameHierarchy, false);
|
||||
|
||||
Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy
|
||||
){
|
||||
log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
|
||||
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user.nameHierarchy, false);
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_FIELD, usedNameHierarchy, false);
|
||||
|
||||
Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location);
|
||||
@@ -457,24 +391,11 @@ Id Storage::onFieldUsageParsed(
|
||||
}
|
||||
|
||||
Id Storage::onGlobalVariableUsageParsed( // or static variable used
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy
|
||||
){
|
||||
log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
|
||||
log("global usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false);
|
||||
|
||||
Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onGlobalVariableUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy)
|
||||
{
|
||||
log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
|
||||
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, user.nameHierarchy, false);
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, userNameHierarchy, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false);
|
||||
|
||||
Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location);
|
||||
@@ -483,99 +404,47 @@ Id Storage::onGlobalVariableUsageParsed(
|
||||
}
|
||||
|
||||
Id Storage::onEnumConstantUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy
|
||||
){
|
||||
log("enum constant usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
|
||||
log("enum constant usage", userNameHierarchy.getQualifiedNameWithSignature() + " -> " + usedNameHierarchy.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false);
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, userNameHierarchy, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_ENUM_CONSTANT, usedNameHierarchy, false);
|
||||
|
||||
Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onEnumConstantUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy
|
||||
){
|
||||
log("enum constant usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
|
||||
|
||||
Id userNodeId = addNodeHierarchy(Node::NODE_FUNCTION, user.nameHierarchy, false);
|
||||
Id usedNodeId = addNodeHierarchy(Node::NODE_GLOBAL_VARIABLE, usedNameHierarchy, false);
|
||||
|
||||
Id edgeId = addEdge(userNodeId, usedNodeId, Edge::EDGE_USAGE, location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseFunction& function) // check if type has valid location
|
||||
Id Storage::onTypeUsageParsed(const ParseLocation& location, const NameHierarchy& user, const NameHierarchy& used)
|
||||
{
|
||||
log("type usage", function.getFullName() + " -> " + typeUsage.dataType->getRawTypeName(), typeUsage.location);
|
||||
log("type usage", user.getQualifiedNameWithSignature() + " -> " + used.getQualifiedName(), location);
|
||||
|
||||
if (!typeUsage.location.isValid())
|
||||
if (!location.isValid())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Id functionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, function, false);
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, typeUsage.dataType->getTypeNameHierarchy(), false);
|
||||
Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, user, false);
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, used, false);
|
||||
|
||||
Id edgeId = addEdge(functionNodeId, typeNodeId, Edge::EDGE_TYPE_USAGE, typeUsage.location);
|
||||
Id edgeId = addEdge(functionNodeId, typeNodeId, Edge::EDGE_TYPE_USAGE, location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseVariable& variable)
|
||||
{
|
||||
log("type usage", variable.getFullName() + " -> " + typeUsage.dataType->getRawTypeName(), typeUsage.location);
|
||||
|
||||
if (!typeUsage.location.isValid())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
Id functionNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, variable.nameHierarchy, false);
|
||||
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, typeUsage.dataType->getTypeNameHierarchy(), false);
|
||||
|
||||
Id edgeId = addEdge(functionNodeId, typeNodeId, Edge::EDGE_TYPE_USAGE, typeUsage.location);
|
||||
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateArgumentTypeOfTemplateRecordParsed(
|
||||
Id Storage::onTemplateArgumentTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& argumentTypeNameHierarchy,
|
||||
const NameHierarchy& templateNameHierarchy)
|
||||
{
|
||||
log(
|
||||
"template argument type",
|
||||
argumentTypeNameHierarchy.getFullName() + " -> " + templateNameHierarchy.getFullName(),
|
||||
argumentTypeNameHierarchy.getQualifiedName() + " -> " + templateNameHierarchy.getQualifiedName(),
|
||||
location
|
||||
);
|
||||
|
||||
Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentTypeNameHierarchy, false);
|
||||
// does not need a source location because this type that is already defined (and therefore has a location).
|
||||
|
||||
Id templateNodeId = addNodeHierarchy(Node::NODE_TYPE, templateNameHierarchy, false);
|
||||
|
||||
addEdge(templateNodeId, argumentNodeId, Edge::EDGE_TEMPLATE_ARGUMENT, location);
|
||||
|
||||
return argumentNodeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateArgumentTypeOfTemplateFunctionParsed(
|
||||
const ParseLocation& location, const NameHierarchy& argumentTypeNameHierarchy,
|
||||
const ParseFunction& templateFunction)
|
||||
{
|
||||
log(
|
||||
"template argument type",
|
||||
argumentTypeNameHierarchy.getFullName() + " -> " + templateFunction.getFullName(),
|
||||
location
|
||||
);
|
||||
|
||||
Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, argumentTypeNameHierarchy, false);
|
||||
// does not need a source location because this type that is already defined (and therefore has a location).
|
||||
|
||||
Id templateNodeId = addNodeHierarchy(Node::NODE_FUNCTION, templateFunction, false);
|
||||
Id templateNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, templateNameHierarchy, false);
|
||||
|
||||
addEdge(templateNodeId, argumentNodeId, Edge::EDGE_TEMPLATE_ARGUMENT, location);
|
||||
|
||||
@@ -583,78 +452,62 @@ Id Storage::onTemplateArgumentTypeOfTemplateFunctionParsed(
|
||||
}
|
||||
|
||||
Id Storage::onTemplateDefaultArgumentTypeParsed(
|
||||
const ParseTypeUsage& defaultArgumentTypeUsage,
|
||||
const NameHierarchy& templateParameterNameHierarchy // actually this is the template parameter???
|
||||
const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy,
|
||||
const NameHierarchy& templateParameterNameHierarchy
|
||||
){
|
||||
log(
|
||||
"template default argument",
|
||||
defaultArgumentTypeUsage.dataType->getTypeNameHierarchy().getFullName() + " -> " + templateParameterNameHierarchy.getFullName(),
|
||||
defaultArgumentTypeUsage.location
|
||||
defaultArgumentTypeNameHierarchy.getQualifiedNameWithSignature() + " -> " + templateParameterNameHierarchy.getQualifiedName(),
|
||||
location
|
||||
);
|
||||
|
||||
Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeUsage.dataType->getTypeNameHierarchy(), false);
|
||||
// does not need a source location because this type that is already defined (and therefore has a location).
|
||||
Id defaultArgumentNodeId = addNodeHierarchy(Node::NODE_TYPE, defaultArgumentTypeNameHierarchy, false);
|
||||
Id parameterNodeId = addNodeHierarchy(Node::NODE_TYPE, templateParameterNameHierarchy, false);
|
||||
|
||||
Id argumentNodeId = addNodeHierarchy(Node::NODE_TYPE, templateParameterNameHierarchy, false);
|
||||
|
||||
addEdge(argumentNodeId, defaultArgumentNodeId, Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT, defaultArgumentTypeUsage.location);
|
||||
addEdge(parameterNodeId, defaultArgumentNodeId, Edge::EDGE_TEMPLATE_DEFAULT_ARGUMENT, location);
|
||||
|
||||
return defaultArgumentNodeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateRecordParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy,
|
||||
const NameHierarchy& templateRecordNameHierarchy
|
||||
Id Storage::onTemplateParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy
|
||||
){
|
||||
log("template record type parameter", templateParameterTypeNameHierarchy.getFullName(), location);
|
||||
log("template parameter type", templateParameterTypeNameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, true);
|
||||
addSourceLocation(parameterNodeId, location, false);
|
||||
addAccess(parameterNodeId, TokenComponentAccess::ACCESS_TEMPLATE);
|
||||
|
||||
addNodeHierarchy(Node::NODE_TYPE, templateRecordNameHierarchy, false);
|
||||
|
||||
return parameterNodeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateRecordSpecializationParsed(
|
||||
const ParseLocation& location, const NameHierarchy& specializedRecordNameHierarchy,
|
||||
const RecordType specializedRecordType, const NameHierarchy& specializedFromNameHierarchy
|
||||
Id Storage::onTemplateSpecializationParsed(
|
||||
const ParseLocation& location, const NameHierarchy& specializedNameHierarchy,
|
||||
const NameHierarchy& specializedFromNameHierarchy
|
||||
){
|
||||
log(
|
||||
"template record specialization",
|
||||
specializedRecordNameHierarchy.getFullName() + " -> " + specializedFromNameHierarchy.getFullName(),
|
||||
specializedNameHierarchy.getQualifiedName() + " -> " + specializedFromNameHierarchy.getQualifiedName(),
|
||||
location
|
||||
);
|
||||
|
||||
Node::NodeType specializedRecordNodeType = Node::NODE_CLASS;
|
||||
if (specializedRecordType == ParserClient::RECORD_STRUCT)
|
||||
{
|
||||
specializedRecordNodeType = Node::NODE_STRUCT;
|
||||
}
|
||||
|
||||
Id specializedNodeId = addNodeHierarchy(specializedRecordNodeType, specializedRecordNameHierarchy, true);
|
||||
addSourceLocation(specializedNodeId, location, false);
|
||||
|
||||
Id specializedId = addNodeHierarchy(Node::NODE_TYPE, specializedNameHierarchy, false);
|
||||
Id recordNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFromNameHierarchy, false);
|
||||
addAccess(specializedNodeId, getAccess(recordNodeId));
|
||||
Id edgeId = addEdge(specializedId, recordNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location);
|
||||
|
||||
addEdge(specializedNodeId, recordNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location);
|
||||
|
||||
return specializedNodeId;
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateMemberFunctionSpecializationParsed(
|
||||
const ParseLocation& location, const ParseFunction& instantiatedFunction, const ParseFunction& specializedFunction
|
||||
const ParseLocation& location, const NameHierarchy& instantiatedFunction, const NameHierarchy& specializedFunction
|
||||
){
|
||||
log(
|
||||
"template member function specialization",
|
||||
instantiatedFunction.getFullName() + " -> " + specializedFunction.getFullName(),
|
||||
instantiatedFunction.getQualifiedNameWithSignature() + " -> " + specializedFunction.getQualifiedNameWithSignature(),
|
||||
location
|
||||
);
|
||||
|
||||
Id instantiatedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, instantiatedFunction, false);
|
||||
|
||||
Id specializedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, false);
|
||||
|
||||
Id edgeId = addEdge(instantiatedFunctionNodeId, specializedFunctionNodeId, Edge::EDGE_TEMPLATE_MEMBER_SPECIALIZATION_OF, location);
|
||||
@@ -662,34 +515,16 @@ Id Storage::onTemplateMemberFunctionSpecializationParsed(
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateFunctionParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy, const ParseFunction function
|
||||
){
|
||||
log("template function type parameter", templateParameterTypeNameHierarchy.getFullName(), location);
|
||||
|
||||
Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, true);
|
||||
addSourceLocation(parameterNodeId, location, false);
|
||||
addAccess(parameterNodeId, TokenComponentAccess::ACCESS_TEMPLATE);
|
||||
|
||||
addNodeHierarchy(Node::NODE_FUNCTION, function, false);
|
||||
|
||||
return parameterNodeId;
|
||||
}
|
||||
|
||||
Id Storage::onTemplateFunctionSpecializationParsed(
|
||||
const ParseLocation& location, const ParseFunction specializedFunction, const ParseFunction templateFunction
|
||||
const ParseLocation& location, const NameHierarchy specializedFunction, const NameHierarchy templateFunction
|
||||
){
|
||||
log("function template specialization", specializedFunction.getFullName(), location);
|
||||
log("function template specialization", specializedFunction.getQualifiedNameWithSignature(), location);
|
||||
|
||||
Id specializedNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, true);
|
||||
addSourceLocation(specializedNodeId, location, false);
|
||||
Id specializedNodeId = addNodeHierarchy(Node::NODE_TYPE, specializedFunction, true);
|
||||
Id functionNodeId = addNodeHierarchy(Node::NODE_TYPE, templateFunction, false);
|
||||
Id edgeId = addEdge(specializedNodeId, functionNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location);
|
||||
|
||||
Id functionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, templateFunction, false);
|
||||
addAccess(specializedNodeId, getAccess(functionNodeId));
|
||||
|
||||
addEdge(specializedNodeId, functionNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location);
|
||||
|
||||
return specializedNodeId;
|
||||
return edgeId;
|
||||
}
|
||||
|
||||
Id Storage::onFileParsed(const FileInfo& fileInfo)
|
||||
@@ -727,7 +562,7 @@ Id Storage::onFileIncludeParsed(const ParseLocation& location, const FileInfo& f
|
||||
Id Storage::onMacroDefineParsed(
|
||||
const ParseLocation& location, const NameHierarchy& macroNameHierarchy, const ParseLocation& scopeLocation
|
||||
){
|
||||
log("macro", macroNameHierarchy.getFullName(), location);
|
||||
log("macro", macroNameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id macroId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, true);
|
||||
addSourceLocation(macroId, location);
|
||||
@@ -741,7 +576,7 @@ Id Storage::onMacroDefineParsed(
|
||||
|
||||
Id Storage::onMacroExpandParsed(const ParseLocation &location, const NameHierarchy& macroNameHierarchy)
|
||||
{
|
||||
log("macro use", macroNameHierarchy.getFullName(), location);
|
||||
log("macro use", macroNameHierarchy.getQualifiedName(), location);
|
||||
|
||||
Id macroExpandId = addNodeHierarchy(Node::NODE_MACRO, macroNameHierarchy, false);
|
||||
Id fileNodeId = getFileNodeId(location.filePath);
|
||||
@@ -1399,7 +1234,7 @@ Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarch
|
||||
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 (type > storedType)
|
||||
if (!node.defined && type > storedType)
|
||||
{
|
||||
m_sqliteStorage.setNodeType(Node::typeToInt(type), nodeId);
|
||||
}
|
||||
@@ -1411,11 +1246,6 @@ Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarch
|
||||
return parentNodeId;
|
||||
}
|
||||
|
||||
Id Storage::addNodeHierarchy(Node::NodeType type, const ParseFunction& function, bool defined)
|
||||
{
|
||||
return addNodeHierarchy(type, function.nameHierarchy, defined);
|
||||
}
|
||||
|
||||
Id Storage::addSourceLocation(Id elementNodeId, const ParseLocation &location, bool isScope)
|
||||
{
|
||||
if (!location.isValid())
|
||||
@@ -1671,11 +1501,11 @@ void Storage::addNodesToGraph(const std::vector<Id> nodeIds, Graph* graph) const
|
||||
|
||||
if (type == Node::NODE_FUNCTION || type == Node::NODE_METHOD)
|
||||
{
|
||||
std::shared_ptr<NameElement> lastElement = nameHierarchy.back();
|
||||
if (lastElement)
|
||||
std::string signatureString = nameHierarchy.getRawNameWithSignature();
|
||||
if (signatureString.size() > 0) // this should always be the case since functions and methods must have sigs.
|
||||
{
|
||||
node->addComponentSignature(
|
||||
std::make_shared<TokenComponentSignature>(lastElement->getFullSignature())
|
||||
std::make_shared<TokenComponentSignature>(signatureString)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+22
-42
@@ -43,34 +43,29 @@ public:
|
||||
virtual void startParsing();
|
||||
virtual void finishParsing();
|
||||
|
||||
virtual void prepareParsingFile(const FilePath& filePath);
|
||||
virtual void startParsingFile(const FilePath& filePath);
|
||||
virtual void finishParsingFile(const FilePath& filePath);
|
||||
|
||||
virtual void onError(const ParseLocation& location, const std::string& message);
|
||||
virtual size_t getErrorCount() const;
|
||||
|
||||
virtual Id onTypedefParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy,
|
||||
const ParseTypeUsage& underlyingType, AccessType access);
|
||||
const ParseLocation& location, const NameHierarchy& typedefName, AccessType access);
|
||||
virtual Id onClassParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation);
|
||||
virtual Id onStructParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation);
|
||||
|
||||
virtual Id onGlobalVariableParsed(const ParseLocation& location, const ParseVariable& variable);
|
||||
virtual Id onFieldParsed(const ParseLocation& location, const ParseVariable& variable, AccessType access);
|
||||
|
||||
virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable);
|
||||
virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access);
|
||||
virtual Id onFunctionParsed(
|
||||
const ParseLocation& location, const ParseFunction& function, const ParseLocation& scopeLocation);
|
||||
const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation);
|
||||
virtual Id onMethodParsed(
|
||||
const ParseLocation& location, const ParseFunction& method, AccessType access, AbstractionType abstraction,
|
||||
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
|
||||
const ParseLocation& scopeLocation);
|
||||
|
||||
virtual Id onNamespaceParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, const ParseLocation& scopeLocation);
|
||||
|
||||
virtual Id onEnumParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation);
|
||||
@@ -80,47 +75,33 @@ public:
|
||||
const ParseLocation& location, const NameHierarchy& childNameHierarchy,
|
||||
const NameHierarchy& parentNameHierarchy, AccessType access);
|
||||
virtual Id onMethodOverrideParsed(
|
||||
const ParseLocation& location, const ParseFunction& base, const ParseFunction& overrider);
|
||||
const ParseLocation& location, const NameHierarchy& overridden, const NameHierarchy& overrider);
|
||||
virtual Id onCallParsed(
|
||||
const ParseLocation& location, const ParseFunction& caller, const ParseFunction& callee);
|
||||
virtual Id onCallParsed(
|
||||
const ParseLocation& location, const ParseVariable& caller, const ParseFunction& callee);
|
||||
const ParseLocation& location, const NameHierarchy& caller, const NameHierarchy& callee);
|
||||
virtual Id onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy);
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onGlobalVariableUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onGlobalVariableUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy);
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onEnumConstantUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onEnumConstantUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseFunction& function);
|
||||
virtual Id onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseVariable& variable);
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy);
|
||||
virtual Id onTypeUsageParsed(const ParseLocation& location, const NameHierarchy& user, const NameHierarchy& used);
|
||||
|
||||
virtual Id onTemplateArgumentTypeOfTemplateRecordParsed(
|
||||
virtual Id onTemplateArgumentTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& argumentTypeNameHierarchy,
|
||||
const NameHierarchy& templateNameHierarchy);
|
||||
virtual Id onTemplateArgumentTypeOfTemplateFunctionParsed(
|
||||
const ParseLocation& location, const NameHierarchy& argumentTypeNameHierarchy,
|
||||
const ParseFunction& templateFunction);
|
||||
virtual Id onTemplateDefaultArgumentTypeParsed(
|
||||
const ParseTypeUsage& defaultArgumentTypeUsage, const NameHierarchy& templateParameterNameHierarchy);
|
||||
virtual Id onTemplateRecordParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy,
|
||||
const NameHierarchy& templateRecordNameHierarchy);
|
||||
virtual Id onTemplateRecordSpecializationParsed(
|
||||
const ParseLocation& location, const NameHierarchy& specializedRecordNameHierarchy,
|
||||
const RecordType specializedRecordType, const NameHierarchy& specializedFromNameHierarchy);
|
||||
const ParseLocation& location, const NameHierarchy& defaultArgumentTypeNameHierarchy,
|
||||
const NameHierarchy& templateParameterNameHierarchy);
|
||||
virtual Id onTemplateParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy);
|
||||
virtual Id onTemplateSpecializationParsed(
|
||||
const ParseLocation& location, const NameHierarchy& specializedNameHierarchy,
|
||||
const NameHierarchy& specializedFromNameHierarchy);
|
||||
virtual Id onTemplateMemberFunctionSpecializationParsed(
|
||||
const ParseLocation& location, const ParseFunction& instantiatedFunction, const ParseFunction& specializedFunction);
|
||||
const ParseLocation& location, const NameHierarchy& instantiatedFunction, const NameHierarchy& specializedFunction);
|
||||
|
||||
virtual Id onTemplateFunctionParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy, const ParseFunction function);
|
||||
virtual Id onTemplateFunctionSpecializationParsed(
|
||||
const ParseLocation& location, const ParseFunction specializedFunction, const ParseFunction templateFunction);
|
||||
const ParseLocation& location, const NameHierarchy specializedFunction, const NameHierarchy templateFunction);
|
||||
|
||||
virtual Id onFileParsed(const FileInfo& fileInfo);
|
||||
virtual Id onFileIncludeParsed(
|
||||
@@ -176,7 +157,6 @@ public:
|
||||
|
||||
private:
|
||||
Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined);
|
||||
Id addNodeHierarchy(Node::NodeType type, const ParseFunction& function, bool defined);
|
||||
Id addSourceLocation(Id elementNodeId, const ParseLocation &location, bool isScope = false);
|
||||
|
||||
Id addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type);
|
||||
|
||||
@@ -129,12 +129,12 @@ bool Node::isType(NodeTypeMask mask) const
|
||||
|
||||
std::string Node::getName() const
|
||||
{
|
||||
return m_nameHierarchy.getName();
|
||||
return m_nameHierarchy.getRawName();
|
||||
}
|
||||
|
||||
std::string Node::getFullName() const
|
||||
{
|
||||
return m_nameHierarchy.getFullName();
|
||||
return m_nameHierarchy.getQualifiedName();
|
||||
}
|
||||
|
||||
NameHierarchy Node::getNameHierarchy() const
|
||||
|
||||
@@ -1,12 +1,61 @@
|
||||
#include "data/name/NameElement.h"
|
||||
|
||||
NameElement::NameElement(const std::string& name)
|
||||
: m_name(name)
|
||||
, m_signature("")
|
||||
#include "utility/logging/logging.h"
|
||||
#include "utility/utilityString.h"
|
||||
|
||||
std::string NameElement::Signature::serialize(Signature signature)
|
||||
{
|
||||
return signature.m_prefix + "\r" + signature.m_postfix;
|
||||
}
|
||||
|
||||
NameElement::Signature NameElement::Signature::deserialize(const std::string& serialized)
|
||||
{
|
||||
std::vector<std::string> serializedElements = utility::splitToVector(serialized, "\r");
|
||||
if (serializedElements.size() != 2)
|
||||
{
|
||||
LOG_ERROR("unable to deserialize name signature: " + serialized); // todo: obfuscate serialized!
|
||||
}
|
||||
return Signature(serializedElements[0], serializedElements[1]);
|
||||
}
|
||||
|
||||
NameElement::Signature::Signature()
|
||||
{
|
||||
}
|
||||
|
||||
NameElement::NameElement(const std::string& name, const std::string& signature)
|
||||
NameElement::Signature::Signature(std::string prefix, std::string postfix)
|
||||
: m_prefix(prefix)
|
||||
, m_postfix(postfix)
|
||||
{
|
||||
}
|
||||
|
||||
std::string NameElement::Signature::qualifyName(const std::string& name) const
|
||||
{
|
||||
if (!isValid())
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
std::string qualifiedName = m_prefix;
|
||||
if (name.size() > 0)
|
||||
{
|
||||
qualifiedName += " " + name;
|
||||
}
|
||||
qualifiedName += m_postfix;
|
||||
|
||||
return qualifiedName;
|
||||
}
|
||||
|
||||
bool NameElement::Signature::isValid() const
|
||||
{
|
||||
return ((m_prefix + m_postfix).size() > 0);
|
||||
}
|
||||
|
||||
NameElement::NameElement(const std::string& name)
|
||||
: m_name(name)
|
||||
{
|
||||
}
|
||||
|
||||
NameElement::NameElement(const std::string& name, const Signature& signature)
|
||||
: m_name(name)
|
||||
, m_signature(signature)
|
||||
{
|
||||
@@ -16,12 +65,22 @@ NameElement::~NameElement()
|
||||
{
|
||||
}
|
||||
|
||||
std::string NameElement::getFullName() const
|
||||
std::string NameElement::getName() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
std::string NameElement::getFullSignature() const
|
||||
std::string NameElement::getNameWithSignature() const
|
||||
{
|
||||
return m_signature.qualifyName(m_name);
|
||||
}
|
||||
|
||||
bool NameElement::hasSignature() const
|
||||
{
|
||||
return m_signature.isValid();
|
||||
}
|
||||
|
||||
NameElement::Signature NameElement::getSignature()
|
||||
{
|
||||
return m_signature;
|
||||
}
|
||||
|
||||
@@ -1,21 +1,43 @@
|
||||
#ifndef NAME_ELEMENT_H
|
||||
#define NAME_ELEMENT_H
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class DataType;
|
||||
|
||||
class NameElement
|
||||
{
|
||||
public:
|
||||
class Signature
|
||||
{
|
||||
public:
|
||||
static std::string serialize(Signature signature);
|
||||
static Signature deserialize(const std::string& serialized);
|
||||
|
||||
Signature();
|
||||
Signature(std::string prefix, std::string postfix);
|
||||
std::string qualifyName(const std::string& name) const;
|
||||
bool isValid() const;
|
||||
|
||||
private:
|
||||
std::string m_prefix;
|
||||
std::string m_postfix;
|
||||
};
|
||||
|
||||
NameElement(const std::string& name);
|
||||
NameElement(const std::string& name, const std::string& signature);
|
||||
NameElement(const std::string& name, const Signature& signature);
|
||||
~NameElement();
|
||||
|
||||
std::string getFullName() const;
|
||||
std::string getFullSignature() const;
|
||||
std::string getName() const;
|
||||
std::string getNameWithSignature() const;
|
||||
bool hasSignature() const;
|
||||
Signature getSignature();
|
||||
|
||||
private:
|
||||
std::string m_name;
|
||||
std::string m_signature;
|
||||
Signature m_signature;
|
||||
};
|
||||
|
||||
#endif // NAME_ELEMENT_H
|
||||
|
||||
@@ -8,10 +8,12 @@ std::string NameHierarchy::serialize(NameHierarchy nameHierarchy)
|
||||
std::string serializedName = "";
|
||||
for (size_t i = 0; i < nameHierarchy.size(); i++)
|
||||
{
|
||||
serializedName += nameHierarchy[i]->getFullName() + "\t";
|
||||
serializedName += nameHierarchy[i]->getFullSignature();
|
||||
if (i + 1 < nameHierarchy.size())
|
||||
if (i > 0)
|
||||
{
|
||||
serializedName += "\n";
|
||||
}
|
||||
serializedName += nameHierarchy[i]->getName() + "\t";
|
||||
serializedName += NameElement::Signature::serialize(nameHierarchy[i]->getSignature());
|
||||
}
|
||||
return serializedName;
|
||||
}
|
||||
@@ -29,7 +31,7 @@ NameHierarchy NameHierarchy::deserialize(const std::string& serializedName)
|
||||
LOG_ERROR("unable to deserialize name hierarchy: " + serializedName); // todo: obfuscate serializedName!
|
||||
return NameHierarchy();
|
||||
}
|
||||
nameHierarchy.push(std::make_shared<NameElement>(nameParts[0], nameParts[1]));
|
||||
nameHierarchy.push(std::make_shared<NameElement>(nameParts[0], NameElement::Signature::deserialize(nameParts[1])));
|
||||
}
|
||||
|
||||
return nameHierarchy;
|
||||
@@ -77,26 +79,44 @@ size_t NameHierarchy::size() const
|
||||
return m_elements.size();
|
||||
}
|
||||
|
||||
std::string NameHierarchy::getFullName() const
|
||||
std::string NameHierarchy::getQualifiedName() const
|
||||
{
|
||||
std::string name;
|
||||
for (size_t i = 0; i < m_elements.size(); i++)
|
||||
{
|
||||
name += m_elements[i]->getFullName();
|
||||
if (i + 1 < m_elements.size())
|
||||
if (i > 0)
|
||||
{
|
||||
name += "::";
|
||||
}
|
||||
name += m_elements[i]->getName();
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
std::string NameHierarchy::getName() const
|
||||
std::string NameHierarchy::getQualifiedNameWithSignature() const
|
||||
{
|
||||
std::string name = getQualifiedName();
|
||||
if (m_elements.size())
|
||||
{
|
||||
name = m_elements.back()->getSignature().qualifyName(name);
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
std::string NameHierarchy::getRawName() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->getFullName();
|
||||
return m_elements.back()->getName();
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string NameHierarchy::getRawNameWithSignature() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->getNameWithSignature();
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -23,8 +23,10 @@ public:
|
||||
std::shared_ptr<NameElement> operator[](size_t pos) const;
|
||||
size_t size() const;
|
||||
|
||||
std::string getFullName() const;
|
||||
std::string getName() const;
|
||||
std::string getQualifiedName() const;
|
||||
std::string getQualifiedNameWithSignature() const;
|
||||
std::string getRawName() const;
|
||||
std::string getRawNameWithSignature() const;
|
||||
|
||||
private:
|
||||
std::vector<std::shared_ptr<NameElement>> m_elements;
|
||||
|
||||
@@ -19,5 +19,5 @@ ParseFunction::ParseFunction(
|
||||
|
||||
std::string ParseFunction::getFullName() const
|
||||
{
|
||||
return nameHierarchy.getFullName();
|
||||
return nameHierarchy.getQualifiedNameWithSignature();
|
||||
}
|
||||
|
||||
@@ -11,5 +11,5 @@ ParseVariable::ParseVariable(const ParseTypeUsage& type, const NameHierarchy& na
|
||||
|
||||
std::string ParseVariable::getFullName() const
|
||||
{
|
||||
return nameHierarchy.getFullName();
|
||||
return nameHierarchy.getQualifiedNameWithSignature();
|
||||
}
|
||||
|
||||
@@ -107,9 +107,10 @@ std::string ParserClient::parameterStr(const std::vector<ParseTypeUsage> paramet
|
||||
|
||||
std::string ParserClient::functionStr(const ParseFunction& function)
|
||||
{
|
||||
std::string str =
|
||||
/*std::string str =
|
||||
function.returnType.dataType->getFullTypeName() + " " + function.getFullName() + parameterStr(function.parameters);
|
||||
return addConstPrefix(addStaticPrefix(str, function.isStatic), function.isConst, false);
|
||||
return addConstPrefix(addStaticPrefix(str, function.isStatic), function.isConst, false);*/
|
||||
return function.nameHierarchy.getQualifiedNameWithSignature();
|
||||
}
|
||||
|
||||
ParserClient::ParserClient()
|
||||
|
||||
@@ -58,35 +58,30 @@ public:
|
||||
virtual void startParsing() = 0;
|
||||
virtual void finishParsing() = 0;
|
||||
|
||||
virtual void prepareParsingFile(const FilePath& filePath) = 0;
|
||||
virtual void startParsingFile(const FilePath& filePath) = 0;
|
||||
virtual void finishParsingFile(const FilePath& filePath) = 0;
|
||||
|
||||
virtual void onError(const ParseLocation& location, const std::string& message) = 0;
|
||||
virtual size_t getErrorCount() const = 0;
|
||||
|
||||
virtual Id onTypedefParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy,
|
||||
const ParseTypeUsage& underlyingType, AccessType access) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& typedefName, AccessType access) = 0;
|
||||
virtual Id onClassParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation) = 0;
|
||||
virtual Id onStructParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation) = 0;
|
||||
|
||||
virtual Id onGlobalVariableParsed(const ParseLocation& location, const ParseVariable& variable) = 0;
|
||||
virtual Id onFieldParsed(const ParseLocation& location, const ParseVariable& variable, AccessType access) = 0;
|
||||
|
||||
virtual Id onGlobalVariableParsed(const ParseLocation& location, const NameHierarchy& variable) = 0;
|
||||
virtual Id onFieldParsed(const ParseLocation& location, const NameHierarchy& field, AccessType access) = 0;
|
||||
virtual Id onFunctionParsed(
|
||||
const ParseLocation& location, const ParseFunction& function, const ParseLocation& scopeLocation) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& function, const ParseLocation& scopeLocation) = 0;
|
||||
virtual Id onMethodParsed(
|
||||
const ParseLocation& location, const ParseFunction& method, AccessType access, AbstractionType abstraction,
|
||||
const ParseLocation& location, const NameHierarchy& method, AccessType access, AbstractionType abstraction,
|
||||
const ParseLocation& scopeLocation) = 0;
|
||||
|
||||
virtual Id onNamespaceParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy,
|
||||
const ParseLocation& scopeLocation) = 0;
|
||||
|
||||
virtual Id onEnumParsed(
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy, AccessType access,
|
||||
const ParseLocation& scopeLocation) = 0;
|
||||
@@ -96,48 +91,30 @@ public:
|
||||
const ParseLocation& location, const NameHierarchy& nameHierarchy,
|
||||
const NameHierarchy& baseNameHierarchy, AccessType access) = 0;
|
||||
virtual Id onMethodOverrideParsed(
|
||||
const ParseLocation& location, const ParseFunction& base, const ParseFunction& overrider) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& overridden, const NameHierarchy& overrider) = 0;
|
||||
virtual Id onCallParsed(
|
||||
const ParseLocation& location, const ParseFunction& caller, const ParseFunction& callee) = 0;
|
||||
virtual Id onCallParsed(
|
||||
const ParseLocation& location, const ParseVariable& caller, const ParseFunction& callee) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& caller, const NameHierarchy& callee) = 0;
|
||||
virtual Id onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onFieldUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onGlobalVariableUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onGlobalVariableUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onEnumConstantUsageParsed(
|
||||
const ParseLocation& location, const ParseFunction& user, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onEnumConstantUsageParsed(
|
||||
const ParseLocation& location, const ParseVariable& user, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onTypeUsageParsed(const ParseTypeUsage& type, const ParseFunction& function) = 0;
|
||||
virtual Id onTypeUsageParsed(const ParseTypeUsage& type, const ParseVariable& variable) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& userNameHierarchy, const NameHierarchy& usedNameHierarchy) = 0;
|
||||
virtual Id onTypeUsageParsed(const ParseLocation& location, const NameHierarchy& user, const NameHierarchy& used) = 0;
|
||||
|
||||
virtual Id onTemplateArgumentTypeOfTemplateRecordParsed(
|
||||
virtual Id onTemplateArgumentTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& argumentTypeNameHierarchy,
|
||||
const NameHierarchy& templateNameHierarchy) = 0;
|
||||
virtual Id onTemplateArgumentTypeOfTemplateFunctionParsed(
|
||||
const ParseLocation& location, const NameHierarchy& argumentTypeNameHierarchy,
|
||||
const ParseFunction& templateFunction) = 0;
|
||||
virtual Id onTemplateDefaultArgumentTypeParsed(
|
||||
const ParseTypeUsage& type, const NameHierarchy& templateArgumentTypeNameHierarchy) = 0;
|
||||
virtual Id onTemplateRecordParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy,
|
||||
const NameHierarchy& templateRecordNameHierarchy) = 0;
|
||||
virtual Id onTemplateRecordSpecializationParsed(
|
||||
const ParseLocation& location, const NameHierarchy& specializedRecordNameHierarchy,
|
||||
const RecordType specializedRecordType, const NameHierarchy& specializedFromNameHierarchy) = 0;
|
||||
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;
|
||||
virtual Id onTemplateMemberFunctionSpecializationParsed(
|
||||
const ParseLocation& location, const ParseFunction& instantiatedFunction, const ParseFunction& specializedFunction) = 0;
|
||||
|
||||
virtual Id onTemplateFunctionParameterTypeParsed(
|
||||
const ParseLocation& location, const NameHierarchy& templateParameterTypeNameHierarchy,
|
||||
const ParseFunction function) = 0;
|
||||
virtual Id onTemplateFunctionSpecializationParsed(
|
||||
const ParseLocation& location, const ParseFunction specializedFunction, const ParseFunction templateFunction) = 0;
|
||||
const ParseLocation& location, const NameHierarchy& instantiatedFunction, const NameHierarchy& specializedFunction) = 0;
|
||||
|
||||
virtual Id onFileParsed(const FileInfo& fileInfo) = 0;
|
||||
virtual Id onFileIncludeParsed(
|
||||
|
||||
@@ -68,7 +68,7 @@ SearchNode* SearchIndex::addNode(NameHierarchy nameHierarchy)
|
||||
std::deque<Id> nameIds;
|
||||
for (size_t i = 0; i < nameHierarchy.size(); i++)
|
||||
{
|
||||
nameIds.push_back(m_dictionary.getWordId(nameHierarchy[i]->getFullName()));
|
||||
nameIds.push_back(m_dictionary.getWordId(nameHierarchy[i]->getName()));
|
||||
}
|
||||
|
||||
if (nameIds.size())
|
||||
|
||||
@@ -87,7 +87,7 @@ bool SearchMatch::isValid() const
|
||||
|
||||
void SearchMatch::print(std::ostream& ostream) const
|
||||
{
|
||||
ostream << weight << '\t' << nameHierarchy.getFullName() << std::endl << '\t';
|
||||
ostream << weight << '\t' << nameHierarchy.getQualifiedName() << std::endl << '\t';
|
||||
size_t i = 0;
|
||||
for (size_t index : indices)
|
||||
{
|
||||
@@ -104,7 +104,7 @@ void SearchMatch::print(std::ostream& ostream) const
|
||||
|
||||
std::string SearchMatch::getFullName() const
|
||||
{
|
||||
return nameHierarchy.getFullName();
|
||||
return nameHierarchy.getQualifiedName();
|
||||
}
|
||||
|
||||
std::string SearchMatch::getNodeTypeAsString() const
|
||||
|
||||
@@ -20,7 +20,7 @@ std::string NamedDataType::getFullTypeName() const
|
||||
|
||||
std::string NamedDataType::getRawTypeName() const
|
||||
{
|
||||
return m_nameHierarchy.getFullName();
|
||||
return m_nameHierarchy.getQualifiedNameWithSignature();
|
||||
}
|
||||
|
||||
const NameHierarchy& NamedDataType::getTypeNameHierarchy() const
|
||||
|
||||
Reference in New Issue
Block a user