data: save undefined in database field instead of using different node types
* expand toggle also for undefined classes * changed direction of some template edges * save same access component to specialized template functions and classes
This commit is contained in:
+16
-16
@@ -38,11 +38,11 @@ Edge::EdgeType Edge::intToType(int value)
|
||||
case 0x200:
|
||||
return EDGE_TYPEDEF_OF;
|
||||
case 0x400:
|
||||
return EDGE_TEMPLATE_PARAMETER_OF;
|
||||
return EDGE_TEMPLATE_PARAMETER;
|
||||
case 0x800:
|
||||
return EDGE_TEMPLATE_ARGUMENT_OF;
|
||||
return EDGE_TEMPLATE_ARGUMENT;
|
||||
case 0x1000:
|
||||
return EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF;
|
||||
return EDGE_TEMPLATE_DEFAULT_ARGUMENT;
|
||||
case 0x2000:
|
||||
return EDGE_TEMPLATE_SPECIALIZATION_OF;
|
||||
case 0x4000:
|
||||
@@ -186,11 +186,11 @@ std::string Edge::getTypeString(EdgeType type)
|
||||
return "use";
|
||||
case EDGE_TYPEDEF_OF:
|
||||
return "typedef";
|
||||
case EDGE_TEMPLATE_PARAMETER_OF:
|
||||
case EDGE_TEMPLATE_PARAMETER:
|
||||
return "template_parameter";
|
||||
case EDGE_TEMPLATE_ARGUMENT_OF:
|
||||
case EDGE_TEMPLATE_ARGUMENT:
|
||||
return "template_argument";
|
||||
case EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF:
|
||||
case EDGE_TEMPLATE_DEFAULT_ARGUMENT:
|
||||
return "template_default_argument";
|
||||
case EDGE_TEMPLATE_SPECIALIZATION_OF:
|
||||
return "template_specialization";
|
||||
@@ -238,10 +238,10 @@ std::ostream& operator<<(std::ostream& ostream, const Edge& edge)
|
||||
|
||||
bool Edge::checkType() const
|
||||
{
|
||||
Node::NodeTypeMask complexTypeMask = Node::NODE_UNDEFINED_TYPE | Node::NODE_CLASS | Node::NODE_STRUCT | Node:: NODE_TEMPLATE_PARAMETER_TYPE;
|
||||
Node::NodeTypeMask typeMask = Node::NODE_UNDEFINED | Node::NODE_ENUM | Node::NODE_TYPEDEF | complexTypeMask;
|
||||
Node::NodeTypeMask variableMask = Node::NODE_UNDEFINED | Node::NODE_UNDEFINED_VARIABLE | Node::NODE_GLOBAL_VARIABLE | Node::NODE_FIELD;
|
||||
Node::NodeTypeMask functionMask = Node::NODE_UNDEFINED_FUNCTION | Node::NODE_FUNCTION | Node::NODE_METHOD;
|
||||
Node::NodeTypeMask complexTypeMask = Node::NODE_CLASS | Node::NODE_STRUCT | Node:: NODE_TEMPLATE_PARAMETER_TYPE;
|
||||
Node::NodeTypeMask typeMask = Node::NODE_ENUM | Node::NODE_TYPEDEF | complexTypeMask;
|
||||
Node::NodeTypeMask variableMask = Node::NODE_GLOBAL_VARIABLE | Node::NODE_FIELD;
|
||||
Node::NodeTypeMask functionMask = Node::NODE_FUNCTION | Node::NODE_METHOD;
|
||||
|
||||
switch (m_type)
|
||||
{
|
||||
@@ -282,8 +282,8 @@ bool Edge::checkType() const
|
||||
return true;
|
||||
|
||||
case EDGE_OVERRIDE:
|
||||
if (!m_from->isType(Node::NODE_UNDEFINED_FUNCTION | Node::NODE_METHOD) ||
|
||||
!m_to->isType(Node::NODE_UNDEFINED_FUNCTION | Node::NODE_METHOD))
|
||||
if (!m_from->isType(Node::NODE_METHOD) ||
|
||||
!m_to->isType(Node::NODE_METHOD))
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -310,15 +310,15 @@ bool Edge::checkType() const
|
||||
}
|
||||
return true;
|
||||
|
||||
case EDGE_TEMPLATE_PARAMETER_OF:
|
||||
case EDGE_TEMPLATE_PARAMETER:
|
||||
if (!m_from->isType(Node::NODE_TEMPLATE_PARAMETER_TYPE) || !m_to->isType(typeMask | functionMask))
|
||||
{
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
|
||||
case EDGE_TEMPLATE_ARGUMENT_OF:
|
||||
case EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF:
|
||||
case EDGE_TEMPLATE_ARGUMENT:
|
||||
case EDGE_TEMPLATE_DEFAULT_ARGUMENT:
|
||||
if (!m_from->isType(typeMask) || !m_to->isType(typeMask | functionMask))
|
||||
{
|
||||
break;
|
||||
@@ -346,7 +346,7 @@ bool Edge::checkType() const
|
||||
}
|
||||
return true;
|
||||
case EDGE_MACRO_USAGE:
|
||||
if(!m_to->isType(Node::NODE_MACRO | Node::NODE_UNDEFINED_MACRO) || !m_from->isType(Node::NODE_FILE))
|
||||
if (!m_to->isType(Node::NODE_MACRO) || !m_from->isType(Node::NODE_FILE))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -29,9 +29,9 @@ public:
|
||||
EDGE_INHERITANCE = 0x80,
|
||||
EDGE_OVERRIDE = 0x100,
|
||||
EDGE_TYPEDEF_OF = 0x200,
|
||||
EDGE_TEMPLATE_PARAMETER_OF = 0x400,
|
||||
EDGE_TEMPLATE_ARGUMENT_OF = 0x800,
|
||||
EDGE_TEMPLATE_DEFAULT_ARGUMENT_OF = 0x1000,
|
||||
EDGE_TEMPLATE_PARAMETER = 0x400,
|
||||
EDGE_TEMPLATE_ARGUMENT = 0x800,
|
||||
EDGE_TEMPLATE_DEFAULT_ARGUMENT = 0x1000,
|
||||
EDGE_TEMPLATE_SPECIALIZATION_OF = 0x2000,
|
||||
|
||||
EDGE_INCLUDE = 0x4000,
|
||||
|
||||
@@ -40,7 +40,7 @@ void Graph::forEachToken(std::function<void(Token*)> func) const
|
||||
forEachEdge(func);
|
||||
}
|
||||
|
||||
Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy)
|
||||
Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy, bool defined)
|
||||
{
|
||||
Node* n = getNodeById(id);
|
||||
if (n)
|
||||
@@ -48,7 +48,7 @@ Node* Graph::createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy)
|
||||
return n;
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> node = std::make_shared<Node>(id, type, nameHierarchy);
|
||||
std::shared_ptr<Node> node = std::make_shared<Node>(id, type, nameHierarchy, defined);
|
||||
m_nodes.emplace(node->getId(), node);
|
||||
return node.get();
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ public:
|
||||
void forEachEdge(std::function<void(Edge*)> func) const;
|
||||
void forEachToken(std::function<void(Token*)> func) const;
|
||||
|
||||
Node* createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy);
|
||||
Node* createNode(Id id, Node::NodeType type, NameHierarchy nameHierarchy, bool defined);
|
||||
Edge* createEdge(Id id, Edge::EdgeType type, Node* from, Node* to);
|
||||
|
||||
size_t getNodeCount() const;
|
||||
|
||||
+36
-46
@@ -17,12 +17,10 @@ std::string Node::getTypeString(NodeType type)
|
||||
{
|
||||
case NODE_UNDEFINED:
|
||||
return "undefined";
|
||||
case NODE_UNDEFINED_FUNCTION:
|
||||
return "undefined_function";
|
||||
case NODE_UNDEFINED_VARIABLE:
|
||||
return "undefined_variable";
|
||||
case NODE_UNDEFINED_TYPE:
|
||||
return "undefined_type";
|
||||
case NODE_TYPE:
|
||||
return "type";
|
||||
case NODE_NAMESPACE:
|
||||
return "namespace";
|
||||
case NODE_CLASS:
|
||||
return "class";
|
||||
case NODE_STRUCT:
|
||||
@@ -35,8 +33,6 @@ std::string Node::getTypeString(NodeType type)
|
||||
return "function";
|
||||
case NODE_METHOD:
|
||||
return "method";
|
||||
case NODE_NAMESPACE:
|
||||
return "namespace";
|
||||
case NODE_ENUM:
|
||||
return "enum";
|
||||
case NODE_ENUM_CONSTANT:
|
||||
@@ -47,8 +43,6 @@ std::string Node::getTypeString(NodeType type)
|
||||
return "template_parameter_type";
|
||||
case NODE_FILE:
|
||||
return "file";
|
||||
case NODE_UNDEFINED_MACRO:
|
||||
return "undefined_macro";
|
||||
case NODE_MACRO:
|
||||
return "macro";
|
||||
}
|
||||
@@ -65,58 +59,44 @@ Node::NodeType Node::intToType(int value)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
case 0x1:
|
||||
return NODE_UNDEFINED;
|
||||
case 0x2:
|
||||
return NODE_UNDEFINED_TYPE;
|
||||
return NODE_TYPE;
|
||||
case 0x4:
|
||||
return NODE_UNDEFINED_VARIABLE;
|
||||
case 0x8:
|
||||
return NODE_UNDEFINED_FUNCTION;
|
||||
case 0x10:
|
||||
return NODE_STRUCT;
|
||||
case 0x20:
|
||||
return NODE_CLASS;
|
||||
case 0x40:
|
||||
return NODE_GLOBAL_VARIABLE;
|
||||
case 0x80:
|
||||
return NODE_FIELD;
|
||||
case 0x100:
|
||||
return NODE_FUNCTION;
|
||||
case 0x200:
|
||||
return NODE_METHOD;
|
||||
case 0x400:
|
||||
return NODE_NAMESPACE;
|
||||
case 0x800:
|
||||
case 0x8:
|
||||
return NODE_STRUCT;
|
||||
case 0x10:
|
||||
return NODE_CLASS;
|
||||
case 0x20:
|
||||
return NODE_GLOBAL_VARIABLE;
|
||||
case 0x40:
|
||||
return NODE_FIELD;
|
||||
case 0x80:
|
||||
return NODE_FUNCTION;
|
||||
case 0x100:
|
||||
return NODE_METHOD;
|
||||
case 0x200:
|
||||
return NODE_ENUM;
|
||||
case 0x1000:
|
||||
case 0x400:
|
||||
return NODE_ENUM_CONSTANT;
|
||||
case 0x2000:
|
||||
case 0x800:
|
||||
return NODE_TYPEDEF;
|
||||
case 0x4000:
|
||||
case 0x1000:
|
||||
return NODE_TEMPLATE_PARAMETER_TYPE;
|
||||
case 0x8000:
|
||||
case 0x2000:
|
||||
return NODE_FILE;
|
||||
case 0x10000:
|
||||
return NODE_UNDEFINED_MACRO;
|
||||
case 0x20000:
|
||||
case 0x4000:
|
||||
return NODE_MACRO;
|
||||
}
|
||||
|
||||
return NODE_UNDEFINED;
|
||||
}
|
||||
|
||||
Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy)
|
||||
Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy, bool defined)
|
||||
: Token(id)
|
||||
, m_type(type)
|
||||
, m_nameHierarchy(nameHierarchy)
|
||||
{
|
||||
}
|
||||
|
||||
Node::Node(const Node& other)
|
||||
: Token(other)
|
||||
, m_type(other.m_type)
|
||||
, m_nameHierarchy(other.m_nameHierarchy)
|
||||
, m_defined(defined)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -131,7 +111,7 @@ Node::NodeType Node::getType() const
|
||||
|
||||
void Node::setType(NodeType type)
|
||||
{
|
||||
if (!isType(type | NODE_UNDEFINED | NODE_UNDEFINED_FUNCTION | NODE_UNDEFINED_VARIABLE | NODE_UNDEFINED_TYPE))
|
||||
if (!isType(type | NODE_UNDEFINED))
|
||||
{
|
||||
LOG_WARNING(
|
||||
"Cannot change NodeType after it was already set from " + getTypeString() + " to " + getTypeString(type)
|
||||
@@ -161,6 +141,16 @@ NameHierarchy Node::getNameHierarchy() const
|
||||
return m_nameHierarchy;
|
||||
}
|
||||
|
||||
bool Node::isDefined() const
|
||||
{
|
||||
return m_defined;
|
||||
}
|
||||
|
||||
void Node::setDefined(bool defined)
|
||||
{
|
||||
m_defined = defined;
|
||||
}
|
||||
|
||||
const std::vector<Edge*>& Node::getEdges() const
|
||||
{
|
||||
return m_edges;
|
||||
|
||||
+19
-20
@@ -20,30 +20,26 @@ class Node
|
||||
{
|
||||
public:
|
||||
typedef int NodeTypeMask;
|
||||
// list undefined types first to ensure that they get replaced by their defined counterparts when it is parsed.
|
||||
enum NodeType : NodeTypeMask
|
||||
{
|
||||
NODE_UNDEFINED = 0x1,
|
||||
NODE_UNDEFINED_TYPE = 0x2,
|
||||
NODE_UNDEFINED_VARIABLE = 0x4,
|
||||
NODE_UNDEFINED_FUNCTION = 0x8,
|
||||
NODE_TYPE = 0x2,
|
||||
|
||||
NODE_STRUCT = 0x10,
|
||||
NODE_CLASS = 0x20,
|
||||
NODE_GLOBAL_VARIABLE = 0x40,
|
||||
NODE_FIELD = 0x80,
|
||||
NODE_FUNCTION = 0x100,
|
||||
NODE_METHOD = 0x200,
|
||||
NODE_NAMESPACE = 0x400,
|
||||
NODE_ENUM = 0x800,
|
||||
NODE_ENUM_CONSTANT = 0x1000,
|
||||
NODE_TYPEDEF = 0x2000,
|
||||
NODE_TEMPLATE_PARAMETER_TYPE = 0x4000,
|
||||
NODE_NAMESPACE = 0x4,
|
||||
NODE_STRUCT = 0x8,
|
||||
NODE_CLASS = 0x10,
|
||||
NODE_GLOBAL_VARIABLE = 0x20,
|
||||
NODE_FIELD = 0x40,
|
||||
NODE_FUNCTION = 0x80,
|
||||
NODE_METHOD = 0x100,
|
||||
|
||||
NODE_FILE = 0x8000,
|
||||
NODE_ENUM = 0x200,
|
||||
NODE_ENUM_CONSTANT = 0x400,
|
||||
NODE_TYPEDEF = 0x800,
|
||||
NODE_TEMPLATE_PARAMETER_TYPE = 0x1000,
|
||||
|
||||
NODE_UNDEFINED_MACRO = 0x10000,
|
||||
NODE_MACRO = 0x20000,
|
||||
NODE_FILE = 0x2000,
|
||||
NODE_MACRO = 0x4000
|
||||
};
|
||||
|
||||
static std::string getTypeString(NodeType type);
|
||||
@@ -52,8 +48,7 @@ public:
|
||||
|
||||
static const NodeTypeMask NODE_NOT_VISIBLE;
|
||||
|
||||
Node(Id id, NodeType type, NameHierarchy nameHierarchy);
|
||||
Node(const Node& other);
|
||||
Node(Id id, NodeType type, NameHierarchy nameHierarchy, bool defined);
|
||||
virtual ~Node();
|
||||
|
||||
NodeType getType() const;
|
||||
@@ -64,6 +59,9 @@ public:
|
||||
std::string getFullName() const;
|
||||
NameHierarchy getNameHierarchy() const;
|
||||
|
||||
bool isDefined() const;
|
||||
void setDefined(bool defined);
|
||||
|
||||
const std::vector<Edge*>& getEdges() const;
|
||||
|
||||
void addEdge(Edge* edge);
|
||||
@@ -105,6 +103,7 @@ private:
|
||||
|
||||
NodeType m_type;
|
||||
NameHierarchy m_nameHierarchy;
|
||||
bool m_defined;
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& ostream, const Node& node);
|
||||
|
||||
Reference in New Issue
Block a user