aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient/languageclientsettings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/languageclient/languageclientsettings.cpp')
-rw-r--r--src/plugins/languageclient/languageclientsettings.cpp72
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 &reg){
- return reg.exactMatch(filePath.toString()) || reg.exactMatch(filePath.fileName());
+ return Utils::anyOf(regexps, [filePath](const QRegularExpression &reg){
+ return reg.match(filePath.toString()).hasMatch()
+ || reg.match(filePath.fileName()).hasMatch();
});
}