diff options
author | Aleksey Kladov <[email protected]> | 2021-06-16 08:30:29 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2021-06-16 08:30:29 +0100 |
commit | d2c9f3add10a020d6ef7b674b7a722a1d0846f2d (patch) | |
tree | a20045a4daf48f3de43b96dc623422e895df9fc2 | |
parent | 2980fd430dbe30d5d8fd28091a8c47b3ffd4008f (diff) |
internal: add deref_mut to minicore
-rw-r--r-- | crates/ide_completion/src/render.rs | 22 | ||||
-rw-r--r-- | crates/test_utils/src/fixture.rs | 54 | ||||
-rw-r--r-- | crates/test_utils/src/minicore.rs | 8 |
3 files changed, 49 insertions, 35 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index 3eb51e80b..fac83b650 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs | |||
@@ -1191,21 +1191,11 @@ fn main() { | |||
1191 | fn suggest_deref_mut() { | 1191 | fn suggest_deref_mut() { |
1192 | check_relevance( | 1192 | check_relevance( |
1193 | r#" | 1193 | r#" |
1194 | #[lang = "deref"] | 1194 | //- minicore: deref_mut |
1195 | trait Deref { | ||
1196 | type Target; | ||
1197 | fn deref(&self) -> &Self::Target; | ||
1198 | } | ||
1199 | |||
1200 | #[lang = "deref_mut"] | ||
1201 | pub trait DerefMut: Deref { | ||
1202 | fn deref_mut(&mut self) -> &mut Self::Target; | ||
1203 | } | ||
1204 | |||
1205 | struct S; | 1195 | struct S; |
1206 | struct T(S); | 1196 | struct T(S); |
1207 | 1197 | ||
1208 | impl Deref for T { | 1198 | impl core::ops::Deref for T { |
1209 | type Target = S; | 1199 | type Target = S; |
1210 | 1200 | ||
1211 | fn deref(&self) -> &Self::Target { | 1201 | fn deref(&self) -> &Self::Target { |
@@ -1213,7 +1203,7 @@ impl Deref for T { | |||
1213 | } | 1203 | } |
1214 | } | 1204 | } |
1215 | 1205 | ||
1216 | impl DerefMut for T { | 1206 | impl core::ops::DerefMut for T { |
1217 | fn deref_mut(&mut self) -> &mut Self::Target { | 1207 | fn deref_mut(&mut self) -> &mut Self::Target { |
1218 | &mut self.0 | 1208 | &mut self.0 |
1219 | } | 1209 | } |
@@ -1232,12 +1222,12 @@ fn main() { | |||
1232 | lc m [local] | 1222 | lc m [local] |
1233 | lc t [local] | 1223 | lc t [local] |
1234 | lc &mut t [type+local] | 1224 | lc &mut t [type+local] |
1235 | tt DerefMut [] | ||
1236 | tt Deref [] | ||
1237 | fn foo(…) [] | ||
1238 | st T [] | 1225 | st T [] |
1239 | st S [] | 1226 | st S [] |
1240 | fn main() [] | 1227 | fn main() [] |
1228 | fn foo(…) [] | ||
1229 | md core [] | ||
1230 | tt Sized [] | ||
1241 | "#]], | 1231 | "#]], |
1242 | ) | 1232 | ) |
1243 | } | 1233 | } |
diff --git a/crates/test_utils/src/fixture.rs b/crates/test_utils/src/fixture.rs index 6ba112de8..313088c37 100644 --- a/crates/test_utils/src/fixture.rs +++ b/crates/test_utils/src/fixture.rs | |||
@@ -129,8 +129,18 @@ impl Fixture { | |||
129 | if line.starts_with("//-") { | 129 | if line.starts_with("//-") { |
130 | let meta = Fixture::parse_meta_line(line); | 130 | let meta = Fixture::parse_meta_line(line); |
131 | res.push(meta) | 131 | res.push(meta) |
132 | } else if let Some(entry) = res.last_mut() { | 132 | } else { |
133 | entry.text.push_str(line); | 133 | if line.starts_with("// ") |
134 | && line.contains(":") | ||
135 | && !line.contains("::") | ||
136 | && line.chars().all(|it| !it.is_uppercase()) | ||
137 | { | ||
138 | panic!("looks like invalid metadata line: {:?}", line) | ||
139 | } | ||
140 | |||
141 | if let Some(entry) = res.last_mut() { | ||
142 | entry.text.push_str(line); | ||
143 | } | ||
134 | } | 144 | } |
135 | } | 145 | } |
136 | 146 | ||
@@ -276,38 +286,44 @@ impl MiniCore { | |||
276 | } | 286 | } |
277 | } | 287 | } |
278 | 288 | ||
279 | let mut curr_region = ""; | 289 | let mut active_regions = Vec::new(); |
280 | let mut seen_regions = Vec::new(); | 290 | let mut seen_regions = Vec::new(); |
281 | for line in lines { | 291 | for line in lines { |
282 | let trimmed = line.trim(); | 292 | let trimmed = line.trim(); |
283 | if let Some(region) = trimmed.strip_prefix("// region:") { | 293 | if let Some(region) = trimmed.strip_prefix("// region:") { |
284 | assert_eq!(curr_region, ""); | 294 | active_regions.push(region); |
285 | curr_region = region; | ||
286 | continue; | 295 | continue; |
287 | } | 296 | } |
288 | if let Some(region) = trimmed.strip_prefix("// endregion:") { | 297 | if let Some(region) = trimmed.strip_prefix("// endregion:") { |
289 | assert_eq!(curr_region, region); | 298 | let prev = active_regions.pop().unwrap(); |
290 | curr_region = ""; | 299 | assert_eq!(prev, region); |
291 | continue; | 300 | continue; |
292 | } | 301 | } |
293 | seen_regions.push(curr_region); | ||
294 | 302 | ||
295 | let mut flag = curr_region; | 303 | let mut line_region = false; |
296 | if let Some(idx) = trimmed.find("// :") { | 304 | if let Some(idx) = trimmed.find("// :") { |
297 | flag = &trimmed[idx + "// :".len()..]; | 305 | line_region = true; |
306 | active_regions.push(&trimmed[idx + "// :".len()..]); | ||
298 | } | 307 | } |
299 | 308 | ||
300 | let skip = if flag == "" { | 309 | let mut keep = true; |
301 | false | 310 | for ®ion in &active_regions { |
302 | } else { | 311 | assert!( |
303 | assert!(!flag.starts_with(' '), "region marker starts with a space: {:?}", flag); | 312 | !region.starts_with(' '), |
304 | self.assert_valid_flag(flag); | 313 | "region marker starts with a space: {:?}", |
305 | !self.has_flag(flag) | 314 | region |
306 | }; | 315 | ); |
316 | self.assert_valid_flag(region); | ||
317 | seen_regions.push(region); | ||
318 | keep &= self.has_flag(region); | ||
319 | } | ||
307 | 320 | ||
308 | if !skip { | 321 | if keep { |
309 | buf.push_str(line) | 322 | buf.push_str(line) |
310 | } | 323 | } |
324 | if line_region { | ||
325 | active_regions.pop().unwrap(); | ||
326 | } | ||
311 | } | 327 | } |
312 | 328 | ||
313 | for flag in &self.valid_flags { | 329 | for flag in &self.valid_flags { |
@@ -315,7 +331,7 @@ impl MiniCore { | |||
315 | panic!("unused minicore flag: {:?}", flag); | 331 | panic!("unused minicore flag: {:?}", flag); |
316 | } | 332 | } |
317 | } | 333 | } |
318 | 334 | format!("{}", buf); | |
319 | buf | 335 | buf |
320 | } | 336 | } |
321 | } | 337 | } |
diff --git a/crates/test_utils/src/minicore.rs b/crates/test_utils/src/minicore.rs index 5ff60178c..8555ff935 100644 --- a/crates/test_utils/src/minicore.rs +++ b/crates/test_utils/src/minicore.rs | |||
@@ -13,6 +13,7 @@ | |||
13 | //! range: | 13 | //! range: |
14 | //! unsize: sized | 14 | //! unsize: sized |
15 | //! deref: sized | 15 | //! deref: sized |
16 | //! deref_mut: deref | ||
16 | //! coerce_unsized: unsize | 17 | //! coerce_unsized: unsize |
17 | //! pin: | 18 | //! pin: |
18 | //! future: pin | 19 | //! future: pin |
@@ -64,8 +65,15 @@ pub mod ops { | |||
64 | type Target: ?Sized; | 65 | type Target: ?Sized; |
65 | fn deref(&self) -> &Self::Target; | 66 | fn deref(&self) -> &Self::Target; |
66 | } | 67 | } |
68 | // region:deref_mut | ||
69 | #[lang = "deref_mut"] | ||
70 | pub trait DerefMut: Deref { | ||
71 | fn deref_mut(&mut self) -> &mut Self::Target; | ||
72 | } | ||
73 | // endregion:deref_mut | ||
67 | } | 74 | } |
68 | pub use self::deref::Deref; | 75 | pub use self::deref::Deref; |
76 | pub use self::deref::DerefMut; //:deref_mut | ||
69 | // endregion:deref | 77 | // endregion:deref |
70 | 78 | ||
71 | // region:range | 79 | // region:range |