diff --git a/bin/app/data/ApplicationSettings_template.xml b/bin/app/data/ApplicationSettings_template.xml index c6c40b5c..27c846f7 100644 --- a/bin/app/data/ApplicationSettings_template.xml +++ b/bin/app/data/ApplicationSettings_template.xml @@ -1,5 +1,6 @@ + @@ -8,6 +9,8 @@ + + diff --git a/bin/app/data/ProjectSettings_template.xml b/bin/app/data/ProjectSettings_template.xml index 312cd7d6..1ad426df 100644 --- a/bin/app/data/ProjectSettings_template.xml +++ b/bin/app/data/ProjectSettings_template.xml @@ -1,5 +1,6 @@ + diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 05403011..a67c2779 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -20,6 +20,7 @@ #include "data/query/QueryCommand.h" #include "data/query/QueryTree.h" #include "data/type/DataType.h" +#include "settings/ApplicationSettings.h" Storage::Storage() { @@ -839,6 +840,32 @@ std::shared_ptr Storage::getGraphForActiveTokenIds(const std::vector& } } + if (ApplicationSettings::getInstance()->filterUndefinedNodesFromGraph()) + { + bool allUndefined = true; + Node::NodeTypeMask undefinedMask = + Node::NODE_UNDEFINED | Node::NODE_UNDEFINED_TYPE | + Node::NODE_UNDEFINED_VARIABLE | Node::NODE_UNDEFINED_FUNCTION; + for (Id tokenId : tokenIds) + { + Token* token = m_graph.getTokenById(tokenId); + if (token && token->isNode() && !dynamic_cast(token)->isType(undefinedMask)) + { + allUndefined = false; + break; + } + } + + if (!allUndefined) + { + QueryTree tree("!'undefined'"); + std::shared_ptr outGraph = std::make_shared(); + + GraphFilterConductor().filter(&tree, graph.get(), outGraph.get()); + return outGraph; + } + } + return graph; } diff --git a/src/lib/data/graph/filter/GraphFilterConductor.cpp b/src/lib/data/graph/filter/GraphFilterConductor.cpp index 4dae0882..767773e4 100644 --- a/src/lib/data/graph/filter/GraphFilterConductor.cpp +++ b/src/lib/data/graph/filter/GraphFilterConductor.cpp @@ -95,6 +95,11 @@ void GraphFilterConductor::filterCommandNode(const QueryCommand* node, const Fil { switch (node->getType()) { + case QueryCommand::COMMAND_UNDEFINED: + GraphFilterCommandNodeType( + Node::NODE_UNDEFINED | Node::NODE_UNDEFINED_TYPE | + Node::NODE_UNDEFINED_VARIABLE | Node::NODE_UNDEFINED_FUNCTION).apply(in, out); + break; case QueryCommand::COMMAND_MEMBER: GraphFilterCommandMember().apply(in, out); break; diff --git a/src/lib/data/query/QueryCommand.cpp b/src/lib/data/query/QueryCommand.cpp index 2e54ffc6..53014c72 100644 --- a/src/lib/data/query/QueryCommand.cpp +++ b/src/lib/data/query/QueryCommand.cpp @@ -11,6 +11,8 @@ std::map QueryCommand::getCommandTypeMap return commandMap; } + commandMap.emplace("undefined", COMMAND_UNDEFINED); + commandMap.emplace("member", COMMAND_MEMBER); commandMap.emplace("child", COMMAND_MEMBER); diff --git a/src/lib/data/query/QueryCommand.h b/src/lib/data/query/QueryCommand.h index 35fbe5e2..5e70cfe7 100644 --- a/src/lib/data/query/QueryCommand.h +++ b/src/lib/data/query/QueryCommand.h @@ -13,6 +13,8 @@ public: { COMMAND_INVALID, + COMMAND_UNDEFINED, + COMMAND_MEMBER, COMMAND_PARENT, COMMAND_FUNCTION, diff --git a/src/lib/settings/ApplicationSettings.cpp b/src/lib/settings/ApplicationSettings.cpp index 7e9267ea..4488c44a 100644 --- a/src/lib/settings/ApplicationSettings.cpp +++ b/src/lib/settings/ApplicationSettings.cpp @@ -21,6 +21,11 @@ std::string ApplicationSettings::getStartupProjectFilePath() const return getValue("StartupProject", ""); } +bool ApplicationSettings::filterUndefinedNodesFromGraph() const +{ + return getValue("FilterUndefinedNodesFromGraph", false); +} + int ApplicationSettings::getCodeTabWidth() const { return getValue("code/TabWidth", 4); diff --git a/src/lib/settings/ApplicationSettings.h b/src/lib/settings/ApplicationSettings.h index 50659ccc..5859d185 100644 --- a/src/lib/settings/ApplicationSettings.h +++ b/src/lib/settings/ApplicationSettings.h @@ -17,6 +17,7 @@ public: ~ApplicationSettings(); std::string getStartupProjectFilePath() const; + bool filterUndefinedNodesFromGraph() const; // code int getCodeTabWidth() const;