diff --git a/doc/src/editors/creator-code-syntax.qdoc b/doc/src/editors/creator-code-syntax.qdoc index bbd9d1442fc..cf2d272a6cb 100644 --- a/doc/src/editors/creator-code-syntax.qdoc +++ b/doc/src/editors/creator-code-syntax.qdoc @@ -669,6 +669,11 @@ \l{http://linterrors.com/js/the-array-literal-notation-is-preferrable} {The array literal notation [] is preferable}. + \row + \li M400 + \li Warning + \li Duplicate import + \endtable \section1 Resetting the Code Model diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index c7d18698c97..292f063b2b4 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -764,6 +764,26 @@ bool Check::visit(UiProgram *) return true; } +bool Check::visit(UiImport *ast) +{ + ShortImportInfo info; + if (auto ver = ast->version) + info.second = LanguageUtils::ComponentVersion(ver->majorVersion, ver->minorVersion); + + if (!ast->fileName.isNull()) // it must be a file import + info.first = ast->fileName.toString(); + else // no file import - construct full uri + info.first = toString(ast->importUri); + + if (m_importInfo.contains(info)) { + SourceLocation location = ast->firstSourceLocation(); + location.length = ast->lastSourceLocation().end(); + addMessage(WarnDuplicateImport, location, info.first); + } + m_importInfo.append(info); + return true; +} + bool Check::visit(UiObjectInitializer *) { QString typeName; diff --git a/src/libs/qmljs/qmljscheck.h b/src/libs/qmljs/qmljscheck.h index f42de04a55c..e2bb303bcc1 100644 --- a/src/libs/qmljs/qmljscheck.h +++ b/src/libs/qmljs/qmljscheck.h @@ -65,6 +65,7 @@ protected: void postVisit(AST::Node *ast) override; bool visit(AST::UiProgram *ast) override; + bool visit(AST::UiImport *ast) override; bool visit(AST::UiObjectDefinition *ast) override; bool visit(AST::UiObjectBinding *ast) override; bool visit(AST::UiScriptBinding *ast) override; @@ -136,6 +137,9 @@ private: QStack m_propertyStack; QStack m_typeStack; + using ShortImportInfo = QPair; + QList m_importInfo; + class MessageTypeAndSuppression { public: diff --git a/src/libs/qmljs/qmljsstaticanalysismessage.cpp b/src/libs/qmljs/qmljsstaticanalysismessage.cpp index a9677bb373f..1d0e165935c 100644 --- a/src/libs/qmljs/qmljsstaticanalysismessage.cpp +++ b/src/libs/qmljs/qmljsstaticanalysismessage.cpp @@ -240,6 +240,8 @@ StaticAnalysisMessages::StaticAnalysisMessages() tr("Referencing the parent of the root item is not supported in a Qt Quick UI form.")); newMsg(StateCannotHaveChildItem, Error, tr("A State cannot have a child item (%1)."), 1); + newMsg(WarnDuplicateImport, Warning, + tr("Duplicate import (%1)."), 1); } } // anonymous namespace diff --git a/src/libs/qmljs/qmljsstaticanalysismessage.h b/src/libs/qmljs/qmljsstaticanalysismessage.h index c66a30946b7..d0f349fef93 100644 --- a/src/libs/qmljs/qmljsstaticanalysismessage.h +++ b/src/libs/qmljs/qmljsstaticanalysismessage.h @@ -43,7 +43,7 @@ enum Type { // Changing the numbers can break user code. // When adding a new check, also add it to the documentation, currently - // in creator-editors.qdoc. + // in creator-code-syntax.qdoc. UnknownType = 0, ErrInvalidEnumValue = 1, ErrEnumValueMustBeStringOrNumber = 2, @@ -128,7 +128,8 @@ enum Type ErrInvalidStringValuePattern = 320, ErrLongerStringValueExpected = 321, ErrShorterStringValueExpected = 322, - ErrInvalidArrayValueLength = 323 + ErrInvalidArrayValueLength = 323, + WarnDuplicateImport = 400 }; class QMLJS_EXPORT PrototypeMessageData {