forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/3.6'
Conflicts: src/plugins/coreplugin/editormanager/editormanager.cpp Change-Id: Ibdf433b54e36e58182b7094f78d47ed3e8c81684
This commit is contained in:
@@ -306,12 +306,44 @@ void IpcCommunicator::initializeBackend()
|
||||
initializeBackendWithCurrentData();
|
||||
}
|
||||
|
||||
void IpcCommunicator::registerEmptyProjectForProjectLessFiles()
|
||||
static QStringList projectPartOptions(const CppTools::ProjectPart::Ptr &projectPart)
|
||||
{
|
||||
QStringList options = ClangCodeModel::Utils::createClangOptions(projectPart,
|
||||
CppTools::ProjectFile::Unclassified); // No language option
|
||||
if (PchInfo::Ptr pchInfo = PchManager::instance()->pchInfo(projectPart))
|
||||
options += ClangCodeModel::Utils::createPCHInclusionOptions(pchInfo->fileName());
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
static ClangBackEnd::ProjectPartContainer toProjectPartContainer(
|
||||
const CppTools::ProjectPart::Ptr &projectPart)
|
||||
{
|
||||
const QStringList options = projectPartOptions(projectPart);
|
||||
|
||||
return ClangBackEnd::ProjectPartContainer(projectPart->id(), Utf8StringVector(options));
|
||||
}
|
||||
|
||||
static QVector<ClangBackEnd::ProjectPartContainer> toProjectPartContainers(
|
||||
const QList<CppTools::ProjectPart::Ptr> projectParts)
|
||||
{
|
||||
QVector<ClangBackEnd::ProjectPartContainer> projectPartContainers;
|
||||
projectPartContainers.reserve(projectParts.size());
|
||||
|
||||
foreach (const CppTools::ProjectPart::Ptr &projectPart, projectParts)
|
||||
projectPartContainers << toProjectPartContainer(projectPart);
|
||||
|
||||
return projectPartContainers;
|
||||
}
|
||||
|
||||
void IpcCommunicator::registerFallbackProjectPart()
|
||||
{
|
||||
QTC_CHECK(m_connection.isConnected());
|
||||
registerProjectPartsForEditor({ClangBackEnd::ProjectPartContainer(
|
||||
Utf8String(),
|
||||
Utf8StringVector())});
|
||||
|
||||
const auto projectPart = CppTools::CppModelManager::instance()->fallbackProjectPart();
|
||||
const auto projectPartContainer = toProjectPartContainer(projectPart);
|
||||
|
||||
registerProjectPartsForEditor({projectPartContainer});
|
||||
}
|
||||
|
||||
void IpcCommunicator::registerCurrentProjectParts()
|
||||
@@ -343,49 +375,12 @@ void IpcCommunicator::registerCurrentCodeModelUiHeaders()
|
||||
updateUnsavedFile(es->fileName(), es->contents(), es->revision());
|
||||
}
|
||||
|
||||
static QStringList projectPartMessageLine(const CppTools::ProjectPart::Ptr &projectPart)
|
||||
{
|
||||
QStringList options = ClangCodeModel::Utils::createClangOptions(projectPart,
|
||||
CppTools::ProjectFile::Unclassified); // No language option
|
||||
if (PchInfo::Ptr pchInfo = PchManager::instance()->pchInfo(projectPart))
|
||||
options += ClangCodeModel::Utils::createPCHInclusionOptions(pchInfo->fileName());
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
static ClangBackEnd::ProjectPartContainer toProjectPartContainer(
|
||||
const CppTools::ProjectPart::Ptr &projectPart)
|
||||
{
|
||||
const QStringList arguments = projectPartMessageLine(projectPart);
|
||||
return ClangBackEnd::ProjectPartContainer(projectPart->id(), Utf8StringVector(arguments));
|
||||
}
|
||||
|
||||
static QVector<ClangBackEnd::ProjectPartContainer> toProjectPartContainers(
|
||||
const QList<CppTools::ProjectPart::Ptr> projectParts)
|
||||
{
|
||||
QVector<ClangBackEnd::ProjectPartContainer> projectPartContainers;
|
||||
projectPartContainers.reserve(projectParts.size());
|
||||
foreach (const CppTools::ProjectPart::Ptr &projectPart, projectParts)
|
||||
projectPartContainers << toProjectPartContainer(projectPart);
|
||||
return projectPartContainers;
|
||||
}
|
||||
|
||||
void IpcCommunicator::registerProjectsParts(const QList<CppTools::ProjectPart::Ptr> projectParts)
|
||||
{
|
||||
const auto projectPartContainers = toProjectPartContainers(projectParts);
|
||||
registerProjectPartsForEditor(projectPartContainers);
|
||||
}
|
||||
|
||||
void IpcCommunicator::registerTranslationUnit(TextEditor::TextDocument *document)
|
||||
{
|
||||
const QString filePath = document->filePath().toString();
|
||||
const QString projectPartId = Utils::projectPartIdForFile(filePath);
|
||||
|
||||
registerTranslationUnitsForEditor({{Utf8String(filePath),
|
||||
Utf8String(projectPartId),
|
||||
uint(document->document()->revision())}});
|
||||
}
|
||||
|
||||
void IpcCommunicator::updateTranslationUnitFromCppEditorDocument(const QString &filePath)
|
||||
{
|
||||
const auto document = CppTools::CppModelManager::instance()->cppEditorDocument(filePath);
|
||||
@@ -426,25 +421,6 @@ void setLastSentDocumentRevision(const QString &filePath,
|
||||
}
|
||||
}
|
||||
|
||||
void IpcCommunicator::registerTranslationUnit(const QString &filePath,
|
||||
const QByteArray &contents,
|
||||
uint documentRevision)
|
||||
{
|
||||
const QString projectPartId = Utils::projectPartIdForFile(filePath);
|
||||
|
||||
if (documentHasChanged(filePath)) {
|
||||
const bool hasUnsavedContent = true;
|
||||
|
||||
registerTranslationUnitsForEditor({{filePath,
|
||||
projectPartId,
|
||||
Utf8String::fromByteArray(contents),
|
||||
hasUnsavedContent,
|
||||
documentRevision}});
|
||||
|
||||
setLastSentDocumentRevision(filePath, documentRevision);
|
||||
}
|
||||
}
|
||||
|
||||
void IpcCommunicator::updateTranslationUnit(const QString &filePath,
|
||||
const QByteArray &contents,
|
||||
uint documentRevision)
|
||||
@@ -495,6 +471,7 @@ void IpcCommunicator::requestDiagnostics(Core::IDocument *document)
|
||||
|
||||
requestDiagnostics(FileContainer(filePath,
|
||||
projectPartId,
|
||||
Utf8StringVector(),
|
||||
textDocument->document()->revision()));
|
||||
}
|
||||
|
||||
@@ -547,7 +524,7 @@ void IpcCommunicator::onCoreAboutToClose()
|
||||
|
||||
void IpcCommunicator::initializeBackendWithCurrentData()
|
||||
{
|
||||
registerEmptyProjectForProjectLessFiles();
|
||||
registerFallbackProjectPart();
|
||||
registerCurrentProjectParts();
|
||||
registerCurrentCppEditorDocuments();
|
||||
registerCurrentCodeModelUiHeaders();
|
||||
|
||||
@@ -133,8 +133,6 @@ public:
|
||||
|
||||
void registerProjectsParts(const QList<CppTools::ProjectPart::Ptr> projectParts);
|
||||
|
||||
void registerTranslationUnit(TextEditor::TextDocument *document);
|
||||
void registerTranslationUnit(const QString &filePath, const QByteArray &contents, uint documentRevision);
|
||||
void updateTranslationUnitIfNotCurrentDocument(Core::IDocument *document);
|
||||
void updateTranslationUnit(Core::IDocument *document);
|
||||
void updateUnsavedFile(Core::IDocument *document);
|
||||
@@ -146,6 +144,8 @@ public:
|
||||
void requestDiagnostics(Core::IDocument *document);
|
||||
void updateChangeContentStartPosition(const QString &filePath, int position);
|
||||
|
||||
void registerFallbackProjectPart();
|
||||
|
||||
public: // for tests
|
||||
IpcSenderInterface *setIpcSender(IpcSenderInterface *ipcSender);
|
||||
void killBackendProcess();
|
||||
@@ -158,7 +158,6 @@ private:
|
||||
|
||||
void initializeBackend();
|
||||
void initializeBackendWithCurrentData();
|
||||
void registerEmptyProjectForProjectLessFiles();
|
||||
void registerCurrentProjectParts();
|
||||
void registerCurrentCppEditorDocuments();
|
||||
void registerCurrentCodeModelUiHeaders();
|
||||
|
||||
@@ -58,6 +58,11 @@ static void initializeTextMarks()
|
||||
Utils::Theme::ClangCodeModel_Error_TextMarkColor);
|
||||
}
|
||||
|
||||
ClangCodeModelPlugin::ClangCodeModelPlugin()
|
||||
{
|
||||
qRegisterMetaType<CppTools::ProjectPart::Ptr>();
|
||||
}
|
||||
|
||||
bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *errorMessage)
|
||||
{
|
||||
Q_UNUSED(arguments)
|
||||
|
||||
@@ -50,6 +50,8 @@ class ClangCodeModelPlugin: public ExtensionSystem::IPlugin
|
||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ClangCodeModel.json")
|
||||
|
||||
public:
|
||||
ClangCodeModelPlugin();
|
||||
|
||||
bool initialize(const QStringList &arguments, QString *errorMessage);
|
||||
void extensionsInitialized();
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ void ClangEditorDocumentParser::updateHelper(const BaseEditorDocumentParser::InM
|
||||
State state_ = state();
|
||||
state_.projectPart = determineProjectPart(filePath(), configuration(), state_);
|
||||
setState(state_);
|
||||
emit projectPartDetermined(state_.projectPart);
|
||||
|
||||
// Determine message line arguments
|
||||
const QStringList options = createOptions(filePath(), state_.projectPart, true);
|
||||
|
||||
@@ -50,6 +50,9 @@ public:
|
||||
QList<SemanticMarker::Range> ifdefedOutBlocks() const;
|
||||
SemanticMarker::Ptr semanticMarker() const;
|
||||
|
||||
signals:
|
||||
void projectPartDetermined(CppTools::ProjectPart::Ptr projectPart);
|
||||
|
||||
private:
|
||||
void updateHelper(const BaseEditorDocumentParser::InMemoryInfo &info) override;
|
||||
|
||||
|
||||
@@ -41,7 +41,9 @@
|
||||
#include <diagnosticcontainer.h>
|
||||
#include <sourcelocationcontainer.h>
|
||||
|
||||
#include <cpptools/cpptoolsplugin.h>
|
||||
#include <cpptools/cppcodemodelsettings.h>
|
||||
#include <cpptools/cppprojects.h>
|
||||
#include <cpptools/cpptoolsreuse.h>
|
||||
#include <cpptools/cppworkingcopy.h>
|
||||
|
||||
#include <texteditor/convenience.h>
|
||||
@@ -87,6 +89,9 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor(
|
||||
, m_semanticHighlighter(document)
|
||||
, m_builtinProcessor(document, /*enableSemanticHighlighter=*/ false)
|
||||
{
|
||||
connect(m_parser.data(), &ClangEditorDocumentParser::projectPartDetermined,
|
||||
this, &ClangEditorDocumentProcessor::onParserDeterminedProjectPart);
|
||||
|
||||
// Forwarding the semantic info from the builtin processor enables us to provide all
|
||||
// editor (widget) related features that are not yet implemented by the clang plugin.
|
||||
connect(&m_builtinProcessor, &CppTools::BuiltinEditorDocumentProcessor::cppDocumentUpdated,
|
||||
@@ -230,9 +235,10 @@ static bool isProjectPartLoadedOrIsFallback(CppTools::ProjectPart::Ptr projectPa
|
||||
&& (projectPart->id().isEmpty() || ClangCodeModel::Utils::isProjectPartLoaded(projectPart));
|
||||
}
|
||||
|
||||
void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor()
|
||||
void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor(
|
||||
CppTools::ProjectPart::Ptr projectPart)
|
||||
{
|
||||
const CppTools::ProjectPart::Ptr projectPart = m_parser->projectPart();
|
||||
QTC_ASSERT(projectPart, return);
|
||||
|
||||
if (isProjectPartLoadedOrIsFallback(projectPart)) {
|
||||
updateTranslationUnitForEditor(projectPart.data());
|
||||
@@ -242,6 +248,12 @@ void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor(
|
||||
}
|
||||
}
|
||||
|
||||
void ClangEditorDocumentProcessor::onParserDeterminedProjectPart(
|
||||
CppTools::ProjectPart::Ptr projectPart)
|
||||
{
|
||||
updateProjectPartAndTranslationUnitForEditor(projectPart);
|
||||
}
|
||||
|
||||
void ClangEditorDocumentProcessor::onParserFinished()
|
||||
{
|
||||
if (revision() != m_parserRevision)
|
||||
@@ -253,8 +265,6 @@ void ClangEditorDocumentProcessor::onParserFinished()
|
||||
|
||||
// Run semantic highlighter
|
||||
m_semanticHighlighter.run();
|
||||
|
||||
updateProjectPartAndTranslationUnitForEditor();
|
||||
}
|
||||
|
||||
void ClangEditorDocumentProcessor::updateTranslationUnitForEditor(CppTools::ProjectPart *projectPart)
|
||||
@@ -294,13 +304,37 @@ void ClangEditorDocumentProcessor::requestDiagnostics()
|
||||
}
|
||||
}
|
||||
|
||||
static CppTools::ProjectPart projectPartForLanguageOption(CppTools::ProjectPart *projectPart)
|
||||
{
|
||||
if (projectPart)
|
||||
return *projectPart;
|
||||
return *CppTools::CppModelManager::instance()->fallbackProjectPart().data();
|
||||
}
|
||||
|
||||
static QStringList languageOptions(const QString &filePath, CppTools::ProjectPart *projectPart)
|
||||
{
|
||||
const auto theProjectPart = projectPartForLanguageOption(projectPart);
|
||||
CppTools::CompilerOptionsBuilder builder(theProjectPart);
|
||||
builder.addLanguageOption(CppTools::ProjectFile::classify(filePath));
|
||||
|
||||
return builder.options();
|
||||
}
|
||||
|
||||
static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart *projectPart)
|
||||
{
|
||||
return QStringList(languageOptions(filePath, projectPart))
|
||||
+ CppTools::codeModelSettings()->extraClangOptions();
|
||||
}
|
||||
|
||||
ClangBackEnd::FileContainer
|
||||
ClangEditorDocumentProcessor::fileContainer(CppTools::ProjectPart *projectPart) const
|
||||
{
|
||||
if (projectPart)
|
||||
return {filePath(), projectPart->id(), revision()};
|
||||
const auto projectPartId = projectPart
|
||||
? Utf8String::fromString(projectPart->id())
|
||||
: Utf8String();
|
||||
const QStringList theFileArguments = fileArguments(filePath(), projectPart);
|
||||
|
||||
return {filePath(), Utf8String(), revision()};
|
||||
return {filePath(), projectPartId, Utf8StringVector(theFileArguments), revision()};
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
@@ -85,10 +85,11 @@ public:
|
||||
static ClangEditorDocumentProcessor *get(const QString &filePath);
|
||||
|
||||
private slots:
|
||||
void onParserDeterminedProjectPart(CppTools::ProjectPart::Ptr projectPart);
|
||||
void onParserFinished();
|
||||
|
||||
private:
|
||||
void updateProjectPartAndTranslationUnitForEditor();
|
||||
void updateProjectPartAndTranslationUnitForEditor(CppTools::ProjectPart::Ptr projectPart);
|
||||
void updateTranslationUnitForEditor(CppTools::ProjectPart *projectPart);
|
||||
void requestDiagnostics(CppTools::ProjectPart *projectPart);
|
||||
void requestDiagnostics();
|
||||
|
||||
@@ -300,7 +300,9 @@ void ModelManagerSupportClang::onProjectPartsUpdated(ProjectExplorer::Project *p
|
||||
QTC_ASSERT(project, return);
|
||||
const CppTools::ProjectInfo projectInfo = cppModelManager()->projectInfo(project);
|
||||
QTC_ASSERT(projectInfo.isValid(), return);
|
||||
|
||||
m_ipcCommunicator.registerProjectsParts(projectInfo.projectParts());
|
||||
m_ipcCommunicator.registerFallbackProjectPart();
|
||||
}
|
||||
|
||||
void ModelManagerSupportClang::onProjectPartsRemoved(const QStringList &projectPartIds)
|
||||
@@ -308,6 +310,7 @@ void ModelManagerSupportClang::onProjectPartsRemoved(const QStringList &projectP
|
||||
if (!projectPartIds.isEmpty()) {
|
||||
unregisterTranslationUnitsWithProjectParts(projectPartIds);
|
||||
m_ipcCommunicator.unregisterProjectPartsForEditor(projectPartIds);
|
||||
m_ipcCommunicator.registerFallbackProjectPart();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -104,16 +104,6 @@ static QString getResourceDir()
|
||||
return dir.canonicalPath();
|
||||
}
|
||||
|
||||
static bool maybeIncludeBorlandExtensions()
|
||||
{
|
||||
return
|
||||
#if defined(CINDEX_VERSION) // clang 3.2 or higher
|
||||
true;
|
||||
#else
|
||||
false;
|
||||
#endif
|
||||
}
|
||||
|
||||
class LibClangOptionsBuilder : public CompilerOptionsBuilder
|
||||
{
|
||||
public:
|
||||
@@ -122,13 +112,13 @@ public:
|
||||
if (projectPart.isNull())
|
||||
return QStringList();
|
||||
|
||||
LibClangOptionsBuilder optionsBuilder(projectPart);
|
||||
LibClangOptionsBuilder optionsBuilder(*projectPart.data());
|
||||
|
||||
if (verboseRunLog().isDebugEnabled())
|
||||
optionsBuilder.add(QLatin1String("-v"));
|
||||
|
||||
optionsBuilder.addLanguageOption(fileKind);
|
||||
optionsBuilder.addOptionsForLanguage(maybeIncludeBorlandExtensions());
|
||||
optionsBuilder.addOptionsForLanguage(/*checkForBorlandExtensions*/ true);
|
||||
|
||||
optionsBuilder.addToolchainAndProjectDefines();
|
||||
|
||||
@@ -137,15 +127,13 @@ public:
|
||||
optionsBuilder.addHeaderPathOptions();
|
||||
optionsBuilder.addProjectConfigFileInclude();
|
||||
|
||||
optionsBuilder.addDiagnosticOptions();
|
||||
|
||||
optionsBuilder.addExtraOptions();
|
||||
|
||||
return optionsBuilder.options();
|
||||
}
|
||||
|
||||
private:
|
||||
LibClangOptionsBuilder(const CppTools::ProjectPart::Ptr &projectPart)
|
||||
LibClangOptionsBuilder(const CppTools::ProjectPart &projectPart)
|
||||
: CompilerOptionsBuilder(projectPart)
|
||||
{
|
||||
}
|
||||
@@ -181,7 +169,7 @@ private:
|
||||
static const QString wrappedQtHeaders = ICore::instance()->resourcePath()
|
||||
+ QLatin1String("/cplusplus/wrappedQtHeaders");
|
||||
|
||||
if (m_projectPart->qtVersion != ProjectPart::NoQt) {
|
||||
if (m_projectPart.qtVersion != ProjectPart::NoQt) {
|
||||
add(QLatin1String("-I") + wrappedQtHeaders);
|
||||
add(QLatin1String("-I") + wrappedQtHeaders + QLatin1String("/QtCore"));
|
||||
}
|
||||
@@ -189,9 +177,9 @@ private:
|
||||
|
||||
void addProjectConfigFileInclude()
|
||||
{
|
||||
if (!m_projectPart->projectConfigFile.isEmpty()) {
|
||||
if (!m_projectPart.projectConfigFile.isEmpty()) {
|
||||
add(QLatin1String("-include"));
|
||||
add(m_projectPart->projectConfigFile);
|
||||
add(m_projectPart.projectConfigFile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,30 +189,7 @@ private:
|
||||
add(QLatin1String("-fdiagnostics-show-note-include-stack"));
|
||||
add(QLatin1String("-fmacro-backtrace-limit=0"));
|
||||
add(QLatin1String("-fretain-comments-from-system-headers"));
|
||||
// TODO: -Xclang -ferror-limit -Xclang 0 ?
|
||||
}
|
||||
|
||||
void addDiagnosticOptions()
|
||||
{
|
||||
add(QStringLiteral("-fmessage-length=0"));
|
||||
add(QStringLiteral("-fdiagnostics-show-note-include-stack"));
|
||||
add(QStringLiteral("-fmacro-backtrace-limit=0"));
|
||||
add(QStringLiteral("-fretain-comments-from-system-headers"));
|
||||
add(QStringLiteral("-ferror-limit=1000"));
|
||||
|
||||
add(QStringLiteral("-Weverything"));
|
||||
add(QStringLiteral("-Wno-c++98-compat"));
|
||||
add(QStringLiteral("-Wno-c++98-compat-pedantic"));
|
||||
add(QStringLiteral("-Wno-unused-macros"));
|
||||
add(QStringLiteral("-Wno-newline-eof"));
|
||||
add(QStringLiteral("-Wno-exit-time-destructors"));
|
||||
add(QStringLiteral("-Wno-global-constructors"));
|
||||
add(QStringLiteral("-Wno-gnu-zero-variadic-macro-arguments"));
|
||||
add(QStringLiteral("-Wno-documentation"));
|
||||
add(QStringLiteral("-Wno-shadow"));
|
||||
|
||||
if (m_projectPart->languageVersion >= ProjectPart::CXX98)
|
||||
add(QStringLiteral("-Wno-missing-prototypes"));
|
||||
add(QLatin1String("-ferror-limit=1000"));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1037,6 +1037,7 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile(
|
||||
CppTools::Tests::ProjectOpenerAndCloser projectManager;
|
||||
const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true);
|
||||
QVERIFY(projectInfo.isValid());
|
||||
QVERIFY(monitorGeneratedUiFile.waitUntilGenerated());
|
||||
|
||||
// Open file with ui object
|
||||
const QString completionFile = testDir.absolutePath("mainwindow.cpp");
|
||||
@@ -1046,7 +1047,6 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile(
|
||||
QVERIFY(openSource.succeeded());
|
||||
|
||||
// ...and check comletions
|
||||
QVERIFY(monitorGeneratedUiFile.waitUntilGenerated());
|
||||
ProposalModel proposal = completionResults(openSource.editor());
|
||||
QVERIFY(hasItem(proposal, "menuBar"));
|
||||
QVERIFY(hasItem(proposal, "statusBar"));
|
||||
|
||||
Reference in New Issue
Block a user