diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index 7069262dd18..3805f157d22 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -74,6 +74,12 @@ public: return testDataDir(QLatin1String("sources")) + fileName; } + /// File from the test data directory (top leve) + QString file(const QString &fileName) const + { + return testDataDir(QString()) + fileName; + } + private: QString testDataDir(const QString& subdir, bool cleaned = true) const { @@ -166,7 +172,7 @@ void CppToolsPlugin::test_modelmanager_framework_headers() } /// QTCREATORBUG-9056 -void CppToolsPlugin::test_modelmanager_refresh() +void CppToolsPlugin::test_modelmanager_refresh_1() { ModelManagerTestHelper helper; CppModelManager *mm = CppModelManager::instance(); @@ -178,7 +184,7 @@ void CppToolsPlugin::test_modelmanager_refresh() const QString testHeader(testDataDir.fileFromSourcesDir( QLatin1String("test_modelmanager_refresh.h"))); - Project *project = helper.createProject(QLatin1String("test_modelmanager_refresh")); + Project *project = helper.createProject(QLatin1String("test_modelmanager_refresh_1")); ProjectInfo pi = mm->projectInfo(project); QCOMPARE(pi.project().data(), project); @@ -216,3 +222,59 @@ void CppToolsPlugin::test_modelmanager_refresh() QVERIFY(snapshot.contains(testHeader)); QVERIFY(snapshot.contains(testCpp)); } + +/// QTCREATORBUG-9205 +void CppToolsPlugin::test_modelmanager_refresh_2() +{ + ModelManagerTestHelper helper; + CppModelManager *mm = CppModelManager::instance(); + + const TestDataDirectory testDataDir(QLatin1String("testdata_refresh")); + + const QString testHeader1(testDataDir.file(QLatin1String("defines.h"))); + const QString testHeader2(testDataDir.file(QLatin1String("header.h"))); + const QString testCpp(testDataDir.file(QLatin1String("source.cpp"))); + + Project *project = helper.createProject(QLatin1String("test_modelmanager_refresh_2")); + ProjectInfo pi = mm->projectInfo(project); + QCOMPARE(pi.project().data(), project); + + ProjectPart::Ptr part(new ProjectPart); + pi.appendProjectPart(part); + part->cxxVersion = ProjectPart::CXX98; + part->qtVersion = ProjectPart::Qt5; + part->files.append(ProjectFile(testHeader1, ProjectFile::CXXHeader)); + part->files.append(ProjectFile(testHeader2, ProjectFile::CXXHeader)); + part->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); + + mm->updateProjectInfo(pi); + + CPlusPlus::Snapshot snapshot; + QStringList refreshedFiles; + CPlusPlus::Document::Ptr document; + + for (int i = 0; i < 2; ++i) { + mm->updateSourceFiles(QStringList() << testHeader1 << testHeader2 << testCpp); + refreshedFiles = helper.waitForRefreshedSourceFiles(); + + QCOMPARE(refreshedFiles.size(), 3); + QVERIFY(refreshedFiles.contains(testHeader1)); + QVERIFY(refreshedFiles.contains(testHeader2)); + QVERIFY(refreshedFiles.contains(testCpp)); + + snapshot = mm->snapshot(); + QVERIFY(snapshot.contains(testHeader1)); + QVERIFY(snapshot.contains(testHeader2)); + QVERIFY(snapshot.contains(testCpp)); + + // No diagnostic messages expected + document = snapshot.document(testHeader1); + QVERIFY(document->diagnosticMessages().isEmpty()); + + document = snapshot.document(testHeader2); + QVERIFY(document->diagnosticMessages().isEmpty()); + + document = snapshot.document(testCpp); + QVERIFY(document->diagnosticMessages().isEmpty()); + } +} diff --git a/src/plugins/cpptools/cpppreprocessor.cpp b/src/plugins/cpptools/cpppreprocessor.cpp index 5ab1c9a04e7..5c5d1bd803f 100644 --- a/src/plugins/cpptools/cpppreprocessor.cpp +++ b/src/plugins/cpptools/cpppreprocessor.cpp @@ -138,6 +138,7 @@ void CppPreprocessor::resetEnvironment() { m_env.reset(); m_processed.clear(); + m_included.clear(); } void CppPreprocessor::getFileContents(const QString &absoluteFilePath, diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index dd925121c1c..d3eb847e30e 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -141,7 +141,8 @@ private slots: void test_modelmanager_paths(); void test_modelmanager_framework_headers(); - void test_modelmanager_refresh(); + void test_modelmanager_refresh_1(); + void test_modelmanager_refresh_2(); private: void test_completion(); diff --git a/tests/cppmodelmanager/testdata_refresh/defines.h b/tests/cppmodelmanager/testdata_refresh/defines.h new file mode 100644 index 00000000000..4563c017ed4 --- /dev/null +++ b/tests/cppmodelmanager/testdata_refresh/defines.h @@ -0,0 +1,31 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + + +#define FORWARD_DECLARE_CLASS(name) class name; diff --git a/tests/cppmodelmanager/testdata_refresh/header.h b/tests/cppmodelmanager/testdata_refresh/header.h new file mode 100644 index 00000000000..55ce0a2a4c0 --- /dev/null +++ b/tests/cppmodelmanager/testdata_refresh/header.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + + +#include "defines.h" + +FORWARD_DECLARE_CLASS(QAction) diff --git a/tests/cppmodelmanager/testdata_refresh/source.cpp b/tests/cppmodelmanager/testdata_refresh/source.cpp new file mode 100644 index 00000000000..55ce0a2a4c0 --- /dev/null +++ b/tests/cppmodelmanager/testdata_refresh/source.cpp @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + + +#include "defines.h" + +FORWARD_DECLARE_CLASS(QAction)