diff options
| author | Sam McCall <sam.mccall@gmail.com> | 2019-03-27 17:47:49 +0000 |
|---|---|---|
| committer | Sam McCall <sam.mccall@gmail.com> | 2019-03-27 17:47:49 +0000 |
| commit | a69698f45fadefd2cabba8d5aa1a8e93463a6d49 (patch) | |
| tree | 4052f9f6efd3a86a95ca6f019328d6b8ac0f50f5 /clang-tools-extra/clangd/Protocol.cpp | |
| parent | 381188f1f39ea8980c23aecb3a0695425aaa99cc (diff) | |
| download | bcm5719-llvm-a69698f45fadefd2cabba8d5aa1a8e93463a6d49.tar.gz bcm5719-llvm-a69698f45fadefd2cabba8d5aa1a8e93463a6d49.zip | |
[clangd] Support utf-8 offsets (rather than utf-16) as a protocol extension
Summary:
Still some pieces to go here: unit tests for new SourceCode functionality and
a command-line flag to force utf-8 mode. But wanted to get early feedback.
Reviewers: hokein
Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, kadircet, jdoerfert, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D58275
llvm-svn: 357102
Diffstat (limited to 'clang-tools-extra/clangd/Protocol.cpp')
| -rw-r--r-- | clang-tools-extra/clangd/Protocol.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp index dfd130a77a5..e11c621aaa3 100644 --- a/clang-tools-extra/clangd/Protocol.cpp +++ b/clang-tools-extra/clangd/Protocol.cpp @@ -16,6 +16,7 @@ #include "clang/Basic/LLVM.h" #include "llvm/ADT/Hashing.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringSwitch.h" #include "llvm/Support/Format.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/JSON.h" @@ -311,6 +312,11 @@ bool fromJSON(const llvm::json::Value &Params, ClientCapabilities &R) { } } } + if (auto *OffsetEncoding = O->get("offsetEncoding")) { + R.offsetEncoding.emplace(); + if (!fromJSON(*OffsetEncoding, *R.offsetEncoding)) + return false; + } return true; } @@ -932,5 +938,26 @@ bool fromJSON(const llvm::json::Value &Params, ReferenceParams &R) { return fromJSON(Params, Base); } +llvm::json::Value toJSON(const OffsetEncoding &OE) { + switch (OE) { + case OffsetEncoding::UTF8: + return "utf-8"; + case OffsetEncoding::UTF16: + return "utf-16"; + case OffsetEncoding::UnsupportedEncoding: + return "unknown"; + } +} +bool fromJSON(const llvm::json::Value &V, OffsetEncoding &OE) { + auto Str = V.getAsString(); + if (!Str) + return false; + OE = llvm::StringSwitch<OffsetEncoding>(*Str) + .Case("utf-8", OffsetEncoding::UTF8) + .Case("utf-16", OffsetEncoding::UTF16) + .Default(OffsetEncoding::UnsupportedEncoding); + return true; +} + } // namespace clangd } // namespace clang |

