shiboken2/clang: Suppress class scope look up for parameters with scope resolution
authorFriedemann Kleint <Friedemann.Kleint@qt.io>
Thu, 27 Apr 2023 11:00:37 +0000 (13:00 +0200)
committerGraham Inggs <ginggs@debian.org>
Sat, 25 Jan 2025 16:33:38 +0000 (16:33 +0000)
Add a flag to AbstractMetaBuilderPrivate::findTypeEntriesHelper()
to suppress the class scope look in case scope resolution.

Task-number: PYSIDE-2288
Pick-to: 6.5 5.15
Change-Id: I04a4810d03845fb48393c5efed3641220bd12d87
Reviewed-by: Christian Tismer <tismer@stackless.com>
Gbp-Pq: Name shiboken2-clang-Suppress-class-scope-look-up-for-paramete.patch

sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
sources/shiboken2/ApiExtractor/abstractmetabuilder.h
sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h

index 2f34e16b6d0ffbb358db028dbd02905048c40b2f..4bf4ab40a722092f036b0f0e871f6e2b793bd735 100644 (file)
@@ -1845,7 +1845,10 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(const Functio
             return nullptr;
         }
 
-        AbstractMetaType *type = translateType(returnType, currentClass, {}, &errorMessage);
+        TranslateTypeFlags flags;
+        if (functionItem->scopeResolution())
+            flags.setFlag(AbstractMetaBuilder::NoClassScopeLookup);
+        AbstractMetaType *type = translateType(returnType, currentClass, flags, &errorMessage);
         if (!type) {
             const QString reason = msgUnmatchedReturnType(functionItem, errorMessage);
             qCWarning(lcShiboken, "%s",
@@ -1880,7 +1883,10 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(const Functio
             return nullptr;
         }
 
-        AbstractMetaType *metaType = translateType(arg->type(), currentClass, {}, &errorMessage);
+        TranslateTypeFlags flags;
+        if (arg->scopeResolution())
+            flags.setFlag(AbstractMetaBuilder::NoClassScopeLookup);
+        AbstractMetaType *metaType = translateType(arg->type(), currentClass, flags, &errorMessage);
         if (!metaType) {
             // If an invalid argument has a default value, simply remove it
             // unless the function is virtual (since the override in the
@@ -2073,11 +2079,13 @@ static const TypeEntry* findTypeEntryUsingContext(const AbstractMetaClass* metaC
 // Helper for translateTypeStatic()
 TypeEntries AbstractMetaBuilderPrivate::findTypeEntries(const QString &qualifiedName,
                                                         const QString &name,
+                                                        TranslateTypeFlags flags,
                                                         AbstractMetaClass *currentClass,
                                                         AbstractMetaBuilderPrivate *d)
 {
     // 5.1 - Try first using the current scope
-    if (currentClass) {
+    if (currentClass != nullptr
+        && !flags.testFlag(AbstractMetaBuilder::NoClassScopeLookup)) {
         if (auto type = findTypeEntryUsingContext(currentClass, qualifiedName))
             return {type};
 
@@ -2278,7 +2286,7 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateTypeStatic(const TypeInfo
         typeInfo.clearInstantiations();
     }
 
-    TypeEntries types = findTypeEntries(qualifiedName, name, currentClass, d);
+    TypeEntries types = findTypeEntries(qualifiedName, name, flags, currentClass, d);
     if (!flags.testFlag(AbstractMetaBuilder::TemplateArgument)) {
         // Avoid clashes between QByteArray and enum value QMetaType::QByteArray
         // unless we are looking for template arguments.
index 8916eaf25db8a15fa1a661055e72a64b85c18347..f333ad5c89bade8aa601b48ba3f6351c8d4d4aec 100644 (file)
@@ -94,7 +94,8 @@ public:
 
     enum TranslateTypeFlag {
         DontResolveType = 0x1,
-        TemplateArgument = 0x2
+        TemplateArgument = 0x2,
+        NoClassScopeLookup = 0x4
     };
     Q_DECLARE_FLAGS(TranslateTypeFlags, TranslateTypeFlag);
 
index 84689508903572027b3d9ba89a5f1db0ce7efdb9..8ddd3692a7f574c4c700ab99a22dd41226a38744 100644 (file)
@@ -154,6 +154,7 @@ public:
                                                  TranslateTypeFlags flags = {},
                                                  QString *errorMessageIn = nullptr);
     static TypeEntries findTypeEntries(const QString &qualifiedName, const QString &name,
+                                       TranslateTypeFlags flags = {},
                                        AbstractMetaClass *currentClass = nullptr,
                                        AbstractMetaBuilderPrivate *d = nullptr);