diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-02-24 16:11:20 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-02-24 18:35:49 +0000 |
commit | 1697c7173c2b8d12aea529774beca5ef0e1616fa (patch) | |
tree | 7a0ee9e3af35b14e2139313bf8814c212ce2194f | |
parent | 2daee4615c01e6da9e0298df35999fe169323e74 (diff) |
Make error message about cyclic overload dependencies more verbose
Collect and output all implicit conversions involved.
Task-number: PYSIDE-323
Change-Id: I166cb8bd9ea157d07444772ba341195327c0061e
Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r-- | generator/shiboken2/overloaddata.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/generator/shiboken2/overloaddata.cpp b/generator/shiboken2/overloaddata.cpp index 2e757e7..203918f 100644 --- a/generator/shiboken2/overloaddata.cpp +++ b/generator/shiboken2/overloaddata.cpp @@ -152,6 +152,27 @@ static QString getImplicitConversionTypeName(const AbstractMetaType* containerTy + types.join(QLatin1String(", ")) + QLatin1String(" >"); } +static QString msgCyclicDependency(const QString &funcName, const QString &graphName, + const QList<const AbstractMetaFunction *> &involvedConversions) +{ + QString result; + QTextStream str(&result); + str << "Cyclic dependency found on overloaddata for \"" << funcName + << "\" method! The graph boy saved the graph at \"" << QDir::toNativeSeparators(graphName) + << "\"."; + if (const int count = involvedConversions.size()) { + str << " Implicit conversions (" << count << "): "; + for (int i = 0; i < count; ++i) { + if (i) + str << ", \""; + str << involvedConversions.at(i)->signature() << '"'; + if (const AbstractMetaClass *c = involvedConversions.at(i)->implementingClass()) + str << '(' << c->name() << ')'; + } + } + return result; +} + /** * Topologically sort the overloads by implicit convertion order * @@ -266,6 +287,8 @@ void OverloadData::sortNextOverloads() QStringList classesWithIntegerImplicitConversion; + QList<const AbstractMetaFunction *> involvedConversions; + foreach(OverloadData* ov, m_nextOverloadData) { const AbstractMetaType* targetType = ov->argType(); const QString targetTypeEntryName(getTypeName(ov)); @@ -291,6 +314,7 @@ void OverloadData::sortNextOverloads() // container check (This happened to QVariant and QHash) graph.removeEdge(targetTypeId, convertibleTypeId); graph.addEdge(convertibleTypeId, targetTypeId); + involvedConversions.append(function); } // Process inheritance relationships @@ -324,8 +348,10 @@ void OverloadData::sortNextOverloads() } else { foreach (const AbstractMetaFunction* function, m_generator->implicitConversions(instantiation)) { QString convertibleTypeName = getImplicitConversionTypeName(ov->argType(), instantiation, function); - if (!graph.containsEdge(targetTypeId, sortData.map[convertibleTypeName])) // Avoid cyclic dependency. + if (!graph.containsEdge(targetTypeId, sortData.map[convertibleTypeName])) { // Avoid cyclic dependency. graph.addEdge(sortData.map[convertibleTypeName], targetTypeId); + involvedConversions.append(function); + } } } } @@ -406,9 +432,7 @@ void OverloadData::sortNextOverloads() for (; it != sortData.map.end(); ++it) nodeNames.insert(it.value(), it.key()); graph.dumpDot(nodeNames, graphName); - qCWarning(lcShiboken).noquote().nospace() - << QStringLiteral("Cyclic dependency found on overloaddata for '%1' method! The graph boy saved the graph at %2.") - .arg(funcName, graphName); + qCWarning(lcShiboken).noquote() << qPrintable(msgCyclicDependency(funcName, graphName, involvedConversions)); } m_nextOverloadData.clear(); |