diff options
Diffstat (limited to 'abstractmetalang.cpp')
-rw-r--r-- | abstractmetalang.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/abstractmetalang.cpp b/abstractmetalang.cpp index 5e8020db7..9643d5f85 100644 --- a/abstractmetalang.cpp +++ b/abstractmetalang.cpp @@ -675,12 +675,22 @@ QString AbstractMetaFunction::minimalSignature() const return minimalSignature; } -FunctionModificationList AbstractMetaFunction::modifications(const AbstractMetaClass *implementor) const +FunctionModificationList AbstractMetaFunction::modifications(const AbstractMetaClass* implementor) const { - // FIXME Global functions do not support modifications if (!implementor) - return FunctionModificationList(); - return implementor->typeEntry()->functionModifications(minimalSignature()); + implementor = ownerClass(); + + if (!implementor) + return TypeDatabase::instance()->functionModifications(minimalSignature()); + + FunctionModificationList mods; + while (implementor) { + mods += implementor->typeEntry()->functionModifications(minimalSignature()); + if (implementor == implementor->baseClass()) + break; + implementor = implementor->baseClass(); + } + return mods; } bool AbstractMetaFunction::hasModifications(const AbstractMetaClass *implementor) const @@ -714,7 +724,7 @@ CodeSnipList AbstractMetaFunction::injectedCodeSnips(CodeSnip::Position position bool AbstractMetaFunction::hasSignatureModifications() const { - foreach (const FunctionModification mod, modifications(ownerClass())) { + foreach (const FunctionModification mod, modifications()) { foreach (const ArgumentModification argmod, mod.argument_mods) { // since zero represents the return type and we're // interested only in checking the function arguments, |