[clangd] Handle InitializeParams and store rootUri
Summary:
The root Uri is the workspace location and will be useful in the context of
indexing. We could also add more things to InitializeParams in order to
configure Clangd for C/C++ sepecific extensions.
Reviewers: ilya-biryukov, bkramer, krasimir, Nebiroth
Reviewed By: ilya-biryukov
Subscribers: ilya-biryukov
Tags: #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D38093
llvm-svn: 314309
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp
index d9da386..e68add6 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -286,6 +286,63 @@
return Result;
}
+namespace {
+TraceLevel getTraceLevel(llvm::StringRef TraceLevelStr,
+ clangd::Logger &Logger) {
+ if (TraceLevelStr == "off")
+ return TraceLevel::Off;
+ else if (TraceLevelStr == "messages")
+ return TraceLevel::Messages;
+ else if (TraceLevelStr == "verbose")
+ return TraceLevel::Verbose;
+
+ Logger.log(llvm::formatv("Unknown trace level \"{0}\"\n", TraceLevelStr));
+ return TraceLevel::Off;
+}
+} // namespace
+
+llvm::Optional<InitializeParams>
+InitializeParams::parse(llvm::yaml::MappingNode *Params,
+ clangd::Logger &Logger) {
+ InitializeParams Result;
+ for (auto &NextKeyValue : *Params) {
+ auto *KeyString = dyn_cast<llvm::yaml::ScalarNode>(NextKeyValue.getKey());
+ if (!KeyString)
+ return llvm::None;
+
+ llvm::SmallString<10> KeyStorage;
+ StringRef KeyValue = KeyString->getValue(KeyStorage);
+ auto *Value =
+ dyn_cast_or_null<llvm::yaml::ScalarNode>(NextKeyValue.getValue());
+ if (!Value)
+ continue;
+
+ if (KeyValue == "processId") {
+ auto *Value =
+ dyn_cast_or_null<llvm::yaml::ScalarNode>(NextKeyValue.getValue());
+ if (!Value)
+ return llvm::None;
+ long long Val;
+ if (llvm::getAsSignedInteger(Value->getValue(KeyStorage), 0, Val))
+ return llvm::None;
+ Result.processId = Val;
+ } else if (KeyValue == "rootPath") {
+ Result.rootPath = Value->getValue(KeyStorage);
+ } else if (KeyValue == "rootUri") {
+ Result.rootUri = URI::parse(Value);
+ } else if (KeyValue == "initializationOptions") {
+ // Not used
+ } else if (KeyValue == "capabilities") {
+ // Not used
+ } else if (KeyValue == "trace") {
+ Result.trace = getTraceLevel(Value->getValue(KeyStorage), Logger);
+ } else {
+ logIgnoredField(KeyValue, Logger);
+ }
+ }
+ return Result;
+}
+
llvm::Optional<DidOpenTextDocumentParams>
DidOpenTextDocumentParams::parse(llvm::yaml::MappingNode *Params,
clangd::Logger &Logger) {