aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2019-07-22 09:34:47 +0200
committerEike Ziller <eike.ziller@qt.io>2019-07-22 09:34:47 +0200
commit4ce34fd90f19f38f50fd6046a08bf4eca65e0a85 (patch)
treebbe1d857375517eff90cc425465ff2b49450b671 /src/libs
parent370511b5e469039230888b9a7c415d695224d398 (diff)
parent4c77521a6fe1a491907084fed293b7d42a8dbc63 (diff)
Merge remote-tracking branch 'origin/4.10'
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/languageserverprotocol/jsonkeys.h1
-rw-r--r--src/libs/languageserverprotocol/servercapabilities.cpp42
-rw-r--r--src/libs/languageserverprotocol/servercapabilities.h24
-rw-r--r--src/libs/utils/filesearch.cpp44
-rw-r--r--src/libs/utils/filesearch.h1
5 files changed, 88 insertions, 24 deletions
diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h
index 4c4ee054ab..cccf0789b9 100644
--- a/src/libs/languageserverprotocol/jsonkeys.h
+++ b/src/libs/languageserverprotocol/jsonkeys.h
@@ -145,6 +145,7 @@ constexpr char optionsKey[] = "options";
constexpr char parametersKey[] = "params";
constexpr char patternKey[] = "pattern";
constexpr char positionKey[] = "position";
+constexpr char prepareProviderKey[] = "prepareProvider";
constexpr char processIdKey[] = "processId";
constexpr char queryKey[] = "query";
constexpr char rangeFormattingKey[] = "rangeFormatting";
diff --git a/src/libs/languageserverprotocol/servercapabilities.cpp b/src/libs/languageserverprotocol/servercapabilities.cpp
index f9dce15b35..a8e932ad50 100644
--- a/src/libs/languageserverprotocol/servercapabilities.cpp
+++ b/src/libs/languageserverprotocol/servercapabilities.cpp
@@ -111,6 +111,44 @@ Utils::optional<Utils::variant<bool, CodeActionOptions>> ServerCapabilities::cod
return Utils::nullopt;
}
+Utils::optional<Utils::variant<ServerCapabilities::RenameOptions, bool>> ServerCapabilities::renameProvider() const
+{
+ using RetType = Utils::variant<ServerCapabilities::RenameOptions, bool>;
+ const QJsonValue &localValue = value(renameProviderKey);
+ if (localValue.isBool())
+ return RetType(localValue.toBool());
+ if (localValue.isObject())
+ return RetType(RenameOptions(localValue.toObject()));
+ return Utils::nullopt;
+}
+
+void ServerCapabilities::setRenameProvider(Utils::variant<ServerCapabilities::RenameOptions, bool> renameProvider)
+{
+ if (Utils::holds_alternative<bool>(renameProvider))
+ insert(renameProviderKey, Utils::get<bool>(renameProvider));
+ else if (Utils::holds_alternative<RenameOptions>(renameProvider))
+ insert(renameProviderKey, Utils::get<RenameOptions>(renameProvider));
+}
+
+Utils::optional<Utils::variant<bool, JsonObject>> ServerCapabilities::colorProvider() const
+{
+ using RetType = Utils::variant<bool, JsonObject>;
+ const QJsonValue &localValue = value(colorProviderKey);
+ if (localValue.isBool())
+ return RetType(localValue.toBool());
+ if (localValue.isObject())
+ return RetType(JsonObject(localValue.toObject()));
+ return Utils::nullopt;
+}
+
+void ServerCapabilities::setColorProvider(Utils::variant<bool, JsonObject> colorProvider)
+{
+ if (Utils::holds_alternative<bool>(colorProvider))
+ insert(renameProviderKey, Utils::get<bool>(colorProvider));
+ else if (Utils::holds_alternative<JsonObject>(colorProvider))
+ insert(renameProviderKey, Utils::get<JsonObject>(colorProvider));
+}
+
bool ServerCapabilities::isValid(QStringList *error) const
{
return checkOptional<TextDocumentSyncOptions, int>(error, textDocumentSyncKey)
@@ -128,9 +166,9 @@ bool ServerCapabilities::isValid(QStringList *error) const
&& checkOptional<CodeLensOptions>(error, codeLensProviderKey)
&& checkOptional<bool>(error, documentFormattingProviderKey)
&& checkOptional<bool>(error, documentRangeFormattingProviderKey)
- && checkOptional<bool>(error, renameProviderKey)
+ && checkOptional<bool, RenameOptions>(error, renameProviderKey)
&& checkOptional<DocumentLinkOptions>(error, documentLinkProviderKey)
- && checkOptional<TextDocumentRegistrationOptions>(error, colorProviderKey)
+ && checkOptional<bool, JsonObject>(error, colorProviderKey)
&& checkOptional<ExecuteCommandOptions>(error, executeCommandProviderKey)
&& checkOptional<WorkspaceServerCapabilities>(error, workspaceKey)
&& checkOptional<SemanticHighlightingServerCapabilities>(error, semanticHighlightingKey);
diff --git a/src/libs/languageserverprotocol/servercapabilities.h b/src/libs/languageserverprotocol/servercapabilities.h
index 6345178c57..7365449b0f 100644
--- a/src/libs/languageserverprotocol/servercapabilities.h
+++ b/src/libs/languageserverprotocol/servercapabilities.h
@@ -357,9 +357,23 @@ public:
{ insert(documentRangeFormattingProviderKey, documentRangeFormattingProvider); }
void clearDocumentRangeFormattingProvider() { remove(documentRangeFormattingProviderKey); }
+ class RenameOptions : public JsonObject
+ {
+ public:
+ using JsonObject::JsonObject;
+
+ // Renames should be checked and tested before being executed.
+ Utils::optional<bool> prepareProvider() const { return optionalValue<bool>(prepareProviderKey); }
+ void setPrepareProvider(bool prepareProvider) { insert(prepareProviderKey, prepareProvider); }
+ void clearPrepareProvider() { remove(prepareProviderKey); }
+
+ bool isValid(QStringList * error) const override
+ { return checkOptional<bool>(error, prepareProviderKey); }
+ };
+
// The server provides rename support.
- Utils::optional<bool> renameProvider() const { return optionalValue<bool>(renameProviderKey); }
- void setRenameProvider(bool renameProvider) { insert(renameProviderKey, renameProvider); }
+ Utils::optional<Utils::variant<RenameOptions, bool>> renameProvider() const;
+ void setRenameProvider(Utils::variant<RenameOptions,bool> renameProvider);
void clearRenameProvider() { remove(renameProviderKey); }
// The server provides document link support.
@@ -370,10 +384,8 @@ public:
void clearDocumentLinkProvider() { remove(documentLinkProviderKey); }
// The server provides color provider support.
- Utils::optional<TextDocumentRegistrationOptions> colorProvider() const
- { return optionalValue<TextDocumentRegistrationOptions>(colorProviderKey); }
- void setColorProvider(TextDocumentRegistrationOptions colorProvider)
- { insert(colorProviderKey, colorProvider); }
+ Utils::optional<Utils::variant<bool, JsonObject>> colorProvider() const;
+ void setColorProvider(Utils::variant<bool, JsonObject> colorProvider);
void clearColorProvider() { remove(colorProviderKey); }
// The server provides execute command support.
diff --git a/src/libs/utils/filesearch.cpp b/src/libs/utils/filesearch.cpp
index 0bdf3991c5..03aa1cf9b2 100644
--- a/src/libs/utils/filesearch.cpp
+++ b/src/libs/utils/filesearch.cpp
@@ -651,11 +651,16 @@ SubDirFileIterator::SubDirFileIterator(const QStringList &directories, const QSt
{
m_encoding = (encoding == nullptr ? QTextCodec::codecForLocale() : encoding);
qreal maxPer = qreal(MAX_PROGRESS) / directories.count();
- foreach (const QString &directoryEntry, directories) {
+ for (const QString &directoryEntry : directories) {
if (!directoryEntry.isEmpty()) {
- m_dirs.push(QDir(directoryEntry));
- m_progressValues.push(maxPer);
- m_processedValues.push(false);
+ const QDir dir(directoryEntry);
+ const QString canonicalPath = dir.canonicalPath();
+ if (!canonicalPath.isEmpty() && dir.exists()) {
+ m_dirs.push(dir);
+ m_knownDirs.insert(canonicalPath);
+ m_progressValues.push(maxPer);
+ m_processedValues.push(false);
+ }
}
}
}
@@ -676,10 +681,18 @@ void SubDirFileIterator::update(int index)
const bool processed = m_processedValues.pop();
if (dir.exists()) {
const QString dirPath = dir.path();
- QStringList subDirs;
- if (!processed)
- subDirs = dir.entryList(QDir::Dirs|QDir::Hidden|QDir::NoDotAndDotDot);
- if (subDirs.isEmpty()) {
+ using Dir = QString;
+ using CanonicalDir = QString;
+ std::vector<std::pair<Dir, CanonicalDir>> subDirs;
+ if (!processed) {
+ for (const QFileInfo &info :
+ dir.entryInfoList(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot)) {
+ const QString canonicalDir = info.canonicalFilePath();
+ if (!m_knownDirs.contains(canonicalDir))
+ subDirs.emplace_back(info.filePath(), canonicalDir);
+ }
+ }
+ if (subDirs.empty()) {
const QStringList allFileEntries = dir.entryList(QDir::Files|QDir::Hidden);
const QStringList allFilePaths = Utils::transform(allFileEntries,
[&dirPath](const QString &entry) {
@@ -696,14 +709,13 @@ void SubDirFileIterator::update(int index)
m_dirs.push(dir);
m_progressValues.push(subProgress);
m_processedValues.push(true);
- QStringListIterator it(subDirs);
- it.toBack();
- while (it.hasPrevious()) {
- const QString &directory = it.previous();
- m_dirs.push(QDir(dirPath + QLatin1Char('/') + directory));
- m_progressValues.push(subProgress);
- m_processedValues.push(false);
- }
+ Utils::reverseForeach(subDirs,
+ [this, subProgress](const std::pair<Dir, CanonicalDir> &dir) {
+ m_dirs.push(QDir(dir.first));
+ m_knownDirs.insert(dir.second);
+ m_progressValues.push(subProgress);
+ m_processedValues.push(false);
+ });
}
} else {
m_progress += dirProgressMax;
diff --git a/src/libs/utils/filesearch.h b/src/libs/utils/filesearch.h
index cddb637184..546a7334cc 100644
--- a/src/libs/utils/filesearch.h
+++ b/src/libs/utils/filesearch.h
@@ -159,6 +159,7 @@ private:
std::function<QStringList(const QStringList &)> m_filterFiles;
QTextCodec *m_encoding;
QStack<QDir> m_dirs;
+ QSet<QString> m_knownDirs;
QStack<qreal> m_progressValues;
QStack<bool> m_processedValues;
qreal m_progress;