diff options
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r-- | src/plugins/cpptools/cppchecksymbols.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcompletionassist.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpppreprocessor.cpp | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cpppreprocessor_test.cpp | 113 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptools.pro | 5 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptools.qbs | 5 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.h | 2 |
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(); |