diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index eda9ecc06fb..8115b52577d 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -69,6 +69,10 @@ ModelManagerSupportClang::ModelManagerSupportClang() this, &ModelManagerSupportClang::onEditorOpened); CppTools::CppModelManager *modelManager = cppModelManager(); + connect(modelManager, &CppTools::CppModelManager::abstractEditorSupportContentsUpdated, + this, &ModelManagerSupportClang::onAbstractEditorSupportContentsUpdated); + connect(modelManager, &CppTools::CppModelManager::abstractEditorSupportRemoved, + this, &ModelManagerSupportClang::onAbstractEditorSupportRemoved); connect(modelManager, &CppTools::CppModelManager::projectPartsUpdated, this, &ModelManagerSupportClang::onProjectPartsUpdated); connect(modelManager, &CppTools::CppModelManager::projectPartsRemoved, diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp index 58de8258508..2ddcf8bcb99 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp @@ -615,6 +615,49 @@ bool hasSnippet(ProposalModel model, const QByteArray &text) return false; } +class MonitorGeneratedUiFile : public QObject +{ + Q_OBJECT + +public: + MonitorGeneratedUiFile(); + bool waitUntilGenerated(int timeout = 10000) const; + +private: + void onUiFileGenerated() { m_isGenerated = true; } + + bool m_isGenerated = false; +}; + +MonitorGeneratedUiFile::MonitorGeneratedUiFile() +{ + connect(CppTools::CppModelManager::instance(), + &CppTools::CppModelManager::abstractEditorSupportContentsUpdated, + this, &MonitorGeneratedUiFile::onUiFileGenerated); +} + +bool MonitorGeneratedUiFile::waitUntilGenerated(int timeout) const +{ + if (m_isGenerated) + return true; + + QTime time; + time.start(); + + forever { + if (m_isGenerated) + return true; + + if (time.elapsed() > timeout) + return false; + + QCoreApplication::processEvents(); + QThread::msleep(20); + } + + return false; +} + } // anonymous namespace namespace ClangCodeModel { @@ -883,6 +926,8 @@ void ClangCodeCompletionTest::testUnsavedFilesTrackingByCompletingUiObject() CppTools::Tests::TemporaryCopiedDir testDir(qrcPath("qt-widgets-app")); QVERIFY(testDir.isValid()); + MonitorGeneratedUiFile monitorGeneratedUiFile; + // Open project const QString projectFilePath = testDir.absolutePath("qt-widgets-app.pro"); CppTools::Tests::ProjectOpenerAndCloser projectManager; @@ -897,11 +942,11 @@ void ClangCodeCompletionTest::testUnsavedFilesTrackingByCompletingUiObject() QVERIFY(openSource.succeeded()); // ...and check comletions + QVERIFY(monitorGeneratedUiFile.waitUntilGenerated()); ProposalModel proposal = completionResults(openSource.editor()); QVERIFY(hasItem(proposal, "menuBar")); QVERIFY(hasItem(proposal, "statusBar")); QVERIFY(hasItem(proposal, "centralWidget")); - QEXPECT_FAIL("", "Signals are not yet done", Abort); QVERIFY(hasItem(proposal, "setupUi")); } @@ -921,6 +966,7 @@ void ClangCodeCompletionTest::testUpdateBackendAfterRestart() // ... and modify it, so we have an unsaved file. insertTextAtTopOfEditor(openHeader.editor(), "int someGlobal;\n"); // Open project ... + MonitorGeneratedUiFile monitorGeneratedUiFile; const QString projectFilePath = testDir.absolutePath("qt-widgets-app.pro"); CppTools::Tests::ProjectOpenerAndCloser projectManager; const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true); @@ -931,6 +977,7 @@ void ClangCodeCompletionTest::testUpdateBackendAfterRestart() QVERIFY(testDocument.isCreatedAndHasValidCursorPosition()); OpenEditorAtCursorPosition openSource(testDocument); QVERIFY(openSource.succeeded()); + QVERIFY(monitorGeneratedUiFile.waitUntilGenerated()); // Check commands that would have been sent QVERIFY(compare(LogOutput(spy.senderLog), @@ -939,6 +986,8 @@ void ClangCodeCompletionTest::testUpdateBackendAfterRestart() " ProjectPartContainer id: qt-widgets-app.pro\n" "RegisterTranslationUnitForCodeCompletionCommand\n" " Path: myheader.h ProjectPart: \n" + "RegisterTranslationUnitForCodeCompletionCommand\n" + " Path: ui_mainwindow.h ProjectPart: \n" ))); spy.senderLog.clear(); @@ -966,3 +1015,5 @@ void ClangCodeCompletionTest::testUpdateBackendAfterRestart() } // namespace Tests } // namespace Internal } // namespace ClangCodeModel + +#include "clangcodecompletion_test.moc"