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>
This commit is contained in:
Erik Verbruggen
2012-02-16 15:09:56 +01:00
parent 89e64b5aed
commit 3aab8beaf4
31 changed files with 519 additions and 195 deletions

View File

@@ -32,6 +32,8 @@
#include "ModelManagerInterface.h" #include "ModelManagerInterface.h"
#include <QtCore/QSet>
using namespace CPlusPlus; using namespace CPlusPlus;
static CppModelManagerInterface *g_instance = 0; static CppModelManagerInterface *g_instance = 0;
@@ -54,3 +56,44 @@ CppModelManagerInterface *CppModelManagerInterface::instance()
return g_instance; return g_instance;
} }
void CppModelManagerInterface::ProjectInfo::clearProjectParts()
{
m_projectParts.clear();
m_includePaths.clear();
m_frameworkPaths.clear();
m_sourceFiles.clear();
m_defines.clear();
}
void CppModelManagerInterface::ProjectInfo::appendProjectPart(
const CppModelManagerInterface::ProjectPart::Ptr &part)
{
if (!part)
return;
m_projectParts.append(part);
// update include paths
QSet<QString> incs = QSet<QString>::fromList(m_includePaths);
foreach (const QString &ins, part->includePaths)
incs.insert(ins);
m_includePaths = incs.toList();
// update framework paths
QSet<QString> frms = QSet<QString>::fromList(m_frameworkPaths);
foreach (const QString &frm, part->frameworkPaths)
frms.insert(frm);
m_frameworkPaths = frms.toList();
// update source files
QSet<QString> srcs = QSet<QString>::fromList(m_sourceFiles);
foreach (const QString &src, part->sourceFiles)
srcs.insert(src);
m_sourceFiles = srcs.toList();
// update defines
if (!m_defines.isEmpty())
m_defines.append('\n');
m_defines.append(part->defines);
}

View File

@@ -35,6 +35,9 @@
#include <cplusplus/CppDocument.h> #include <cplusplus/CppDocument.h>
#include <languageutils/fakemetaobject.h> #include <languageutils/fakemetaobject.h>
#include <projectexplorer/project.h>
#include <projectexplorer/toolchain.h>
#include <QObject> #include <QObject>
#include <QHash> #include <QHash>
#include <QPointer> #include <QPointer>
@@ -66,33 +69,88 @@ class CPLUSPLUS_EXPORT CppModelManagerInterface : public QObject
Q_OBJECT Q_OBJECT
public: public:
enum Language { CXX, OBJC };
class CPLUSPLUS_EXPORT ProjectPart
{
public:
ProjectPart()
: qtVersion(UnknownQt)
{}
public: //attributes
QStringList sourceFiles;
QByteArray defines;
QStringList includePaths;
QStringList frameworkPaths;
QStringList precompiledHeaders;
Language language;
ProjectExplorer::ToolChain::CompilerFlags flags;
enum QtVersion {
UnknownQt = -1,
NoQt = 0,
Qt4 = 1,
Qt5 = 2
};
QtVersion qtVersion;
bool cpp0xEnabled() const
{ return flags == ProjectExplorer::ToolChain::STD_CXX11; }
bool objcEnabled() const
{ return language == CppModelManagerInterface::OBJC; }
typedef QSharedPointer<ProjectPart> Ptr;
};
class ProjectInfo class ProjectInfo
{ {
public: public:
ProjectInfo() ProjectInfo()
{ } { }
ProjectInfo(QPointer<ProjectExplorer::Project> project) ProjectInfo(QWeakPointer<ProjectExplorer::Project> project)
: project(project) : m_project(project)
{ } { }
operator bool() const operator bool() const
{ return ! project.isNull(); } { return ! m_project.isNull(); }
bool isValid() const bool isValid() const
{ return ! project.isNull(); } { return ! m_project.isNull(); }
bool isNull() const bool isNull() const
{ return project.isNull(); } { return m_project.isNull(); }
public: // attributes QWeakPointer<ProjectExplorer::Project> project() const
QPointer<ProjectExplorer::Project> project; { return m_project; }
QString projectPath;
QByteArray defines; const QList<ProjectPart::Ptr> projectParts() const
QStringList sourceFiles; { return m_projectParts; }
QStringList includePaths;
QStringList frameworkPaths; void clearProjectParts();
QStringList precompiledHeaders; void appendProjectPart(const ProjectPart::Ptr &part);
const QStringList includePaths() const
{ return m_includePaths; }
const QStringList frameworkPaths() const
{ return m_frameworkPaths; }
const QStringList sourceFiles() const
{ return m_sourceFiles; }
const QByteArray defines() const
{ return m_defines; }
private: // attributes
QWeakPointer<ProjectExplorer::Project> m_project;
QList<ProjectPart::Ptr> m_projectParts;
// the attributes below are calculated from the project parts.
QStringList m_includePaths;
QStringList m_frameworkPaths;
QStringList m_sourceFiles;
QByteArray m_defines;
}; };
class WorkingCopy class WorkingCopy
@@ -110,6 +168,9 @@ public:
QPair<QString, unsigned> get(const QString &fileName) const QPair<QString, unsigned> get(const QString &fileName) const
{ return _elements.value(fileName); } { return _elements.value(fileName); }
QHashIterator<QString, QPair<QString, unsigned> > iterator() const
{ return QHashIterator<QString, QPair<QString, unsigned> >(_elements); }
private: private:
typedef QHash<QString, QPair<QString, unsigned> > Table; typedef QHash<QString, QPair<QString, unsigned> > Table;
Table _elements; Table _elements;
@@ -135,6 +196,7 @@ public:
virtual QList<ProjectInfo> projectInfos() const = 0; virtual QList<ProjectInfo> projectInfos() const = 0;
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0; virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const = 0;
virtual void updateProjectInfo(const ProjectInfo &pinfo) = 0; virtual void updateProjectInfo(const ProjectInfo &pinfo) = 0;
virtual QList<ProjectPart::Ptr> projectPart(const QString &fileName) const = 0;
virtual void addEditorSupport(CppTools::AbstractEditorSupport *editorSupport) = 0; virtual void addEditorSupport(CppTools::AbstractEditorSupport *editorSupport) = 0;
virtual void removeEditorSupport(CppTools::AbstractEditorSupport *editorSupport) = 0; virtual void removeEditorSupport(CppTools::AbstractEditorSupport *editorSupport) = 0;

View File

@@ -513,19 +513,23 @@ void AutotoolsProject::updateCppCodeModel()
CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelManager->projectInfo(this); CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelManager->projectInfo(this);
const bool update = (pinfo.includePaths != allIncludePaths) const bool update = (pinfo.includePaths() != allIncludePaths)
|| (pinfo.sourceFiles != m_files) || (pinfo.sourceFiles() != m_files)
|| (pinfo.defines != m_toolChain->predefinedMacros()) || (pinfo.defines() != m_toolChain->predefinedMacros(QStringList()))
|| (pinfo.frameworkPaths != allFrameworkPaths); || (pinfo.frameworkPaths() != allFrameworkPaths);
if (update) { if (update) {
pinfo.includePaths = allIncludePaths; pinfo.clearProjectParts();
pinfo.sourceFiles = m_files; CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
new CPlusPlus::CppModelManagerInterface::ProjectPart);
part->includePaths = allIncludePaths;
part->sourceFiles = m_files;
if (m_toolChain) if (m_toolChain)
pinfo.defines = m_toolChain->predefinedMacros(); part->defines = m_toolChain->predefinedMacros(QStringList());
pinfo.frameworkPaths = allFrameworkPaths; part->frameworkPaths = allFrameworkPaths;
modelManager->updateProjectInfo(pinfo); part->language = CPlusPlus::CppModelManagerInterface::CXX;
modelManager->updateSourceFiles(pinfo.sourceFiles); pinfo.appendProjectPart(part);
}
modelManager->updateProjectInfo(pinfo); modelManager->updateProjectInfo(pinfo);
modelManager->updateSourceFiles(m_files);
}
} }

View File

@@ -307,18 +307,23 @@ bool CMakeProject::parseCMakeLists()
CPlusPlus::CppModelManagerInterface::instance(); CPlusPlus::CppModelManagerInterface::instance();
if (modelmanager) { if (modelmanager) {
CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this); CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this);
if (pinfo.includePaths != allIncludePaths if (pinfo.includePaths() != allIncludePaths
|| pinfo.sourceFiles != m_files || pinfo.sourceFiles() != m_files
|| pinfo.defines != (activeBC->toolChain() ? activeBC->toolChain()->predefinedMacros() : QByteArray()) || pinfo.defines() != (activeBC->toolChain() ? activeBC->toolChain()->predefinedMacros(QStringList()) : QByteArray())
|| pinfo.frameworkPaths != allFrameworkPaths) { || pinfo.frameworkPaths() != allFrameworkPaths) {
pinfo.includePaths = allIncludePaths; pinfo.clearProjectParts();
CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
new CPlusPlus::CppModelManagerInterface::ProjectPart);
part->includePaths = allIncludePaths;
// TODO we only want C++ files, not all other stuff that might be in the project // TODO we only want C++ files, not all other stuff that might be in the project
pinfo.sourceFiles = m_files; part->sourceFiles = m_files;
pinfo.defines = (activeBC->toolChain() ? activeBC->toolChain()->predefinedMacros() : QByteArray()); // TODO this is to simplistic part->defines = (activeBC->toolChain() ? activeBC->toolChain()->predefinedMacros(QStringList()) : QByteArray()); // TODO this is to simplistic
pinfo.frameworkPaths = allFrameworkPaths; part->frameworkPaths = allFrameworkPaths;
part->language = CPlusPlus::CppModelManagerInterface::CXX;
pinfo.appendProjectPart(part);
modelmanager->updateProjectInfo(pinfo); modelmanager->updateProjectInfo(pinfo);
m_codeModelFuture.cancel(); m_codeModelFuture.cancel();
m_codeModelFuture = modelmanager->updateSourceFiles(pinfo.sourceFiles); m_codeModelFuture = modelmanager->updateSourceFiles(m_files);
} }
} }
emit buildTargetsChanged(); emit buildTargetsChanged();

View File

@@ -1863,15 +1863,19 @@ public:
QList<CppModelManagerInterface::ProjectInfo> projectInfos = modelManager->projectInfos(); QList<CppModelManagerInterface::ProjectInfo> projectInfos = modelManager->projectInfos();
bool inProject = false; bool inProject = false;
foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) { foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) {
if (info.sourceFiles.contains(doc->fileName())) { foreach (CppModelManagerInterface::ProjectPart::Ptr part, info.projectParts()) {
if (part->sourceFiles.contains(doc->fileName())) {
inProject = true; inProject = true;
includePaths += info.includePaths; includePaths += part->includePaths;
}
} }
} }
if (!inProject) { if (!inProject) {
// better use all include paths than none // better use all include paths than none
foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) {
includePaths += info.includePaths; foreach (CppModelManagerInterface::ProjectPart::Ptr part, info.projectParts())
includePaths += part->includePaths;
}
} }
// find a include file through the locator // find a include file through the locator

View File

@@ -58,8 +58,8 @@ TextEditor::IAssistInterface *CppCompletionSupport::createAssistInterface(Projec
QStringList includePaths; QStringList includePaths;
QStringList frameworkPaths; QStringList frameworkPaths;
if (project) { if (project) {
includePaths = modelManager->projectInfo(project).includePaths; includePaths = modelManager->projectInfo(project).includePaths();
frameworkPaths = modelManager->projectInfo(project).frameworkPaths; frameworkPaths = modelManager->projectInfo(project).frameworkPaths();
} }
return new CppTools::Internal::CppCompletionAssistInterface( return new CppTools::Internal::CppCompletionAssistInterface(
document, document,

View File

@@ -90,6 +90,34 @@
#include <iostream> #include <iostream>
#include <sstream> #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;
using namespace CppTools::Internal; using namespace CppTools::Internal;
using namespace CPlusPlus; using namespace CPlusPlus;
@@ -733,7 +761,8 @@ QStringList CppModelManager::internalProjectFiles() const
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
ProjectInfo pinfo = it.value(); ProjectInfo pinfo = it.value();
files += pinfo.sourceFiles; foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
files += part->sourceFiles;
} }
files.removeDuplicates(); files.removeDuplicates();
return files; return files;
@@ -746,7 +775,8 @@ QStringList CppModelManager::internalIncludePaths() const
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
ProjectInfo pinfo = it.value(); ProjectInfo pinfo = it.value();
includePaths += pinfo.includePaths; foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
includePaths += part->includePaths;
} }
includePaths.removeDuplicates(); includePaths.removeDuplicates();
return includePaths; return includePaths;
@@ -759,7 +789,8 @@ QStringList CppModelManager::internalFrameworkPaths() const
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
ProjectInfo pinfo = it.value(); ProjectInfo pinfo = it.value();
frameworkPaths += pinfo.frameworkPaths; foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
frameworkPaths += part->frameworkPaths;
} }
frameworkPaths.removeDuplicates(); frameworkPaths.removeDuplicates();
return frameworkPaths; return frameworkPaths;
@@ -772,7 +803,8 @@ QByteArray CppModelManager::internalDefinedMacros() const
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
ProjectInfo pinfo = it.value(); ProjectInfo pinfo = it.value();
macros += pinfo.defines; foreach (const ProjectPart::Ptr &part, pinfo.projectParts())
macros += part->defines;
} }
return macros; return macros;
} }
@@ -860,13 +892,66 @@ CppModelManager::ProjectInfo CppModelManager::projectInfo(ProjectExplorer::Proje
void CppModelManager::updateProjectInfo(const ProjectInfo &pinfo) 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); QMutexLocker locker(&mutex);
if (! pinfo.isValid()) if (! pinfo.isValid())
return; return;
m_projects.insert(pinfo.project, pinfo); ProjectExplorer::Project *project = pinfo.project().data();
m_projects.insert(project, pinfo);
m_dirty = true; 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) QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles)

View File

@@ -83,7 +83,7 @@ class CppPreprocessor;
class CppFindReferences; class CppFindReferences;
#ifndef ICHECK_BUILD #ifndef ICHECK_BUILD
class CppModelManager : public CPlusPlus::CppModelManagerInterface class CPPTOOLS_EXPORT CppModelManager : public CPlusPlus::CppModelManagerInterface
{ {
Q_OBJECT Q_OBJECT
@@ -99,6 +99,7 @@ public:
virtual QList<ProjectInfo> projectInfos() const; virtual QList<ProjectInfo> projectInfos() const;
virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const; virtual ProjectInfo projectInfo(ProjectExplorer::Project *project) const;
virtual void updateProjectInfo(const ProjectInfo &pinfo); virtual void updateProjectInfo(const ProjectInfo &pinfo);
virtual QList<ProjectPart::Ptr> projectPart(const QString &fileName) const;
virtual CPlusPlus::Snapshot snapshot() const; virtual CPlusPlus::Snapshot snapshot() const;
virtual void GC(); virtual void GC();
@@ -237,6 +238,8 @@ private:
mutable QMutex protectExtraDiagnostics; mutable QMutex protectExtraDiagnostics;
QHash<QString, QHash<int, QList<CPlusPlus::Document::DiagnosticMessage> > > m_extraDiagnostics; QHash<QString, QHash<int, QList<CPlusPlus::Document::DiagnosticMessage> > > m_extraDiagnostics;
QMap<QString, QList<ProjectPart::Ptr> > m_srcToProjectPart;
}; };
#endif #endif

View File

@@ -45,18 +45,31 @@ using namespace CPlusPlus;
namespace CppTools { namespace CppTools {
void moveCursorToEndOfIdentifier(QTextCursor *tc) { static void moveCursorToStartOrEndOfIdentifier(QTextCursor *tc,
QTextCursor::MoveOperation op,
int posDiff = 0)
{
QTextDocument *doc = tc->document(); QTextDocument *doc = tc->document();
if (!doc) if (!doc)
return; return;
QChar ch = doc->characterAt(tc->position()); QChar ch = doc->characterAt(tc->position() - posDiff);
while (ch.isLetterOrNumber() || ch == QLatin1Char('_')) { while (ch.isLetterOrNumber() || ch == QLatin1Char('_')) {
tc->movePosition(QTextCursor::NextCharacter); tc->movePosition(op);
ch = doc->characterAt(tc->position()); 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 bool isOwnershipRAIIName(const QString &name)
{ {
static QSet<QString> knownNames; static QSet<QString> knownNames;

View File

@@ -45,6 +45,7 @@ class LookupContext;
namespace CppTools { namespace CppTools {
void CPPTOOLS_EXPORT moveCursorToEndOfIdentifier(QTextCursor *tc); void CPPTOOLS_EXPORT moveCursorToEndOfIdentifier(QTextCursor *tc);
void CPPTOOLS_EXPORT moveCursorToStartOfIdentifier(QTextCursor *tc);
bool CPPTOOLS_EXPORT isOwnershipRAIIType(CPlusPlus::Symbol *symbol, bool CPPTOOLS_EXPORT isOwnershipRAIIType(CPlusPlus::Symbol *symbol,
const CPlusPlus::LookupContext &context); const CPlusPlus::LookupContext &context);

View File

@@ -257,30 +257,33 @@ void GenericProject::refresh(RefreshOptions options)
if (modelManager) { if (modelManager) {
CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelManager->projectInfo(this); CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelManager->projectInfo(this);
pinfo.clearProjectParts();
CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
new CPlusPlus::CppModelManagerInterface::ProjectPart);
if (m_toolChain) { if (m_toolChain) {
pinfo.defines = m_toolChain->predefinedMacros(); part->defines = m_toolChain->predefinedMacros(QStringList());
pinfo.defines += '\n'; part->defines += '\n';
foreach (const HeaderPath &headerPath, m_toolChain->systemHeaderPaths()) { foreach (const HeaderPath &headerPath, m_toolChain->systemHeaderPaths()) {
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath) if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
pinfo.frameworkPaths.append(headerPath.path()); part->frameworkPaths.append(headerPath.path());
else else
pinfo.includePaths.append(headerPath.path()); part->includePaths.append(headerPath.path());
} }
} }
pinfo.includePaths += allIncludePaths(); part->includePaths += allIncludePaths();
pinfo.defines += m_defines; part->defines += m_defines;
// ### add _defines. // ### add _defines.
pinfo.sourceFiles = files(); part->sourceFiles = files();
pinfo.sourceFiles += generated(); part->sourceFiles += generated();
QStringList filesToUpdate; QStringList filesToUpdate;
if (options & Configuration) { if (options & Configuration) {
filesToUpdate = pinfo.sourceFiles; filesToUpdate = part->sourceFiles;
filesToUpdate.append(QLatin1String("<configuration>")); // XXX don't hardcode configuration file name filesToUpdate.append(QLatin1String("<configuration>")); // XXX don't hardcode configuration file name
// Full update, if there's a code model update, cancel it // Full update, if there's a code model update, cancel it
m_codeModelFuture.cancel(); m_codeModelFuture.cancel();
@@ -291,6 +294,8 @@ void GenericProject::refresh(RefreshOptions options)
filesToUpdate.append(newFileList.toList()); filesToUpdate.append(newFileList.toList());
} }
pinfo.appendProjectPart(part);
modelManager->updateProjectInfo(pinfo); modelManager->updateProjectInfo(pinfo);
m_codeModelFuture = modelManager->updateSourceFiles(filesToUpdate); m_codeModelFuture = modelManager->updateSourceFiles(filesToUpdate);
} }

View File

@@ -85,16 +85,22 @@ bool AbstractMsvcToolChain::isValid() const
return !m_vcvarsBat.isEmpty(); return !m_vcvarsBat.isEmpty();
} }
QByteArray AbstractMsvcToolChain::predefinedMacros() const QByteArray AbstractMsvcToolChain::predefinedMacros(const QStringList &cxxflags) const
{ {
if (m_predefinedMacros.isEmpty()) { if (m_predefinedMacros.isEmpty()) {
Utils::Environment env(m_lastEnvironment); Utils::Environment env(m_lastEnvironment);
addToEnvironment(env); addToEnvironment(env);
m_predefinedMacros = msvcPredefinedMacros(env); m_predefinedMacros = msvcPredefinedMacros(cxxflags, env);
} }
return m_predefinedMacros; return m_predefinedMacros;
} }
ToolChain::CompilerFlags AbstractMsvcToolChain::compilerFlags(const QStringList &cxxflags) const
{
Q_UNUSED(cxxflags);
return NO_FLAGS;
}
QList<HeaderPath> AbstractMsvcToolChain::systemHeaderPaths() const QList<HeaderPath> AbstractMsvcToolChain::systemHeaderPaths() const
{ {
if (m_headerPaths.isEmpty()) { if (m_headerPaths.isEmpty()) {
@@ -118,7 +124,6 @@ void AbstractMsvcToolChain::addToEnvironment(Utils::Environment &env) const
env = m_resultEnvironment; env = m_resultEnvironment;
} }
QString AbstractMsvcToolChain::makeCommand() const QString AbstractMsvcToolChain::makeCommand() const
{ {
if (ProjectExplorerPlugin::instance()->projectExplorerSettings().useJom) { if (ProjectExplorerPlugin::instance()->projectExplorerSettings().useJom) {
@@ -158,9 +163,12 @@ bool AbstractMsvcToolChain::canClone() const
return true; return true;
} }
QByteArray AbstractMsvcToolChain::msvcPredefinedMacros(const Utils::Environment& env) const QByteArray AbstractMsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment& env) const
{ {
Q_UNUSED(cxxflags);
Q_UNUSED(env); Q_UNUSED(env);
QByteArray predefinedMacros = "#define __MSVCRT__\n" QByteArray predefinedMacros = "#define __MSVCRT__\n"
"#define __w64\n" "#define __w64\n"
"#define __int64 long long\n" "#define __int64 long long\n"

View File

@@ -50,11 +50,12 @@ public:
Abi targetAbi() const; Abi targetAbi() const;
bool isValid() const; bool isValid() const;
QByteArray predefinedMacros() const;
QByteArray predefinedMacros(const QStringList &cxxflags) const;
CompilerFlags compilerFlags(const QStringList &cxxflags) const;
QList<HeaderPath> systemHeaderPaths() const; QList<HeaderPath> systemHeaderPaths() const;
void addToEnvironment(Utils::Environment &env) const; void addToEnvironment(Utils::Environment &env) const;
QString makeCommand() const; QString makeCommand() const;
void setDebuggerCommand(const Utils::FileName &d); void setDebuggerCommand(const Utils::FileName &d);
@@ -71,7 +72,8 @@ public:
protected: protected:
virtual Utils::Environment readEnvironmentSetting(Utils::Environment& env) const = 0; virtual Utils::Environment readEnvironmentSetting(Utils::Environment& env) const = 0;
virtual QByteArray msvcPredefinedMacros(const Utils::Environment& env) const; virtual QByteArray msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment& env) const;
bool generateEnvironmentSettings(Utils::Environment &env, bool generateEnvironmentSettings(Utils::Environment &env,
const QString& batchFile, const QString& batchFile,

View File

@@ -95,13 +95,39 @@ static QByteArray runGcc(const Utils::FileName &gcc, const QStringList &argument
return cpp.readAllStandardOutput() + '\n' + cpp.readAllStandardError(); return cpp.readAllStandardOutput() + '\n' + cpp.readAllStandardError();
} }
static QByteArray gccPredefinedMacros(const Utils::FileName &gcc, const QStringList &env) static QByteArray gccPredefinedMacros(const Utils::FileName &gcc, const QStringList &args, const QStringList &env)
{ {
QStringList arguments; QStringList arguments;
arguments << QLatin1String("-xc++") arguments << QLatin1String("-xc++")
<< QLatin1String("-E") << QLatin1String("-E")
<< QLatin1String("-dM") << QLatin1String("-dM");
<< QLatin1String("-"); foreach (const QString &a, args) {
if (a == QLatin1String("-m128bit-long-double") || a == QLatin1String("-m32")
|| a == QLatin1String("-m3dnow") || a == QLatin1String("-m3dnowa")
|| a == QLatin1String("-m64") || a == QLatin1String("-m96bit-long-double")
|| a == QLatin1String("-mabm") || a == QLatin1String("-maes")
|| a.startsWith(QLatin1String("-march=")) || a == QLatin1String("-mavx")
|| a.startsWith(QLatin1String("-masm=")) || a == QLatin1String("-mcx16")
|| a == QLatin1String("-mfma") || a == QLatin1String("-mfma4")
|| a == QLatin1String("-mlwp") || a == QLatin1String("-mpclmul")
|| a == QLatin1String("-mpopcnt") || a == QLatin1String("-msse")
|| a == QLatin1String("-msse2") || a == QLatin1String("-msse2avx")
|| a == QLatin1String("-msse3") || a == QLatin1String("-msse4")
|| a == QLatin1String("-msse4.1") || a == QLatin1String("-msse4.2")
|| a == QLatin1String("-msse4a") || a == QLatin1String("-mssse3")
|| a.startsWith(QLatin1String("-mtune=")) || a == QLatin1String("-mxop")
|| a == QLatin1String("-Os") || a == QLatin1String("-O0") || a == QLatin1String("-O1")
|| a == QLatin1String("-O2") || a == QLatin1String("-O3")
|| a == QLatin1String("-ffinite-math-only") || a == QLatin1String("-fshort-double")
|| a == QLatin1String("-fshort-wchar") || a == QLatin1String("-fsignaling-nans")
|| a.startsWith(QLatin1String("-std=")) || a.startsWith(QLatin1String("-specs="))
|| a == QLatin1String("-ansi")
|| a.startsWith(QLatin1String("-D")) || a.startsWith(QLatin1String("-U"))
|| a == QLatin1String("-undef"))
arguments << a;
}
arguments << QLatin1String("-");
QByteArray predefinedMacros = runGcc(gcc, arguments, env); QByteArray predefinedMacros = runGcc(gcc, arguments, env);
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
@@ -295,7 +321,7 @@ GccToolChain::GccToolChain(const QString &id, bool autodetect) :
GccToolChain::GccToolChain(const GccToolChain &tc) : GccToolChain::GccToolChain(const GccToolChain &tc) :
ToolChain(tc), ToolChain(tc),
m_predefinedMacros(tc.predefinedMacros()), m_predefinedMacros(tc.predefinedMacros(QStringList())),
m_compilerCommand(tc.compilerCommand()), m_compilerCommand(tc.compilerCommand()),
m_debuggerCommand(tc.debuggerCommand()), m_debuggerCommand(tc.debuggerCommand()),
m_targetAbi(tc.m_targetAbi), m_targetAbi(tc.m_targetAbi),
@@ -363,17 +389,24 @@ bool GccToolChain::isValid() const
return !m_compilerCommand.isNull(); return !m_compilerCommand.isNull();
} }
QByteArray GccToolChain::predefinedMacros() const QByteArray GccToolChain::predefinedMacros(const QStringList &cxxflags) const
{ {
if (m_predefinedMacros.isEmpty()) { if (m_predefinedMacros.isEmpty()) {
// Using a clean environment breaks ccache/distcc/etc. // Using a clean environment breaks ccache/distcc/etc.
Utils::Environment env = Utils::Environment::systemEnvironment(); Utils::Environment env = Utils::Environment::systemEnvironment();
addToEnvironment(env); addToEnvironment(env);
m_predefinedMacros = gccPredefinedMacros(m_compilerCommand, env.toStringList()); m_predefinedMacros = gccPredefinedMacros(m_compilerCommand, cxxflags, env.toStringList());
} }
return m_predefinedMacros; return m_predefinedMacros;
} }
ProjectExplorer::ToolChain::CompilerFlags GccToolChain::compilerFlags(const QStringList &cxxflags) const
{
if (cxxflags.contains("-std=c++0x") || cxxflags.contains("-std=gnu++0x"))
return STD_CXX11;
return NO_FLAGS;
}
QList<HeaderPath> GccToolChain::systemHeaderPaths() const QList<HeaderPath> GccToolChain::systemHeaderPaths() const
{ {
if (m_headerPathes.isEmpty()) { if (m_headerPathes.isEmpty()) {

View File

@@ -65,7 +65,9 @@ public:
bool isValid() const; bool isValid() const;
QByteArray predefinedMacros() const; QByteArray predefinedMacros(const QStringList &cxxflags) const;
CompilerFlags compilerFlags(const QStringList &cxxflags) const;
QList<HeaderPath> systemHeaderPaths() const; QList<HeaderPath> systemHeaderPaths() const;
void addToEnvironment(Utils::Environment &env) const; void addToEnvironment(Utils::Environment &env) const;
QString makeCommand() const; QString makeCommand() const;

View File

@@ -144,15 +144,15 @@ static QByteArray msvcCompilationFile()
"_CPPLIB_VER", "_CPPRTTI", "_CPPUNWIND", "_CPPLIB_VER", "_CPPRTTI", "_CPPUNWIND",
"_DEBUG", "_DLL", "__FUNCDNAME__", "_DEBUG", "_DLL", "__FUNCDNAME__",
"__FUNCSIG__", "__FUNCTION__", "_INTEGRAL_MAX_BITS", "__FUNCSIG__", "__FUNCTION__", "_INTEGRAL_MAX_BITS",
"_M_ALPHA","_M_CEE","_M_CEE_PURE", "_M_ALPHA", "_M_AAMD64", "_M_CEE", "_M_CEE_PURE",
"_M_CEE_SAFE", "_M_IX86", "_M_IA64", "_M_CEE_SAFE", "_M_IX86", "_M_IA64",
"_M_IX86_FP", "_M_MPPC", "_M_MRX000", "_M_IX86_FP", "_M_MPPC", "_M_MRX000",
"_M_PPC", "_M_X64", "_MANAGED", "_M_PPC", "_M_X64", "_MANAGED",
"_MFC_VER","_MSC_BUILD", /* "_MSC_EXTENSIONS", */ "_MFC_VER", "_MSC_BUILD", "_MSC_EXTENSIONS",
"_MSC_FULL_VER", "_MSC_VER", "__MSVC_RUNTIME_CHECKS", "_MSC_FULL_VER", "_MSC_VER", "__MSVC_RUNTIME_CHECKS",
"_MT", "_NATIVE_WCHAR_T_DEFINED", "_OPENMP", "_MT", "_NATIVE_WCHAR_T_DEFINED", "_OPENMP",
"_VC_NODEFAULTLIB", "_WCHAR_T_DEFINED", "_WIN32", "_VC_NODEFAULTLIB", "_WCHAR_T_DEFINED", "_WIN32",
"_WIN32_WCE", "_WIN64", "_Wp64", "__DATE__", "_WIN32_WCE", "_WIN64", "_Wp64",
"__DATE__", "__TIME__", "__TIMESTAMP__", "__DATE__", "__TIME__", "__TIMESTAMP__",
0}; 0};
QByteArray file = "#define __PPOUT__(x) V##x=x\n\n"; QByteArray file = "#define __PPOUT__(x) V##x=x\n\n";
@@ -166,9 +166,35 @@ static QByteArray msvcCompilationFile()
} }
// Run MSVC 'cl' compiler to obtain #defines. // Run MSVC 'cl' compiler to obtain #defines.
QByteArray MsvcToolChain::msvcPredefinedMacros(const Utils::Environment &env) const QByteArray MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const
{ {
QByteArray predefinedMacros = AbstractMsvcToolChain::msvcPredefinedMacros(env); QByteArray predefinedMacros = AbstractMsvcToolChain::msvcPredefinedMacros(cxxflags, env);
QStringList toProcess;
foreach (const QString &arg, cxxflags) {
if (arg.startsWith(QLatin1String("/D"))) {
QString define = arg.mid(2);
int pos = define.indexOf(QLatin1Char('='));
if (pos < 0) {
predefinedMacros += "#define ";
predefinedMacros += define.toLocal8Bit();
predefinedMacros += '\n';
} else {
predefinedMacros += "#define ";
predefinedMacros += define.left(pos).toLocal8Bit();
predefinedMacros += ' ';
predefinedMacros += define.mid(pos + 1).toLocal8Bit();
predefinedMacros += '\n';
}
} else if (arg.startsWith(QLatin1String("/U"))) {
predefinedMacros += "#undef ";
predefinedMacros += arg.mid(2).toLocal8Bit();
predefinedMacros += '\n';
} else {
toProcess.append(arg);
}
}
Utils::TempFileSaver saver(QDir::tempPath() + QLatin1String("/envtestXXXXXX.cpp")); Utils::TempFileSaver saver(QDir::tempPath() + QLatin1String("/envtestXXXXXX.cpp"));
saver.write(msvcCompilationFile()); saver.write(msvcCompilationFile());
@@ -186,7 +212,7 @@ QByteArray MsvcToolChain::msvcPredefinedMacros(const Utils::Environment &env) co
return predefinedMacros; return predefinedMacros;
} }
arguments << QLatin1String("/EP") << QDir::toNativeSeparators(saver.fileName()); arguments << toProcess << QLatin1String("/EP") << QDir::toNativeSeparators(saver.fileName());
cpp.start(binary, arguments); cpp.start(binary, arguments);
if (!cpp.waitForStarted()) { if (!cpp.waitForStarted()) {
qWarning("%s: Cannot start '%s': %s", Q_FUNC_INFO, qPrintable(binary), qWarning("%s: Cannot start '%s': %s", Q_FUNC_INFO, qPrintable(binary),

View File

@@ -79,7 +79,8 @@ public:
protected: protected:
Utils::Environment readEnvironmentSetting(Utils::Environment& env) const; Utils::Environment readEnvironmentSetting(Utils::Environment& env) const;
QByteArray msvcPredefinedMacros(const Utils::Environment &env) const; QByteArray msvcPredefinedMacros(const QStringList cxxflags,
const Utils::Environment &env) const;
private: private:
MsvcToolChain(); MsvcToolChain();

View File

@@ -83,7 +83,13 @@ public:
virtual QStringList restrictedToTargets() const; virtual QStringList restrictedToTargets() const;
virtual QByteArray predefinedMacros() const = 0; virtual QByteArray predefinedMacros(const QStringList &cxxflags) const = 0;
enum CompilerFlags {
NO_FLAGS = 0,
STD_CXX11 = 1
};
virtual CompilerFlags compilerFlags(const QStringList &cxxflags) const = 0;
virtual QList<HeaderPath> systemHeaderPaths() const = 0; virtual QList<HeaderPath> systemHeaderPaths() const = 0;
virtual void addToEnvironment(Utils::Environment &env) const = 0; virtual void addToEnvironment(Utils::Environment &env) const = 0;
virtual QString makeCommand() const = 0; virtual QString makeCommand() const = 0;

View File

@@ -94,10 +94,10 @@ QString GcceToolChain::typeDisplayName() const
return GcceToolChainFactory::tr("GCCE"); return GcceToolChainFactory::tr("GCCE");
} }
QByteArray GcceToolChain::predefinedMacros() const QByteArray GcceToolChain::predefinedMacros(const QStringList &list) const
{ {
if (m_predefinedMacros.isEmpty()) { if (m_predefinedMacros.isEmpty()) {
ProjectExplorer::GccToolChain::predefinedMacros(); ProjectExplorer::GccToolChain::predefinedMacros(list);
m_predefinedMacros += "\n" m_predefinedMacros += "\n"
"#define __GCCE__\n" "#define __GCCE__\n"
"#define __SYMBIAN32__\n"; "#define __SYMBIAN32__\n";

View File

@@ -48,7 +48,7 @@ public:
QString type() const; QString type() const;
QString typeDisplayName() const; QString typeDisplayName() const;
QByteArray predefinedMacros() const; QByteArray predefinedMacros(const QStringList &list) const;
void addToEnvironment(Utils::Environment &env) const; void addToEnvironment(Utils::Environment &env) const;
QString makeCommand() const; QString makeCommand() const;
QString defaultMakeTarget() const; QString defaultMakeTarget() const;

View File

@@ -164,8 +164,9 @@ bool RvctToolChain::isValid() const
return !m_compilerCommand.isEmpty(); return !m_compilerCommand.isEmpty();
} }
QByteArray RvctToolChain::predefinedMacros() const QByteArray RvctToolChain::predefinedMacros(const QStringList &cxxflags) const
{ {
Q_UNUSED(cxxflags);
// see http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205f/Babbacdb.html (version 2.2) // see http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205f/Babbacdb.html (version 2.2)
// and http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491b/BABJFEFG.html (version 4.0) // and http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491b/BABJFEFG.html (version 4.0)
QByteArray ba("#define __ARRAY_OPERATORS\n" QByteArray ba("#define __ARRAY_OPERATORS\n"
@@ -187,6 +188,12 @@ QByteArray RvctToolChain::predefinedMacros() const
return ba; return ba;
} }
ProjectExplorer::ToolChain::CompilerFlags RvctToolChain::compilerFlags(const QStringList &cxxflags) const
{
Q_UNUSED(cxxflags);
return NO_FLAGS;
}
QList<ProjectExplorer::HeaderPath> RvctToolChain::systemHeaderPaths() const QList<ProjectExplorer::HeaderPath> RvctToolChain::systemHeaderPaths() const
{ {
return QList<ProjectExplorer::HeaderPath>() return QList<ProjectExplorer::HeaderPath>()

View File

@@ -89,7 +89,8 @@ public:
bool isValid() const; bool isValid() const;
QByteArray predefinedMacros() const; QByteArray predefinedMacros(const QStringList &cxxflags) const;
ProjectExplorer::ToolChain::CompilerFlags compilerFlags(const QStringList &cxxflags) const;
QList<ProjectExplorer::HeaderPath> systemHeaderPaths() const; QList<ProjectExplorer::HeaderPath> systemHeaderPaths() const;
void addToEnvironment(Utils::Environment &env) const; void addToEnvironment(Utils::Environment &env) const;
QString makeCommand() const; QString makeCommand() const;

View File

@@ -166,11 +166,18 @@ bool WinscwToolChain::isValid() const
return fi.exists() && fi.isExecutable(); return fi.exists() && fi.isExecutable();
} }
QByteArray WinscwToolChain::predefinedMacros() const QByteArray WinscwToolChain::predefinedMacros(const QStringList &cxxflags) const
{ {
Q_UNUSED(cxxflags);
return QByteArray("#define __SYMBIAN32__\n"); return QByteArray("#define __SYMBIAN32__\n");
} }
ProjectExplorer::ToolChain::CompilerFlags WinscwToolChain::compilerFlags(const QStringList &cxxflags) const
{
Q_UNUSED(cxxflags);
return NO_FLAGS;
}
QList<ProjectExplorer::HeaderPath> WinscwToolChain::systemHeaderPaths() const QList<ProjectExplorer::HeaderPath> WinscwToolChain::systemHeaderPaths() const
{ {
QList<ProjectExplorer::HeaderPath> result; QList<ProjectExplorer::HeaderPath> result;

View File

@@ -59,7 +59,8 @@ public:
bool isValid() const; bool isValid() const;
QByteArray predefinedMacros() const; QByteArray predefinedMacros(const QStringList &list) const;
ProjectExplorer::ToolChain::CompilerFlags compilerFlags(const QStringList &cxxflags) const;
QList<ProjectExplorer::HeaderPath> systemHeaderPaths() const; QList<ProjectExplorer::HeaderPath> systemHeaderPaths() const;
void addToEnvironment(Utils::Environment &env) const; void addToEnvironment(Utils::Environment &env) const;
QString makeCommand() const; QString makeCommand() const;

View File

@@ -1410,6 +1410,27 @@ QStringList Qt4ProFileNode::symbianCapabilities() const
return result; return result;
} }
QByteArray Qt4ProFileNode::cxxDefines() const
{
QByteArray result;
foreach (const QString &def, variableValue(DefinesVar)) {
result += "#define ";
const int index = def.indexOf(QLatin1Char('='));
if (index == -1) {
result += def.toLatin1();
result += " 1\n";
} else {
const QString name = def.left(index);
const QString value = def.mid(index + 1);
result += name.toLatin1();
result += ' ';
result += value.toLocal8Bit();
result += '\n';
}
}
return result;
}
bool Qt4ProFileNode::isDeployable() const bool Qt4ProFileNode::isDeployable() const
{ {
return m_isDeployable; return m_isDeployable;
@@ -1829,6 +1850,15 @@ void Qt4ProFileNode::applyEvaluate(EvalResult evalResult, bool async)
newVarValues[DefinesVar] = m_readerExact->values(QLatin1String("DEFINES")); newVarValues[DefinesVar] = m_readerExact->values(QLatin1String("DEFINES"));
newVarValues[IncludePathVar] = includePaths(m_readerExact); newVarValues[IncludePathVar] = includePaths(m_readerExact);
newVarValues[CppFlagsVar] = m_readerExact->values("QMAKE_CXXFLAGS");
newVarValues[CppSourceVar] = m_readerExact->absoluteFileValues(QLatin1String("SOURCES"),
m_projectDir,
QStringList() << m_projectDir,
0);
newVarValues[ObjCSourceVar] = m_readerExact->absoluteFileValues(QLatin1String("OBJECTIVE_SOURCES"),
m_projectDir,
QStringList() << m_projectDir,
0);
newVarValues[UiDirVar] = QStringList() << uiDirPath(m_readerExact); newVarValues[UiDirVar] = QStringList() << uiDirPath(m_readerExact);
newVarValues[MocDirVar] = QStringList() << mocDirPath(m_readerExact); newVarValues[MocDirVar] = QStringList() << mocDirPath(m_readerExact);
newVarValues[PkgConfigVar] = m_readerExact->values(QLatin1String("PKGCONFIG")); newVarValues[PkgConfigVar] = m_readerExact->values(QLatin1String("PKGCONFIG"));

View File

@@ -82,6 +82,9 @@ enum Qt4ProjectType {
enum Qt4Variable { enum Qt4Variable {
DefinesVar = 1, DefinesVar = 1,
IncludePathVar, IncludePathVar,
CppFlagsVar,
CppSourceVar,
ObjCSourceVar,
UiDirVar, UiDirVar,
MocDirVar, MocDirVar,
PkgConfigVar, PkgConfigVar,
@@ -354,6 +357,7 @@ public:
QString makefile() const; QString makefile() const;
QStringList symbianCapabilities() const; QStringList symbianCapabilities() const;
QByteArray cxxDefines() const;
bool isDeployable() const; bool isDeployable() const;
QString resolvedMkspecPath() const; QString resolvedMkspecPath() const;

View File

@@ -469,6 +469,8 @@ void Qt4Project::updateCodeModels()
void Qt4Project::updateCppCodeModel() void Qt4Project::updateCppCodeModel()
{ {
typedef CPlusPlus::CppModelManagerInterface::ProjectPart ProjectPart;
QtSupport::BaseQtVersion *qtVersion = 0; QtSupport::BaseQtVersion *qtVersion = 0;
ToolChain *tc = 0; ToolChain *tc = 0;
if (Qt4BaseTarget *target = activeTarget()) { if (Qt4BaseTarget *target = activeTarget()) {
@@ -485,115 +487,78 @@ void Qt4Project::updateCppCodeModel()
if (!modelmanager) if (!modelmanager)
return; return;
// Collect global headers/defines
QStringList predefinedIncludePaths;
QStringList predefinedFrameworkPaths;
QByteArray predefinedMacros;
QString qtFrameworkPath;
if (qtVersion)
qtFrameworkPath = qtVersion->frameworkInstallPath();
if (!qtFrameworkPath.isEmpty())
predefinedFrameworkPaths.append(qtFrameworkPath);
if (tc) {
predefinedMacros = tc->predefinedMacros();
QList<HeaderPath> headers = tc->systemHeaderPaths();
if (qtVersion)
headers.append(qtVersion->systemHeaderPathes());
foreach (const HeaderPath &headerPath, headers) {
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
predefinedFrameworkPaths.append(headerPath.path());
else
predefinedIncludePaths.append(headerPath.path());
}
}
FindQt4ProFiles findQt4ProFiles; FindQt4ProFiles findQt4ProFiles;
QList<Qt4ProFileNode *> proFiles = findQt4ProFiles(rootProjectNode()); QList<Qt4ProFileNode *> proFiles = findQt4ProFiles(rootProjectNode());
QByteArray allDefinedMacros = predefinedMacros;
QStringList allIncludePaths;
QStringList allFrameworkPaths = predefinedFrameworkPaths;
QStringList allPrecompileHeaders;
// Collect per .pro file information
foreach (Qt4ProFileNode *pro, proFiles) {
allPrecompileHeaders.append(pro->variableValue(PrecompiledHeaderVar));
// Add custom defines
foreach (const QString &def, pro->variableValue(DefinesVar)) {
allDefinedMacros += "#define ";
const int index = def.indexOf(QLatin1Char('='));
if (index == -1) {
allDefinedMacros += def.toLatin1();
allDefinedMacros += " 1\n";
} else {
const QString name = def.left(index);
const QString value = def.mid(index + 1);
allDefinedMacros += name.toLatin1();
allDefinedMacros += ' ';
allDefinedMacros += value.toLocal8Bit();
allDefinedMacros += '\n';
}
}
const QStringList proIncludePaths = pro->variableValue(IncludePathVar);
foreach (const QString &includePath, proIncludePaths) {
if (!allIncludePaths.contains(includePath))
allIncludePaths.append(includePath);
}
}
// Add mkspec directory
if (rootQt4ProjectNode())
allIncludePaths.append(rootQt4ProjectNode()->resolvedMkspecPath());
else if (qtVersion)
allIncludePaths.append(qtVersion->mkspecPath().toString());
allIncludePaths.append(predefinedIncludePaths);
QStringList files;
files += m_projectFiles->files[HeaderType];
files += m_projectFiles->generatedFiles[HeaderType];
files += m_projectFiles->files[SourceType];
files += m_projectFiles->generatedFiles[SourceType];
CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this); CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this);
pinfo.clearProjectParts();
//qDebug()<<"Using precompiled header"<<allPrecompileHeaders; ProjectPart::QtVersion qtVersionForPart = ProjectPart::NoQt;
if (qtVersion) {
bool fileList = equalFileList(pinfo.sourceFiles, files); if (qtVersion->qtVersion() < QtSupport::QtVersionNumber(5,0,0))
qtVersionForPart = ProjectPart::Qt4;
if (pinfo.defines == allDefinedMacros else
&& pinfo.includePaths == allIncludePaths qtVersionForPart = ProjectPart::Qt5;
&& pinfo.frameworkPaths == allFrameworkPaths
&& fileList
&& pinfo.precompiledHeaders == allPrecompileHeaders
&& !m_codeModelCanceled) {
// Nothing to update...
} else {
pinfo.sourceFiles.clear();
if (pinfo.defines != allDefinedMacros
|| pinfo.includePaths != allIncludePaths
|| pinfo.frameworkPaths != allFrameworkPaths
|| pinfo.precompiledHeaders != allPrecompileHeaders)
{
pinfo.sourceFiles.append(QLatin1String("<configuration>"));
} }
//pinfo.defines = predefinedMacros; QStringList allFiles;
pinfo.defines = allDefinedMacros; foreach (Qt4ProFileNode *pro, proFiles) {
pinfo.includePaths = allIncludePaths; ProjectPart::Ptr part(new ProjectPart);
pinfo.frameworkPaths = allFrameworkPaths; part->qtVersion = qtVersionForPart;
pinfo.sourceFiles += files;
pinfo.precompiledHeaders = allPrecompileHeaders; // part->defines
if (tc)
part->defines = tc->predefinedMacros(pro->variableValue(CppFlagsVar));
part->defines += pro->cxxDefines();
// part->includePaths
part->includePaths.append(pro->variableValue(IncludePathVar));
QList<HeaderPath> headers;
if (tc)
headers = tc->systemHeaderPaths(); // todo pass cxxflags?
if (qtVersion) {
headers.append(qtVersion->systemHeaderPathes());
}
foreach (const HeaderPath &headerPath, headers) {
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
part->frameworkPaths.append(headerPath.path());
else
part->includePaths.append(headerPath.path());
}
if (qtVersion) {
if (!qtVersion->frameworkInstallPath().isEmpty())
part->frameworkPaths.append(qtVersion->frameworkInstallPath());
part->includePaths.append(qtVersion->mkspecPath().toString());
}
// part->precompiledHeaders
part->precompiledHeaders.append(pro->variableValue(PrecompiledHeaderVar));
// part->language
part->language = CPlusPlus::CppModelManagerInterface::CXX;
// part->flags
if (tc)
part->flags = tc->compilerFlags(pro->variableValue(CppFlagsVar));
part->sourceFiles = pro->variableValue(CppSourceVar);
pinfo.appendProjectPart(part);
allFiles += part->sourceFiles;
part = ProjectPart::Ptr(new ProjectPart);
// todo objc code?
part->language = CPlusPlus::CppModelManagerInterface::OBJC;
part->sourceFiles = pro->variableValue(ObjCSourceVar);
if (!part->sourceFiles.isEmpty())
pinfo.appendProjectPart(part);
allFiles += part->sourceFiles;
}
modelmanager->updateProjectInfo(pinfo); modelmanager->updateProjectInfo(pinfo);
m_codeModelFuture = modelmanager->updateSourceFiles(pinfo.sourceFiles); m_codeModelFuture = modelmanager->updateSourceFiles(allFiles);
m_codeModelCanceled = false;
}
} }
void Qt4Project::updateQmlJSCodeModel() void Qt4Project::updateQmlJSCodeModel()

View File

@@ -663,7 +663,7 @@ void BaseTextEditorWidget::setChangeSet(const Utils::ChangeSet &changeSet)
} }
} }
Core::IFile *BaseTextEditorWidget::file() Core::IFile *BaseTextEditorWidget::file() const
{ {
return d->m_document; return d->m_document;
} }

View File

@@ -141,7 +141,7 @@ public:
void setChangeSet(const Utils::ChangeSet &changeSet); void setChangeSet(const Utils::ChangeSet &changeSet);
// EditorInterface // EditorInterface
Core::IFile * file(); Core::IFile * file() const;
bool createNew(const QString &contents); bool createNew(const QString &contents);
virtual bool open(QString *errorString, const QString &fileName, const QString &realFileName); virtual bool open(QString *errorString, const QString &fileName, const QString &realFileName);
QByteArray saveState() const; QByteArray saveState() const;

View File

@@ -43,7 +43,7 @@ class TEXTEDITOR_EXPORT GenericProposal : public IAssistProposal
{ {
public: public:
GenericProposal(int cursorPos, IGenericProposalModel *model); GenericProposal(int cursorPos, IGenericProposalModel *model);
~GenericProposal(); virtual ~GenericProposal();
virtual bool isFragile() const; virtual bool isFragile() const;
virtual int basePosition() const; virtual int basePosition() const;

View File

@@ -58,6 +58,12 @@ public:
unsigned length; unsigned length;
int kind; int kind;
bool isValid() const
{ return line != 0; }
bool isInvalid() const
{ return line == 0; }
Result() Result()
: line(0), column(0), length(0), kind(-1) {} : line(0), column(0), length(0), kind(-1) {}
Result(unsigned line, unsigned column, unsigned length, int kind) Result(unsigned line, unsigned column, unsigned length, int kind)