aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-01-16 15:45:10 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-01-17 10:07:55 +0000
commit181fa70b7ba06c92c3c0fdc4c70081b14e4b1bdf (patch)
tree3342c5f2020cf693594554b4f96bff6e8f39cf9c /sources/shiboken2
parent9d4c604943d73cb1c8f1a6dfdf9129f92bed0661 (diff)
shiboken: Fix some clazy warnings
- Mixing const/non-const iterators - Do not use operator[] on temporaries of type QVector - Remove unused nontrivial variables - Add Q_FALLTHROUGH() - Potential detach in range-based for Change-Id: I89391fdda616f119eadd7de529eb6cee69343f85 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'sources/shiboken2')
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp14
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp1
-rw-r--r--sources/shiboken2/ApiExtractor/apiextractor.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/fileout.cpp16
-rw-r--r--sources/shiboken2/ApiExtractor/graph.cpp3
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem.cpp20
-rw-r--r--sources/shiboken2/generator/generator.cpp4
-rw-r--r--sources/shiboken2/generator/shiboken2/cppgenerator.cpp18
-rw-r--r--sources/shiboken2/generator/shiboken2/headergenerator.cpp2
-rw-r--r--sources/shiboken2/generator/shiboken2/overloaddata.cpp21
12 files changed, 45 insertions, 60 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
index 79d69abf3..32036749d 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
@@ -487,7 +487,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
const QSet<NamespaceModelItem> &namespaceTypeValues = dom->uniqueNamespaces();
ReportHandler::setProgressReference(namespaceTypeValues);
- for (NamespaceModelItem item : namespaceTypeValues) {
+ for (const NamespaceModelItem &item : namespaceTypeValues) {
ReportHandler::progress(QLatin1String("Generating namespace model..."));
AbstractMetaClass *metaClass = traverseNamespace(dom, item);
if (metaClass)
@@ -1143,7 +1143,7 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte
// Register all enum values on Type database
const EnumeratorList &enumerators = enumItem->enumerators();
- for (EnumeratorModelItem e : enumItem->enumerators()) {
+ for (const EnumeratorModelItem &e : enumerators) {
QString name;
if (enclosing) {
name += enclosing->name();
@@ -1645,8 +1645,8 @@ AbstractMetaFunctionList AbstractMetaBuilderPrivate::templateClassFunctionList(c
}
}
- const AbstractMetaFunctionList::ConstIterator unchangedBegin = unchangedFunctions.begin();
- const AbstractMetaFunctionList::ConstIterator unchangedEnd = unchangedFunctions.end();
+ const AbstractMetaFunctionList::ConstIterator unchangedBegin = unchangedFunctions.cbegin();
+ const AbstractMetaFunctionList::ConstIterator unchangedEnd = unchangedFunctions.cend();
for (int i = result.size() - 1; i >= 0; --i) {
AbstractMetaFunction *function = result.at(i);
if (!unchangedFunctions.contains(function)
@@ -3034,10 +3034,8 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
QString templateParamName;
for (const QString &possibleName : qAsConst(possibleNames)) {
t = typeDb->findType(possibleName);
- if (t) {
- QString templateParamName = possibleName;
+ if (t)
break;
- }
}
if (t) {
@@ -3185,8 +3183,6 @@ void AbstractMetaBuilderPrivate::parseQ_Property(AbstractMetaClass *metaClass,
continue;
}
- QString typeName = scope + l.at(0);
-
QPropertySpec* spec = new QPropertySpec(type->typeEntry());
spec->setName(l.at(1));
spec->setIndex(i);
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
index 19e6a0f26..840466108 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
@@ -1326,7 +1326,6 @@ void AbstractMetaClass::setFunctions(const AbstractMetaFunctionList &functions)
// Functions must be sorted by name before next loop
sortFunctions();
- QString currentName;
for (AbstractMetaFunction *f : qAsConst(m_functions)) {
f->setOwnerClass(this);
diff --git a/sources/shiboken2/ApiExtractor/apiextractor.cpp b/sources/shiboken2/ApiExtractor/apiextractor.cpp
index 404e0bea6..6508d378a 100644
--- a/sources/shiboken2/ApiExtractor/apiextractor.cpp
+++ b/sources/shiboken2/ApiExtractor/apiextractor.cpp
@@ -46,7 +46,7 @@
ApiExtractor::ApiExtractor() : m_builder(0)
{
// Environment TYPESYSTEMPATH
- QString envTypesystemPaths = QFile::decodeName(getenv("TYPESYSTEMPATH"));
+ QString envTypesystemPaths = QFile::decodeName(qgetenv("TYPESYSTEMPATH"));
if (!envTypesystemPaths.isEmpty())
TypeDatabase::instance()->addTypesystemPath(envTypesystemPaths);
}
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp
index ea08ff6f9..16a7a3147 100644
--- a/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp
@@ -260,7 +260,7 @@ bool parse(const QByteArrayList &clangArgs, unsigned clangFlags, BaseVisitor &b
debug.nospace();
debug << "Errors in "
<< QDir::toNativeSeparators(QFile::decodeName(clangArgs.constLast())) << ":\n";
- for (const Diagnostic &diagnostic : diagnostics)
+ for (const Diagnostic &diagnostic : qAsConst(diagnostics))
debug << diagnostic << '\n';
}
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp
index fdc8d3312..f30a585bc 100644
--- a/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp
@@ -163,7 +163,7 @@ QVector<Diagnostic> getDiagnostics(CXTranslationUnit tu)
CXDiagnosticSeverity maxSeverity(const QVector<Diagnostic> &ds)
{
CXDiagnosticSeverity result = CXDiagnostic_Ignored;
- for (const Diagnostic d : ds) {
+ for (const Diagnostic& d : ds) {
if (d.severity > result)
result = d.severity;
}
diff --git a/sources/shiboken2/ApiExtractor/fileout.cpp b/sources/shiboken2/ApiExtractor/fileout.cpp
index c97347fe1..be0023c3c 100644
--- a/sources/shiboken2/ApiExtractor/fileout.cpp
+++ b/sources/shiboken2/ApiExtractor/fileout.cpp
@@ -39,15 +39,15 @@ bool FileOut::dummy = false;
bool FileOut::diff = false;
#ifdef Q_OS_LINUX
-const char* colorDelete = "\033[31m";
-const char* colorAdd = "\033[32m";
-const char* colorInfo = "\033[36m";
-const char* colorReset = "\033[0m";
+static const char colorDelete[] = "\033[31m";
+static const char colorAdd[] = "\033[32m";
+static const char colorInfo[] = "\033[36m";
+static const char colorReset[] = "\033[0m";
#else
-const char* colorDelete = "";
-const char* colorAdd = "";
-const char* colorInfo = "";
-const char* colorReset = "";
+static const char colorDelete[] = "";
+static const char colorAdd[] = "";
+static const char colorInfo[] = "";
+static const char colorReset[] = "";
#endif
FileOut::FileOut(QString n):
diff --git a/sources/shiboken2/ApiExtractor/graph.cpp b/sources/shiboken2/ApiExtractor/graph.cpp
index e6ee660dc..6ba4d994a 100644
--- a/sources/shiboken2/ApiExtractor/graph.cpp
+++ b/sources/shiboken2/ApiExtractor/graph.cpp
@@ -127,8 +127,7 @@ void Graph::dumpDot(const QHash< int, QString >& nodeNames, const QString& fileN
QTextStream s(&output);
s << "digraph D {\n";
for (int i = 0; i < m_d->edges.size(); ++i) {
- GraphPrivate::EdgeIterator it = m_d->edges[i].begin();
- for (;it != m_d->edges[i].end(); ++it)
+ for (auto it = m_d->edges[i].cbegin(), end = m_d->edges[i].cend(); it != end; ++it)
s << '"' << nodeNames[i] << "\" -> \"" << nodeNames[*it] << "\"\n";
}
s << "}\n";
diff --git a/sources/shiboken2/ApiExtractor/typesystem.cpp b/sources/shiboken2/ApiExtractor/typesystem.cpp
index c6f723e4d..8564da3c4 100644
--- a/sources/shiboken2/ApiExtractor/typesystem.cpp
+++ b/sources/shiboken2/ApiExtractor/typesystem.cpp
@@ -373,6 +373,7 @@ bool Handler::endElement(const QStringRef &localName)
m_current->parent->entry->setCodeSnips(snips);
break;
}
+ Q_FALLTHROUGH();
case StackElement::NativeToTarget:
case StackElement::AddConversion:
m_contextStack.top()->codeSnips.last().addTemplateInstance(m_current->value.templateInstance);
@@ -756,20 +757,20 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
break;
case StackElement::ValueTypeEntry:
attributes.insert(QLatin1String("default-constructor"), QString());
- // fall throooough
+ Q_FALLTHROUGH();
case StackElement::ObjectTypeEntry:
attributes.insert(QLatin1String("force-abstract"), QLatin1String("no"));
attributes.insert(QLatin1String("deprecated"), QLatin1String("no"));
attributes.insert(QLatin1String("hash-function"), QString());
attributes.insert(QLatin1String("stream"), QLatin1String("no"));
- // fall throooough
+ Q_FALLTHROUGH();
case StackElement::InterfaceTypeEntry:
attributes[QLatin1String("default-superclass")] = m_defaultSuperclass;
attributes.insert(QLatin1String("polymorphic-id-expression"), QString());
attributes.insert(QLatin1String("delete-in-main-thread"), QLatin1String("no"));
attributes.insert(QLatin1String("held-type"), QString());
attributes.insert(QLatin1String("copyable"), QString());
- // fall through
+ Q_FALLTHROUGH();
case StackElement::NamespaceTypeEntry:
attributes.insert(QLatin1String("target-lang-name"), QString());
attributes[QLatin1String("package")] = m_defaultPackage;
@@ -968,7 +969,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
itype->setOrigin(otype);
element->entry = otype;
}
- // fall through
+ Q_FALLTHROUGH();
case StackElement::ValueTypeEntry: {
if (!element->entry) {
ValueTypeEntry* typeEntry = new ValueTypeEntry(name, since);
@@ -978,12 +979,12 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
element->entry = typeEntry;
}
- // fall through
+ Q_FALLTHROUGH();
case StackElement::NamespaceTypeEntry:
if (!element->entry)
element->entry = new NamespaceTypeEntry(name, since);
- // fall through
+ Q_FALLTHROUGH();
case StackElement::ObjectTypeEntry:
if (!element->entry)
element->entry = new ObjectTypeEntry(name, since);
@@ -1334,13 +1335,12 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
}
break;
- case StackElement::RejectEnumValue: {
+ case StackElement::RejectEnumValue:
if (!m_currentEnum) {
m_error = QLatin1String("<reject-enum-value> node must be used inside a <enum-type> node");
return false;
}
- QString name = attributes[nameAttribute()];
- } break;
+ break;
case StackElement::ReplaceType: {
if (topElement.type != StackElement::ModifyArgument) {
m_error = QLatin1String("Type replacement can only be specified for argument modifications");
@@ -2495,7 +2495,7 @@ AddedFunction::AddedFunction(QString signature, QString returnType, double vr) :
break;
}
// is const?
- m_isConst = signature.right(signatureLength - endPos).contains(QLatin1String("const"));
+ m_isConst = signature.rightRef(signatureLength - endPos).contains(QLatin1String("const"));
}
}
diff --git a/sources/shiboken2/generator/generator.cpp b/sources/shiboken2/generator/generator.cpp
index a8e8735bb..71647a1c5 100644
--- a/sources/shiboken2/generator/generator.cpp
+++ b/sources/shiboken2/generator/generator.cpp
@@ -127,7 +127,7 @@ void Generator::addInstantiatedContainersAndSmartPointers(const AbstractMetaType
QString piece = isContainer ? QStringLiteral("container") : QStringLiteral("smart pointer");
QString warning =
QString::fromLatin1("Skipping instantiation of %1 '%2' because it has template"
- " arguments.").arg(piece).arg(type->originalTypeDescription());
+ " arguments.").arg(piece, type->originalTypeDescription());
if (!context.isEmpty())
warning.append(QStringLiteral(" Calling context: %1").arg(context));
@@ -443,7 +443,7 @@ QTextStream& formatCode(QTextStream &s, const QString& code, Indentor &indentor)
for (QString line : lst) {
if (!line.isEmpty() && !emptyLine.match(line).hasMatch()) {
- while (line.end()->isSpace())
+ while (line.constEnd()->isSpace())
line.chop(1);
int limit = 0;
for(int i = 0; i < spacesToRemove; ++i) {
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
index e9d801044..11e5625b8 100644
--- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
@@ -701,7 +701,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
qCWarning(lcShiboken) << "The expression used in return value contains an invalid index.";
break;
}
- defaultReturnExpr.replace(match.captured(0), func->arguments()[argId]->name());
+ defaultReturnExpr.replace(match.captured(0), func->arguments().at(argId)->name());
offset = match.capturedStart(1);
}
}
@@ -1046,7 +1046,6 @@ void CppGenerator::writeEnumConverterFunctions(QTextStream& s, const TypeEntry*
{
if (!enumType)
return;
- QString enumFlagName = enumType->isFlags() ? QLatin1String("flag") : QLatin1String("enum");
QString typeName = fixedCppTypeName(enumType);
QString enumPythonType = cpythonTypeNameExt(enumType);
QString cppTypeName = getFullTypeName(enumType).trimmed();
@@ -3872,11 +3871,7 @@ void CppGenerator::writeMappingMethods(QTextStream &s,
const AbstractMetaClass *metaClass,
GeneratorContext &context)
{
-
- QMap<QString, QString> funcs;
-
- QHash< QString, QPair< QString, QString > >::const_iterator it = m_mappingProtocol.begin();
- for (; it != m_mappingProtocol.end(); ++it) {
+ for (auto it = m_mappingProtocol.cbegin(), end = m_mappingProtocol.cend(); it != end; ++it) {
const AbstractMetaFunction* func = metaClass->findFunction(it.key());
if (!func)
continue;
@@ -3900,12 +3895,9 @@ void CppGenerator::writeSequenceMethods(QTextStream &s,
const AbstractMetaClass *metaClass,
GeneratorContext &context)
{
-
- QMap<QString, QString> funcs;
bool injectedCode = false;
- QHash< QString, QPair< QString, QString > >::const_iterator it = m_sequenceProtocol.begin();
- for (; it != m_sequenceProtocol.end(); ++it) {
+ for (auto it = m_sequenceProtocol.cbegin(), end = m_sequenceProtocol.cend(); it != end; ++it) {
const AbstractMetaFunction* func = metaClass->findFunction(it.key());
if (!func)
continue;
@@ -3984,7 +3976,7 @@ void CppGenerator::writeTypeAsMappingDefinition(QTextStream& s, const AbstractMe
QString baseName = cpythonBaseName(metaClass);
s << INDENT << "memset(&" << baseName << "_TypeAsMapping, 0, sizeof(PyMappingMethods));" << endl;
- for (QHash<QString, QString>::const_iterator it = m_mpFuncs.cbegin(), end = m_mpFuncs.end(); it != end; ++it) {
+ for (auto it = m_mpFuncs.cbegin(), end = m_mpFuncs.cend(); it != end; ++it) {
const QString &mpName = it.key();
if (funcs[mpName].isEmpty())
continue;
@@ -4279,7 +4271,7 @@ void CppGenerator::writeRichCompareFunction(QTextStream &s, GeneratorContext &co
int alternativeNumericTypes = 0;
for (const AbstractMetaFunction *func : overloads) {
if (!func->isStatic() &&
- ShibokenGenerator::isNumber(func->arguments()[0]->type()->typeEntry()))
+ ShibokenGenerator::isNumber(func->arguments().at(0)->type()->typeEntry()))
alternativeNumericTypes++;
}
diff --git a/sources/shiboken2/generator/shiboken2/headergenerator.cpp b/sources/shiboken2/generator/shiboken2/headergenerator.cpp
index 0c3cf93f6..f6bd2cd7e 100644
--- a/sources/shiboken2/generator/shiboken2/headergenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/headergenerator.cpp
@@ -417,7 +417,7 @@ bool HeaderGenerator::finishGeneration()
// TODO-CONVERTER ------------------------------------------------------------------------------
macrosStream << "// Macros for type check" << endl;
- for (const AbstractMetaEnum *cppEnum : globalEnums) {
+ for (const AbstractMetaEnum *cppEnum : qAsConst(globalEnums)) {
if (cppEnum->isAnonymous() || cppEnum->isPrivate())
continue;
includes << cppEnum->typeEntry()->include();
diff --git a/sources/shiboken2/generator/shiboken2/overloaddata.cpp b/sources/shiboken2/generator/shiboken2/overloaddata.cpp
index 876185cbe..8fd16f83c 100644
--- a/sources/shiboken2/generator/shiboken2/overloaddata.cpp
+++ b/sources/shiboken2/generator/shiboken2/overloaddata.cpp
@@ -94,7 +94,7 @@ static bool typesAreEqual(const AbstractMetaType* typeA, const AbstractMetaType*
*/
struct OverloadSortData
{
- OverloadSortData() : counter(0) {};
+ OverloadSortData() : counter(0) {}
/**
* Adds a typeName into the type map without associating it with
@@ -211,7 +211,7 @@ void OverloadData::sortNextOverloads()
<< QLatin1String("long");
// sort the children overloads
- for (OverloadData *ov : m_nextOverloadData)
+ for (OverloadData *ov : qAsConst(m_nextOverloadData))
ov->sortNextOverloads();
if (m_nextOverloadData.size() <= 1)
@@ -220,7 +220,7 @@ void OverloadData::sortNextOverloads()
// Populates the OverloadSortData object containing map and reverseMap, to map type names to ids,
// these ids will be used by the topological sort algorithm, because is easier and faster to work
// with graph sorting using integers.
- for (OverloadData *ov : m_nextOverloadData) {
+ for (OverloadData *ov : qAsConst(m_nextOverloadData)) {
sortData.mapType(ov);
const QString typeName(getTypeName(ov));
@@ -293,7 +293,7 @@ void OverloadData::sortNextOverloads()
MetaFunctionList involvedConversions;
- for (OverloadData *ov : m_nextOverloadData) {
+ for (OverloadData *ov : qAsConst(m_nextOverloadData)) {
const AbstractMetaType* targetType = ov->argType();
const QString targetTypeEntryName(getTypeName(ov));
int targetTypeId = sortData.map[targetTypeEntryName];
@@ -404,7 +404,7 @@ void OverloadData::sortNextOverloads()
if (sortData.map.contains(QLatin1String("QString")) && sortData.map.contains(QLatin1String("QByteArray")))
graph.addEdge(sortData.map[QLatin1String("QString")], sortData.map[QLatin1String("QByteArray")]);
- for (OverloadData *ov : m_nextOverloadData) {
+ for (OverloadData *ov : qAsConst(m_nextOverloadData)) {
const AbstractMetaType* targetType = ov->argType();
if (!targetType->isEnum())
continue;
@@ -435,9 +435,8 @@ void OverloadData::sortNextOverloads()
// Dump overload graph
QString graphName = QDir::tempPath() + QLatin1Char('/') + funcName + QLatin1String(".dot");
- QHash<QString, int>::const_iterator it = sortData.map.begin();
QHash<int, QString> nodeNames;
- for (; it != sortData.map.end(); ++it)
+ for (auto it = sortData.map.cbegin(), end = sortData.map.cend(); it != end; ++it)
nodeNames.insert(it.value(), it.key());
graph.dumpDot(nodeNames, graphName);
qCWarning(lcShiboken).noquote() << qPrintable(msgCyclicDependency(funcName, graphName, involvedConversions));
@@ -521,7 +520,7 @@ void OverloadData::addOverload(const AbstractMetaFunction* func)
for (int i = 0; m_headOverloadData->m_minArgs > 0 && i < origNumArgs; i++) {
if (func->argumentRemoved(i + 1))
continue;
- if (!ShibokenGenerator::getDefaultValue(func, func->arguments()[i]).isEmpty()) {
+ if (!ShibokenGenerator::getDefaultValue(func, func->arguments().at(i)).isEmpty()) {
int fixedArgIndex = i - removed;
if (fixedArgIndex < m_headOverloadData->m_minArgs)
m_headOverloadData->m_minArgs = fixedArgIndex;
@@ -670,7 +669,7 @@ const AbstractMetaArgument* OverloadData::argument(const AbstractMetaFunction* f
argPos++;
}
- return func->arguments()[m_argPos + removed];
+ return func->arguments().at(m_argPos + removed);
}
OverloadDataList OverloadData::overloadDataOnPosition(OverloadData* overloadData, int argPos) const
@@ -755,7 +754,7 @@ const AbstractMetaFunction* OverloadData::getFunctionWithDefaultValue() const
if (func->argumentRemoved(i + 1))
removedArgs++;
}
- if (!ShibokenGenerator::getDefaultValue(func, func->arguments()[m_argPos + removedArgs]).isEmpty())
+ if (!ShibokenGenerator::getDefaultValue(func, func->arguments().at(m_argPos + removedArgs)).isEmpty())
return func;
}
return 0;
@@ -822,7 +821,7 @@ QPair<int, int> OverloadData::getMinMaxArguments(const AbstractMetaFunctionList&
if (func->argumentRemoved(j + 1))
continue;
int fixedArgIndex = j - removed;
- if (fixedArgIndex < minArgs && !ShibokenGenerator::getDefaultValue(func, func->arguments()[j]).isEmpty())
+ if (fixedArgIndex < minArgs && !ShibokenGenerator::getDefaultValue(func, func->arguments().at(j)).isEmpty())
minArgs = fixedArgIndex;
}
}