[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: playground/bindings/smokegenerator
From: Arno Rehn <kde () arnorehn ! de>
Date: 2009-05-31 20:48:02
Message-ID: 1243802882.975650.6070.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 976086 by arnorehn:
further improve type resolution
M +26 -19 generatorvisitor.cpp
M +1 -0 generatorvisitor.h
--- trunk/playground/bindings/smokegenerator/generatorvisitor.cpp #976085:976086
@@ -57,15 +57,29 @@
return ret;
}
+inline
+bool GeneratorVisitor::isIntegralType(const QStringList& type)
+{
+ static QRegExp exp1("((un)?signed\\s+)?(short|int|long|long long|char)");
+ static QRegExp exp2("(bool|float|double|void)");
+ QString str = type.join(" ");
+ return exp1.exactMatch(str) || exp2.exactMatch(str);
+}
+
+// TODO: this might have to be improved for cases like 'Typedef::Nested foo'
QPair<Class*, Typedef*> GeneratorVisitor::resolveType(const QString & name)
{
+#define returnOnExistence(name) \
+ if (classes.contains(name)) {\
+ return qMakePair<Class*, Typedef*>(&classes[name], 0); \
+ } else if (typedefs.contains(name)) { \
+ return qMakePair<Class*, Typedef*>(0, &typedefs[name]); \
+ }
+
// check for nested classes
for (int i = klass.count() - 1; i >= 0; i--) {
QString name = klass[i]->toString() + "::" + name;
- if (classes.contains(name))
- return qMakePair<Class*, Typedef*>(&classes[name], 0);
- else if (typedefs.contains(name))
- return qMakePair<Class*, Typedef*>(0, &typedefs[name]);
+ returnOnExistence(name);
}
// check for 'using type;'
@@ -80,10 +94,7 @@
foreach (const QString& string, list) {
QString complete = string + rest;
if (string.endsWith(first)) {
- if (classes.contains(complete))
- return qMakePair<Class*, Typedef*>(&classes[complete], 0);
- else if (typedefs.contains(complete))
- return qMakePair<Class*, Typedef*>(0, &typedefs[complete]);
+ returnOnExistence(complete);
}
}
}
@@ -93,10 +104,7 @@
do {
nspace.push_back(name);
QString n = nspace.join("::");
- if (classes.contains(n))
- return qMakePair<Class*, Typedef*>(&classes[n], 0);
- else if (typedefs.contains(n))
- return qMakePair<Class*, Typedef*>(0, &typedefs[n]);
+ returnOnExistence(n);
nspace.pop_back();
if (!nspace.isEmpty())
nspace.pop_back();
@@ -106,14 +114,12 @@
foreach (const QStringList& list, usingNamespaces) {
foreach (const QString& string, list) {
QString cname = string + "::" + name;
- if (classes.contains(cname))
- return qMakePair<Class*, Typedef*>(&classes[cname], 0);
- else if (typedefs.contains(cname))
- return qMakePair<Class*, Typedef*>(0, &typedefs[cname]);
+ returnOnExistence(cname);
}
}
return qMakePair<Class*, Typedef*>(0, 0);
+#undef returnOnExistence
}
void GeneratorVisitor::visitAccessSpecifier(AccessSpecifierAST* node)
@@ -402,8 +408,9 @@
{
tc->run(node);
// the method returns void - we don't need to create a new type for that
- if (tc->qualifiedName().join("::") == "void") {
- currentTypeRef = const_cast<Type*>(&Type::Void);
+ if (isIntegralType(tc->qualifiedName())) {
+ currentType = Type(tc->qualifiedName().join(" "), tc->isConstant(), tc->isVolatile());
+ createType = true;
DefaultVisitor::visitSimpleTypeSpecifier(node);
return;
}
@@ -422,7 +429,7 @@
if (tc->isVolatile()) currentType.setIsVolatile(true);
}
} else {
- // type not known (e.g. integral type)
+ // type not known
currentType = Type(tc->qualifiedName().join("::"), tc->isConstant(), tc->isVolatile());
}
createType = true;
--- trunk/playground/bindings/smokegenerator/generatorvisitor.h #976085:976086
@@ -39,6 +39,7 @@
protected:
inline const Token& token(std::size_t token) { return m_session->token_stream->token(token); }
QPair<bool, bool> parseCv(const ListNode<std::size_t> *cv);
+ bool isIntegralType(const QStringList& type);
QPair<Class*, Typedef*> resolveType(const QString& name);
virtual void visitAccessSpecifier(AccessSpecifierAST* node);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic