ProjectExplorer: Added support for registering custom languages

Change-Id: I728a2ed1ef7d9f44d7c2b59d27d6e23444cd3bb5
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Filippo Cucchetto
2016-12-16 00:43:14 +01:00
parent 35690ab66e
commit 4b1f8f3609
63 changed files with 422 additions and 341 deletions

View File

@@ -27,6 +27,7 @@
#include "abi.h"
#include "headerpath.h"
#include "projectexplorerconstants.h"
#include "toolchainmanager.h"
#include "task.h"
@@ -39,7 +40,8 @@
static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id";
static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName";
static const char AUTODETECT_KEY[] = "ProjectExplorer.ToolChain.Autodetect";
static const char LANGUAGE_KEY[] = "ProjectExplorer.ToolChain.Language";
static const char LANGUAGE_KEY_V1[] = "ProjectExplorer.ToolChain.Language"; // For QtCreator <= 4.2
static const char LANGUAGE_KEY_V2[] = "ProjectExplorer.ToolChain.LanguageV2"; // For QtCreator > 4.2
namespace ProjectExplorer {
namespace Internal {
@@ -63,15 +65,49 @@ public:
}
QByteArray m_id;
QSet<ToolChain::Language> m_supportedLanguages;
QSet<Core::Id> m_supportedLanguages;
mutable QString m_displayName;
Core::Id m_typeId;
ToolChain::Language m_language = ToolChain::Language::None;
Core::Id m_language;
Detection m_detection;
};
// Deprecated used from QtCreator <= 4.2
Core::Id fromLanguageV1(int language)
{
switch (language)
{
case Deprecated::Toolchain::C :
return Core::Id(Constants::C_LANGUAGE_ID);
case Deprecated::Toolchain::Cxx:
return Core::Id(Constants::CXX_LANGUAGE_ID);
case Deprecated::Toolchain::None:
default:
return Core::Id();
}
}
} // namespace Internal
namespace Deprecated {
namespace Toolchain {
QString languageId(Language l)
{
switch (l) {
case Language::None:
return QStringLiteral("None");
case Language::C:
return QStringLiteral("C");
case Language::Cxx:
return QStringLiteral("Cxx");
};
return QString();
}
} // namespace Toolchain
} // namespace Deprecated
/*!
\class ProjectExplorer::ToolChain
\brief The ToolChain class represents a tool chain.
@@ -95,12 +131,13 @@ ToolChain::ToolChain(const ToolChain &other) :
.arg(other.displayName());
}
void ToolChain::setLanguage(const ToolChain::Language &l)
void ToolChain::setLanguage(Core::Id language)
{
QTC_ASSERT(d->m_language == Language::None, return);
QTC_ASSERT(l != Language::None, return);
QTC_ASSERT(!d->m_language.isValid(), return);
QTC_ASSERT(language.isValid(), return);
QTC_ASSERT(ToolChainManager::isLanguageSupported(language), return);
d->m_language = l;
d->m_language = language;
}
ToolChain::~ToolChain()
@@ -154,39 +191,7 @@ QList<Abi> ToolChain::supportedAbis() const
return { targetAbi() };
}
const QSet<ToolChain::Language> &ToolChain::allLanguages()
{
static QSet<Language> languages({ Language::C, Language::Cxx });
return languages;
}
QString ToolChain::languageDisplayName(Language language)
{
switch (language) {
case Language::None:
return QCoreApplication::translate("ProjectExplorer::ToolChain", "None");
case Language::C:
return QCoreApplication::translate("ProjectExplorer::ToolChain", "C");
case Language::Cxx:
return QCoreApplication::translate("ProjectExplorer::ToolChain", "C++");
};
return QString();
}
QString ToolChain::languageId(ToolChain::Language l)
{
switch (l) {
case Language::None:
return QStringLiteral("None");
case Language::C:
return QStringLiteral("C");
case Language::Cxx:
return QStringLiteral("Cxx");
};
return QString();
}
ToolChain::Language ToolChain::language() const
Core::Id ToolChain::language() const
{
return d->m_language;
}
@@ -220,8 +225,7 @@ QVariantMap ToolChain::toMap() const
result.insert(QLatin1String(ID_KEY), idToSave);
result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName());
result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected());
result.insert(QLatin1String(LANGUAGE_KEY), static_cast<int>(language()));
result.insert(QLatin1String(LANGUAGE_KEY_V2), language().toSetting());
return result;
}
@@ -258,12 +262,13 @@ bool ToolChain::fromMap(const QVariantMap &data)
const bool autoDetect = data.value(QLatin1String(AUTODETECT_KEY), false).toBool();
d->m_detection = autoDetect ? AutoDetectionFromSettings : ManualDetection;
bool ok;
d->m_language
= static_cast<Language>(data.value(QLatin1String(LANGUAGE_KEY),
static_cast<int>(Language::Cxx)).toInt(&ok));
if (!ok)
d->m_language = Language::Cxx;
if (data.contains(LANGUAGE_KEY_V2))
d->m_language = Core::Id::fromSetting(data.value(QLatin1String(LANGUAGE_KEY_V2)));
else if (data.contains(LANGUAGE_KEY_V1)) // Import from old settings
d->m_language = Internal::fromLanguageV1(data.value(QLatin1String(LANGUAGE_KEY_V1)).toInt());
if (!d->m_language.isValid())
d->m_language = Core::Id(Constants::CXX_LANGUAGE_ID);
return true;
}
@@ -311,7 +316,7 @@ bool ToolChainFactory::canCreate()
return false;
}
ToolChain *ToolChainFactory::create(ToolChain::Language l)
ToolChain *ToolChainFactory::create(Core::Id l)
{
Q_UNUSED(l);
return nullptr;