[utilities/kate/release/22.12] /: lspclient: add rootfile pattern to detect rootpath
Christoph Cullmann
null at kde.org
Sun Nov 6 20:05:55 GMT 2022
Git commit d2658e90832083544cc7738a3e63da7595ea42fa by Christoph Cullmann, on behalf of Eric Armbruster.
Committed on 06/11/2022 at 20:05.
Pushed by cullmann into branch 'release/22.12'.
lspclient: add rootfile pattern to detect rootpath
This makes it possible to use file patterns to detect the rootpath.
(cherry picked from commit 2239a2aa6c20f1268072e5fed76babc911bb03f1)
M +33 -17 addons/lspclient/lspclientservermanager.cpp
M +2 -1 doc/kate/plugins.docbook
https://invent.kde.org/utilities/kate/commit/d2658e90832083544cc7738a3e63da7595ea42fa
diff --git a/addons/lspclient/lspclientservermanager.cpp b/addons/lspclient/lspclientservermanager.cpp
index 538c40aaa..68d6521e5 100644
--- a/addons/lspclient/lspclientservermanager.cpp
+++ b/addons/lspclient/lspclientservermanager.cpp
@@ -40,8 +40,8 @@
typedef QMap<QString, QString> QStringMap;
Q_DECLARE_METATYPE(QStringMap)
-// helper to find a proper root dir for the given document & file name that indicate the root dir
-static QString rootForDocumentAndRootIndicationFileName(KTextEditor::Document *document, const QString &rootIndicationFileName)
+// helper to find a proper root dir for the given document & file name/pattern that indicates the root dir
+static QString findRootForDocument(KTextEditor::Document *document, const QStringList &rootIndicationFileNames, const QStringList &rootIndicationFilePatterns)
{
// search only feasible if document is local file
if (!document->url().isLocalFile()) {
@@ -56,7 +56,15 @@ static QString rootForDocumentAndRootIndicationFileName(KTextEditor::Document *d
seenDirectories.insert(dir.absolutePath());
// the file that indicates the root dir is there => all fine
- if (dir.exists(rootIndicationFileName)) {
+ for (const auto &fileName : rootIndicationFileNames) {
+ if (dir.exists(fileName)) {
+ return dir.absolutePath();
+ }
+ }
+
+ // look for matching file patterns
+ dir.setNameFilters(rootIndicationFilePatterns);
+ if (!dir.entryList().isEmpty()) {
return dir.absolutePath();
}
@@ -70,6 +78,22 @@ static QString rootForDocumentAndRootIndicationFileName(KTextEditor::Document *d
return QString();
}
+static QStringList indicationDataToStringList(const QJsonValue &indicationData)
+{
+ if (indicationData.isArray()) {
+ QStringList indications;
+ for (auto indication : indicationData.toArray()) {
+ if (indication.isString()) {
+ indications << indication.toString();
+ }
+ }
+
+ return indications;
+ }
+
+ return {};
+};
+
#include <memory>
// helper guard to handle revision (un)lock
@@ -624,20 +648,12 @@ private:
* clangd does
*/
if (!rootpath) {
- const auto fileNamesForDetection = serverConfig.value(QStringLiteral("rootIndicationFileNames"));
- if (fileNamesForDetection.isArray()) {
- // we try each file name alternative in the listed order
- // this allows to have preferences
- const auto fileNames = fileNamesForDetection.toArray();
- for (auto name : fileNames) {
- if (name.isString()) {
- auto root = rootForDocumentAndRootIndicationFileName(document, name.toString());
- if (!root.isEmpty()) {
- rootpath = root;
- break;
- }
- }
- }
+ const auto fileNamesForDetection = indicationDataToStringList(serverConfig.value(QStringLiteral("rootIndicationFileNames")));
+ const auto filePatternsForDetection = indicationDataToStringList(serverConfig.value(QStringLiteral("rootIndicationFilePatterns")));
+
+ auto root = findRootForDocument(document, fileNamesForDetection, filePatternsForDetection);
+ if (!root.isEmpty()) {
+ rootpath = root;
}
}
diff --git a/doc/kate/plugins.docbook b/doc/kate/plugins.docbook
index b03998268..ab950b333 100644
--- a/doc/kate/plugins.docbook
+++ b/doc/kate/plugins.docbook
@@ -2686,7 +2686,8 @@ to the <quote>projectBase</quote> (as determined by the <link
linkend="kate-application-plugin-projects">Project plugin</link>) if applicable,
or otherwise relative to the document's directory. If not specified and
"rootIndicationFileNames" is an array as filenames, then a parent directory of
-current document containing such a file is selected. As a last fallback, the
+current document containing such a file is selected. Alternatively, if "root" is not specified and
+"rootIndicationFilePatterns" is an array of file patterns, then a parent directory of the current document matching the file pattern is selected. As a last fallback, the
home directory is selected as "root". For any document, the resulting "root"
then determines whether or not a separate instance is needed. If so, the "root"
is passed as rootUri/rootPath. </para>
More information about the kde-doc-english
mailing list