Alien-SmokeQt
view release on metacpan or search on metacpan
generator/generatorvisitor.cpp view on Meta::CPAN
if (!cv) return ret;
const ListNode<std::size_t> *it = cv->toFront(), *end = it;
do {
if (it->element) {
int _kind = m_session->token_stream->kind(it->element);
if (_kind == Token_const)
ret.first = true;
else if (_kind == Token_volatile)
ret.second = true;
}
it = it->next;
} while (end != it);
return ret;
}
#define returnOnExistence(name) \
if (classes.contains(name)) { \
return &classes[name]; \
} else if (typedefs.contains(name)) { \
return &typedefs[name]; \
} else if (enums.contains(name)) { \
return &enums[name]; \
}
BasicTypeDeclaration* GeneratorVisitor::resolveTypeInSuperClasses(const Class* klass, const QString& name)
{
foreach (const Class::BaseClassSpecifier& bclass, klass->baseClasses()) {
QString _name = bclass.baseClass->toString() + "::" + name;
returnOnExistence(_name);
QStringList nspace = klass->nameSpace().split("::");
if (!klass->nameSpace().isEmpty() && nspace != this->nspace) {
do {
nspace.push_back(name);
QString n = nspace.join("::");
returnOnExistence(n);
nspace.pop_back();
if (!nspace.isEmpty())
nspace.pop_back();
} while (!nspace.isEmpty());
}
if (!bclass.baseClass->baseClasses().count())
continue;
BasicTypeDeclaration* decl = resolveTypeInSuperClasses(bclass.baseClass, name);
if (decl)
return decl;
}
return 0;
}
BasicTypeDeclaration* GeneratorVisitor::resolveType(const QString & name)
{
QString _name = name;
return resolveType(_name);
}
// TODO: this might have to be improved for cases like 'Typedef::Nested foo'
BasicTypeDeclaration* GeneratorVisitor::resolveType(QString & name)
{
if (ParserOptions::qtMode && name.endsWith("::enum_type")) {
// strip off "::enum_type"
QString flags = name.left(name.length() - 11);
QHash<QString, Typedef>::iterator it = typedefs.find(flags);
if (it != typedefs.end()) {
QString enumType = it.value().resolve().toString().replace(QRegExp("QFlags<(.*)>"), "\\1");
QHash<QString, Enum>::iterator it = enums.find(enumType);
if (it != enums.end()) {
return &it.value();
}
}
}
// check for 'using type;'
// if we use 'type', we can also access type::nested, take care of that
int index = name.indexOf("::");
QString first = name, rest;
if (index > -1) {
first = name.mid(0, index);
rest = name.mid(index);
}
foreach (const QStringList& list, usingTypes) {
foreach (const QString& string, list) {
QString complete = string + rest;
if (string.endsWith(first)) {
returnOnExistence(complete);
}
}
}
// check for the name in parent namespaces
QStringList nspace = this->nspace;
do {
nspace.push_back(name);
QString n = nspace.join("::");
returnOnExistence(n);
nspace.pop_back();
if (!nspace.isEmpty())
nspace.pop_back();
} while (!nspace.isEmpty());
// check for nested classes
for (int i = klass.count() - 1; i >= 0; i--) {
QString _name = klass[i]->toString() + "::" + name;
returnOnExistence(_name);
BasicTypeDeclaration* decl = resolveTypeInSuperClasses(klass[i], name);
if (decl)
return decl;
}
// maybe it's just 'there'
returnOnExistence(name);
// check for the name in any of the namespaces included by 'using namespace'
foreach (const QStringList& list, usingNamespaces) {
foreach (const QString& string, list) {
QString cname = string + "::" + name;
returnOnExistence(cname);
}
}
QStringList parts = name.split("::");
if (parts.count() > 1) {
// try to resolve the first part - if that works simply append the last part.
( run in 0.913 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )