aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2014-02-19 11:39:06 -0300
committerNikolai Kosjar <nikolai.kosjar@digia.com>2014-02-24 14:08:11 +0100
commitc2803b00be65a064fa5217bdd016b530d518ab9f (patch)
tree31a2453767810f8b791a721c09325972f13814ae /src/plugins/cpptools
parent54471bc3f4ce747dd4ea7d48af363b30c49bb42e (diff)
CppTools: Avoid self-include
...in CPlusPlus::Document due to cyclic includes. Task-number: QTCREATORBUG-11457 Change-Id: I1ca19c901c26d9984d795a61879dd6b41c57096c Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r--src/plugins/cpptools/cpppreprocessor.cpp2
-rw-r--r--src/plugins/cpptools/cpppreprocessor_test.cpp44
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.h1
-rw-r--r--src/plugins/cpptools/cpptoolstestcase.cpp13
-rw-r--r--src/plugins/cpptools/cpptoolstestcase.h2
5 files changed, 61 insertions, 1 deletions
diff --git a/src/plugins/cpptools/cpppreprocessor.cpp b/src/plugins/cpptools/cpppreprocessor.cpp
index f8d14bf123c..229d06885f1 100644
--- a/src/plugins/cpptools/cpppreprocessor.cpp
+++ b/src/plugins/cpptools/cpppreprocessor.cpp
@@ -355,7 +355,7 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc)
if (Document::Ptr includedDoc = m_snapshot.document(includedFile))
mergeEnvironment(includedDoc);
- else
+ else if (!m_included.contains(includedFile))
run(includedFile);
}
diff --git a/src/plugins/cpptools/cpppreprocessor_test.cpp b/src/plugins/cpptools/cpppreprocessor_test.cpp
index 5f6729bb0c0..17ab615b025 100644
--- a/src/plugins/cpptools/cpppreprocessor_test.cpp
+++ b/src/plugins/cpptools/cpppreprocessor_test.cpp
@@ -32,8 +32,12 @@
#include "cppmodelmanager.h"
#include "cpppreprocessertesthelper.h"
#include "cpppreprocessor.h"
+#include "cppsnapshotupdater.h"
+#include "cpptoolseditorsupport.h"
#include "cpptoolstestcase.h"
+#include <texteditor/basetexteditor.h>
+
#include <cplusplus/CppDocument.h>
#include <utils/fileutils.h>
@@ -117,3 +121,43 @@ void CppToolsPlugin::test_cpppreprocessor_includes_resolvedUnresolved()
QCOMPARE(unresolvedIncludes.at(0).unresolvedFileName(), QLatin1String("notresolvable.h"));
QVERIFY(unresolvedIncludes.at(0).resolvedFileName().isEmpty());
}
+
+/// Check: Avoid self-include entries due to cyclic includes.
+void CppToolsPlugin::test_cpppreprocessor_includes_cyclic()
+{
+ const QString fileName1 = TestIncludePaths::testFilePath(QLatin1String("cyclic1.h"));
+ const QString fileName2 = TestIncludePaths::testFilePath(QLatin1String("cyclic2.h"));
+ const QStringList sourceFiles = QStringList() << fileName1 << fileName2;
+
+ // Create global snapshot (needed in SnapshotUpdater)
+ TestCase testCase;
+ testCase.parseFiles(sourceFiles);
+
+ // Open editor
+ TextEditor::BaseTextEditor *editor;
+ QVERIFY(testCase.openBaseTextEditor(fileName1, &editor));
+ testCase.closeEditorAtEndOfTestCase(editor);
+
+ // Get editor snapshot
+ CppEditorSupport *cppEditorSupport = CppModelManagerInterface::instance()
+ ->cppEditorSupport(editor);
+ QVERIFY(cppEditorSupport);
+ QSharedPointer<SnapshotUpdater> snapshotUpdater = cppEditorSupport->snapshotUpdater();
+ QVERIFY(snapshotUpdater);
+ Snapshot snapshot = snapshotUpdater->snapshot();
+ QCOMPARE(snapshot.size(), 3); // Configuration file included
+
+ // Check includes
+ Document::Ptr doc1 = snapshot.document(fileName1);
+ QVERIFY(doc1);
+ Document::Ptr doc2 = snapshot.document(fileName2);
+ QVERIFY(doc2);
+
+ QCOMPARE(doc1->unresolvedIncludes().size(), 0);
+ QCOMPARE(doc1->resolvedIncludes().size(), 1);
+ QCOMPARE(doc1->resolvedIncludes().first().resolvedFileName(), fileName2);
+
+ QCOMPARE(doc2->unresolvedIncludes().size(), 0);
+ QCOMPARE(doc2->resolvedIncludes().size(), 1);
+ QCOMPARE(doc2->resolvedIncludes().first().resolvedFileName(), fileName1);
+}
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 4e9c024ad12..05a137dc6ea 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -123,6 +123,7 @@ private slots:
void test_format_pointerdeclaration_macros_data();
void test_cpppreprocessor_includes_resolvedUnresolved();
+ void test_cpppreprocessor_includes_cyclic();
void test_functionutils_virtualFunctions();
void test_functionutils_virtualFunctions_data();
diff --git a/src/plugins/cpptools/cpptoolstestcase.cpp b/src/plugins/cpptools/cpptoolstestcase.cpp
index 7c46ec84b0b..12c0218270d 100644
--- a/src/plugins/cpptools/cpptoolstestcase.cpp
+++ b/src/plugins/cpptools/cpptoolstestcase.cpp
@@ -30,6 +30,7 @@
#include "cpptoolstestcase.h"
#include <coreplugin/editormanager/editormanager.h>
+#include <texteditor/basetexteditor.h>
#include <cplusplus/CppDocument.h>
#include <utils/fileutils.h>
@@ -100,6 +101,18 @@ bool TestCase::succeededSoFar() const
return m_succeededSoFar;
}
+bool TestCase::openBaseTextEditor(const QString &fileName, TextEditor::BaseTextEditor **editor)
+{
+ typedef TextEditor::BaseTextEditor BTEditor;
+ if (BTEditor *e = qobject_cast<BTEditor *>(Core::EditorManager::openEditor(fileName))) {
+ if (editor) {
+ *editor = e;
+ return true;
+ }
+ }
+ return false;
+}
+
CPlusPlus::Snapshot TestCase::globalSnapshot()
{
return CppModelManagerInterface::instance()->snapshot();
diff --git a/src/plugins/cpptools/cpptoolstestcase.h b/src/plugins/cpptools/cpptoolstestcase.h
index 7fac75f5e3f..a3c2529568a 100644
--- a/src/plugins/cpptools/cpptoolstestcase.h
+++ b/src/plugins/cpptools/cpptoolstestcase.h
@@ -42,6 +42,7 @@ class Document;
class Snapshot;
}
namespace Core { class IEditor; }
+namespace TextEditor { class BaseTextEditor; }
namespace CppTools {
namespace Tests {
@@ -69,6 +70,7 @@ public:
~TestCase();
bool succeededSoFar() const;
+ bool openBaseTextEditor(const QString &fileName, TextEditor::BaseTextEditor **editor);
void closeEditorAtEndOfTestCase(Core::IEditor *editor);
static bool closeEditorWithoutGarbageCollectorInvocation(Core::IEditor *editor);