summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/autotoolsprojectmanager/autotoolsproject.cpp10
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp17
-rw-r--r--src/plugins/cppeditor/cppquickfixes.cpp12
-rw-r--r--src/plugins/cpptools/ModelManagerInterface.cpp10
-rw-r--r--src/plugins/cpptools/ModelManagerInterface.h91
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp66
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h4
-rw-r--r--src/plugins/cpptools/cppmodelmanager_test.cpp16
-rw-r--r--src/plugins/cpptools/cppprojectfile.cpp101
-rw-r--r--src/plugins/cpptools/cppprojectfile.h86
-rw-r--r--src/plugins/cpptools/cpptools.pro6
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp46
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.cpp82
-rw-r--r--src/plugins/qt4projectmanager/qt4project.cpp36
14 files changed, 376 insertions, 207 deletions
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
index 8d938a4ab2..13a10c6b71 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp
@@ -434,13 +434,15 @@ void AutotoolsProject::updateCppCodeModel()
|| (pinfo.frameworkPaths() != allFrameworkPaths);
if (update) {
pinfo.clearProjectParts();
- CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
- new CPlusPlus::CppModelManagerInterface::ProjectPart);
+ CPlusPlus::ProjectPart::Ptr part(new CPlusPlus::ProjectPart);
part->includePaths = allIncludePaths;
- part->sourceFiles = m_files;
+ foreach (const QString &file, m_files)
+ part->files << CPlusPlus::ProjectFile(file, CPlusPlus::ProjectFile::CXXSource);
+
part->defines = macros;
part->frameworkPaths = allFrameworkPaths;
- part->language = CPlusPlus::CppModelManagerInterface::ProjectPart::CXX11;
+ part->cVersion = CPlusPlus::ProjectPart::C99;
+ part->cxxVersion = CPlusPlus::ProjectPart::CXX11;
pinfo.appendProjectPart(part);
modelManager->updateProjectInfo(pinfo);
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index fa1d2ce7aa..e5d27e269f 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -372,19 +372,20 @@ bool CMakeProject::parseCMakeLists()
|| pinfo.defines() != allDefines
|| pinfo.frameworkPaths() != allFrameworkPaths) {
pinfo.clearProjectParts();
- CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
- new CPlusPlus::CppModelManagerInterface::ProjectPart);
+ CPlusPlus::ProjectPart::Ptr part(new CPlusPlus::ProjectPart);
part->includePaths = allIncludePaths;
- // TODO we only want C++ files, not all other stuff that might be in the project
- part->sourceFiles = m_files;
+ CPlusPlus::ProjectFileAdder adder(part->files);
+ foreach (const QString &file, m_files)
+ adder.maybeAdd(file);
part->defines = allDefines;
part->frameworkPaths = allFrameworkPaths;
+ part->cVersion = CPlusPlus::ProjectPart::C99;
if (tc)
- part->language = tc->compilerFlags(cxxflags) == ToolChain::STD_CXX11
- ? CPlusPlus::CppModelManagerInterface::ProjectPart::CXX11
- : CPlusPlus::CppModelManagerInterface::ProjectPart::CXX;
+ part->cxxVersion = tc->compilerFlags(cxxflags) == ToolChain::STD_CXX11
+ ? CPlusPlus::ProjectPart::CXX11
+ : CPlusPlus::ProjectPart::CXX98;
else
- part->language = CPlusPlus::CppModelManagerInterface::ProjectPart::CXX11;
+ part->cxxVersion = CPlusPlus::ProjectPart::CXX11;
pinfo.appendProjectPart(part);
modelmanager->updateProjectInfo(pinfo);
m_codeModelFuture.cancel();
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index 5454753f3c..1182a19269 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -1688,17 +1688,19 @@ void AddIncludeForUndefinedIdentifier::match(const CppQuickFixInterface &interfa
QList<CppModelManagerInterface::ProjectInfo> projectInfos = modelManager->projectInfos();
bool inProject = false;
foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) {
- foreach (CppModelManagerInterface::ProjectPart::Ptr part, info.projectParts()) {
- if (part->sourceFiles.contains(doc->fileName()) || part->objcSourceFiles.contains(doc->fileName()) || part->headerFiles.contains(doc->fileName())) {
- inProject = true;
- includePaths += part->includePaths;
+ foreach (ProjectPart::Ptr part, info.projectParts()) {
+ foreach (const ProjectFile &file, part->files) {
+ if (file.path == doc->fileName()) {
+ inProject = true;
+ includePaths += part->includePaths;
+ }
}
}
}
if (!inProject) {
// better use all include paths than none
foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) {
- foreach (CppModelManagerInterface::ProjectPart::Ptr part, info.projectParts())
+ foreach (ProjectPart::Ptr part, info.projectParts())
includePaths += part->includePaths;
}
}
diff --git a/src/plugins/cpptools/ModelManagerInterface.cpp b/src/plugins/cpptools/ModelManagerInterface.cpp
index c7d52785da..8f877f0cbe 100644
--- a/src/plugins/cpptools/ModelManagerInterface.cpp
+++ b/src/plugins/cpptools/ModelManagerInterface.cpp
@@ -82,7 +82,7 @@ void CppModelManagerInterface::ProjectInfo::clearProjectParts()
}
void CppModelManagerInterface::ProjectInfo::appendProjectPart(
- const CppModelManagerInterface::ProjectPart::Ptr &part)
+ const ProjectPart::Ptr &part)
{
if (!part)
return;
@@ -103,12 +103,8 @@ void CppModelManagerInterface::ProjectInfo::appendProjectPart(
// update source files
QSet<QString> srcs = QSet<QString>::fromList(m_sourceFiles);
- foreach (const QString &src, part->headerFiles)
- srcs.insert(src);
- foreach (const QString &src, part->sourceFiles)
- srcs.insert(src);
- foreach (const QString &src, part->objcSourceFiles)
- srcs.insert(src);
+ foreach (const ProjectFile &file, part->files)
+ srcs.insert(file.path);
m_sourceFiles = srcs.toList();
// update defines
diff --git a/src/plugins/cpptools/ModelManagerInterface.h b/src/plugins/cpptools/ModelManagerInterface.h
index f57b038778..5376daad25 100644
--- a/src/plugins/cpptools/ModelManagerInterface.h
+++ b/src/plugins/cpptools/ModelManagerInterface.h
@@ -33,6 +33,7 @@
#include <cplusplus/CppDocument.h>
#include <languageutils/fakemetaobject.h>
#include "cpptools_global.h"
+#include "cppprojectfile.h"
#include <QObject>
#include <QHash>
@@ -63,48 +64,64 @@ namespace CppTools {
namespace CPlusPlus {
-class CPPTOOLS_EXPORT CppModelManagerInterface : public QObject
+class CPPTOOLS_EXPORT ProjectPart
{
- Q_OBJECT
+public:
+ ProjectPart()
+ : cVersion(C89)
+ , cxxVersion(CXX11)
+ , cxxExtensions(NoExtensions)
+ , qtVersion(UnknownQt)
+ {}
public:
+ enum CVersion {
+ C89,
+ C99,
+ C11
+ };
- class CPPTOOLS_EXPORT ProjectPart
- {
- public:
- ProjectPart()
- : language(CXX11)
- , qtVersion(UnknownQt)
- {}
-
- public: // enums and types
- enum Language {
- C89 = 1,
- C99 = 2,
- CXX = 3,
- CXX11 = 4
- };
- enum QtVersion {
- UnknownQt = -1,
- NoQt = 0,
- Qt4 = 1,
- Qt5 = 2
- };
-
- typedef QSharedPointer<ProjectPart> Ptr;
-
- public: //attributes
- QStringList headerFiles;
- QStringList sourceFiles;
- QStringList objcSourceFiles;
- QByteArray defines;
- QStringList includePaths;
- QStringList frameworkPaths;
- QStringList precompiledHeaders;
- Language language;
- QtVersion qtVersion;
+ enum CXXVersion {
+ CXX98,
+ CXX11
+ };
+
+ enum CXXExtension {
+ NoExtensions = 0x0,
+ GnuExtensions = 0x1,
+ MicrosoftExtensions = 0x2,
+ BorlandExtensions = 0x4,
+ OpenMP = 0x8
+ };
+ Q_DECLARE_FLAGS(CXXExtensions, CXXExtension)
+
+ enum QtVersion {
+ UnknownQt = -1,
+ NoQt = 0,
+ Qt4 = 1,
+ Qt5 = 2
};
+ typedef QSharedPointer<ProjectPart> Ptr;
+
+public: //attributes
+ QList<ProjectFile> files;
+ QByteArray defines;
+ QStringList includePaths;
+ QStringList frameworkPaths;
+ QStringList precompiledHeaders;
+ CVersion cVersion;
+ CXXVersion cxxVersion;
+ CXXExtensions cxxExtensions;
+ QtVersion qtVersion;
+};
+
+class CPPTOOLS_EXPORT CppModelManagerInterface : public QObject
+{
+ Q_OBJECT
+
+public:
+
class CPPTOOLS_EXPORT ProjectInfo
{
public:
@@ -252,4 +269,6 @@ public Q_SLOTS:
} // namespace CPlusPlus
+QDebug operator <<(QDebug stream, const CPlusPlus::ProjectFile &cxxFile);
+
#endif // CPPMODELMANAGERINTERFACE_H
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index ce615d5c6b..7dd4c79a2b 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -89,9 +89,9 @@
namespace CPlusPlus {
-uint qHash(const CppModelManagerInterface::ProjectPart &p)
+uint qHash(const ProjectPart &p)
{
- uint h = qHash(p.defines) ^ p.language ^ p.qtVersion;
+ uint h = qHash(p.defines) ^ p.cVersion ^ p.cxxVersion ^ p.cxxExtensions ^ p.qtVersion;
foreach (const QString &i, p.includePaths)
h ^= qHash(i);
@@ -102,12 +102,16 @@ uint qHash(const CppModelManagerInterface::ProjectPart &p)
return h;
}
-bool operator==(const CppModelManagerInterface::ProjectPart &p1,
- const CppModelManagerInterface::ProjectPart &p2)
+bool operator==(const ProjectPart &p1,
+ const ProjectPart &p2)
{
if (p1.defines != p2.defines)
return false;
- if (p1.language != p2.language)
+ if (p1.cVersion != p2.cVersion)
+ return false;
+ if (p1.cxxVersion != p2.cxxVersion)
+ return false;
+ if (p1.cxxExtensions != p2.cxxExtensions)
return false;
if (p1.qtVersion!= p2.qtVersion)
return false;
@@ -769,9 +773,8 @@ QStringList CppModelManager::internalProjectFiles() const
it.next();
ProjectInfo pinfo = it.value();
foreach (const ProjectPart::Ptr &part, pinfo.projectParts()) {
- files += part->headerFiles;
- files += part->sourceFiles;
- files += part->objcSourceFiles;
+ foreach (const ProjectFile &file, part->files)
+ files += file.path;
}
}
files.removeDuplicates();
@@ -839,24 +842,37 @@ void CppModelManager::dumpModelManagerConfiguration()
qDebug()<<" for project:"<< pinfo.project().data()->document()->fileName();
foreach (const ProjectPart::Ptr &part, pinfo.projectParts()) {
qDebug() << "=== part ===";
- const char* lang;
- switch (part->language) {
- case ProjectPart::CXX: lang = "C++"; break;
- case ProjectPart::CXX11: lang = "C++11"; break;
- case ProjectPart::C89: lang = "C89"; break;
- case ProjectPart::C99: lang = "C99"; break;
- default: lang = "INVALID";
+ const char* cVersion;
+ const char* cxxVersion;
+ const char* cxxExtensions;
+ switch (part->cVersion) {
+ case ProjectPart::C89: cVersion = "C89"; break;
+ case ProjectPart::C99: cVersion = "C99"; break;
+ case ProjectPart::C11: cVersion = "C11"; break;
+ default: cVersion = "INVALID";
+ }
+ switch (part->cxxVersion) {
+ case ProjectPart::CXX98: cVersion = "CXX98"; break;
+ case ProjectPart::CXX11: cVersion = "CXX11"; break;
+ default: cxxVersion = "INVALID";
+ }
+ switch (part->cxxExtensions) {
+ case ProjectPart::NoExtensions: cVersion = "NoExtensions"; break;
+ case ProjectPart::GnuExtensions: cVersion = "GnuExtensions"; break;
+ case ProjectPart::MicrosoftExtensions: cVersion = "MicrosoftExtensions"; break;
+ case ProjectPart::BorlandExtensions: cVersion = "BorlandExtensions"; break;
+ default: cxxExtensions = "INVALID";
}
- qDebug() << "language:" << lang;
+ qDebug() << "cVersion:" << cVersion;
+ qDebug() << "cxxVersion:" << cxxVersion;
+ qDebug() << "cxxExtensions:" << cxxExtensions;
qDebug() << "Qt version:" << part->qtVersion;
qDebug() << "precompiled header:" << part->precompiledHeaders;
qDebug() << "defines:" << part->defines;
qDebug() << "includes:" << part->includePaths;
qDebug() << "frameworkPaths:" << part->frameworkPaths;
- qDebug() << "headers:" << part->headerFiles;
- qDebug() << "sources:" << part->sourceFiles;
- qDebug() << "objc sources:" << part->objcSourceFiles;
+ qDebug() << "files:" << part->files;
qDebug() << "";
}
}
@@ -988,12 +1004,8 @@ void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo)
foreach (const ProjectInfo &projectInfo, m_projects) {
foreach (const ProjectPart::Ptr &projectPart, projectInfo.projectParts()) {
- foreach (const QString &sourceFile, projectPart->sourceFiles)
- m_srcToProjectPart[sourceFile].append(projectPart);
- foreach (const QString &objcSourceFile, projectPart->objcSourceFiles)
- m_srcToProjectPart[objcSourceFile].append(projectPart);
- foreach (const QString &headerFile, projectPart->headerFiles)
- m_srcToProjectPart[headerFile].append(projectPart);
+ foreach (const ProjectFile &cxxFile, projectPart->files)
+ m_srcToProjectPart[cxxFile.path].append(projectPart);
}
}
}
@@ -1004,9 +1016,9 @@ void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo)
emit projectPartsUpdated(pinfo.project().data());
}
-QList<CppModelManager::ProjectPart::Ptr> CppModelManager::projectPart(const QString &fileName) const
+QList<ProjectPart::Ptr> CppModelManager::projectPart(const QString &fileName) const
{
- QList<CppModelManager::ProjectPart::Ptr> parts = m_srcToProjectPart.value(fileName);
+ QList<ProjectPart::Ptr> parts = m_srcToProjectPart.value(fileName);
if (!parts.isEmpty())
return parts;
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index c882a0ec4f..503c3c5258 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -94,7 +94,7 @@ public:
virtual QList<ProjectInfo> projectInfos() const;
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
virtual void updateProjectInfo(const ProjectInfo &pinfo);
- virtual QList<ProjectPart::Ptr> projectPart(const QString &fileName) const;
+ virtual QList<CPlusPlus::ProjectPart::Ptr> projectPart(const QString &fileName) const;
virtual CPlusPlus::Snapshot snapshot() const;
virtual Document::Ptr document(const QString &fileName) const;
@@ -244,7 +244,7 @@ private:
mutable QMutex m_protectExtraDiagnostics;
QHash<QString, QHash<int, QList<Document::DiagnosticMessage> > > m_extraDiagnostics;
- QMap<QString, QList<ProjectPart::Ptr> > m_srcToProjectPart;
+ QMap<QString, QList<CPlusPlus::ProjectPart::Ptr> > m_srcToProjectPart;
CppCompletionAssistProvider *m_completionAssistProvider;
CppCompletionAssistProvider *m_completionFallback;
diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp
index 338aa01d79..a5eb79914b 100644
--- a/src/plugins/cpptools/cppmodelmanager_test.cpp
+++ b/src/plugins/cpptools/cppmodelmanager_test.cpp
@@ -39,7 +39,8 @@ using namespace CppTools::Internal;
typedef CPlusPlus::Document Document;
typedef CPlusPlus::CppModelManagerInterface::ProjectInfo ProjectInfo;
-typedef CPlusPlus::CppModelManagerInterface::ProjectPart ProjectPart;
+typedef CPlusPlus::ProjectPart ProjectPart;
+typedef CPlusPlus::ProjectFile ProjectFile;
typedef ProjectExplorer::Project Project;
namespace {
@@ -81,7 +82,7 @@ void CppToolsPlugin::test_modelmanager_paths()
ProjectPart::Ptr part(new ProjectPart);
pi.appendProjectPart(part);
- part->language = ProjectPart::CXX;
+ part->cxxVersion = ProjectPart::CXX98;
part->qtVersion = ProjectPart::Qt5;
part->defines = QByteArray("#define OH_BEHAVE -1\n");
part->includePaths = QStringList() << testIncludeDir(false);
@@ -109,19 +110,20 @@ void CppToolsPlugin::test_modelmanager_framework_headers()
ProjectPart::Ptr part(new ProjectPart);
pi.appendProjectPart(part);
- part->language = ProjectPart::CXX;
+ part->cxxVersion = ProjectPart::CXX98;
part->qtVersion = ProjectPart::Qt5;
part->defines = QByteArray("#define OH_BEHAVE -1\n");
part->includePaths << testIncludeDir();
part->frameworkPaths << testFrameworksDir();
- part->sourceFiles << testSource(QLatin1String("test_modelmanager_framework_headers.cpp"));
+ const QString &source = testSource(QLatin1String("test_modelmanager_framework_headers.cpp"));
+ part->files << ProjectFile(source, ProjectFile::CXXSource);
mm->updateProjectInfo(pi);
- mm->updateSourceFiles(part->sourceFiles).waitForFinished();
+ mm->updateSourceFiles(QStringList(source)).waitForFinished();
QCoreApplication::processEvents();
- QVERIFY(mm->snapshot().contains(part->sourceFiles.first()));
- Document::Ptr doc = mm->snapshot().document(part->sourceFiles.first());
+ QVERIFY(mm->snapshot().contains(source));
+ Document::Ptr doc = mm->snapshot().document(source);
QVERIFY(!doc.isNull());
CPlusPlus::Namespace *ns = doc->globalNamespace();
QVERIFY(ns);
diff --git a/src/plugins/cpptools/cppprojectfile.cpp b/src/plugins/cpptools/cppprojectfile.cpp
new file mode 100644
index 0000000000..20e58a60ae
--- /dev/null
+++ b/src/plugins/cpptools/cppprojectfile.cpp
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** 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 "cppprojectfile.h"
+#include <coreplugin/icore.h>
+#include "cpptoolsconstants.h"
+#include <QDebug>
+
+namespace CPlusPlus {
+
+ProjectFile::ProjectFile()
+ : kind(CHeader)
+{
+}
+
+ProjectFile::ProjectFile(const QString &file, Kind kind)
+ : path(file)
+ , kind(kind)
+{
+}
+
+ProjectFileAdder::ProjectFileAdder(QList<ProjectFile> &files)
+ : m_files(files)
+{
+ addMapping(CppTools::Constants::C_SOURCE_MIMETYPE, ProjectFile::CSource);
+ addMapping(CppTools::Constants::C_HEADER_MIMETYPE, ProjectFile::CHeader);
+ addMapping(CppTools::Constants::CPP_SOURCE_MIMETYPE, ProjectFile::CSource);
+ addMapping(CppTools::Constants::CPP_HEADER_MIMETYPE, ProjectFile::CHeader);
+ addMapping(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE, ProjectFile::ObjCXXSource);
+}
+
+ProjectFileAdder::~ProjectFileAdder()
+{
+}
+
+bool ProjectFileAdder::maybeAdd(const QString &path)
+{
+ m_fileInfo.setFile(path);
+ foreach (const Pair &pair, m_mapping)
+ if (pair.first.matchesFile(path)) {
+ m_files << ProjectFile(path, pair.second);
+ return true;
+ }
+ return false;
+}
+
+void ProjectFileAdder::addMapping(const char *mimeName, ProjectFile::Kind kind)
+{
+ const Core::MimeDatabase *mimeDatabase = Core::ICore::mimeDatabase();
+ Core::MimeType mimeType = mimeDatabase->findByType(QLatin1String(mimeName));
+ if (!mimeType.isNull())
+ m_mapping.append(Pair(mimeType, kind));
+}
+
+} // namespace CPlusPlus
+
+QDebug operator <<(QDebug stream, const CPlusPlus::ProjectFile &cxxFile)
+{
+ const char *kind;
+ switch (cxxFile.kind) {
+ case CPlusPlus::ProjectFile::CHeader: kind = "CHeader"; break;
+ case CPlusPlus::ProjectFile::CSource: kind = "CSource"; break;
+ case CPlusPlus::ProjectFile::CXXHeader: kind = "CXXHeader"; break;
+ case CPlusPlus::ProjectFile::CXXSource: kind = "CXXSource"; break;
+ case CPlusPlus::ProjectFile::ObjCHeader: kind = "ObjCHeader"; break;
+ case CPlusPlus::ProjectFile::ObjCSource: kind = "ObjCSource"; break;
+ case CPlusPlus::ProjectFile::ObjCXXHeader: kind = "ObjCXXHeader"; break;
+ case CPlusPlus::ProjectFile::ObjCXXSource: kind = "ObjCXXSource"; break;
+ case CPlusPlus::ProjectFile::CudaSource: kind = "CudaSource"; break;
+ case CPlusPlus::ProjectFile::OpenCLSource: kind = "OpenCLSource"; break;
+ default: kind = "INVALID"; break;
+ }
+ stream << cxxFile.path << QLatin1String(", ") << kind;
+ return stream;
+}
diff --git a/src/plugins/cpptools/cppprojectfile.h b/src/plugins/cpptools/cppprojectfile.h
new file mode 100644
index 0000000000..ffe4e9c1c0
--- /dev/null
+++ b/src/plugins/cpptools/cppprojectfile.h
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** 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.
+**
+****************************************************************************/
+
+#ifndef CPLUSPLUS_CPPPROJECTFILE_H
+#define CPLUSPLUS_CPPPROJECTFILE_H
+
+#include <QString>
+#include <QMap>
+#include <coreplugin/mimedatabase.h>
+#include "cpptools_global.h"
+
+namespace CPlusPlus {
+
+class CPPTOOLS_EXPORT ProjectFile
+{
+public:
+ // enums and types
+ enum Kind {
+ CHeader = 1,
+ CSource = 2,
+ CXXHeader = 3,
+ CXXSource = 4,
+ ObjCHeader = 5,
+ ObjCSource = 6,
+ ObjCXXHeader = 7,
+ ObjCXXSource = 8,
+ CudaSource = 9,
+ OpenCLSource = 10
+ };
+
+ ProjectFile();
+ ProjectFile(const QString &file, Kind kind);
+
+ QString path;
+ Kind kind;
+};
+
+class CPPTOOLS_EXPORT ProjectFileAdder
+{
+public:
+ ProjectFileAdder(QList<ProjectFile> &files);
+ ~ProjectFileAdder();
+
+ bool maybeAdd(const QString &path);
+
+private:
+ typedef QPair<Core::MimeType, ProjectFile::Kind> Pair;
+
+ void addMapping(const char *mimeName, ProjectFile::Kind kind);
+
+ QList<ProjectFile> &m_files;
+ QList<Pair> m_mapping;
+ QFileInfo m_fileInfo;
+};
+
+} // namespace CPlusPlus
+
+QDebug operator <<(QDebug stream, const CPlusPlus::ProjectFile &cxxFile);
+
+#endif // CPLUSPLUS_CPPPROJECTFILE_H
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index 50ffa5d562..a6f329db4e 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -48,7 +48,8 @@ HEADERS += completionsettingspage.h \
TypeHierarchyBuilder.h \
cppindexingsupport.h \
builtinindexingsupport.h \
- cpppointerdeclarationformatter.h
+ cpppointerdeclarationformatter.h \
+ cppprojectfile.h
SOURCES += completionsettingspage.cpp \
cppclassesfilter.cpp \
@@ -90,7 +91,8 @@ SOURCES += completionsettingspage.cpp \
TypeHierarchyBuilder.cpp \
cppindexingsupport.cpp \
builtinindexingsupport.cpp \
- cpppointerdeclarationformatter.cpp
+ cpppointerdeclarationformatter.cpp \
+ cppprojectfile.cpp
FORMS += completionsettingspage.ui \
cppfilesettingspage.ui \
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 91ad80d74c..7fd885eb4d 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -59,27 +59,6 @@ using namespace ProjectExplorer;
namespace GenericProjectManager {
namespace Internal {
-static QList<Core::MimeType> cppMimeTypes()
-{
- QStringList mimeTypesNames;
- mimeTypesNames << QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE)
- << QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE)
- << QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)
- << QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)
- << QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE);
-
- QList<Core::MimeType> mimeTypes;
-
- const Core::MimeDatabase *mimeDatabase = Core::ICore::mimeDatabase();
- foreach (const QString &typeName, mimeTypesNames) {
- Core::MimeType mimeType = mimeDatabase->findByType(typeName);
- if (!mimeType.isNull())
- mimeTypes.append(mimeType);
- }
-
- return mimeTypes;
-}
-
////////////////////////////////////////////////////////////////////////////////////
//
// GenericProject
@@ -267,8 +246,7 @@ void GenericProject::refresh(RefreshOptions options)
if (modelManager) {
CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelManager->projectInfo(this);
pinfo.clearProjectParts();
- CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
- new CPlusPlus::CppModelManagerInterface::ProjectPart);
+ CPlusPlus::ProjectPart::Ptr part(new CPlusPlus::ProjectPart);
Kit *k = activeTarget() ? activeTarget()->kit() : KitManager::instance()->defaultKit();
if (ToolChain *tc = ToolChainKitInformation::toolChain(k)) {
@@ -290,29 +268,23 @@ void GenericProject::refresh(RefreshOptions options)
// ### add _defines.
// Add any C/C++ files to be parsed
- const QList<Core::MimeType> mimeTypes = cppMimeTypes();
- QFileInfo fileInfo;
-
- foreach (const QString &file, files()) {
- fileInfo.setFile(file);
- foreach (const Core::MimeType &mimeType, mimeTypes) {
- if (mimeType.matchesFile(fileInfo)) {
- part->sourceFiles += file;
- break;
- }
- }
- }
+ CPlusPlus::ProjectFileAdder adder(part->files);
+ foreach (const QString &file, files())
+ adder.maybeAdd(file);
QStringList filesToUpdate;
if (options & Configuration) {
- filesToUpdate = part->sourceFiles;
+ foreach (const CPlusPlus::ProjectFile &file, part->files)
+ filesToUpdate << file.path;
filesToUpdate.append(CPlusPlus::CppModelManagerInterface::configurationFileName());
// Full update, if there's a code model update, cancel it
m_codeModelFuture.cancel();
} else if (options & Files) {
// Only update files that got added to the list
- QSet<QString> newFileList = part->sourceFiles.toSet();
+ QSet<QString> newFileList;
+ foreach (const CPlusPlus::ProjectFile &file, part->files)
+ newFileList.insert(file.path);
newFileList.subtract(oldFileList);
filesToUpdate.append(newFileList.toList());
}
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 341806e310..30bbadc727 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -430,13 +430,13 @@ void QbsProject::updateCppCodeModel(const qbs::ProjectData *prj)
CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this);
pinfo.clearProjectParts();
- CPlusPlus::CppModelManagerInterface::ProjectPart::QtVersion qtVersionForPart
- = CPlusPlus::CppModelManagerInterface::ProjectPart::NoQt;
+ CPlusPlus::ProjectPart::QtVersion qtVersionForPart
+ = CPlusPlus::ProjectPart::NoQt;
if (qtVersion) {
if (qtVersion->qtVersion() < QtSupport::QtVersionNumber(5,0,0))
- qtVersionForPart = CPlusPlus::CppModelManagerInterface::ProjectPart::Qt4;
+ qtVersionForPart = CPlusPlus::ProjectPart::Qt4;
else
- qtVersionForPart = CPlusPlus::CppModelManagerInterface::ProjectPart::Qt5;
+ qtVersionForPart = CPlusPlus::ProjectPart::Qt5;
}
QStringList allFiles;
@@ -490,62 +490,24 @@ void QbsProject::updateCppCodeModel(const qbs::ProjectData *prj)
const QString pch = props.getModuleProperty(QLatin1String(CONFIG_CPP_MODULE),
QLatin1String(CONFIG_PRECOMPILEDHEADER)).toString();
- QStringList cxxSources;
- QStringList cSources;
- QStringList headers;
- QStringList objcSources;
- cxxSources << QLatin1String(CONFIGURATION_PATH);
- cSources << QLatin1String(CONFIGURATION_PATH);
- objcSources << QLatin1String(CONFIGURATION_PATH);
-
- foreach (const QString &file, grp.allFilePaths()) {
- QFileInfo fi = QFileInfo(file);
- if (!fi.exists())
- continue;
-
- Core::MimeType t = Core::ICore::mimeDatabase()->findByFile(fi);
- if (t.isNull())
- continue;
- if (t.matchesType(QLatin1String("text/x-chdr")))
- headers << file;
- else if (t.matchesType(QLatin1String("text/x-c++src")))
- cxxSources << file;
- else if (t.matchesType(QLatin1String("text/x-objcsrc")))
- objcSources << file;
- else if (t.matchesType(QLatin1String("text/x-csrc")))
- cxxSources << file;
- }
- allFiles.append(headers);
- allFiles.append(cSources);
- allFiles.append(cxxSources);
- allFiles.append(objcSources);
-
- if (cxxSources.count() > 1) {
- CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(new CPlusPlus::CppModelManagerInterface::ProjectPart);
- part->qtVersion = qtVersionForPart;
- part->language = isCxx11 ? CPlusPlus::CppModelManagerInterface::ProjectPart::CXX11
- : CPlusPlus::CppModelManagerInterface::ProjectPart::CXX;
- part->sourceFiles = cxxSources;
- part->objcSourceFiles = objcSources;
- part->headerFiles = headers;
- part->includePaths = grpIncludePaths;
- part->frameworkPaths = grpFrameworkPaths;
- part->precompiledHeaders = QStringList(pch);
- part->defines = grpDefines;
- pinfo.appendProjectPart(part);
- }
- if (cSources.count() > 1) {
- CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(new CPlusPlus::CppModelManagerInterface::ProjectPart);
- part->qtVersion = CPlusPlus::CppModelManagerInterface::ProjectPart::NoQt;
- part->language = CPlusPlus::CppModelManagerInterface::ProjectPart::C99; // FIXME: Can we find the exact c version from tc?
- part->sourceFiles = cxxSources;
- part->headerFiles = headers;
- part->includePaths = grpIncludePaths;
- part->frameworkPaths = grpFrameworkPaths;
- part->precompiledHeaders = QStringList(pch);
- part->defines = grpDefines;
- pinfo.appendProjectPart(part);
- }
+ CPlusPlus::ProjectPart::Ptr part(new CPlusPlus::ProjectPart);
+ CPlusPlus::ProjectFileAdder adder(part->files);
+ foreach (const QString &file, grp.allFilePaths())
+ if (adder.maybeAdd(file))
+ allFiles.append(file);
+ part->files << CPlusPlus::ProjectFile(QLatin1String(CONFIGURATION_PATH),
+ CPlusPlus::ProjectFile::CXXHeader);
+
+ part->qtVersion = qtVersionForPart;
+ // TODO: qbs has separate variable for CFLAGS
+ part->cVersion = CPlusPlus::ProjectPart::C99;
+ part->cxxVersion = isCxx11 ? CPlusPlus::ProjectPart::CXX11 : CPlusPlus::ProjectPart::CXX98;
+ // TODO: get the exact cxxExtensions from toolchain
+ part->includePaths = grpIncludePaths;
+ part->frameworkPaths = grpFrameworkPaths;
+ part->precompiledHeaders = QStringList(pch);
+ part->defines = grpDefines;
+ pinfo.appendProjectPart(part);
}
}
diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp
index 1618d46cb0..4aaeec3a37 100644
--- a/src/plugins/qt4projectmanager/qt4project.cpp
+++ b/src/plugins/qt4projectmanager/qt4project.cpp
@@ -491,7 +491,8 @@ void Qt4Project::updateCodeModels()
void Qt4Project::updateCppCodeModel()
{
- typedef CPlusPlus::CppModelManagerInterface::ProjectPart ProjectPart;
+ typedef CPlusPlus::ProjectPart ProjectPart;
+ typedef CPlusPlus::ProjectFile ProjectFile;
Kit *k = 0;
QtSupport::BaseQtVersion *qtVersion = 0;
@@ -567,20 +568,31 @@ void Qt4Project::updateCppCodeModel()
// part->language
if (tc)
- part->language = tc->compilerFlags(cxxflags) == ToolChain::STD_CXX11 ? ProjectPart::CXX11 : ProjectPart::CXX;
+ part->cxxVersion = (tc->compilerFlags(cxxflags) == ToolChain::STD_CXX11)
+ ? ProjectPart::CXX11 : ProjectPart::CXX98;
else
- part->language = CPlusPlus::CppModelManagerInterface::ProjectPart::CXX11;
+ part->cxxVersion = ProjectPart::CXX11;
- part->sourceFiles = pro->variableValue(CppSourceVar);
- part->headerFiles += pro->variableValue(CppHeaderVar);
- part->headerFiles += pro->uiFiles();
- part->sourceFiles.prepend(CPlusPlus::CppModelManagerInterface::configurationFileName());
- part->objcSourceFiles = pro->variableValue(ObjCSourceVar);
- pinfo.appendProjectPart(part);
+ foreach (const QString &file, pro->variableValue(CppSourceVar)) {
+ allFiles << file;
+ part->files << ProjectFile(file, ProjectFile::CXXSource);
+ }
+ foreach (const QString &file, pro->variableValue(CppHeaderVar)) {
+ allFiles << file;
+ part->files << ProjectFile(file, ProjectFile::CXXHeader);
+ }
+ foreach (const QString &file, pro->uiFiles()) {
+ allFiles << file;
+ part->files << ProjectFile(file, ProjectFile::CXXHeader);
+ }
- allFiles += part->headerFiles;
- allFiles += part->sourceFiles;
- allFiles += part->objcSourceFiles;
+ part->files.prepend(ProjectFile(CPlusPlus::CppModelManagerInterface::configurationFileName(),
+ ProjectFile::CXXSource));
+ foreach (const QString &file, pro->variableValue(ObjCSourceVar)) {
+ allFiles << file;
+ part->files << ProjectFile(file, ProjectFile::ObjCSource);
+ }
+ pinfo.appendProjectPart(part);
}
modelmanager->updateProjectInfo(pinfo);