forked from qt-creator/qt-creator
QmlJS: Add error message for Component with multiple children
Component is only allowed to have a single child element, that will be the root element of the component. If there is no child at all we create a warning. Having no child is temporarily required. Change-Id: I5c0d9d9cdf1be106b20ed4f1134a973d58126498 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -794,8 +794,10 @@ bool Check::visit(UiObjectInitializer *)
|
|||||||
UiQualifiedId *qualifiedTypeId = qualifiedTypeNameId(parent());
|
UiQualifiedId *qualifiedTypeId = qualifiedTypeNameId(parent());
|
||||||
if (qualifiedTypeId) {
|
if (qualifiedTypeId) {
|
||||||
typeName = qualifiedTypeId->name.toString();
|
typeName = qualifiedTypeId->name.toString();
|
||||||
if (typeName == "Component")
|
if (typeName == "Component") {
|
||||||
m_idStack.push(StringSet());
|
m_idStack.push(StringSet());
|
||||||
|
_componentChildCount = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_typeStack.push(typeName);
|
m_typeStack.push(typeName);
|
||||||
@@ -806,10 +808,23 @@ bool Check::visit(UiObjectInitializer *)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Check::endVisit(UiObjectInitializer *)
|
void Check::endVisit(UiObjectInitializer *uiObjectInitializer)
|
||||||
{
|
{
|
||||||
m_propertyStack.pop();
|
m_propertyStack.pop();
|
||||||
m_typeStack.pop();
|
|
||||||
|
const QString type = m_typeStack.pop();
|
||||||
|
|
||||||
|
if (type == "Component" && _componentChildCount == 0) {
|
||||||
|
SourceLocation loc;
|
||||||
|
UiObjectDefinition *objectDefinition = cast<UiObjectDefinition *>(parent());
|
||||||
|
if (objectDefinition)
|
||||||
|
loc = objectDefinition->qualifiedTypeNameId->identifierToken;
|
||||||
|
UiObjectBinding *objectBinding = cast<UiObjectBinding *>(parent());
|
||||||
|
if (objectBinding)
|
||||||
|
loc = objectBinding->qualifiedTypeNameId->identifierToken;
|
||||||
|
addMessage(WarnComponentRequiresChildren, loc);
|
||||||
|
}
|
||||||
|
|
||||||
UiObjectDefinition *objectDefinition = cast<UiObjectDefinition *>(parent());
|
UiObjectDefinition *objectDefinition = cast<UiObjectDefinition *>(parent());
|
||||||
if (objectDefinition && objectDefinition->qualifiedTypeNameId->name == QLatin1String("Component"))
|
if (objectDefinition && objectDefinition->qualifiedTypeNameId->name == QLatin1String("Component"))
|
||||||
m_idStack.pop();
|
m_idStack.pop();
|
||||||
@@ -962,6 +977,12 @@ void Check::visitQmlObject(Node *ast, UiQualifiedId *typeId,
|
|||||||
addMessage(ErrUnsupportedRootTypeInQmlUi,
|
addMessage(ErrUnsupportedRootTypeInQmlUi,
|
||||||
locationFromRange(ast->firstSourceLocation(), ast->lastSourceLocation()), typeName);
|
locationFromRange(ast->firstSourceLocation(), ast->lastSourceLocation()), typeName);
|
||||||
|
|
||||||
|
if (!m_typeStack.isEmpty() && m_typeStack.last() == "Component") {
|
||||||
|
_componentChildCount++;
|
||||||
|
if (_componentChildCount > 1)
|
||||||
|
addMessage(ErrToManyComponentChildren, typeErrorLocation);
|
||||||
|
}
|
||||||
|
|
||||||
bool typeError = false;
|
bool typeError = false;
|
||||||
if (_importsOk) {
|
if (_importsOk) {
|
||||||
const ObjectValue *prototype = _context->lookupType(_doc.data(), typeId);
|
const ObjectValue *prototype = _context->lookupType(_doc.data(), typeId);
|
||||||
|
@@ -158,6 +158,7 @@ private:
|
|||||||
|
|
||||||
bool _importsOk;
|
bool _importsOk;
|
||||||
bool _inStatementBinding;
|
bool _inStatementBinding;
|
||||||
|
int _componentChildCount = 0;
|
||||||
const Imports *_imports;
|
const Imports *_imports;
|
||||||
TranslationFunction lastTransLationfunction = noTranslationfunction;
|
TranslationFunction lastTransLationfunction = noTranslationfunction;
|
||||||
};
|
};
|
||||||
|
@@ -251,6 +251,10 @@ StaticAnalysisMessages::StaticAnalysisMessages()
|
|||||||
tr("Type cannot be instantiated recursively (%1)."), 1);
|
tr("Type cannot be instantiated recursively (%1)."), 1);
|
||||||
newMsg(WarnLogicalValueDoesNotDependOnValues, Warning,
|
newMsg(WarnLogicalValueDoesNotDependOnValues, Warning,
|
||||||
tr("Logical value does not depend on actual values"));
|
tr("Logical value does not depend on actual values"));
|
||||||
|
newMsg(ErrToManyComponentChildren, Error,
|
||||||
|
tr("Components are only allowed to have a single child element."));
|
||||||
|
newMsg(WarnComponentRequiresChildren, Warning,
|
||||||
|
tr("Components require a child element."));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
@@ -132,6 +132,8 @@ enum Type {
|
|||||||
ErrInvalidArrayValueLength = 323,
|
ErrInvalidArrayValueLength = 323,
|
||||||
ErrHitMaximumRecursion = 324,
|
ErrHitMaximumRecursion = 324,
|
||||||
WarnLogicalValueDoesNotDependOnValues = 325,
|
WarnLogicalValueDoesNotDependOnValues = 325,
|
||||||
|
ErrToManyComponentChildren = 326,
|
||||||
|
WarnComponentRequiresChildren = 327,
|
||||||
WarnDuplicateImport = 400
|
WarnDuplicateImport = 400
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user