diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2012-02-16 15:09:56 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2012-02-16 15:17:17 +0100 |
commit | 3aab8beaf4c585e66179f14fac2f63b51f034520 (patch) | |
tree | aa9e45b3b8647ff76d421cc7ae0138c4531c9567 /src/plugins/cpptools | |
parent | 89e64b5aedf480133b0837d34408736220d593e3 (diff) | |
download | qt-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.cpp | 4 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 95 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.h | 5 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsreuse.cpp | 21 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsreuse.h | 1 |
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); |