data: lambda handling

* implemented handling lambdas as functions
* functions can have child nodes now
* NameElements in NameHierarchy can have signatures now.
* fixed crash that occurred when message listener was used while being half way through its destruction process.
This commit is contained in:
malte_langkabel
2015-12-10 18:00:54 +01:00
parent 2b03215ea4
commit 01bcf7266b
22 changed files with 238 additions and 568 deletions
+29 -36
View File
@@ -239,7 +239,7 @@ Id Storage::onStructParsed(
){
log("struct", nameHierarchy.getFullName(), location);
Id nodeId = addNodeHierarchy(Node::NODE_STRUCT, nameHierarchy, true);
Id nodeId = addNodeHierarchy(Node::NODE_STRUCT, nameHierarchy, scopeLocation.isValid());
addSourceLocation(nodeId, location);
addSourceLocation(nodeId, scopeLocation, true);
@@ -281,7 +281,7 @@ Id Storage::onFunctionParsed(
){
log("function", function.getFullName(), location);
Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function, true);
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);
@@ -306,7 +306,7 @@ Id Storage::onMethodParsed(
){
log("method", method.getFullName(), location);
Id nodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_METHOD, method, location.isValid() && scopeLocation.isValid());
Id nodeId = addNodeHierarchy(Node::NODE_METHOD, method, location.isValid() && scopeLocation.isValid());
addSourceLocation(nodeId, location);
addSourceLocation(nodeId, scopeLocation, true);
addAccess(nodeId, access);
@@ -386,8 +386,8 @@ Id Storage::onMethodOverrideParsed(
{
log("override", base.getFullName() + " -> " + overrider.getFullName(), location);
Id baseNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, base, false); // TODO: call this overridden
Id overriderNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, overrider, false);
Id baseNodeId = addNodeHierarchy(Node::NODE_FUNCTION, base, false); // TODO: call this overridden
Id overriderNodeId = addNodeHierarchy(Node::NODE_FUNCTION, overrider, false);
Id edgeId = addEdge(overriderNodeId, baseNodeId, Edge::EDGE_OVERRIDE, location);
@@ -398,8 +398,8 @@ Id Storage::onCallParsed(const ParseLocation& location, const ParseFunction& cal
{
log("call", caller.getFullName() + " -> " + callee.getFullName(), location);
Id callerNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, caller, false);
Id calleeNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, callee, false);
Id callerNodeId = addNodeHierarchy(Node::NODE_FUNCTION, caller, false);
Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, false);
Id edgeId = addEdge(callerNodeId, calleeNodeId, Edge::EDGE_CALL, location);
@@ -411,7 +411,7 @@ Id Storage::onCallParsed(const ParseLocation& location, const ParseVariable& cal
log("call", caller.getFullName() + " -> " + callee.getFullName(), location);
Id callerNodeId = addNodeHierarchy(Node::NODE_UNDEFINED, caller.nameHierarchy, false);
Id calleeNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, callee, false);
Id calleeNodeId = addNodeHierarchy(Node::NODE_FUNCTION, callee, false);
Id edgeId = addEdge(callerNodeId, calleeNodeId, Edge::EDGE_CALL, location);
@@ -423,7 +423,7 @@ Id Storage::onFieldUsageParsed(
){
log("field usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, user, false);
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);
@@ -449,7 +449,7 @@ Id Storage::onGlobalVariableUsageParsed( // or static variable used
){
log("global usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, user, false);
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);
@@ -475,7 +475,7 @@ Id Storage::onEnumConstantUsageParsed(
){
log("enum constant usage", user.getFullName() + " -> " + usedNameHierarchy.getFullName(), location);
Id userNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, user, false);
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);
@@ -505,7 +505,7 @@ Id Storage::onTypeUsageParsed(const ParseTypeUsage& typeUsage, const ParseFuncti
return 0;
}
Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function, false);
Id functionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, function, false);
Id typeNodeId = addNodeHierarchy(Node::NODE_TYPE, typeUsage.dataType->getTypeNameHierarchy(), false);
Id edgeId = addEdge(functionNodeId, typeNodeId, Edge::EDGE_TYPE_USAGE, typeUsage.location);
@@ -563,7 +563,7 @@ Id Storage::onTemplateArgumentTypeOfTemplateFunctionParsed(
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 = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, templateFunction, false);
Id templateNodeId = addNodeHierarchy(Node::NODE_FUNCTION, templateFunction, false);
addEdge(templateNodeId, argumentNodeId, Edge::EDGE_TEMPLATE_ARGUMENT, location);
@@ -642,9 +642,9 @@ Id Storage::onTemplateMemberFunctionSpecializationParsed(
location
);
Id instantiatedFunctionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, instantiatedFunction, false);
Id instantiatedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, instantiatedFunction, false);
Id specializedFunctionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, specializedFunction, false);
Id specializedFunctionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, false);
Id edgeId = addEdge(instantiatedFunctionNodeId, specializedFunctionNodeId, Edge::EDGE_TEMPLATE_MEMBER_SPECIALIZATION_OF, location);
@@ -659,7 +659,7 @@ Id Storage::onTemplateFunctionParameterTypeParsed(
Id parameterNodeId = addNodeHierarchy(Node::NODE_TEMPLATE_PARAMETER_TYPE, templateParameterTypeNameHierarchy, true);
addSourceLocation(parameterNodeId, location, false);
Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, function, false);
Id functionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, function, false);
addEdge(functionNodeId, parameterNodeId, Edge::EDGE_TEMPLATE_PARAMETER, location);
return parameterNodeId;
@@ -670,10 +670,10 @@ Id Storage::onTemplateFunctionSpecializationParsed(
){
log("function template specialization", specializedFunction.getFullName(), location);
Id specializedNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, specializedFunction, true);
Id specializedNodeId = addNodeHierarchy(Node::NODE_FUNCTION, specializedFunction, true);
addSourceLocation(specializedNodeId, location, false);
Id functionNodeId = addNodeHierarchyWithDistinctSignature(Node::NODE_FUNCTION, templateFunction, false);
Id functionNodeId = addNodeHierarchy(Node::NODE_FUNCTION, templateFunction, false);
addAccess(specializedNodeId, getAccess(functionNodeId));
addEdge(specializedNodeId, functionNodeId, Edge::EDGE_TEMPLATE_SPECIALIZATION_OF, location);
@@ -1294,7 +1294,7 @@ TimePoint Storage::getFileModificationTime(const FilePath& filePath) const
return TimePoint(m_sqliteStorage.getFileByPath(filePath.str()).modificationTime);
}
Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined, bool distinct)
Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined)
{
std::vector<Id> nameIds = addNameHierarchyElements(nameHierarchy);
@@ -1314,9 +1314,15 @@ Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarch
m_sqliteStorage.setNodeDefined(true, nodeId);
}
if (nodeId == 0 || (lastName && distinct))
if (nodeId == 0)
{
nodeId = m_sqliteStorage.addNode(Node::typeToInt(type), nameId, lastName & defined);
nodeId = m_sqliteStorage.addNode(Node::typeToInt(type), nameId, lastName && defined);
std::string signature = nameHierarchy[i]->getFullSignature();
if (signature.size() != 0)
{
m_sqliteStorage.addSignature(nodeId, signature);
}
if (parentNodeId != 0)
{
@@ -1338,22 +1344,9 @@ Id Storage::addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarch
return parentNodeId;
}
Id Storage::addNodeHierarchyWithDistinctSignature(Node::NodeType type, const ParseFunction& function, bool defined)
Id Storage::addNodeHierarchy(Node::NodeType type, const ParseFunction& function, bool defined)
{
std::string signature = ParserClient::functionSignatureStr(function);
Id nodeId = m_sqliteStorage.getNodeIdBySignature(signature);
if (!nodeId)
{
nodeId = addNodeHierarchy(type, function.nameHierarchy, defined, true);
m_sqliteStorage.addSignature(nodeId, signature);
}
else if (defined)
{
m_sqliteStorage.setNodeDefined(true, nodeId);
}
return nodeId;
return addNodeHierarchy(type, function.nameHierarchy, defined);
}
std::vector<Id> Storage::addNameHierarchyElements(NameHierarchy nameHierarchy)
+2 -2
View File
@@ -170,8 +170,8 @@ public:
virtual TimePoint getFileModificationTime(const FilePath& filePath) const;
private:
Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined, bool distinct = false);
Id addNodeHierarchyWithDistinctSignature(Node::NodeType type, const ParseFunction& function, bool defined);
Id addNodeHierarchy(Node::NodeType nodeType, NameHierarchy nameHierarchy, bool defined);
Id addNodeHierarchy(Node::NodeType type, const ParseFunction& function, bool defined);
std::vector<Id> addNameHierarchyElements(NameHierarchy nameHierarchy);
Id addSourceLocation(Id elementNodeId, const ParseLocation &location, bool isScope = false);
+12
View File
@@ -2,6 +2,13 @@
NameElement::NameElement(const std::string& name)
: m_name(name)
, m_signature("")
{
}
NameElement::NameElement(const std::string& name, const std::string& signature)
: m_name(name)
, m_signature(signature)
{
}
@@ -13,3 +20,8 @@ std::string NameElement::getFullName() const
{
return m_name;
}
std::string NameElement::getFullSignature() const
{
return m_signature;
}
+3
View File
@@ -7,12 +7,15 @@ class NameElement
{
public:
NameElement(const std::string& name);
NameElement(const std::string& name, const std::string& signature);
~NameElement();
std::string getFullName() const;
std::string getFullSignature() const;
private:
std::string m_name;
std::string m_signature;
};
#endif // NAME_ELEMENT_H
+1 -1
View File
@@ -23,7 +23,7 @@ void NameHierarchy::pop()
m_elements.pop_back();
}
std::shared_ptr<NameElement> NameHierarchy::back()
std::shared_ptr<NameElement> NameHierarchy::back() const
{
return m_elements.back();
}
+1 -1
View File
@@ -16,7 +16,7 @@ public:
void push(std::shared_ptr<NameElement> element);
void pop();
std::shared_ptr<NameElement> back();
std::shared_ptr<NameElement> back() const;
std::shared_ptr<NameElement> operator[](size_t pos) const;
size_t size() const;
+3 -7
View File
@@ -111,14 +111,10 @@ std::string ParserClient::parameterStr(const std::vector<ParseTypeUsage> paramet
std::string ParserClient::functionStr(const ParseFunction& function)
{
//return function.getFullName();
std::string str =
function.returnType.dataType->getFullTypeName() + " " + function.getFullName() + parameterStr(function.parameters);
return addConstPrefix(addStaticPrefix(str, function.isStatic), function.isConst, false);
}
std::string ParserClient::functionSignatureStr(const ParseFunction& function)
{
return addConstPrefix(function.getFullName() + parameterStr(function.parameters), function.isConst, false);
function.returnType.dataType->getFullTypeName() + " " + function.getFullName();
return addStaticPrefix(str, function.isStatic);
}
ParserClient::ParserClient()
+1 -1
View File
@@ -50,7 +50,7 @@ public:
static std::string variableStr(const ParseVariable& variable);
static std::string parameterStr(const std::vector<ParseTypeUsage> parameters);
static std::string functionStr(const ParseFunction& function);
static std::string functionSignatureStr(const ParseFunction& function);
static std::string functionSignatureStr(const ParseFunction& function); // should this be in here? consider languages other than c++.
ParserClient();
virtual ~ParserClient();