aboutsummaryrefslogtreecommitdiffstats
path: root/shibokengenerator.cpp
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2010-06-25 15:19:02 -0300
committerRenato Filho <renato.filho@openbossa.org>2010-06-25 16:52:42 -0300
commit0648daae2a791e2870c79ba1edd6573a41df62a9 (patch)
treea0eb69c1d380a24daf8024e8c18e53390aee7b65 /shibokengenerator.cpp
parent4ca6e3d79ac57419d0c89286964445a01f8c2278 (diff)
Generate cpp file with "using namespace ..." if class inside of
namespace. Reviewer: Luciano Wolf <luciano.wolf@openbossa.org> Hugo Parente <hugo.lima@openbossa.org>
Diffstat (limited to 'shibokengenerator.cpp')
-rw-r--r--shibokengenerator.cpp45
1 files changed, 29 insertions, 16 deletions
diff --git a/shibokengenerator.cpp b/shibokengenerator.cpp
index 75c25df38..877fab758 100644
--- a/shibokengenerator.cpp
+++ b/shibokengenerator.cpp
@@ -44,6 +44,25 @@ QHash<QString, QString> ShibokenGenerator::m_pythonOperators = QHash<QString, QS
QHash<QString, QString> ShibokenGenerator::m_formatUnits = QHash<QString, QString>();
QHash<QString, QString> ShibokenGenerator::m_tpFuncs = QHash<QString, QString>();
+
+static QString resolveScopePrefix(const AbstractMetaClass* scope, const QString& value)
+{
+ if (!scope)
+ return QString();
+
+ QString name;
+ QString scopePrefix = scope->qualifiedCppName() + "::";
+ QStringList parts = scopePrefix.split("::", QString::SkipEmptyParts);
+ for(int i = (parts.size() - 1) ; i >= 0; i--){
+
+ if (!value.startsWith(parts[i] + "::"))
+ name = parts[i] + "::" + name;
+ else
+ name = "";
+ }
+
+ return name;
+}
ShibokenGenerator::ShibokenGenerator() : Generator()
{
if (m_pythonPrimitiveTypeName.isEmpty())
@@ -334,11 +353,7 @@ QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction*
if (arg->type()->isEnum()) {
const AbstractMetaEnum* metaEnum = findAbstractMetaEnum(arg->type());
- if (metaEnum->enclosingClass()) {
- prefix = metaEnum->enclosingClass()->qualifiedCppName() + "::";
- if (value.startsWith(prefix))
- prefix = QString();
- }
+ prefix = resolveScopePrefix(metaEnum->enclosingClass(), value);
} else if (arg->type()->isFlags()) {
static QRegExp numberRegEx("^\\d+$"); // Numbers to flags
if (numberRegEx.exactMatch(value)) {
@@ -372,25 +387,23 @@ QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction*
} else if (arg->type()->typeEntry()->isValue()) {
const AbstractMetaClass* metaClass = classes().findClass(arg->type()->typeEntry());
if (enumValueRegEx.exactMatch(value))
- prefix = metaClass->qualifiedCppName() + "::";
- if (value.startsWith(prefix))
- prefix = QString();
+ prefix = resolveScopePrefix(metaClass, value);
} else if (arg->type()->isPrimitive() && arg->type()->name() == "int") {
- if (enumValueRegEx.exactMatch(value) && func->implementingClass()) {
- prefix = func->implementingClass()->qualifiedCppName() + "::";
- if (value.startsWith(prefix))
- prefix = QString();
- }
+ if (enumValueRegEx.exactMatch(value) && func->implementingClass())
+ prefix = resolveScopePrefix(func->implementingClass(), value);
} else if(arg->type()->isPrimitive()) {
static QRegExp unknowArgumentRegEx("^(?:[A-Za-z_][\\w:]*\\()?([A-Za-z_]\\w*)(?:\\))?$"); // [PrimitiveType(] DESIREDNAME [)]
if (unknowArgumentRegEx.indexIn(value) != -1 && func->implementingClass()) {
foreach (const AbstractMetaField* field, func->implementingClass()->fields()) {
if (unknowArgumentRegEx.cap(1).trimmed() == field->name()) {
QString fieldName = field->name();
- if (field->isStatic())
- fieldName.prepend(func->implementingClass()->qualifiedCppName() + "::");
- else
+ if (field->isStatic()) {
+ prefix = resolveScopePrefix(func->implementingClass()->enclosingClass(), value);
+ fieldName.prepend(prefix);
+ prefix= "";
+ } else {
fieldName.prepend(CPP_SELF_VAR "->");
+ }
value.replace(unknowArgumentRegEx.cap(1), fieldName);
break;
}