diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/configure.cmake | 2 | ||||
-rw-r--r-- | src/tools/moc/generator.cpp | 46 | ||||
-rw-r--r-- | src/tools/moc/generator.h | 2 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 11 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 4 |
5 files changed, 41 insertions, 24 deletions
diff --git a/src/tools/configure.cmake b/src/tools/configure.cmake index 7ab1509a89f..6a9c1b8e3f3 100644 --- a/src/tools/configure.cmake +++ b/src/tools/configure.cmake @@ -2,7 +2,7 @@ # SPDX-License-Identifier: BSD-3-Clause if(LINUX OR QT_FIND_ALL_PACKAGES_ALWAYS) - qt_find_package(WaylandScanner PROVIDED_TARGETS Wayland::Scanner) + qt_find_package(WaylandScanner MODULE PROVIDED_TARGETS Wayland::Scanner) endif() qt_feature("androiddeployqt" PRIVATE diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index b60b65d5fb5..aba7ab0d257 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -628,11 +628,11 @@ void Generator::addFunctions(const QList<FunctionDef> &list, const char *functyp if (f.isConstructor) fprintf(out, "Constructor("); else - fprintf(out, "%s(", f.type.name.constData()); // return type + fprintf(out, "%s(", disambiguatedTypeName(f.type.name).constData()); // return type const char *comma = ""; for (const auto &argument : f.arguments) { - fprintf(out, "%s%s", comma, argument.type.name.constData()); + fprintf(out, "%s%s", comma, disambiguatedTypeName(argument.type.name).constData()); comma = ", "; } @@ -725,7 +725,7 @@ void Generator::addProperties() for (const PropertyDef &p : std::as_const(cdef->propertyList)) { fprintf(out, " // property '%s'\n" " QtMocHelpers::PropertyData<%s%s>(%d, ", - p.name.constData(), cxxTypeTag(p.typeTag), p.type.constData(), stridx(p.name)); + p.name.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), stridx(p.name)); generateTypeInfo(p.type); fputc(',', out); @@ -810,7 +810,7 @@ void Generator::addEnums() fprintf(out, " // %s '%s'\n" " QtMocHelpers::EnumData<%s>(%d, %d,", e.flags & EnumIsFlag ? "flag" : "enum", e.name.constData(), - e.name.constData(), stridx(e.name), stridx(typeName)); + disambiguatedTypeName(e.name).constData(), stridx(e.name), stridx(typeName)); if (e.flags) { const char *separator = ""; @@ -959,7 +959,7 @@ void Generator::generateStaticMetacall() if (it != begin) fprintf(out, ","); fprintf(out, "(*reinterpret_cast<%s>(_a[%d]))", - a.typeNameForCast.constData(), offset++); + disambiguatedTypeNameForCast(a.normalizedType).constData(), offset++); } }; @@ -1006,7 +1006,7 @@ void Generator::generateStaticMetacall() Q_ASSERT(!f.normalizedType.isEmpty()); fprintf(out, " case %d: ", methodindex); if (f.normalizedType != "void") - fprintf(out, "{ %s _r = ", noRef(f.normalizedType).constData()); + fprintf(out, "{ %s _r = ", disambiguatedTypeName(noRef(f.normalizedType)).constData()); fprintf(out, "_t->"); if (f.inPrivateClass.size()) fprintf(out, "%s->", f.inPrivateClass.constData()); @@ -1023,7 +1023,7 @@ void Generator::generateStaticMetacall() const ArgumentDef &a = *it; if (it != begin) fprintf(out, ","); - fprintf(out, "(*reinterpret_cast< %s>(_a[%d]))",a.typeNameForCast.constData(), offset++); + fprintf(out, "(*reinterpret_cast<%s>(_a[%d]))", disambiguatedTypeNameForCast(a.normalizedType).constData(), offset++); usedArgs |= UsedA; } if (f.isPrivateSignal) { @@ -1034,8 +1034,8 @@ void Generator::generateStaticMetacall() } fprintf(out, ");"); if (f.normalizedType != "void") { - fprintf(out, "\n if (_a[0]) *reinterpret_cast< %s*>(_a[0]) = std::move(_r); } ", - noRef(f.normalizedType).constData()); + fprintf(out, "\n if (_a[0]) *reinterpret_cast<%s*>(_a[0]) = std::move(_r); } ", + disambiguatedTypeName(noRef(f.normalizedType)).constData()); usedArgs |= UsedA; } fprintf(out, " break;\n"); @@ -1169,19 +1169,19 @@ void Generator::generateStaticMetacall() #if QT_VERSION <= QT_VERSION_CHECK(7, 0, 0) else if (auto eflags = cdef->enumDeclarations.value(p.type); eflags & EnumIsFlag) fprintf(out, " case %d: QtMocHelpers::assignFlags<%s>(_v, %s%s()); break;\n", - propindex, p.type.constData(), prefix.constData(), p.read.constData()); + propindex, disambiguatedTypeName(p.type).constData(), prefix.constData(), p.read.constData()); #endif else if (p.read == "default") fprintf(out, " case %d: *reinterpret_cast<%s%s*>(_v) = %s%s().value(); break;\n", - propindex, cxxTypeTag(p.typeTag), p.type.constData(), + propindex, cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), prefix.constData(), p.bind.constData()); else if (!p.read.isEmpty()) fprintf(out, " case %d: *reinterpret_cast<%s%s*>(_v) = %s%s(); break;\n", - propindex, cxxTypeTag(p.typeTag), p.type.constData(), + propindex, cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), prefix.constData(), p.read.constData()); else fprintf(out, " case %d: *reinterpret_cast<%s%s*>(_v) = %s%s; break;\n", - propindex, cxxTypeTag(p.typeTag), p.type.constData(), + propindex, cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData(), prefix.constData(), p.member.constData()); } fprintf(out, " default: break;\n"); @@ -1206,21 +1206,21 @@ void Generator::generateStaticMetacall() if (p.write == "default") { fprintf(out, " case %d: {\n", propindex); fprintf(out, " %s%s().setValue(*reinterpret_cast<%s%s*>(_v));\n", - prefix.constData(), p.bind.constData(), cxxTypeTag(p.typeTag), p.type.constData()); + prefix.constData(), p.bind.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); fprintf(out, " break;\n"); fprintf(out, " }\n"); } else if (!p.write.isEmpty()) { fprintf(out, " case %d: %s%s(*reinterpret_cast<%s%s*>(_v)); break;\n", propindex, prefix.constData(), p.write.constData(), - cxxTypeTag(p.typeTag), p.type.constData()); + cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); } else { fprintf(out, " case %d:", propindex); if (p.notify.isEmpty()) { fprintf(out, " QtMocHelpers::setProperty(%s%s, *reinterpret_cast<%s%s*>(_v)); break;\n", - prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), p.type.constData()); + prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); } else { fprintf(out, "\n if (QtMocHelpers::setProperty(%s%s, *reinterpret_cast<%s%s*>(_v)))\n", - prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), p.type.constData()); + prefix.constData(), p.member.constData(), cxxTypeTag(p.typeTag), disambiguatedTypeName(p.type).constData()); fprintf(out, " Q_EMIT _t->%s(", p.notify.constData()); if (p.notifyId > -1) { const FunctionDef &f = cdef->signalList.at(p.notifyId); @@ -1483,6 +1483,18 @@ void Generator::generatePluginMetaData() fputs("\n", out); } +QByteArray Generator::disambiguatedTypeName(const QByteArray &name) +{ + if (cdef->allEnumNames.contains(name)) + return "enum " + name; + return name; +} + +QByteArray Generator::disambiguatedTypeNameForCast(const QByteArray &name) +{ + return QByteArray("std::add_pointer_t<"+ disambiguatedTypeName(name) +">"); +} + QT_WARNING_DISABLE_GCC("-Wunused-function") QT_WARNING_DISABLE_CLANG("-Wunused-function") QT_WARNING_DISABLE_CLANG("-Wundefined-internal") diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index 0ee2ad23919..a9d65764a2b 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -40,6 +40,8 @@ private: void generateStaticMetacall(); void generateSignal(const FunctionDef *def, int index); void generatePluginMetaData(); + QByteArray disambiguatedTypeName(const QByteArray &name); + QByteArray disambiguatedTypeNameForCast(const QByteArray &name); QMultiMap<QByteArray, int> automaticPropertyMetaTypesHelper(); QMap<int, QMultiMap<QByteArray, int>> methodsWithAutomaticTypesHelper(const QList<FunctionDef> &methodList); diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index da0096ebfe1..14280712154 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -243,7 +243,7 @@ enum class IncludeState { NoInclude, }; -bool Moc::parseEnum(EnumDef *def) +bool Moc::parseEnum(EnumDef *def, ClassDef *containingClass) { bool isTypdefEnum = false; // typedef enum { ... } Foo; @@ -252,6 +252,8 @@ bool Moc::parseEnum(EnumDef *def) if (test(IDENTIFIER)) { def->name = lexem(); + if (containingClass) + containingClass->allEnumNames.insert(def->name); } else { if (lookup(-1) != TYPEDEF) return false; // anonymous enum @@ -294,6 +296,8 @@ bool Moc::parseEnum(EnumDef *def) if (!test(IDENTIFIER)) return false; def->name = lexem(); + // used as the name for our enum, but we don't track it, + // because we only care about types that might conflict with members } return true; } @@ -316,7 +320,6 @@ void Moc::parseFunctionArguments(FunctionDef *def) arg.rightType += lexem(); } arg.normalizedType = normalizeType(QByteArray(arg.type.name + ' ' + arg.rightType)); - arg.typeNameForCast = QByteArray("std::add_pointer_t<"+arg.normalizedType+">"); if (test(EQ)) arg.isDefault = true; def->arguments += arg; @@ -772,7 +775,7 @@ void Moc::parse() break; case ENUM: { EnumDef enumDef; - if (parseEnum(&enumDef)) + if (parseEnum(&enumDef, nullptr)) def.enumList += enumDef; } break; case CLASS: @@ -979,7 +982,7 @@ void Moc::parse() break; case ENUM: { EnumDef enumDef; - if (parseEnum(&enumDef)) + if (parseEnum(&enumDef, &def)) def.enumList += enumDef; } break; case SEMIC: diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 6ee48b83df1..f08edb3f0d2 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -66,7 +66,6 @@ struct ArgumentDef ArgumentDef() : isDefault(false) {} Type type; QByteArray rightType, normalizedType, name; - QByteArray typeNameForCast; // type name to be used in cast from void * in metacall bool isDefault; QJsonObject toJson() const; @@ -198,6 +197,7 @@ struct ClassDef : BaseDef { QList<FunctionDef> signalList, slotList, methodList, publicList; QList<QByteArray> nonClassSignalList; QList<PropertyDef> propertyList; + QSet<QByteArray> allEnumNames; int revisionedMethods = 0; bool hasQObject = false; @@ -260,7 +260,7 @@ public: Type parseType(); - bool parseEnum(EnumDef *def); + bool parseEnum(EnumDef *def, ClassDef *containingClass); bool parseFunction(FunctionDef *def, bool inMacro = false); bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def); |