diff options
Diffstat (limited to 'clang-tools-extra/clangd/Protocol.cpp')
-rw-r--r-- | clang-tools-extra/clangd/Protocol.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp index 17618f3a1c3..c370e0db0b4 100644 --- a/clang-tools-extra/clangd/Protocol.cpp +++ b/clang-tools-extra/clangd/Protocol.cpp @@ -204,6 +204,33 @@ TextDocumentItem::parse(llvm::yaml::MappingNode *Params) { return Result; } +llvm::Optional<Metadata> Metadata::parse(llvm::yaml::MappingNode *Params) { + Metadata 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 = NextKeyValue.getValue(); + + llvm::SmallString<10> Storage; + if (KeyValue == "extraFlags") { + auto *Seq = dyn_cast<llvm::yaml::SequenceNode>(Value); + if (!Seq) + return llvm::None; + for (auto &Item : *Seq) { + auto *Node = dyn_cast<llvm::yaml::ScalarNode>(&Item); + if (!Node) + return llvm::None; + Result.extraFlags.push_back(Node->getValue(Storage)); + } + } + } + return Result; +} + llvm::Optional<TextEdit> TextEdit::parse(llvm::yaml::MappingNode *Params) { TextEdit Result; for (auto &NextKeyValue : *Params) { @@ -265,6 +292,11 @@ DidOpenTextDocumentParams::parse(llvm::yaml::MappingNode *Params) { if (!Parsed) return llvm::None; Result.textDocument = std::move(*Parsed); + } else if (KeyValue == "metadata") { + auto Parsed = Metadata::parse(Value); + if (!Parsed) + return llvm::None; + Result.metadata = std::move(*Parsed); } else { return llvm::None; } |