Clang: Remove per-mimetype settings

Related to

    commit c47079f97f7d42db0c581525a2ce6fddbc0995f2
    Clang: Activate the code model with a check box

Change-Id: Ief11768ba0dd27788032e2dd3ad9b7ae39a8f52b
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-11-11 10:47:27 +01:00
parent 140b39487b
commit 48952084a6
12 changed files with 114 additions and 245 deletions

View File

@@ -94,7 +94,7 @@ bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *err
pchManager, &PchManager::onProjectPartsUpdated); pchManager, &PchManager::onProjectPartsUpdated);
// Register ModelManagerSupportProvider // Register ModelManagerSupportProvider
cppModelManager->addModelManagerSupportProvider(&m_modelManagerSupportProvider); cppModelManager->setClangModelManagerSupportProvider(&m_modelManagerSupportProvider);
initializeTextMarks(); initializeTextMarks();

View File

@@ -174,13 +174,8 @@ void ModelManagerSupportClang::onEditorOpened(Core::IEditor *editor)
TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(document); TextEditor::TextDocument *textDocument = qobject_cast<TextEditor::TextDocument *>(document);
if (textDocument && cppModelManager()->isCppEditor(editor)) { if (textDocument && cppModelManager()->isCppEditor(editor)) {
const QString clangSupportId = QLatin1String(Constants::CLANG_MODELMANAGERSUPPORT_ID); connectTextDocumentToTranslationUnit(textDocument);
if (cppModelManager()->isManagedByModelManagerSupport(textDocument, clangSupportId)) { connectToWidgetsMarkContextMenuRequested(editor->widget());
connectTextDocumentToTranslationUnit(textDocument);
connectToWidgetsMarkContextMenuRequested(editor->widget());
} else {
connectTextDocumentToUnsavedFiles(textDocument);
}
// TODO: Ensure that not fully loaded documents are updated? // TODO: Ensure that not fully loaded documents are updated?
} }

View File

@@ -55,7 +55,7 @@ static const QLatin1Char kDoubleQuote('"');
static const QLatin1Char kNewLine('\n'); static const QLatin1Char kNewLine('\n');
static const QLatin1Char kHorizontalTab('\t'); static const QLatin1Char kHorizontalTab('\t');
const char CLANG_MODELMANAGERSUPPORT_ID[] = "ClangCodeMode.ClangCodeMode"; const char CLANG_MODELMANAGERSUPPORT_ID[] = "ClangCodeModel.ClangCodeModel";
const char CLANG_ERROR[] = "Clang.Error"; const char CLANG_ERROR[] = "Clang.Error";
const char CLANG_WARNING[] = "Clang.Warning"; const char CLANG_WARNING[] = "Clang.Warning";

View File

@@ -35,13 +35,11 @@
#include "../clangmodelmanagersupport.h" #include "../clangmodelmanagersupport.h"
#include <clangcodemodel/clangeditordocumentprocessor.h> #include <clangcodemodel/clangeditordocumentprocessor.h>
#include <clangcodemodel/constants.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <cpptools/cppcodemodelsettings.h> #include <cpptools/cppcodemodelsettings.h>
#include <cpptools/cpptoolsconstants.h>
#include <cpptools/cpptoolsreuse.h> #include <cpptools/cpptoolsreuse.h>
#include <cpptools/cpptoolstestcase.h> #include <cpptools/cpptoolstestcase.h>
#include <cpptools/modelmanagertesthelper.h> #include <cpptools/modelmanagertesthelper.h>
@@ -857,7 +855,7 @@ private:
ActivateClangModelManagerSupport(); ActivateClangModelManagerSupport();
CppCodeModelSettingsPtr m_codeModelSettings; CppCodeModelSettingsPtr m_codeModelSettings;
QHash<QString, QString> m_previousValues; bool m_clangCodeModelWasUsedPreviously;
}; };
ActivateClangModelManagerSupport::ActivateClangModelManagerSupport( ActivateClangModelManagerSupport::ActivateClangModelManagerSupport(
@@ -865,22 +863,16 @@ ActivateClangModelManagerSupport::ActivateClangModelManagerSupport(
: m_codeModelSettings(codeModelSettings) : m_codeModelSettings(codeModelSettings)
{ {
QTC_CHECK(m_codeModelSettings); QTC_CHECK(m_codeModelSettings);
const QString clangModelManagerSupportId
= QLatin1String(Constants::CLANG_MODELMANAGERSUPPORT_ID); m_clangCodeModelWasUsedPreviously = m_codeModelSettings->useClangCodeModel();
foreach (const QString &mimeType, CppTools::CppCodeModelSettings::supportedMimeTypes()) {
m_previousValues.insert(mimeType, m_codeModelSettings->setUseClangCodeModel(true);
m_codeModelSettings->modelManagerSupportIdForMimeType(mimeType));
m_codeModelSettings->setModelManagerSupportIdForMimeType(mimeType,
clangModelManagerSupportId);
}
m_codeModelSettings->emitChanged(); m_codeModelSettings->emitChanged();
} }
ActivateClangModelManagerSupport::~ActivateClangModelManagerSupport() ActivateClangModelManagerSupport::~ActivateClangModelManagerSupport()
{ {
QHash<QString, QString>::const_iterator i = m_previousValues.constBegin(); m_codeModelSettings->setUseClangCodeModel(m_clangCodeModelWasUsedPreviously);
for (; i != m_previousValues.end(); ++i)
m_codeModelSettings->setModelManagerSupportIdForMimeType(i.key(), i.value());
m_codeModelSettings->emitChanged(); m_codeModelSettings->emitChanged();
} }

View File

@@ -61,8 +61,6 @@ const char CPP_SNIPPETS_GROUP_ID[] = "C++";
const char CPP_PREPROCESSOR_PROJECT_PREFIX[] = "CppPreprocessorProject-"; const char CPP_PREPROCESSOR_PROJECT_PREFIX[] = "CppPreprocessorProject-";
const char CLANG_MODELMANAGERSUPPORT_ID[] = "ClangCodeMode.ClangCodeMode";
} // namespace Constants } // namespace Constants
} // namespace CppEditor } // namespace CppEditor

View File

@@ -181,7 +181,7 @@ void CppEditorDocument::onMimeTypeChanged()
const QString &mt = mimeType(); const QString &mt = mimeType();
m_isObjCEnabled = (mt == QLatin1String(CppTools::Constants::OBJECTIVE_C_SOURCE_MIMETYPE) m_isObjCEnabled = (mt == QLatin1String(CppTools::Constants::OBJECTIVE_C_SOURCE_MIMETYPE)
|| mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)); || mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE));
m_completionAssistProvider = mm()->completionAssistProvider(mt); m_completionAssistProvider = mm()->completionAssistProvider();
initializeTimer(); initializeTimer();
} }
@@ -292,7 +292,7 @@ void CppEditorDocument::releaseResources()
void CppEditorDocument::initializeTimer() void CppEditorDocument::initializeTimer()
{ {
m_processorTimer.setSingleShot(true); m_processorTimer.setSingleShot(true);
if (mm()->isManagedByModelManagerSupport(this, QLatin1String(Constants::CLANG_MODELMANAGERSUPPORT_ID))) if (mm()->isClangCodeModelActive())
m_processorTimer.setInterval(clangProcessDocumentIntervalInMs); m_processorTimer.setInterval(clangProcessDocumentIntervalInMs);
else else
m_processorTimer.setInterval(processDocumentIntervalInMs); m_processorTimer.setInterval(processDocumentIntervalInMs);

View File

@@ -29,23 +29,22 @@
****************************************************************************/ ****************************************************************************/
#include "cppcodemodelsettings.h" #include "cppcodemodelsettings.h"
#include "cppmodelmanagersupport.h"
#include "cpptoolsconstants.h" #include "cpptoolsconstants.h"
#include <QSettings>
using namespace CppTools; using namespace CppTools;
static QLatin1String cppHeaderMimeType(Constants::CPP_HEADER_MIMETYPE); static QLatin1String cppHeaderMimeType(Constants::CPP_HEADER_MIMETYPE);
static QLatin1String cHeaderMimeType(Constants::C_HEADER_MIMETYPE); static QLatin1String cHeaderMimeType(Constants::C_HEADER_MIMETYPE);
static QLatin1String clangExtraOptionsKey(Constants::CPPTOOLS_EXTRA_CLANG_OPTIONS); static QLatin1String clangExtraOptionsKey(Constants::CPPTOOLS_EXTRA_CLANG_OPTIONS);
static QLatin1String useClangCodeModelKey(Constants::CPPTOOLS_USE_CLANG_CODE_MODEL);
void CppCodeModelSettings::fromSettings(QSettings *s) void CppCodeModelSettings::fromSettings(QSettings *s)
{ {
s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP));
QVariant supporters = s->value(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY));
foreach (const QString &mimeType, supportedMimeTypes())
setIdForMimeType(supporters, mimeType);
setUseClangCodeModel(s->value(useClangCodeModelKey, false).toBool());
setExtraClangOptions(s->value(clangExtraOptionsKey, defaultExtraClangOptions()).toStringList()); setExtraClangOptions(s->value(clangExtraOptionsKey, defaultExtraClangOptions()).toStringList());
QVariant v = s->value(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), PchUse_None); QVariant v = s->value(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), PchUse_None);
@@ -58,66 +57,24 @@ void CppCodeModelSettings::fromSettings(QSettings *s)
void CppCodeModelSettings::toSettings(QSettings *s) void CppCodeModelSettings::toSettings(QSettings *s)
{ {
s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP));
QHash<QString, QVariant> var;
foreach (const QString &mimeType, m_modelManagerSupportByMimeType.keys()) s->setValue(useClangCodeModelKey, useClangCodeModel());
var[mimeType] = m_modelManagerSupportByMimeType[mimeType];
s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY), QVariant(var));
s->setValue(clangExtraOptionsKey, extraClangOptions()); s->setValue(clangExtraOptionsKey, extraClangOptions());
s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), pchUsage()); s->setValue(QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE), pchUsage());
s->endGroup(); s->endGroup();
emit changed(); emit changed();
} }
QStringList CppCodeModelSettings::supportedMimeTypes() bool CppCodeModelSettings::useClangCodeModel() const
{ {
return QStringList({ return m_useClangCodeModel;
QLatin1String(Constants::C_SOURCE_MIMETYPE),
QLatin1String(Constants::CPP_SOURCE_MIMETYPE),
QLatin1String(Constants::OBJECTIVE_C_SOURCE_MIMETYPE),
QLatin1String(Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE),
QLatin1String(Constants::CPP_HEADER_MIMETYPE)
});
} }
void CppCodeModelSettings::emitChanged() void CppCodeModelSettings::setUseClangCodeModel(bool useClangCodeModel)
{ {
emit changed(); m_useClangCodeModel = useClangCodeModel;
}
void CppCodeModelSettings::setModelManagerSupportProviders(
const QList<ModelManagerSupportProvider *> &providers)
{
m_modelManagerSupportsByName.clear();
foreach (ModelManagerSupportProvider *provider, providers)
m_modelManagerSupportsByName[provider->displayName()] = provider->id();
}
QString CppCodeModelSettings::modelManagerSupportIdForMimeType(const QString &mimeType) const
{
if (mimeType == cHeaderMimeType)
return m_modelManagerSupportByMimeType.value(cppHeaderMimeType);
else
return m_modelManagerSupportByMimeType.value(mimeType);
}
void CppCodeModelSettings::setModelManagerSupportIdForMimeType(const QString &mimeType,
const QString &id)
{
QString theMimeType = mimeType;
if (theMimeType == cHeaderMimeType)
theMimeType = cppHeaderMimeType;
m_modelManagerSupportByMimeType.insert(theMimeType, id);
}
bool CppCodeModelSettings::hasModelManagerSupportIdForMimeType(const QString &mimeType,
const QString &id) const
{
if (mimeType == cHeaderMimeType)
return m_modelManagerSupportByMimeType.value(cppHeaderMimeType) == id;
else
return m_modelManagerSupportByMimeType.value(mimeType) == id;
} }
QStringList CppCodeModelSettings::defaultExtraClangOptions() QStringList CppCodeModelSettings::defaultExtraClangOptions()
@@ -147,8 +104,17 @@ void CppCodeModelSettings::setExtraClangOptions(const QStringList &extraClangOpt
m_extraClangOptions = extraClangOptions; m_extraClangOptions = extraClangOptions;
} }
void CppCodeModelSettings::setIdForMimeType(const QVariant &var, const QString &mimeType) CppCodeModelSettings::PCHUsage CppCodeModelSettings::pchUsage() const
{ {
QHash<QString, QVariant> mimeToId = var.toHash(); return m_pchUsage;
m_modelManagerSupportByMimeType[mimeType] = mimeToId.value(mimeType, defaultId()).toString(); }
void CppCodeModelSettings::setPCHUsage(CppCodeModelSettings::PCHUsage pchUsage)
{
m_pchUsage = pchUsage;
}
void CppCodeModelSettings::emitChanged()
{
emit changed();
} }

View File

@@ -33,15 +33,15 @@
#include "cpptools_global.h" #include "cpptools_global.h"
#include <QHash> #include <QObject>
#include <QList> #include <QStringList>
#include <QSettings>
#include <QString> QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
namespace CppTools { namespace CppTools {
class ModelManagerSupportProvider;
class CPPTOOLS_EXPORT CppCodeModelSettings : public QObject class CPPTOOLS_EXPORT CppCodeModelSettings : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -53,34 +53,19 @@ public:
}; };
public: public:
CppCodeModelSettings(): m_pchUsage(PchUse_None) {}
void fromSettings(QSettings *s); void fromSettings(QSettings *s);
void toSettings(QSettings *s); void toSettings(QSettings *s);
void setModelManagerSupportProviders(const QList<ModelManagerSupportProvider *> &supporters); public:
bool useClangCodeModel() const;
QString modelManagerSupportIdForMimeType(const QString &mimeType) const; void setUseClangCodeModel(bool useClangCodeModel);
void setModelManagerSupportIdForMimeType(const QString &mimeType, const QString &id);
bool hasModelManagerSupportIdForMimeType(const QString &mimeType, const QString &id) const;
const QHash<QString, QString> &availableModelManagerSupportProvidersByName() const
{ return m_modelManagerSupportsByName; }
QString defaultId() const
{ return m_defaultId; }
void setDefaultId(const QString &defaultId)
{ m_defaultId = defaultId; }
static QStringList defaultExtraClangOptions(); static QStringList defaultExtraClangOptions();
QStringList extraClangOptions() const; QStringList extraClangOptions() const;
void setExtraClangOptions(const QStringList &extraClangOptions); void setExtraClangOptions(const QStringList &extraClangOptions);
PCHUsage pchUsage() const { return m_pchUsage; } PCHUsage pchUsage() const;
void setPCHUsage(PCHUsage pchUsage) { m_pchUsage = pchUsage; } void setPCHUsage(PCHUsage pchUsage);
static QStringList supportedMimeTypes();
public: // for tests public: // for tests
void emitChanged(); void emitChanged();
@@ -89,14 +74,10 @@ signals:
void changed(); void changed();
private: private:
void setIdForMimeType(const QVariant &var, const QString &mimeType); bool m_isClangCodeModelAvailable = false;
bool m_useClangCodeModel = false;
private:
QHash<QString, QString> m_modelManagerSupportByMimeType;
QHash<QString, QString> m_modelManagerSupportsByName;
QStringList m_extraClangOptions; QStringList m_extraClangOptions;
QString m_defaultId; PCHUsage m_pchUsage = PchUse_None;
PCHUsage m_pchUsage;
}; };
} // namespace CppTools } // namespace CppTools

View File

@@ -29,6 +29,7 @@
****************************************************************************/ ****************************************************************************/
#include "cppcodemodelsettingspage.h" #include "cppcodemodelsettingspage.h"
#include "cppmodelmanager.h"
#include "cpptoolsconstants.h" #include "cpptoolsconstants.h"
#include "ui_cppcodemodelsettingspage.h" #include "ui_cppcodemodelsettingspage.h"
@@ -85,19 +86,12 @@ void CppCodeModelSettingsWidget::applyToSettings() const
m_settings->toSettings(Core::ICore::settings()); m_settings->toSettings(Core::ICore::settings());
} }
static bool isClangCodeModelActive(const CppCodeModelSettings &settings)
{
const QString currentCodeModelId
= settings.modelManagerSupportIdForMimeType(QLatin1String(Constants::CPP_SOURCE_MIMETYPE));
return currentCodeModelId != settings.defaultId();
}
void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() const void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() const
{ {
bool isClangActive = false; bool isClangActive = false;
const bool isClangAvailable = m_settings->availableModelManagerSupportProvidersByName().size() > 1; const bool isClangAvailable = CppModelManager::instance()->isClangCodeModelAvailable();
if (isClangAvailable) if (isClangAvailable)
isClangActive = isClangCodeModelActive(*m_settings.data()); isClangActive = m_settings->useClangCodeModel();
m_ui->activateClangCodeModelPluginHint->setVisible(!isClangAvailable); m_ui->activateClangCodeModelPluginHint->setVisible(!isClangAvailable);
m_ui->clangSettingsGroupBox->setEnabled(isClangAvailable); m_ui->clangSettingsGroupBox->setEnabled(isClangAvailable);
@@ -109,23 +103,25 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() const
bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const
{ {
// Once the underlying settings are not mime type based anymore, simplify here. bool settingsChanged = false;
// Until then, ensure that the settings are set uniformly for all the mime types
// to avoid surprises.
const QString activeCodeModelId = m_ui->clangSettingsGroupBox->isChecked() const bool previouslyClangWasActive = m_settings->useClangCodeModel();
? QLatin1String("ClangCodeMode.ClangCodeMode") const bool nowClangIsActive = m_ui->clangSettingsGroupBox->isChecked();
: QLatin1String("CppTools.BuiltinCodeModel"); if (nowClangIsActive != previouslyClangWasActive) {
m_settings->setUseClangCodeModel(nowClangIsActive);
settingsChanged = true;
}
foreach (const QString &mimeType, m_settings->supportedMimeTypes()) const QStringList previousOptions = m_settings->extraClangOptions();
m_settings->setModelManagerSupportIdForMimeType(mimeType, activeCodeModelId); const QString newOptionsAsString = m_ui->clangOptionsToAppendTextEdit->document()->toPlainText();
const QStringList newOptions = newOptionsAsString.split(QLatin1Char('\n'),
QString::SkipEmptyParts);
if (newOptions != previousOptions) {
m_settings->setExtraClangOptions(newOptions);
settingsChanged = true;
}
const QString clangOptionsText = m_ui->clangOptionsToAppendTextEdit->document()->toPlainText(); return settingsChanged;
const QStringList extraClangOptions = clangOptionsText.split(QLatin1Char('\n'),
QString::SkipEmptyParts);
m_settings->setExtraClangOptions(extraClangOptions);
return true;
} }
CppCodeModelSettingsPage::CppCodeModelSettingsPage(QSharedPointer<CppCodeModelSettings> &settings, CppCodeModelSettingsPage::CppCodeModelSettingsPage(QSharedPointer<CppCodeModelSettings> &settings,

View File

@@ -151,11 +151,10 @@ public:
QMap<QString, CppEditorDocumentHandle *> m_cppEditorDocuments; QMap<QString, CppEditorDocumentHandle *> m_cppEditorDocuments;
QSet<AbstractEditorSupport *> m_extraEditorSupports; QSet<AbstractEditorSupport *> m_extraEditorSupports;
// Completion & highlighting // Model Manager Supports for e.g. completion and highlighting
ModelManagerSupportProviderInternal m_modelManagerSupportInternalProvider; ModelManagerSupportProvider *m_clangModelManagerSupportProvider;
ModelManagerSupport::Ptr m_modelManagerSupportInternal; ModelManagerSupport::Ptr m_builtinModelManagerSupport;
QHash<QString, ModelManagerSupportProvider *> m_availableModelManagerSupports; ModelManagerSupport::Ptr m_activeModelManagerSupport;
QHash<QString, ModelManagerSupport::Ptr> m_activeModelManagerSupports;
// Indexing // Indexing
CppIndexingSupport *m_indexingSupporter; CppIndexingSupport *m_indexingSupporter;
@@ -293,6 +292,14 @@ CppModelManager *CppModelManager::instance()
return m_instance; return m_instance;
} }
void CppModelManager::initializeModelManagerSupports()
{
d->m_clangModelManagerSupportProvider = nullptr;
d->m_builtinModelManagerSupport
= ModelManagerSupportProviderInternal().createModelManagerSupport();
d->m_activeModelManagerSupport = d->m_builtinModelManagerSupport;
}
CppModelManager::CppModelManager(QObject *parent) CppModelManager::CppModelManager(QObject *parent)
: CppModelManagerBase(parent), d(new CppModelManagerPrivate) : CppModelManagerBase(parent), d(new CppModelManagerPrivate)
{ {
@@ -337,15 +344,10 @@ CppModelManager::CppModelManager(QObject *parent)
QSharedPointer<CppCodeModelSettings> codeModelSettings QSharedPointer<CppCodeModelSettings> codeModelSettings
= CppToolsPlugin::instance()->codeModelSettings(); = CppToolsPlugin::instance()->codeModelSettings();
codeModelSettings->setDefaultId(d->m_modelManagerSupportInternalProvider.id());
connect(codeModelSettings.data(), &CppCodeModelSettings::changed, connect(codeModelSettings.data(), &CppCodeModelSettings::changed,
this, &CppModelManager::onCodeModelSettingsChanged); this, &CppModelManager::onCodeModelSettingsChanged);
d->m_modelManagerSupportInternal initializeModelManagerSupports();
= d->m_modelManagerSupportInternalProvider.createModelManagerSupport();
d->m_activeModelManagerSupports.insert(d->m_modelManagerSupportInternalProvider.id(),
d->m_modelManagerSupportInternal);
addModelManagerSupportProvider(&d->m_modelManagerSupportInternalProvider);
d->m_internalIndexingSupport = new BuiltinIndexingSupport; d->m_internalIndexingSupport = new BuiltinIndexingSupport;
} }
@@ -665,31 +667,6 @@ void CppModelManager::removeProjectInfoFilesAndIncludesFromSnapshot(const Projec
} }
} }
void CppModelManager::handleAddedModelManagerSupports(const QSet<QString> &supportIds)
{
foreach (const QString &id, supportIds) {
ModelManagerSupportProvider * const provider = d->m_availableModelManagerSupports.value(id);
if (provider) {
QTC_CHECK(!d->m_activeModelManagerSupports.contains(id));
d->m_activeModelManagerSupports.insert(id, provider->createModelManagerSupport());
}
}
}
QList<ModelManagerSupport::Ptr> CppModelManager::handleRemovedModelManagerSupports(
const QSet<QString> &supportIds)
{
QList<ModelManagerSupport::Ptr> removed;
foreach (const QString &id, supportIds) {
const ModelManagerSupport::Ptr support = d->m_activeModelManagerSupports.value(id);
d->m_activeModelManagerSupports.remove(id);
removed << support;
}
return removed;
}
void CppModelManager::closeCppEditorDocuments() void CppModelManager::closeCppEditorDocuments()
{ {
QList<Core::IDocument *> cppDocumentsToClose; QList<Core::IDocument *> cppDocumentsToClose;
@@ -964,12 +941,15 @@ bool CppModelManager::isCppEditor(Core::IEditor *editor) const
return editor->context().contains(ProjectExplorer::Constants::LANG_CXX); return editor->context().contains(ProjectExplorer::Constants::LANG_CXX);
} }
bool CppModelManager::isManagedByModelManagerSupport(Core::IDocument *document, const QString &id) const bool CppModelManager::isClangCodeModelAvailable() const
{ {
auto documentMimeTupe = document->mimeType(); return d->m_clangModelManagerSupportProvider != nullptr;
auto codeModelSettings = CppToolsPlugin::instance()->codeModelSettings(); }
return codeModelSettings->hasModelManagerSupportIdForMimeType(documentMimeTupe, id); bool CppModelManager::isClangCodeModelActive() const
{
return isClangCodeModelAvailable()
&& d->m_activeModelManagerSupport != d->m_builtinModelManagerSupport;
} }
void CppModelManager::emitDocumentUpdated(Document::Ptr doc) void CppModelManager::emitDocumentUpdated(Document::Ptr doc)
@@ -1053,43 +1033,25 @@ void CppModelManager::onCurrentEditorChanged(Core::IEditor *editor)
} }
} }
static const QSet<QString> activeModelManagerSupportsFromSettings()
{
QSet<QString> result;
QSharedPointer<CppCodeModelSettings> codeModelSettings
= CppToolsPlugin::instance()->codeModelSettings();
const QStringList mimeTypes = codeModelSettings->supportedMimeTypes();
foreach (const QString &mimeType, mimeTypes) {
const QString id = codeModelSettings->modelManagerSupportIdForMimeType(mimeType);
if (!id.isEmpty())
result << id;
}
return result;
}
void CppModelManager::onCodeModelSettingsChanged() void CppModelManager::onCodeModelSettingsChanged()
{ {
const QSet<QString> currentCodeModelSupporters = d->m_activeModelManagerSupports.keys().toSet(); const bool isClangActive = isClangCodeModelActive();
const QSet<QString> newCodeModelSupporters = activeModelManagerSupportsFromSettings(); const QSharedPointer<CppCodeModelSettings> settings
= CppToolsPlugin::instance()->codeModelSettings();
QSet<QString> added = newCodeModelSupporters; ModelManagerSupport::Ptr newCodeModelSupport;
added.subtract(currentCodeModelSupporters);
added.remove(d->m_modelManagerSupportInternalProvider.id());
handleAddedModelManagerSupports(added);
QSet<QString> removed = currentCodeModelSupporters; if (isClangCodeModelAvailable()) {
removed.subtract(newCodeModelSupporters); if (!isClangActive && settings->useClangCodeModel())
removed.remove(d->m_modelManagerSupportInternalProvider.id()); newCodeModelSupport = d->m_clangModelManagerSupportProvider->createModelManagerSupport();
const QList<ModelManagerSupport::Ptr> supportsToDelete else if (isClangActive && !settings->useClangCodeModel())
= handleRemovedModelManagerSupports(removed); newCodeModelSupport = d->m_builtinModelManagerSupport;
QTC_CHECK(removed.size() == supportsToDelete.size()); }
if (!added.isEmpty() || !removed.isEmpty()) if (newCodeModelSupport) {
closeCppEditorDocuments(); closeCppEditorDocuments();
d->m_activeModelManagerSupport = newCodeModelSupport;
// supportsToDelete goes out of scope and deletes the supports }
} }
void CppModelManager::onAboutToLoadSession() void CppModelManager::onAboutToLoadSession()
@@ -1201,44 +1163,26 @@ void CppModelManager::finishedRefreshingSourceFiles(const QSet<QString> &files)
emit sourceFilesRefreshed(files); emit sourceFilesRefreshed(files);
} }
void CppModelManager::addModelManagerSupportProvider( void CppModelManager::setClangModelManagerSupportProvider(
ModelManagerSupportProvider *modelManagerSupportProvider) ModelManagerSupportProvider *modelManagerSupportProvider)
{ {
QTC_ASSERT(modelManagerSupportProvider, return); QTC_ASSERT(modelManagerSupportProvider, return);
d->m_availableModelManagerSupports[modelManagerSupportProvider->id()] QTC_CHECK(d->m_clangModelManagerSupportProvider == nullptr);
= modelManagerSupportProvider;
QSharedPointer<CppCodeModelSettings> cms = CppToolsPlugin::instance()->codeModelSettings(); d->m_clangModelManagerSupportProvider = modelManagerSupportProvider;
cms->setModelManagerSupportProviders(d->m_availableModelManagerSupports.values());
onCodeModelSettingsChanged(); onCodeModelSettingsChanged();
} }
ModelManagerSupport::Ptr CppModelManager::modelManagerSupportForMimeType( CppCompletionAssistProvider *CppModelManager::completionAssistProvider() const
const QString &mimeType) const
{ {
QSharedPointer<CppCodeModelSettings> cms = CppToolsPlugin::instance()->codeModelSettings(); return d->m_activeModelManagerSupport->completionAssistProvider();
const QString &id = cms->modelManagerSupportIdForMimeType(mimeType);
return d->m_activeModelManagerSupports.value(id, d->m_modelManagerSupportInternal);
}
CppCompletionAssistProvider *CppModelManager::completionAssistProvider(
const QString &mimeType) const
{
if (mimeType.isEmpty())
return 0;
ModelManagerSupport::Ptr cms = modelManagerSupportForMimeType(mimeType);
QTC_ASSERT(cms, return 0);
return cms->completionAssistProvider();
} }
BaseEditorDocumentProcessor *CppModelManager::editorDocumentProcessor( BaseEditorDocumentProcessor *CppModelManager::editorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) const TextEditor::TextDocument *baseTextDocument) const
{ {
QTC_ASSERT(baseTextDocument, return 0); return d->m_activeModelManagerSupport->editorDocumentProcessor(baseTextDocument);
ModelManagerSupport::Ptr cms = modelManagerSupportForMimeType(baseTextDocument->mimeType());
QTC_ASSERT(cms, return 0);
return cms->editorDocumentProcessor(baseTextDocument);
} }
void CppModelManager::setIndexingSupport(CppIndexingSupport *indexingSupport) void CppModelManager::setIndexingSupport(CppIndexingSupport *indexingSupport)

View File

@@ -121,7 +121,8 @@ public:
void emitAbstractEditorSupportRemoved(const QString &filePath); void emitAbstractEditorSupportRemoved(const QString &filePath);
bool isCppEditor(Core::IEditor *editor) const; bool isCppEditor(Core::IEditor *editor) const;
bool isManagedByModelManagerSupport(Core::IDocument *document, const QString &id) const; bool isClangCodeModelAvailable() const;
bool isClangCodeModelActive() const;
QSet<AbstractEditorSupport*> abstractEditorSupports() const; QSet<AbstractEditorSupport*> abstractEditorSupports() const;
void addExtraEditorSupport(AbstractEditorSupport *editorSupport); void addExtraEditorSupport(AbstractEditorSupport *editorSupport);
@@ -143,8 +144,8 @@ public:
void finishedRefreshingSourceFiles(const QSet<QString> &files); void finishedRefreshingSourceFiles(const QSet<QString> &files);
void addModelManagerSupportProvider(ModelManagerSupportProvider *modelManagerSupportProvider); void setClangModelManagerSupportProvider(ModelManagerSupportProvider *modelManagerSupportProvider);
CppCompletionAssistProvider *completionAssistProvider(const QString &mimeType) const; CppCompletionAssistProvider *completionAssistProvider() const;
BaseEditorDocumentProcessor *editorDocumentProcessor( BaseEditorDocumentProcessor *editorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) const; TextEditor::TextDocument *baseTextDocument) const;
@@ -205,6 +206,7 @@ private slots:
void onCoreAboutToClose(); void onCoreAboutToClose();
private: private:
void initializeModelManagerSupports();
void delayedGC(); void delayedGC();
void recalculateProjectPartMappings(); void recalculateProjectPartMappings();
void updateCppEditorDocuments() const; void updateCppEditorDocuments() const;
@@ -213,13 +215,8 @@ private:
void removeFilesFromSnapshot(const QSet<QString> &removedFiles); void removeFilesFromSnapshot(const QSet<QString> &removedFiles);
void removeProjectInfoFilesAndIncludesFromSnapshot(const ProjectInfo &projectInfo); void removeProjectInfoFilesAndIncludesFromSnapshot(const ProjectInfo &projectInfo);
void handleAddedModelManagerSupports(const QSet<QString> &supportIds);
QList<ModelManagerSupport::Ptr> handleRemovedModelManagerSupports(
const QSet<QString> &supportIds);
void closeCppEditorDocuments(); void closeCppEditorDocuments();
ModelManagerSupport::Ptr modelManagerSupportForMimeType(const QString &mimeType) const;
WorkingCopy buildWorkingCopyList(); WorkingCopy buildWorkingCopyList();
void ensureUpdated(); void ensureUpdated();

View File

@@ -53,9 +53,9 @@ const char CPPTOOLS_SETTINGSGROUP[] = "CppTools";
const char LOWERCASE_CPPFILES_KEY[] = "LowerCaseFiles"; const char LOWERCASE_CPPFILES_KEY[] = "LowerCaseFiles";
enum { lowerCaseFilesDefault = 1 }; enum { lowerCaseFilesDefault = 1 };
const char CPPTOOLS_SORT_EDITOR_DOCUMENT_OUTLINE[] = "SortedMethodOverview"; const char CPPTOOLS_SORT_EDITOR_DOCUMENT_OUTLINE[] = "SortedMethodOverview";
const char CPPTOOLS_MODEL_MANAGER_SUPPORTERS_KEY[] = "ModelManagerSupporters";
const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage"; const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage";
const char CPPTOOLS_EXTRA_CLANG_OPTIONS[] = "ExtraClangOptions"; const char CPPTOOLS_EXTRA_CLANG_OPTIONS[] = "ExtraClangOptions";
const char CPPTOOLS_USE_CLANG_CODE_MODEL[] = "UseClangCodeModel";
const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Cpp.Code Style"; const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Cpp.Code Style";
const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style"); const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style");