summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r--src/plugins/cpptools/cppchecksymbols.cpp2
-rw-r--r--src/plugins/cpptools/cppcompletionassist.cpp2
-rw-r--r--src/plugins/cpptools/cpppreprocessor.cpp4
-rw-r--r--src/plugins/cpptools/cpppreprocessor_test.cpp113
-rw-r--r--src/plugins/cpptools/cpptools.pro5
-rw-r--r--src/plugins/cpptools/cpptools.qbs5
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.h2
7 files changed, 125 insertions, 8 deletions
diff --git a/src/plugins/cpptools/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp
index 8c7625e1e0..066e71f619 100644
--- a/src/plugins/cpptools/cppchecksymbols.cpp
+++ b/src/plugins/cpptools/cppchecksymbols.cpp
@@ -99,7 +99,7 @@ protected:
if (!processed->contains(doc->globalNamespace())) {
processed->insert(doc->globalNamespace());
- foreach (const Document::Include &i, doc->includes())
+ foreach (const Document::Include &i, doc->resolvedIncludes())
process(_snapshot.document(i.resolvedFileName()), processed);
_mainDocument = (doc == _doc); // ### improve
diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp
index 4a1004aceb..bf5db57ff0 100644
--- a/src/plugins/cpptools/cppcompletionassist.cpp
+++ b/src/plugins/cpptools/cppcompletionassist.cpp
@@ -1732,7 +1732,7 @@ void CppCompletionAssistProcessor::addMacros_helper(const CPlusPlus::Snapshot &s
processed->insert(doc->fileName());
- foreach (const Document::Include &i, doc->includes()) {
+ foreach (const Document::Include &i, doc->resolvedIncludes()) {
addMacros_helper(snapshot, i.resolvedFileName(), processed, definedMacros);
}
diff --git a/src/plugins/cpptools/cpppreprocessor.cpp b/src/plugins/cpptools/cpppreprocessor.cpp
index 1dae47621f..649d3d6bc9 100644
--- a/src/plugins/cpptools/cpppreprocessor.cpp
+++ b/src/plugins/cpptools/cpppreprocessor.cpp
@@ -332,7 +332,7 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc)
m_processed.insert(fn);
- foreach (const Document::Include &incl, doc->includes()) {
+ foreach (const Document::Include &incl, doc->resolvedIncludes()) {
const QString includedFile = incl.resolvedFileName();
if (Document::Ptr includedDoc = m_snapshot.document(includedFile))
@@ -363,7 +363,7 @@ void CppPreprocessor::sourceNeeded(unsigned line, const QString &fileName, Inclu
QString absoluteFileName = resolveFile(fileName, type);
absoluteFileName = QDir::cleanPath(absoluteFileName);
- if (m_currentDoc && !absoluteFileName.isEmpty())
+ if (m_currentDoc)
m_currentDoc->addIncludeFile(Document::Include(fileName, absoluteFileName, line, type));
if (m_included.contains(absoluteFileName))
return; // we've already seen this file.
diff --git a/src/plugins/cpptools/cpppreprocessor_test.cpp b/src/plugins/cpptools/cpppreprocessor_test.cpp
new file mode 100644
index 0000000000..715fd984ce
--- /dev/null
+++ b/src/plugins/cpptools/cpppreprocessor_test.cpp
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** 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 "cpptoolsplugin.h"
+
+#include "cppmodelmanager.h"
+#include "cpppreprocessertesthelper.h"
+#include "cpppreprocessor.h"
+
+#include <cplusplus/CppDocument.h>
+#include <utils/fileutils.h>
+
+#include <QtTest>
+
+using namespace CPlusPlus;
+using namespace CppTools;
+using namespace CppTools::Internal;
+
+typedef Document::Include Include;
+
+class SourcePreprocessor
+{
+public:
+ SourcePreprocessor()
+ : m_cmm(CppModelManager::instance())
+ {
+ cleanUp();
+ }
+
+ Document::Ptr run(const QByteArray &source)
+ {
+ const QString fileName = TestIncludePaths::directoryOfTestFile()
+ + QLatin1String("/file.cpp");
+ Utils::FileSaver srcSaver(fileName);
+ srcSaver.write(source);
+ srcSaver.finalize();
+
+ CppPreprocessor pp((QPointer<CppModelManager>(m_cmm)));
+ pp.setIncludePaths(QStringList(TestIncludePaths::directoryOfTestFile()));
+ pp.run(fileName);
+
+ return m_cmm->snapshot().document(fileName);
+ }
+
+ ~SourcePreprocessor()
+ {
+ cleanUp();
+ }
+
+private:
+ void cleanUp()
+ {
+ m_cmm->GC();
+ QVERIFY(m_cmm->snapshot().isEmpty());
+ }
+
+private:
+ CppModelManager *m_cmm;
+};
+
+void CppToolsPlugin::test_cpppreprocessor_includes()
+{
+ QByteArray source =
+ "#include \"header.h\"\n"
+ "#include \"notresolvable.h\"\n"
+ "\n"
+ ;
+
+ SourcePreprocessor processor;
+ Document::Ptr document = processor.run(source);
+ QVERIFY(document);
+
+ const QList<Document::Include> resolvedIncludes = document->resolvedIncludes();
+ QVERIFY(resolvedIncludes.size() == 1);
+ QVERIFY(resolvedIncludes.at(0).type() == Client::IncludeLocal);
+ QCOMPARE(resolvedIncludes.at(0).unresolvedFileName(), QLatin1String("header.h"));
+ const QString expectedResolvedFileName
+ = TestIncludePaths::directoryOfTestFile() + QLatin1String("/header.h");
+ QCOMPARE(resolvedIncludes.at(0).resolvedFileName(), expectedResolvedFileName);
+
+ const QList<Document::Include> unresolvedIncludes = document->unresolvedIncludes();
+ QVERIFY(unresolvedIncludes.size() == 1);
+ QVERIFY(unresolvedIncludes.at(0).type() == Client::IncludeLocal);
+ QCOMPARE(unresolvedIncludes.at(0).unresolvedFileName(), QLatin1String("notresolvable.h"));
+ QVERIFY(unresolvedIncludes.at(0).resolvedFileName().isEmpty());
+}
+
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index 07d7862598..a8a1d39938 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -97,14 +97,15 @@ FORMS += completionsettingspage.ui \
equals(TEST, 1) {
SOURCES += \
- cpppreprocessertesthelper.cpp \
cppcodegen_test.cpp \
cppcompletion_test.cpp \
cppmodelmanager_test.cpp \
modelmanagertesthelper.cpp \
cpppointerdeclarationformatter_test.cpp \
cpplocatorfilter_test.cpp \
- symbolsearcher_test.cpp
+ symbolsearcher_test.cpp \
+ cpppreprocessor_test.cpp \
+ cpppreprocessertesthelper.cpp
HEADERS += \
cpppreprocessertesthelper.h \
diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs
index 594a0321a0..a8b29fc06f 100644
--- a/src/plugins/cpptools/cpptools.qbs
+++ b/src/plugins/cpptools/cpptools.qbs
@@ -116,12 +116,13 @@ QtcPlugin {
files: [
"cppcodegen_test.cpp",
"cppcompletion_test.cpp",
- "cpppreprocessertesthelper.cpp", "cpppreprocessertesthelper.h",
"cppmodelmanager_test.cpp",
"modelmanagertesthelper.cpp", "modelmanagertesthelper.h",
"cpppointerdeclarationformatter_test.cpp",
"cpplocatorfilter_test.cpp",
- "symbolsearcher_test.cpp"
+ "symbolsearcher_test.cpp",
+ "cpppreprocessor_test.cpp",
+ "cpppreprocessertesthelper.cpp", "cpppreprocessertesthelper.h"
]
cpp.defines: outer.concat(['SRCDIR="' + FileInfo.path(filePath) + '"'])
diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h
index 61f7cae310..6835e365d0 100644
--- a/src/plugins/cpptools/cpptoolsplugin.h
+++ b/src/plugins/cpptools/cpptoolsplugin.h
@@ -189,6 +189,8 @@ private slots:
void test_format_pointerdeclaration_macros();
void test_format_pointerdeclaration_macros_data();
+ void test_cpppreprocessor_includes();
+
void test_modelmanager_paths_are_clean();
void test_modelmanager_framework_headers();
void test_modelmanager_refresh_also_includes_of_project_files();