@@ -31,23 +31,24 @@ using Pattern = std::string;
3131
3232class LSPObject {
3333 public:
34- explicit LSPObject(json repr): repr_(std::move( repr) ) {}
34+ explicit LSPObject(json& repr): repr_(& repr) {}
3535
36- [[nodiscard]] operator const json&() const { return repr_; }
36+ [[nodiscard]] operator const json&() const { return *repr_; }
37+ [[nodiscard]] auto get() const -> json& { return *repr_; }
3738
3839 protected:
39- json repr_;
40+ json* repr_{nullptr} ;
4041};
4142
4243template <typename T>
4344class Vector final : public LSPObject {
4445public:
4546 using LSPObject::LSPObject;
4647
47- [[nodiscard]] explicit operator bool() const { return repr_. is_array(); }
48- [[nodiscard]] auto size() const -> std::size_t { return repr_. size(); }
49- [[nodiscard]] auto empty() const -> bool { return repr_. empty(); }
50- [[nodiscard]] auto at(int index) const -> const T& { return repr_[ index] ; }
48+ [[nodiscard]] explicit operator bool() const { return repr_-> is_array(); }
49+ [[nodiscard]] auto size() const -> std::size_t { return repr_-> size(); }
50+ [[nodiscard]] auto empty() const -> bool { return repr_-> empty(); }
51+ [[nodiscard]] auto at(int index) const -> const T& { return repr_->at( index) ; }
5152};
5253
5354namespace details {
@@ -57,7 +58,7 @@ struct TryEmplace;
5758
5859template <std::derived_from<LSPObject> T>
5960struct TryEmplace<T> {
60- auto operator()(auto& result, const json& value) const -> bool {
61+ auto operator()(auto& result, json& value) const -> bool {
6162 auto obj = T{value};
6263 if (!obj) return false;
6364 result.template emplace<T>(std::move(obj));
@@ -66,7 +67,7 @@ struct TryEmplace<T> {
6667};
6768
6869template <typename... Ts>
69- auto try_emplace(std::variant<Ts...>& result, const json& value) -> bool {
70+ auto try_emplace(std::variant<Ts...>& result, json& value) -> bool {
7071 return (details::TryEmplace<Ts>{}(result, value) || ...);
7172}
7273
@@ -77,7 +78,7 @@ struct TryEmplace<std::monostate> {
7778
7879template <>
7980struct TryEmplace<std::nullptr_t> {
80- auto operator()(auto& result, const json& value) const -> bool {
81+ auto operator()(auto& result, json& value) const -> bool {
8182 if (!value.is_null()) return false;
8283 result.template emplace<std::nullptr_t>(nullptr);
8384 return true;
@@ -86,7 +87,7 @@ struct TryEmplace<std::nullptr_t> {
8687
8788template <>
8889struct TryEmplace<bool> {
89- auto operator()(auto& result, const json& value) const -> bool {
90+ auto operator()(auto& result, json& value) const -> bool {
9091 if (!value.is_boolean()) return false;
9192 result.template emplace<bool>(value);
9293 return true;
@@ -95,7 +96,7 @@ struct TryEmplace<bool> {
9596
9697template <>
9798struct TryEmplace<int> {
98- auto operator()(auto& result, const json& value) const -> bool {
99+ auto operator()(auto& result, json& value) const -> bool {
99100 if (!value.is_number_integer()) return false;
100101 result.template emplace<int>(value);
101102 return true;
@@ -104,7 +105,7 @@ struct TryEmplace<int> {
104105
105106template <>
106107struct TryEmplace<long> {
107- auto operator()(auto& result, const json& value) const -> bool {
108+ auto operator()(auto& result, json& value) const -> bool {
108109 if (!value.is_number_integer()) return false;
109110 result.template emplace<long>(value);
110111 return true;
@@ -113,7 +114,7 @@ struct TryEmplace<long> {
113114
114115template <>
115116struct TryEmplace<double> {
116- auto operator()(auto& result, const json& value) const -> bool {
117+ auto operator()(auto& result, json& value) const -> bool {
117118 if (!value.is_number_float()) return false;
118119 result.template emplace<double>(value);
119120 return true;
@@ -122,7 +123,7 @@ struct TryEmplace<double> {
122123
123124template <>
124125struct TryEmplace<std::string> {
125- auto operator()(auto& result, const json& value) const -> bool {
126+ auto operator()(auto& result, json& value) const -> bool {
126127 if (!value.is_string()) return false;
127128 result.template emplace<std::string>(value);
128129 return true;
@@ -131,31 +132,32 @@ struct TryEmplace<std::string> {
131132
132133template <typename... Ts>
133134struct TryEmplace<std::variant<Ts...>> {
134- auto operator()(auto& result, const json& value) const -> bool {
135+ auto operator()(auto& result, json& value) const -> bool {
135136 return try_emplace(result, value);
136137 }
137138};
138139
139140template <typename... Ts>
140141struct TryEmplace<std::tuple<Ts...>> {
141- auto operator()(auto& result, const json& value) const -> bool {
142+ auto operator()(auto& result, json& value) const -> bool {
142143 lsp_runtime_error("todo: TryEmplace<std::tuple<Ts...>>");
143144 return false;
144145 }
145146};
146147
147148template <>
148149struct TryEmplace<json> {
149- auto operator()(auto& result, const json& value) const -> bool {
150+ auto operator()(auto& result, json& value) const -> bool {
150151 result = value;
151152 return true;
152153 }
153154};
154155
155156template <>
156157struct TryEmplace<TextDocumentSyncKind> {
157- auto operator()(auto& result, const json& value) const -> bool {
158- lsp_runtime_error("todo: TextDocumentSyncKind<json>");
158+ auto operator()(auto& result, json& value) const -> bool {
159+ if (!value.is_number_integer()) return false;
160+ result = TextDocumentSyncKind(value.get<int>());
159161 return true;
160162 }
161163};
@@ -167,12 +169,12 @@ class Vector<std::variant<Ts...>> final : public LSPObject {
167169 public:
168170 using LSPObject::LSPObject;
169171
170- [[nodiscard]] explicit operator bool() const { return repr_. is_array(); }
171- [[nodiscard]] auto size() const -> std::size_t { return repr_. size(); }
172- [[nodiscard]] auto empty() const -> bool { return repr_. empty(); }
172+ [[nodiscard]] explicit operator bool() const { return repr_-> is_array(); }
173+ [[nodiscard]] auto size() const -> std::size_t { return repr_-> size(); }
174+ [[nodiscard]] auto empty() const -> bool { return repr_-> empty(); }
173175 [[nodiscard]] auto at(int index) const -> std::variant<Ts...> {
174176 std::variant<Ts...> result;
175- details::try_emplace(result, repr_[ index] );
177+ details::try_emplace(result, repr_->at( index) );
176178 return result;
177179 }
178180};
@@ -182,24 +184,24 @@ class Map final : public LSPObject {
182184public:
183185 using LSPObject::LSPObject;
184186
185- [[nodiscard]] explicit operator bool() const { return repr_. is_object(); }
186- [[nodiscard]] auto size() const -> std::size_t { return repr_. size(); }
187- [[nodiscard]] auto empty() const -> bool { return repr_. empty(); }
188- [[nodiscard]] auto at(const Key& key) const -> const Value& { return repr_[ key] ; }
187+ [[nodiscard]] explicit operator bool() const { return repr_-> is_object(); }
188+ [[nodiscard]] auto size() const -> std::size_t { return repr_-> size(); }
189+ [[nodiscard]] auto empty() const -> bool { return repr_-> empty(); }
190+ [[nodiscard]] auto at(const Key& key) const -> const Value& { return repr_->at( key) ; }
189191};
190192
191193template <typename Key, typename... Ts>
192194class Map<Key, std::variant<Ts...>> final : public LSPObject {
193195 public:
194196 using LSPObject::LSPObject;
195197
196- [[nodiscard]] explicit operator bool() const { return repr_. is_object(); }
197- [[nodiscard]] auto size() const -> std::size_t { return repr_. size(); }
198- [[nodiscard]] auto empty() const -> bool { return repr_. empty(); }
198+ [[nodiscard]] explicit operator bool() const { return repr_-> is_object(); }
199+ [[nodiscard]] auto size() const -> std::size_t { return repr_-> size(); }
200+ [[nodiscard]] auto empty() const -> bool { return repr_-> empty(); }
199201
200202 [[nodiscard]] auto at(const Key& key) const -> std::variant<Ts...> {
201203 std::variant<Ts...> result;
202- details::try_emplace(result, repr_[ key] );
204+ details::try_emplace(result, repr_->at( key) );
203205 return result;
204206 }
205207};
0 commit comments