diff options
Diffstat (limited to 'src/plugins/languageclient/languageclientsettings.cpp')
-rw-r--r-- | src/plugins/languageclient/languageclientsettings.cpp | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index c27a8f599a..1cb53dafff 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -34,14 +34,17 @@ #include <coreplugin/icore.h> #include <coreplugin/idocument.h> #include <coreplugin/variablechooser.h> + #include <projectexplorer/project.h> #include <projectexplorer/session.h> + #include <utils/algorithm.h> #include <utils/utilsicons.h> #include <utils/delegates.h> #include <utils/fancylineedit.h> #include <utils/mimetypes/mimedatabase.h> #include <utils/jsontreeitem.h> +#include <utils/stringutils.h> #include <QBoxLayout> #include <QComboBox> @@ -52,6 +55,7 @@ #include <QDir> #include <QFileInfo> #include <QHeaderView> +#include <QJsonDocument> #include <QLabel> #include <QListView> #include <QMimeData> @@ -68,6 +72,7 @@ constexpr char enabledKey[] = "enabled"; constexpr char startupBehaviorKey[] = "startupBehavior"; constexpr char mimeTypeKey[] = "mimeType"; constexpr char filePatternKey[] = "filePattern"; +constexpr char initializationOptionsKey[] = "initializationOptions"; constexpr char executableKey[] = "executable"; constexpr char argumentsKey[] = "arguments"; constexpr char settingsGroupKey[] = "LanguageClient"; @@ -465,12 +470,19 @@ QModelIndex LanguageClientSettingsModel::indexForSetting(BaseSettings *setting) return index < 0 ? QModelIndex() : createIndex(index, 0, setting); } +QJsonObject BaseSettings::initializationOptions() const +{ + return QJsonDocument::fromJson(Utils::globalMacroExpander()-> + expand(m_initializationOptions).toUtf8()).object(); +} + void BaseSettings::applyFromSettingsWidget(QWidget *widget) { if (auto settingsWidget = qobject_cast<BaseSettingsWidget *>(widget)) { m_name = settingsWidget->name(); m_languageFilter = settingsWidget->filter(); m_startBehavior = settingsWidget->startupBehavior(); + m_initializationOptions = settingsWidget->initializationOptions(); } } @@ -505,6 +517,7 @@ Client *BaseSettings::createClient() auto *client = new Client(interface); client->setName(Utils::globalMacroExpander()->expand(m_name)); client->setSupportedLanguage(m_languageFilter); + client->setInitializationOptions(initializationOptions()); return client; } @@ -517,6 +530,7 @@ QVariantMap BaseSettings::toMap() const map.insert(startupBehaviorKey, m_startBehavior); map.insert(mimeTypeKey, m_languageFilter.mimeTypes); map.insert(filePatternKey, m_languageFilter.filePattern); + map.insert(initializationOptionsKey, m_initializationOptions); return map; } @@ -530,6 +544,7 @@ void BaseSettings::fromMap(const QVariantMap &map) m_languageFilter.mimeTypes = map[mimeTypeKey].toStringList(); m_languageFilter.filePattern = map[filePatternKey].toStringList(); m_languageFilter.filePattern.removeAll({}); // remove empty entries + m_initializationOptions = map[initializationOptionsKey].toString(); } static LanguageClientSettingsPage &settingsPage() @@ -706,13 +721,16 @@ BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *pa , m_mimeTypes(new QLabel(settings->m_languageFilter.mimeTypes.join(filterSeparator), this)) , m_filePattern(new QLineEdit(settings->m_languageFilter.filePattern.join(filterSeparator), this)) , m_startupBehavior(new QComboBox) + , m_initializationOptions(new Utils::FancyLineEdit(this)) { int row = 0; auto *mainLayout = new QGridLayout; + mainLayout->addWidget(new QLabel(tr("Name:")), row, 0); mainLayout->addWidget(m_name, row, 1); auto chooser = new Core::VariableChooser(this); chooser->addSupportedWidget(m_name); + mainLayout->addWidget(new QLabel(tr("Language:")), ++row, 0); auto mimeLayout = new QHBoxLayout; mimeLayout->addWidget(m_mimeTypes); @@ -722,6 +740,7 @@ BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *pa mainLayout->addLayout(mimeLayout, row, 1); m_filePattern->setPlaceholderText(tr("File pattern")); mainLayout->addWidget(m_filePattern, ++row, 1); + mainLayout->addWidget(new QLabel(tr("Startup behavior:")), ++row, 0); for (int behavior = 0; behavior < BaseSettings::LastSentinel ; ++behavior) m_startupBehavior->addItem(startupBehaviorString(BaseSettings::StartBehavior(behavior))); @@ -757,6 +776,33 @@ BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *pa mainLayout->addWidget(createCapabilitiesView(QJsonValue(capabilities)), row, 1); }); } + + mainLayout->addWidget(new QLabel(tr("Initialization options:")), ++row, 0); + mainLayout->addWidget(m_initializationOptions, row, 1); + chooser->addSupportedWidget(m_initializationOptions); + m_initializationOptions->setValidationFunction([](Utils::FancyLineEdit *edit, QString *errorMessage) { + const QString value = Utils::globalMacroExpander()->expand(edit->text()); + + if (value.isEmpty()) + return true; + + QJsonParseError parseInfo; + const QJsonDocument json = QJsonDocument::fromJson(value.toUtf8(), &parseInfo); + + if (json.isNull()) { + if (errorMessage) + *errorMessage = tr("Failed to parse JSON at %1: %2") + .arg(parseInfo.offset) + .arg(parseInfo.errorString()); + return false; + } + return true; + }); + m_initializationOptions->setText(settings->m_initializationOptions); + m_initializationOptions->setPlaceholderText(tr("Language server-specific JSON to pass via " + "\"initializationOptions\" field of \"initialize\" " + "request.")); + setLayout(mainLayout); } @@ -767,8 +813,8 @@ QString BaseSettingsWidget::name() const LanguageFilter BaseSettingsWidget::filter() const { - return {m_mimeTypes->text().split(filterSeparator, QString::SkipEmptyParts), - m_filePattern->text().split(filterSeparator, QString::SkipEmptyParts)}; + return {m_mimeTypes->text().split(filterSeparator, Utils::SkipEmptyParts), + m_filePattern->text().split(filterSeparator, Utils::SkipEmptyParts)}; } BaseSettings::StartBehavior BaseSettingsWidget::startupBehavior() const @@ -776,6 +822,11 @@ BaseSettings::StartBehavior BaseSettingsWidget::startupBehavior() const return BaseSettings::StartBehavior(m_startupBehavior->currentIndex()); } +QString BaseSettingsWidget::initializationOptions() const +{ + return m_initializationOptions->text(); +} + class MimeTypeModel : public QStringListModel { public: @@ -862,7 +913,7 @@ private: void BaseSettingsWidget::showAddMimeTypeDialog() { - MimeTypeDialog dialog(m_mimeTypes->text().split(filterSeparator, QString::SkipEmptyParts), + MimeTypeDialog dialog(m_mimeTypes->text().split(filterSeparator, Utils::SkipEmptyParts), Core::ICore::dialogParent()); if (dialog.exec() == QDialog::Rejected) return; @@ -890,7 +941,7 @@ StdIOSettingsWidget::StdIOSettingsWidget(const StdIOSettings *settings, QWidget QString StdIOSettingsWidget::executable() const { - return m_executable->path(); + return m_executable->filePath().toString(); } QString StdIOSettingsWidget::arguments() const @@ -904,11 +955,16 @@ bool LanguageFilter::isSupported(const Utils::FilePath &filePath, const QString return true; if (filePattern.isEmpty() && filePath.isEmpty()) return mimeTypes.isEmpty(); - auto regexps = Utils::transform(filePattern, [](const QString &pattern){ - return QRegExp(pattern, Utils::HostOsInfo::fileNameCaseSensitivity(), QRegExp::Wildcard); + const QRegularExpression::PatternOptions options + = Utils::HostOsInfo::fileNameCaseSensitivity() == Qt::CaseInsensitive + ? QRegularExpression::CaseInsensitiveOption : QRegularExpression::NoPatternOption; + auto regexps = Utils::transform(filePattern, [&options](const QString &pattern){ + return QRegularExpression(QRegularExpression::wildcardToRegularExpression(pattern), + options); }); - return Utils::anyOf(regexps, [filePath](const QRegExp ®){ - return reg.exactMatch(filePath.toString()) || reg.exactMatch(filePath.fileName()); + return Utils::anyOf(regexps, [filePath](const QRegularExpression ®){ + return reg.match(filePath.toString()).hasMatch() + || reg.match(filePath.fileName()).hasMatch(); }); } |