summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2012-02-16 15:09:56 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2012-02-16 15:17:17 +0100
commit3aab8beaf4c585e66179f14fac2f63b51f034520 (patch)
treeaa9e45b3b8647ff76d421cc7ae0138c4531c9567 /src/plugins/cpptools
parent89e64b5aedf480133b0837d34408736220d593e3 (diff)
downloadqt-creator-3aab8beaf4c585e66179f14fac2f63b51f034520.tar.gz
Supply c++11 flags and per-project info to c++ code model.
A manual squash/merge of the changes below, plus a couple of subsequent code fixes. 59085aa5fbb99e2d786cd2c1a06c24a111ccb49f: Modify CppModel::ProjectInfo Adding per project node information, to pass on the correct defines/includes for each file, instead of aggregating them incorrectly. Also split up SOURCES and OBJECTIVE_SOURCES. Also ask the toolchain to convert the compilerflags to flags the codemodel understands, for now only gcc and only c++11. Also make the toolchain aware of the flags used to compile, so that it can emit the correct defines. Note: No header files are passed on. 74028802314cd4e75b41b46407433e07090a304d: GCC: Evaluate cxxflags when checking for predefined macros ebaaa4957e4c02cc9637a998eddae1d0acd74f83: MSVC: Take cxxflags into account when checking for predefined macros 9bfce7e889bcf7bcc47bf880e3ea25945ca7d0d7: Compile fixes Change-Id: I9de94ad038dfc5dc1987732e84b13fb4419c96f5 Reviewed-by: Erik Verbruggen <erik.verbruggen@nokia.com>
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r--src/plugins/cpptools/cppcompletionsupport.cpp4
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp95
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h5
-rw-r--r--src/plugins/cpptools/cpptoolsreuse.cpp21
-rw-r--r--src/plugins/cpptools/cpptoolsreuse.h1
5 files changed, 114 insertions, 12 deletions
diff --git a/src/plugins/cpptools/cppcompletionsupport.cpp b/src/plugins/cpptools/cppcompletionsupport.cpp
index 9246708c11..e68073fcee 100644
--- a/src/plugins/cpptools/cppcompletionsupport.cpp
+++ b/src/plugins/cpptools/cppcompletionsupport.cpp
@@ -58,8 +58,8 @@ TextEditor::IAssistInterface *CppCompletionSupport::createAssistInterface(Projec
QStringList includePaths;
QStringList frameworkPaths;
if (project) {
- includePaths = modelManager->projectInfo(project).includePaths;
- frameworkPaths = modelManager->projectInfo(project).frameworkPaths;
+ includePaths = modelManager->projectInfo(project).includePaths();
+ frameworkPaths = modelManager->projectInfo(project).frameworkPaths();
}
return new CppTools::Internal::CppCompletionAssistInterface(
document,
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index b3df985303..2429265fb6 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -90,6 +90,34 @@
#include <iostream>
#include <sstream>
+namespace CPlusPlus {
+uint qHash(const CppModelManagerInterface::ProjectPart &p)
+{
+ uint h = qHash(p.defines) ^ p.language ^ p.flags;
+
+ foreach (const QString &i, p.includePaths)
+ h ^= qHash(i);
+
+ foreach (const QString &f, p.frameworkPaths)
+ h ^= qHash(f);
+
+ return h;
+}
+bool operator==(const CppModelManagerInterface::ProjectPart &p1,
+ const CppModelManagerInterface::ProjectPart &p2)
+{
+ if (p1.defines != p2.defines)
+ return false;
+ if (p1.language != p2.language)
+ return false;
+ if (p1.flags != p2.flags)
+ return false;
+ if (p1.includePaths != p2.includePaths)
+ return false;
+ return p1.frameworkPaths == p2.frameworkPaths;
+}
+} // namespace CPlusPlus
+
using namespace CppTools;
using namespace CppTools::Internal;
using namespace CPlusPlus;
@@ -733,7 +761,8 @@ QStringList CppModelManager::internalProjectFiles() const
while (it.hasNext()) {
it.next();
ProjectInfo pinfo = it.value();
- files += pinfo.sourceFiles;
+ foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
+ files += part->sourceFiles;
}
files.removeDuplicates();
return files;
@@ -746,7 +775,8 @@ QStringList CppModelManager::internalIncludePaths() const
while (it.hasNext()) {
it.next();
ProjectInfo pinfo = it.value();
- includePaths += pinfo.includePaths;
+ foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
+ includePaths += part->includePaths;
}
includePaths.removeDuplicates();
return includePaths;
@@ -759,7 +789,8 @@ QStringList CppModelManager::internalFrameworkPaths() const
while (it.hasNext()) {
it.next();
ProjectInfo pinfo = it.value();
- frameworkPaths += pinfo.frameworkPaths;
+ foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
+ frameworkPaths += part->frameworkPaths;
}
frameworkPaths.removeDuplicates();
return frameworkPaths;
@@ -772,7 +803,8 @@ QByteArray CppModelManager::internalDefinedMacros() const
while (it.hasNext()) {
it.next();
ProjectInfo pinfo = it.value();
- macros += pinfo.defines;
+ foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
+ macros += part->defines;
}
return macros;
}
@@ -860,13 +892,66 @@ CppModelManager::ProjectInfo CppModelManager::projectInfo(ProjectExplorer::Proje
void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo)
{
+#if 0
+ // Tons of debug output...
+ qDebug()<<"========= CppModelManager::updateProjectInfo ======";
+ qDebug()<<" for project:"<< pinfo.project.data()->file()->fileName();
+ foreach (const ProjectPart::Ptr &part, pinfo.projectParts) {
+ qDebug() << "=== part ===";
+ qDebug() << "language:" << (part->language == CXX ? "C++" : "ObjC++");
+ qDebug() << "compilerflags:" << part->flags;
+ qDebug() << "precompiled header:" << part->precompiledHeaders;
+ qDebug() << "defines:" << part->defines;
+ qDebug() << "includes:" << part->includePaths;
+ qDebug() << "frameworkPaths:" << part->frameworkPaths;
+ qDebug() << "sources:" << part->sourceFiles;
+ qDebug() << "";
+ }
+
+ qDebug() << "";
+#endif
QMutexLocker locker(&mutex);
if (! pinfo.isValid())
return;
- m_projects.insert(pinfo.project, pinfo);
+ ProjectExplorer::Project *project = pinfo.project().data();
+ m_projects.insert(project, pinfo);
m_dirty = true;
+
+ m_srcToProjectPart.clear();
+
+ foreach (const ProjectPart::Ptr &projectPart, pinfo.projectParts()) {
+ foreach (const QString &sourceFile, projectPart->sourceFiles) {
+ m_srcToProjectPart[sourceFile].append(projectPart);
+ }
+ }
+}
+
+QList<CppModelManager::ProjectPart::Ptr> CppModelManager::projectPart(const QString &fileName) const
+{
+ QList<CppModelManager::ProjectPart::Ptr> parts = m_srcToProjectPart.value(fileName);
+ if (!parts.isEmpty())
+ return parts;
+
+ //### FIXME: This is a DIRTY hack!
+ if (fileName.endsWith(".h")) {
+ QString cppFile = fileName.mid(0, fileName.length() - 2) + QLatin1String(".cpp");
+ parts = m_srcToProjectPart.value(cppFile);
+ if (!parts.isEmpty())
+ return parts;
+ }
+
+ DependencyTable table;
+ table.build(snapshot());
+ QStringList deps = table.filesDependingOn(fileName);
+ foreach (const QString &dep, deps) {
+ parts = m_srcToProjectPart.value(dep);
+ if (!parts.isEmpty())
+ return parts;
+ }
+
+ return parts;
}
QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles)
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 025e066231..d56045c2e9 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -83,7 +83,7 @@ class CppPreprocessor;
class CppFindReferences;
#ifndef ICHECK_BUILD
-class CppModelManager : public CPlusPlus::CppModelManagerInterface
+class CPPTOOLS_EXPORT CppModelManager : public CPlusPlus::CppModelManagerInterface
{
Q_OBJECT
@@ -99,6 +99,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 CPlusPlus::Snapshot snapshot() const;
virtual void GC();
@@ -237,6 +238,8 @@ private:
mutable QMutex protectExtraDiagnostics;
QHash<QString, QHash<int, QList<CPlusPlus::Document::DiagnosticMessage> > > m_extraDiagnostics;
+
+ QMap<QString, QList<ProjectPart::Ptr> > m_srcToProjectPart;
};
#endif
diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp
index 4b7713cf7e..305e84aded 100644
--- a/src/plugins/cpptools/cpptoolsreuse.cpp
+++ b/src/plugins/cpptools/cpptoolsreuse.cpp
@@ -45,18 +45,31 @@ using namespace CPlusPlus;
namespace CppTools {
-void moveCursorToEndOfIdentifier(QTextCursor *tc) {
+static void moveCursorToStartOrEndOfIdentifier(QTextCursor *tc,
+ QTextCursor::MoveOperation op,
+ int posDiff = 0)
+{
QTextDocument *doc = tc->document();
if (!doc)
return;
- QChar ch = doc->characterAt(tc->position());
+ QChar ch = doc->characterAt(tc->position() - posDiff);
while (ch.isLetterOrNumber() || ch == QLatin1Char('_')) {
- tc->movePosition(QTextCursor::NextCharacter);
- ch = doc->characterAt(tc->position());
+ tc->movePosition(op);
+ ch = doc->characterAt(tc->position() - posDiff);
}
}
+void moveCursorToEndOfIdentifier(QTextCursor *tc)
+{
+ moveCursorToStartOrEndOfIdentifier(tc, QTextCursor::NextCharacter);
+}
+
+void moveCursorToStartOfIdentifier(QTextCursor *tc)
+{
+ moveCursorToStartOrEndOfIdentifier(tc, QTextCursor::PreviousCharacter, 1);
+}
+
static bool isOwnershipRAIIName(const QString &name)
{
static QSet<QString> knownNames;
diff --git a/src/plugins/cpptools/cpptoolsreuse.h b/src/plugins/cpptools/cpptoolsreuse.h
index 170f601bf5..6bdfb1bec6 100644
--- a/src/plugins/cpptools/cpptoolsreuse.h
+++ b/src/plugins/cpptools/cpptoolsreuse.h
@@ -45,6 +45,7 @@ class LookupContext;
namespace CppTools {
void CPPTOOLS_EXPORT moveCursorToEndOfIdentifier(QTextCursor *tc);
+void CPPTOOLS_EXPORT moveCursorToStartOfIdentifier(QTextCursor *tc);
bool CPPTOOLS_EXPORT isOwnershipRAIIType(CPlusPlus::Symbol *symbol,
const CPlusPlus::LookupContext &context);