aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--abstractmetalang.cpp15
-rw-r--r--abstractmetalang.h7
-rw-r--r--tests/testaddfunction.cpp25
-rw-r--r--typesystem.h3
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) { }