From 35f0ddf67c629ce9efaa1ba893afcb2921a251a2 Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Thu, 24 Dec 2015 10:22:07 +0100 Subject: REGISTER_SYNTAX for automagic adding of syntax a fun abuse of static initialization and std::function --- akonadish/syntax_modules/akonadi_count.cpp | 2 ++ akonadish/syntax_modules/akonadi_list.cpp | 2 ++ akonadish/syntax_modules/akonadi_sync.cpp | 2 ++ akonadish/syntax_modules/core_syntax.cpp | 2 ++ akonadish/syntaxtree.cpp | 15 ++++++--------- akonadish/syntaxtree.h | 2 ++ 6 files changed, 16 insertions(+), 9 deletions(-) (limited to 'akonadish') diff --git a/akonadish/syntax_modules/akonadi_count.cpp b/akonadish/syntax_modules/akonadi_count.cpp index 40ad693..e54ac22 100644 --- a/akonadish/syntax_modules/akonadi_count.cpp +++ b/akonadish/syntax_modules/akonadi_count.cpp @@ -39,6 +39,8 @@ namespace AkonadiCount { +REGISTER_SYNTAX(AkonadiCount) + Syntax::List syntax() { Syntax::List syntax; diff --git a/akonadish/syntax_modules/akonadi_list.cpp b/akonadish/syntax_modules/akonadi_list.cpp index 6abc853..25ebbca 100644 --- a/akonadish/syntax_modules/akonadi_list.cpp +++ b/akonadish/syntax_modules/akonadi_list.cpp @@ -39,6 +39,8 @@ namespace AkonadiList { +REGISTER_SYNTAX(AkonadiList) + Syntax::List syntax() { Syntax::List syntax; diff --git a/akonadish/syntax_modules/akonadi_sync.cpp b/akonadish/syntax_modules/akonadi_sync.cpp index 990fdf6..e9388d2 100644 --- a/akonadish/syntax_modules/akonadi_sync.cpp +++ b/akonadish/syntax_modules/akonadi_sync.cpp @@ -37,6 +37,8 @@ namespace AkonadiSync { +REGISTER_SYNTAX(AkonadiSync) + Syntax::List syntax() { Syntax::List syntax; diff --git a/akonadish/syntax_modules/core_syntax.cpp b/akonadish/syntax_modules/core_syntax.cpp index 393a0a5..8fb1448 100644 --- a/akonadish/syntax_modules/core_syntax.cpp +++ b/akonadish/syntax_modules/core_syntax.cpp @@ -27,6 +27,8 @@ namespace CoreSyntax { +REGISTER_SYNTAX(CoreSyntax) + Syntax::List syntax() { Syntax::List syntax; diff --git a/akonadish/syntaxtree.cpp b/akonadish/syntaxtree.cpp index 2d7c127..cd7348e 100644 --- a/akonadish/syntaxtree.cpp +++ b/akonadish/syntaxtree.cpp @@ -45,15 +45,12 @@ Syntax::Syntax(const QString &k, const QString &helpText, std::function > syntaxSyntaxTrees; - syntaxSyntaxTrees << &CoreSyntax::syntax - << &AkonadiList::syntax - << &AkonadiCount::syntax - << &AkonadiSync::syntax - ; - for (auto syntaxSyntaxTree: syntaxSyntaxTrees) { - m_syntax += syntaxSyntaxTree(); - } +} + +int SyntaxTree::registerSyntax(std::function f) +{ + m_syntax += f(); + return m_syntax.size(); } SyntaxTree *SyntaxTree::self() diff --git a/akonadish/syntaxtree.h b/akonadish/syntaxtree.h index 77f52af..6fdf2b9 100644 --- a/akonadish/syntaxtree.h +++ b/akonadish/syntaxtree.h @@ -57,6 +57,7 @@ public: static SyntaxTree *self(); + int registerSyntax(std::function f); Syntax::List syntax() const; Command match(const QStringList &commands) const; Syntax::List nearestSyntax(const QStringList &words, const QString &fragment) const; @@ -73,3 +74,4 @@ private: static SyntaxTree *s_module; }; +#define REGISTER_SYNTAX(name) static const int theTrickFor##name = SyntaxTree::self()->registerSyntax(&name::syntax); -- cgit v1.2.3