From c264c0d2137d15ec3746ed0f3bd80f225671b4a6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 1 Jul 2013 10:25:03 +0200 Subject: [PATCH] C++: Fix resolving ui_* files in CppPreprocessor The working copy contains the artificial ui_* files and therefore we have to consider it while resolving include files. Task-number: QTCREATORBUG-9683 Change-Id: Icb3387b4cd885b3652bae3f1da465d3e0f633332 Reviewed-by: Christian Stenger Reviewed-by: Eike Ziller Reviewed-by: Daniel Teske Reviewed-by: Robert Loehning Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppmodelmanager_test.cpp | 53 +++++++++++++++++++ src/plugins/cpptools/cpppreprocessor.cpp | 2 +- src/plugins/cpptools/cpptoolsplugin.h | 1 + src/plugins/cpptools/modelmanagertesthelper.h | 2 +- .../testdata_guiproject1/main.cpp | 13 +++++ .../testdata_guiproject1/mainwindow.cpp | 16 ++++++ .../testdata_guiproject1/mainwindow.h | 24 +++++++++ .../testdata_guiproject1/mainwindow.ui | 24 +++++++++ .../testdata_guiproject1.pro | 9 ++++ 9 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 tests/cppmodelmanager/testdata_guiproject1/main.cpp create mode 100644 tests/cppmodelmanager/testdata_guiproject1/mainwindow.cpp create mode 100644 tests/cppmodelmanager/testdata_guiproject1/mainwindow.h create mode 100644 tests/cppmodelmanager/testdata_guiproject1/mainwindow.ui create mode 100644 tests/cppmodelmanager/testdata_guiproject1/testdata_guiproject1.pro diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index d01c4ff5ab2..305b16b2c25 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 +#include + #include #include #include @@ -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 > 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 825b29ce8c2..57a3fb4a72b 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 d10c6902215..09bea7fc3ce 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 8a228cac42a..b2b042c4452 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 00000000000..50ca345343b --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/main.cpp @@ -0,0 +1,13 @@ +// Copyright license + +#include "mainwindow.h" +#include + +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 00000000000..495189aa3b0 --- /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 00000000000..6dae9639b63 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.h @@ -0,0 +1,24 @@ +// Copyright license + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include + +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 00000000000..6050363fa71 --- /dev/null +++ b/tests/cppmodelmanager/testdata_guiproject1/mainwindow.ui @@ -0,0 +1,24 @@ + + MainWindow + + + + 0 + 0 + 400 + 300 + + + + MainWindow + + + + + + + + + + + diff --git a/tests/cppmodelmanager/testdata_guiproject1/testdata_guiproject1.pro b/tests/cppmodelmanager/testdata_guiproject1/testdata_guiproject1.pro new file mode 100644 index 00000000000..0fdc70ad7b4 --- /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