diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index d01c4ff5ab2f7967c18ec5e1295181c746dcb374..305b16b2c25c457ba455f761b69b090a88b691f7 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -32,6 +32,9 @@ #include "cpppreprocessor.h" #include "modelmanagertesthelper.h" +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/session.h> + #include <QDebug> #include <QFileInfo> #include <QtTest> @@ -360,3 +363,53 @@ void CppToolsPlugin::test_modelmanager_snapshot_after_two_projects() foreach (const QString &file, project2.projectFiles) QVERIFY(mm->snapshot().contains(file)); } + +void CppToolsPlugin::test_modelmanager_extraeditorsupport_uiFiles() +{ + TestDataDirectory testDataDirectory(QLatin1String("testdata_guiproject1")); + const QString projectFile = testDataDirectory.file(QLatin1String("testdata_guiproject1.pro")); + + // Open project with *.ui file + ProjectExplorer::ProjectExplorerPlugin *pe = ProjectExplorer::ProjectExplorerPlugin::instance(); + QString errorOpeningProject; + Project *project = pe->openProject(projectFile, &errorOpeningProject); + QVERIFY(errorOpeningProject.isEmpty()); + project->configureAsExampleProject(QStringList()); + + // Check working copy. + // An AbstractEditorSupport object should have been added for the ui_* file. + CppModelManagerInterface *mm = CppModelManagerInterface::instance(); + CppModelManagerInterface::WorkingCopy workingCopy = mm->workingCopy(); + + QCOMPARE(workingCopy.size(), 2); // mm->configurationFileName() and "ui_*.h" + + QStringList fileNamesInWorkinCopy; + QHashIterator<QString, QPair<QString, unsigned> > it = workingCopy.iterator(); + while (it.hasNext()) { + it.next(); + fileNamesInWorkinCopy << QFileInfo(it.key()).fileName(); + } + fileNamesInWorkinCopy.sort(); + const QString expectedUiHeaderFileName = QLatin1String("ui_mainwindow.h"); + QCOMPARE(fileNamesInWorkinCopy.at(0), mm->configurationFileName()); + QCOMPARE(fileNamesInWorkinCopy.at(1), expectedUiHeaderFileName); + + // Check CppPreprocessor / includes. + // The CppPreprocessor is expected to find the ui_* file in the working copy. + const QString fileIncludingTheUiFile = testDataDirectory.file(QLatin1String("mainwindow.cpp")); + while (!mm->snapshot().document(fileIncludingTheUiFile)) + QCoreApplication::processEvents(); + + const CPlusPlus::Snapshot snapshot = mm->snapshot(); + const Document::Ptr document = snapshot.document(fileIncludingTheUiFile); + QVERIFY(document); + const QStringList includedFiles = document->includedFiles(); + QCOMPARE(includedFiles.size(), 2); + QCOMPARE(QFileInfo(includedFiles.at(0)).fileName(), QLatin1String("mainwindow.h")); + QCOMPARE(QFileInfo(includedFiles.at(1)).fileName(), QLatin1String("ui_mainwindow.h")); + + // Close Project + ProjectExplorer::SessionManager *sm = pe->session(); + sm->removeProject(project); + ModelManagerTestHelper::verifyClean(); +} diff --git a/src/plugins/cpptools/cpppreprocessor.cpp b/src/plugins/cpptools/cpppreprocessor.cpp index 825b29ce8c22e1c3aff610fca7ae35a15c0b2e56..57a3fb4a72bbdb500c845bff9d83acda96325699 100644 --- a/src/plugins/cpptools/cpppreprocessor.cpp +++ b/src/plugins/cpptools/cpppreprocessor.cpp @@ -231,7 +231,7 @@ QString CppPreprocessor::resolveFile_helper(const QString &fileName, IncludeType foreach (const QString &includePath, m_includePaths) { QString path = includePath + fileName; - if (checkFile(path)) + if (m_workingCopy.contains(path) || checkFile(path)) return path; } diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index d10c690221560663c6383bca3e00cdc985db0a54..09bea7fc3ce2eb61d7dadcdfae3c734887a1da3d 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -164,6 +164,7 @@ private slots: void test_modelmanager_refresh_1(); void test_modelmanager_refresh_2(); void test_modelmanager_snapshot_after_two_projects(); + void test_modelmanager_extraeditorsupport_uiFiles(); private: void test_completion(); diff --git a/src/plugins/cpptools/modelmanagertesthelper.h b/src/plugins/cpptools/modelmanagertesthelper.h index 8a228cac42ae21500ec6e300f34b9e740e1c25e6..b2b042c445212fb09a0f80cc6d6670e1a1b61fe6 100644 --- a/src/plugins/cpptools/modelmanagertesthelper.h +++ b/src/plugins/cpptools/modelmanagertesthelper.h @@ -79,7 +79,7 @@ public: ~ModelManagerTestHelper(); void cleanup(); - void verifyClean(); + static void verifyClean(); Project *createProject(const QString &name); diff --git a/tests/cppmodelmanager/testdata_guiproject1/main.cpp b/tests/cppmodelmanager/testdata_guiproject1/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..50ca345343b36e5fe4f49bbffb79fd434e849a36 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/main.cpp @@ -0,0 +1,13 @@ +// Copyright license + +#include "mainwindow.h" +#include <QApplication> + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/tests/cppmodelmanager/testdata_guiproject1/mainwindow.cpp b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..495189aa3b0ceeb22d1c11184b809e40f557a0b8 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.cpp @@ -0,0 +1,16 @@ +// Copyright license + +#include "mainwindow.h" +#include "ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); +} + +MainWindow::~MainWindow() +{ + delete ui; +} diff --git a/tests/cppmodelmanager/testdata_guiproject1/mainwindow.h b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.h new file mode 100644 index 0000000000000000000000000000000000000000..6dae9639b636b4e3080957ef2fd48aa6e6532ca7 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.h @@ -0,0 +1,24 @@ +// Copyright license + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QMainWindow> + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +private: + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/tests/cppmodelmanager/testdata_guiproject1/mainwindow.ui b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.ui new file mode 100644 index 0000000000000000000000000000000000000000..6050363fa71ed2da04105077f9fef06150d05ee2 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.ui @@ -0,0 +1,24 @@ +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle" > + <string>MainWindow</string> + </property> + <widget class="QMenuBar" name="menuBar" /> + <widget class="QToolBar" name="mainToolBar" /> + <widget class="QWidget" name="centralWidget" /> + <widget class="QStatusBar" name="statusBar" /> + </widget> + <layoutDefault spacing="6" margin="11" /> + <pixmapfunction></pixmapfunction> + <resources/> + <connections/> +</ui> diff --git a/tests/cppmodelmanager/testdata_guiproject1/testdata_guiproject1.pro b/tests/cppmodelmanager/testdata_guiproject1/testdata_guiproject1.pro new file mode 100644 index 0000000000000000000000000000000000000000..0fdc70ad7b41420cf36da51bd1f92dc6582df529 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/testdata_guiproject1.pro @@ -0,0 +1,9 @@ +QT += core gui +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = testdata_guiproject1 +TEMPLATE = app + +SOURCES += main.cpp mainwindow.cpp +HEADERS += mainwindow.h +FORMS += mainwindow.ui