Clang: Use completion through backend process

This makes us independent of libclang crashes for completion.
Re-parsing for highlighting still happens in the Qt Creator process.

Run in verbose mode:
    qtc.clangcodemodel.ipc=true

Run tests:
    -test "ClangCodeModel"

Task-number: QTCREATORBUG-14108
Task-number: QTCREATORBUG-12819
Change-Id: Id3e95bd2afdb6508bbd1d35fddc69534a909b905
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-05-08 15:48:17 +02:00
parent 264132da27
commit 23b8a3b2e8
59 changed files with 3820 additions and 634 deletions

View File

@@ -31,30 +31,62 @@
#ifndef CLANGCODEMODEL_INTERNAL_CLANGMODELMANAGERSUPPORT_H
#define CLANGCODEMODEL_INTERNAL_CLANGMODELMANAGERSUPPORT_H
#include "clangcompletion.h"
#include <cpptools/cppmodelmanagersupport.h>
#include <QObject>
#include <QScopedPointer>
namespace Core { class IDocument; }
namespace ClangCodeModel {
namespace Internal {
class ModelManagerSupport: public CppTools::ModelManagerSupport
class ModelManagerSupportClang:
public QObject,
public CppTools::ModelManagerSupport
{
Q_DISABLE_COPY(ModelManagerSupport)
Q_OBJECT
Q_DISABLE_COPY(ModelManagerSupportClang)
public:
ModelManagerSupport();
virtual ~ModelManagerSupport();
ModelManagerSupportClang();
~ModelManagerSupportClang();
virtual QString id() const;
virtual QString displayName() const;
CppTools::CppCompletionAssistProvider *completionAssistProvider() override;
CppTools::BaseEditorDocumentProcessor *editorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) override;
virtual CppTools::CppCompletionAssistProvider *completionAssistProvider();
virtual CppTools::BaseEditorDocumentProcessor *editorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument);
IpcCommunicator::Ptr ipcCommunicator();
public: // for tests
static ModelManagerSupportClang *instance();
private:
QScopedPointer<CppTools::CppCompletionAssistProvider> m_completionAssistProvider;
void onEditorOpened(Core::IEditor *editor);
void onCurrentEditorChanged(Core::IEditor *newCurrent);
void onCppDocumentReloadFinished(bool success);
void onCppDocumentContentsChanged();
void onAbstractEditorSupportContentsUpdated(const QString &filePath, const QByteArray &content);
void onAbstractEditorSupportRemoved(const QString &filePath);
void onProjectPartsUpdated(ProjectExplorer::Project *project);
void onProjectPartsRemoved(const QStringList &projectFiles);
IpcCommunicator::Ptr m_ipcCommunicator;
QScopedPointer<ClangCompletionAssistProvider> m_completionAssistProvider;
QPointer<Core::IEditor> m_previousCppEditor;
};
class ModelManagerSupportProviderClang : public CppTools::ModelManagerSupportProvider
{
public:
QString id() const override;
QString displayName() const override;
CppTools::ModelManagerSupport::Ptr createModelManagerSupport() override;
};
} // namespace Internal