diff options
-rw-r--r-- | abstractmetalang.cpp | 15 | ||||
-rw-r--r-- | abstractmetalang.h | 7 | ||||
-rw-r--r-- | tests/testaddfunction.cpp | 25 | ||||
-rw-r--r-- | typesystem.h | 3 |
4 files changed, 47 insertions, 3 deletions
diff --git a/abstractmetalang.cpp b/abstractmetalang.cpp index 351abea06..68f6adec9 100644 --- a/abstractmetalang.cpp +++ b/abstractmetalang.cpp @@ -697,6 +697,21 @@ bool AbstractMetaFunction::hasInjectedCode() const return false; } +CodeSnipList AbstractMetaFunction::injectedCodeSnips(CodeSnip::Position position, TypeSystem::Language language) const +{ + CodeSnipList result; + foreach (const FunctionModification mod, modifications(ownerClass())) { + if (mod.isCodeInjection()) { + QList<CodeSnip>::const_iterator it = mod.snips.constBegin(); + for (;it != mod.snips.constEnd(); ++it) { + if ((it->language & language) && (it->position == position || position == CodeSnip::Any)) + result << *it; + } + } + } + return result; +} + bool AbstractMetaFunction::hasSignatureModifications() const { foreach (const FunctionModification mod, modifications(ownerClass())) { diff --git a/abstractmetalang.h b/abstractmetalang.h index 6adb73739..d59b4cf14 100644 --- a/abstractmetalang.h +++ b/abstractmetalang.h @@ -1050,6 +1050,13 @@ public: */ bool hasInjectedCode() const; /** + * Returns a list of code snips for this function. + * The code snips can be filtered by position and language. + * \return list of code snips + */ + CodeSnipList injectedCodeSnips(CodeSnip::Position position = CodeSnip::Any, + TypeSystem::Language language = TypeSystem::All) const; + /** * Verifies if any modification to the function alters/removes its * arguments types or default values. * \return true if there is some modification to function signature diff --git a/tests/testaddfunction.cpp b/tests/testaddfunction.cpp index d02fc67e1..456b9888c 100644 --- a/tests/testaddfunction.cpp +++ b/tests/testaddfunction.cpp @@ -112,7 +112,7 @@ void TestAddFunction::testAddFunctionTagDefaultValues() <add-function signature='func()' />\ </value-type>\ </typesystem>"; - TestUtil t(cppCode, xmlCode, false); + TestUtil t(cppCode, xmlCode); AbstractMetaClassList classes = t.builder()->classes(); AbstractMetaClass* classA = classes.findClass("A"); QVERIFY(classA); @@ -136,7 +136,7 @@ void TestAddFunction::testAddFunctionCodeSnippets() </value-type>\ </typesystem>"; - TestUtil t(cppCode, xmlCode, false); + TestUtil t(cppCode, xmlCode); AbstractMetaClassList classes = t.builder()->classes(); AbstractMetaClass* classA = classes.findClass("A"); QVERIFY(classA); @@ -148,9 +148,30 @@ void TestAddFunction::testFunctionWithoutParenteses() { const char sig1[] = "func"; AddedFunction f1(sig1, "void"); + QCOMPARE(f1.name(), QString("func")); QCOMPARE(f1.arguments().count(), 0); QCOMPARE(f1.isConstant(), false); + + const char cppCode[] = "struct A {};"; + const char xmlCode[] = "\ + <typesystem package=\"Foo\">\ + <value-type name='A'>\ + <add-function signature='func'>\ + <inject-code class='target' position='end'>Hi!, I am the code.</inject-code>\ + </add-function>\ + </value-type>\ + </typesystem>"; + + TestUtil t(cppCode, xmlCode, false); + AbstractMetaClassList classes = t.builder()->classes(); + AbstractMetaClass* classA = classes.findClass("A"); + QVERIFY(classA); + const AbstractMetaFunction* addedFunc = classA->findFunction("func"); + QVERIFY(addedFunc); + QVERIFY(addedFunc->hasInjectedCode()); + QCOMPARE(addedFunc->injectedCodeSnips(CodeSnip::Any, TypeSystem::TargetLangCode).count(), 1); + } QTEST_APPLESS_MAIN(TestAddFunction) diff --git a/typesystem.h b/typesystem.h index 420c7c09e..5e1220639 100644 --- a/typesystem.h +++ b/typesystem.h @@ -242,7 +242,8 @@ public: Declaration, PrototypeInitialization, ConstructorInitialization, - Constructor + Constructor, + Any }; CodeSnip() : language(TypeSystem::TargetLangCode) { } |