diff options
author | Aleksey Kladov <[email protected]> | 2019-08-20 16:33:23 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-08-20 17:53:05 +0100 |
commit | 80a6e614465d8b16cae50f3626c15e912ad3c6f2 (patch) | |
tree | 0ecd7a1a7b79444fcc3847dcefb53ba0ece7c9be /crates | |
parent | de3f2948ea2416d65640c07d2c69df75a4273d50 (diff) |
make CTX type param instead of assoc type
that way, we can implement ConvWith<&'_ CTX> for different lifetimes
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_lsp_server/src/conv.rs | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs index 236fdb972..bbe140b7a 100644 --- a/crates/ra_lsp_server/src/conv.rs +++ b/crates/ra_lsp_server/src/conv.rs | |||
@@ -19,10 +19,9 @@ pub trait Conv { | |||
19 | fn conv(self) -> Self::Output; | 19 | fn conv(self) -> Self::Output; |
20 | } | 20 | } |
21 | 21 | ||
22 | pub trait ConvWith { | 22 | pub trait ConvWith<CTX> { |
23 | type Ctx; | ||
24 | type Output; | 23 | type Output; |
25 | fn conv_with(self, ctx: &Self::Ctx) -> Self::Output; | 24 | fn conv_with(self, ctx: CTX) -> Self::Output; |
26 | } | 25 | } |
27 | 26 | ||
28 | pub trait TryConvWith { | 27 | pub trait TryConvWith { |
@@ -89,8 +88,7 @@ impl Conv for Severity { | |||
89 | } | 88 | } |
90 | } | 89 | } |
91 | 90 | ||
92 | impl ConvWith for CompletionItem { | 91 | impl ConvWith<&'_ LineIndex> for CompletionItem { |
93 | type Ctx = LineIndex; | ||
94 | type Output = ::lsp_types::CompletionItem; | 92 | type Output = ::lsp_types::CompletionItem; |
95 | 93 | ||
96 | fn conv_with(self, ctx: &LineIndex) -> ::lsp_types::CompletionItem { | 94 | fn conv_with(self, ctx: &LineIndex) -> ::lsp_types::CompletionItem { |
@@ -138,8 +136,7 @@ impl ConvWith for CompletionItem { | |||
138 | } | 136 | } |
139 | } | 137 | } |
140 | 138 | ||
141 | impl ConvWith for Position { | 139 | impl ConvWith<&'_ LineIndex> for Position { |
142 | type Ctx = LineIndex; | ||
143 | type Output = TextUnit; | 140 | type Output = TextUnit; |
144 | 141 | ||
145 | fn conv_with(self, line_index: &LineIndex) -> TextUnit { | 142 | fn conv_with(self, line_index: &LineIndex) -> TextUnit { |
@@ -148,8 +145,7 @@ impl ConvWith for Position { | |||
148 | } | 145 | } |
149 | } | 146 | } |
150 | 147 | ||
151 | impl ConvWith for TextUnit { | 148 | impl ConvWith<&'_ LineIndex> for TextUnit { |
152 | type Ctx = LineIndex; | ||
153 | type Output = Position; | 149 | type Output = Position; |
154 | 150 | ||
155 | fn conv_with(self, line_index: &LineIndex) -> Position { | 151 | fn conv_with(self, line_index: &LineIndex) -> Position { |
@@ -158,8 +154,7 @@ impl ConvWith for TextUnit { | |||
158 | } | 154 | } |
159 | } | 155 | } |
160 | 156 | ||
161 | impl ConvWith for TextRange { | 157 | impl ConvWith<&'_ LineIndex> for TextRange { |
162 | type Ctx = LineIndex; | ||
163 | type Output = Range; | 158 | type Output = Range; |
164 | 159 | ||
165 | fn conv_with(self, line_index: &LineIndex) -> Range { | 160 | fn conv_with(self, line_index: &LineIndex) -> Range { |
@@ -167,8 +162,7 @@ impl ConvWith for TextRange { | |||
167 | } | 162 | } |
168 | } | 163 | } |
169 | 164 | ||
170 | impl ConvWith for Range { | 165 | impl ConvWith<&'_ LineIndex> for Range { |
171 | type Ctx = LineIndex; | ||
172 | type Output = TextRange; | 166 | type Output = TextRange; |
173 | 167 | ||
174 | fn conv_with(self, line_index: &LineIndex) -> TextRange { | 168 | fn conv_with(self, line_index: &LineIndex) -> TextRange { |
@@ -208,8 +202,7 @@ impl Conv for ra_ide_api::FunctionSignature { | |||
208 | } | 202 | } |
209 | } | 203 | } |
210 | 204 | ||
211 | impl ConvWith for TextEdit { | 205 | impl ConvWith<&'_ LineIndex> for TextEdit { |
212 | type Ctx = LineIndex; | ||
213 | type Output = Vec<lsp_types::TextEdit>; | 206 | type Output = Vec<lsp_types::TextEdit>; |
214 | 207 | ||
215 | fn conv_with(self, line_index: &LineIndex) -> Vec<lsp_types::TextEdit> { | 208 | fn conv_with(self, line_index: &LineIndex) -> Vec<lsp_types::TextEdit> { |
@@ -217,8 +210,7 @@ impl ConvWith for TextEdit { | |||
217 | } | 210 | } |
218 | } | 211 | } |
219 | 212 | ||
220 | impl ConvWith for &'_ AtomTextEdit { | 213 | impl ConvWith<&'_ LineIndex> for &'_ AtomTextEdit { |
221 | type Ctx = LineIndex; | ||
222 | type Output = lsp_types::TextEdit; | 214 | type Output = lsp_types::TextEdit; |
223 | 215 | ||
224 | fn conv_with(self, line_index: &LineIndex) -> lsp_types::TextEdit { | 216 | fn conv_with(self, line_index: &LineIndex) -> lsp_types::TextEdit { |
@@ -229,10 +221,10 @@ impl ConvWith for &'_ AtomTextEdit { | |||
229 | } | 221 | } |
230 | } | 222 | } |
231 | 223 | ||
232 | impl<T: ConvWith> ConvWith for Option<T> { | 224 | impl<T: ConvWith<CTX>, CTX> ConvWith<CTX> for Option<T> { |
233 | type Ctx = <T as ConvWith>::Ctx; | 225 | type Output = Option<T::Output>; |
234 | type Output = Option<<T as ConvWith>::Output>; | 226 | |
235 | fn conv_with(self, ctx: &Self::Ctx) -> Self::Output { | 227 | fn conv_with(self, ctx: CTX) -> Self::Output { |
236 | self.map(|x| ConvWith::conv_with(x, ctx)) | 228 | self.map(|x| ConvWith::conv_with(x, ctx)) |
237 | } | 229 | } |
238 | } | 230 | } |
@@ -454,35 +446,34 @@ pub fn to_location( | |||
454 | Ok(loc) | 446 | Ok(loc) |
455 | } | 447 | } |
456 | 448 | ||
457 | pub trait MapConvWith<'a>: Sized + 'a { | 449 | pub trait MapConvWith<CTX>: Sized { |
458 | type Ctx; | ||
459 | type Output; | 450 | type Output; |
460 | 451 | ||
461 | fn map_conv_with(self, ctx: &'a Self::Ctx) -> ConvWithIter<'a, Self, Self::Ctx> { | 452 | fn map_conv_with(self, ctx: CTX) -> ConvWithIter<Self, CTX> { |
462 | ConvWithIter { iter: self, ctx } | 453 | ConvWithIter { iter: self, ctx } |
463 | } | 454 | } |
464 | } | 455 | } |
465 | 456 | ||
466 | impl<'a, I> MapConvWith<'a> for I | 457 | impl<CTX, I> MapConvWith<CTX> for I |
467 | where | 458 | where |
468 | I: Iterator + 'a, | 459 | I: Iterator, |
469 | I::Item: ConvWith, | 460 | I::Item: ConvWith<CTX>, |
470 | { | 461 | { |
471 | type Ctx = <I::Item as ConvWith>::Ctx; | 462 | type Output = <I::Item as ConvWith<CTX>>::Output; |
472 | type Output = <I::Item as ConvWith>::Output; | ||
473 | } | 463 | } |
474 | 464 | ||
475 | pub struct ConvWithIter<'a, I, Ctx: 'a> { | 465 | pub struct ConvWithIter<I, CTX> { |
476 | iter: I, | 466 | iter: I, |
477 | ctx: &'a Ctx, | 467 | ctx: CTX, |
478 | } | 468 | } |
479 | 469 | ||
480 | impl<'a, I, Ctx> Iterator for ConvWithIter<'a, I, Ctx> | 470 | impl<I, CTX> Iterator for ConvWithIter<I, CTX> |
481 | where | 471 | where |
482 | I: Iterator, | 472 | I: Iterator, |
483 | I::Item: ConvWith<Ctx = Ctx>, | 473 | I::Item: ConvWith<CTX>, |
474 | CTX: Copy, | ||
484 | { | 475 | { |
485 | type Item = <I::Item as ConvWith>::Output; | 476 | type Item = <I::Item as ConvWith<CTX>>::Output; |
486 | 477 | ||
487 | fn next(&mut self) -> Option<Self::Item> { | 478 | fn next(&mut self) -> Option<Self::Item> { |
488 | self.iter.next().map(|item| item.conv_with(self.ctx)) | 479 | self.iter.next().map(|item| item.conv_with(self.ctx)) |