aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp14
-rw-r--r--shibokengenerator.cpp45
2 files changed, 42 insertions, 17 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp
index 3623ccee5..6cd0ca1e4 100644
--- a/cppgenerator.cpp
+++ b/cppgenerator.cpp
@@ -178,7 +178,19 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl
if (metaClass->typeEntry()->typeFlags() & ComplexTypeEntry::Deprecated)
s << "#Deprecated" << endl;
- s << "using namespace Shiboken;" << endl << endl;
+ s << "using namespace Shiboken;" << endl;
+
+ //Use class base namespace
+ const AbstractMetaClass *context = metaClass->enclosingClass();
+ while(context) {
+ if (context->isNamespace() && !context->enclosingClass()) {
+ s << "using namespace " << context->qualifiedCppName() << ";" << endl;
+ break;
+ }
+ context = context->enclosingClass();
+ }
+
+ s << endl;
// class inject-code native/beginning
if (!metaClass->typeEntry()->codeSnips().isEmpty()) {
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;
}