Alien-SmokeQt
view release on metacpan or search on metacpan
generator/generators/smoke/helpers.cpp view on Meta::CPAN
}
QStringList remainingDefaultValues;
for (int j = i; j < meth.parameters().count(); j++) {
const Parameter defParam = meth.parameters()[j];
QString cast = "(";
cast += defParam.type()->toString() + ')';
cast += defParam.defaultValue();
remainingDefaultValues << cast;
}
overload.setRemainingDefaultValues(remainingDefaultValues);
klass->appendMethod(overload);
params << param;
}
}
// checks if method meth is overriden in class klass or any of its superclasses
const Method* Util::isVirtualOverriden(const Method& meth, const Class* klass)
{
// is the method virtual at all?
if (!(meth.flags() & Method::Virtual) && !(meth.flags() & Method::PureVirtual))
return 0;
// if the method is defined in klass, it can't be overriden there or in any parent class
if (meth.getClass() == klass)
return 0;
foreach (const Method& m, klass->methods()) {
if (!(m.flags() & Method::Static) && m == meth)
// the method m overrides meth
return &m;
}
foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
// we reached the class in which meth was defined and we still didn't find any overrides => return
if (base.baseClass == meth.getClass())
return 0;
// recurse into the base classes
const Method* m = 0;
if ((m = isVirtualOverriden(meth, base.baseClass)))
return m;
}
return 0;
}
static bool qListContainsMethodPointer(const QList<const Method*> list, const Method* ptr) {
foreach (const Method* meth, list) {
if (*meth == *ptr)
return true;
}
return false;
}
QList<const Method*> Util::virtualMethodsForClass(const Class* klass)
{
static QHash<const Class*, QList<const Method*> > cache;
// virtual method callbacks for classes that can't be instanstiated aren't useful
if (!Util::canClassBeInstanciated(klass))
return QList<const Method*>();
if (cache.contains(klass))
return cache[klass];
QList<const Method*> ret;
foreach (const Method* meth, Util::collectVirtualMethods(klass)) {
// this is a synthesized overload, skip it.
if (!meth->remainingDefaultValues().isEmpty())
continue;
if (meth->getClass() == klass) {
// this method can't be overriden, because it's defined in the class for which this method was called
ret << meth;
continue;
}
// Check if the method is overriden, so the callback will always point to the latest definition of the virtual method.
const Method* override = 0;
if ((override = Util::isVirtualOverriden(*meth, klass))) {
// If the method was overriden and put under private access, skip it. If we already have the method, skip it as well.
if (override->access() == Access_private || qListContainsMethodPointer(ret, override))
continue;
ret << override;
} else if (!qListContainsMethodPointer(ret, meth)) {
ret << meth;
}
}
cache[klass] = ret;
return ret;
}
bool Options::typeExcluded(const QString& typeName)
{
foreach (const QRegExp& exp, Options::excludeExpressions) {
if (exp.exactMatch(typeName))
return true;
}
return false;
}
bool Options::functionNameIncluded(const QString& fnName) {
foreach (const QRegExp& exp, Options::includeFunctionNames) {
if (exp.exactMatch(fnName))
return true;
}
return false;
}
bool Options::functionSignatureIncluded(const QString& sig) {
foreach (const QRegExp& exp, Options::includeFunctionNames) {
if (exp.exactMatch(sig))
return true;
}
return false;
}
( run in 1.409 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )