diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/test-utils')
-rw-r--r-- | src/tools/rust-analyzer/crates/test-utils/src/fixture.rs | 53 | ||||
-rw-r--r-- | src/tools/rust-analyzer/crates/test-utils/src/minicore.rs | 94 |
2 files changed, 98 insertions, 49 deletions
diff --git a/src/tools/rust-analyzer/crates/test-utils/src/fixture.rs b/src/tools/rust-analyzer/crates/test-utils/src/fixture.rs index 8c806e792..c824f5af7 100644 --- a/src/tools/rust-analyzer/crates/test-utils/src/fixture.rs +++ b/src/tools/rust-analyzer/crates/test-utils/src/fixture.rs @@ -61,6 +61,8 @@ //! " //! ``` +use std::iter; + use rustc_hash::FxHashMap; use stdx::trim_indent; @@ -259,7 +261,7 @@ impl MiniCore { if res.has_flag(entry) { panic!("duplicate minicore flag: {:?}", entry); } - res.activated_flags.push(entry.to_string()); + res.activated_flags.push(entry.to_owned()); } res @@ -273,35 +275,34 @@ impl MiniCore { let raw_mini_core = include_str!("./minicore.rs"); let mut lines = raw_mini_core.split_inclusive('\n'); - let mut parsing_flags = false; let mut implications = Vec::new(); // Parse `//!` preamble and extract flags and dependencies. - for line in lines.by_ref() { - let line = match line.strip_prefix("//!") { - Some(it) => it, - None => { - assert!(line.trim().is_empty()); - break; - } - }; - - if parsing_flags { - let (flag, deps) = line.split_once(':').unwrap(); - let flag = flag.trim(); - self.valid_flags.push(flag.to_string()); - for dep in deps.split(", ") { - let dep = dep.trim(); - if !dep.is_empty() { - self.assert_valid_flag(dep); - implications.push((flag, dep)); - } - } + let trim_doc: fn(&str) -> Option<&str> = |line| match line.strip_prefix("//!") { + Some(it) => Some(it), + None => { + assert!(line.trim().is_empty(), "expected empty line after minicore header"); + None } + }; + for line in lines + .by_ref() + .map_while(trim_doc) + .skip_while(|line| !line.contains("Available flags:")) + .skip(1) + { + let (flag, deps) = line.split_once(':').unwrap(); + let flag = flag.trim(); + + self.valid_flags.push(flag.to_string()); + implications.extend( + iter::repeat(flag) + .zip(deps.split(", ").map(str::trim).filter(|dep| !dep.is_empty())), + ); + } - if line.contains("Available flags:") { - parsing_flags = true; - } + for (_, dep) in &implications { + self.assert_valid_flag(dep); } for flag in &self.activated_flags { @@ -332,7 +333,7 @@ impl MiniCore { } if let Some(region) = trimmed.strip_prefix("// endregion:") { let prev = active_regions.pop().unwrap(); - assert_eq!(prev, region); + assert_eq!(prev, region, "unbalanced region pairs"); continue; } diff --git a/src/tools/rust-analyzer/crates/test-utils/src/minicore.rs b/src/tools/rust-analyzer/crates/test-utils/src/minicore.rs index 6df29db47..69d2e62b2 100644 --- a/src/tools/rust-analyzer/crates/test-utils/src/minicore.rs +++ b/src/tools/rust-analyzer/crates/test-utils/src/minicore.rs @@ -8,35 +8,36 @@ //! We then strip all the code marked with other flags. //! //! Available flags: -//! sized: -//! unsize: sized +//! add: +//! as_ref: sized +//! bool_impl: option, fn +//! clone: sized //! coerce_unsized: unsize -//! slice: -//! range: -//! deref: sized +//! copy: clone +//! default: sized //! deref_mut: deref -//! index: sized +//! deref: sized +//! derive: +//! drop: +//! eq: sized +//! fmt: result //! fn: -//! try: -//! pin: +//! from: sized //! future: pin -//! option: -//! result: +//! generator: pin +//! hash: +//! index: sized //! iterator: option //! iterators: iterator, fn -//! default: sized -//! hash: -//! clone: sized -//! copy: clone -//! from: sized -//! eq: sized +//! option: //! ord: eq, option -//! derive: -//! fmt: result -//! bool_impl: option, fn -//! add: -//! as_ref: sized -//! drop: +//! pin: +//! range: +//! result: +//! sized: +//! slice: +//! try: +//! unsize: sized pub mod marker { // region:sized @@ -182,6 +183,19 @@ pub mod ops { type Target: ?Sized; fn deref(&self) -> &Self::Target; } + + impl<T: ?Sized> Deref for &T { + type Target = T; + fn deref(&self) -> &T { + loop {} + } + } + impl<T: ?Sized> Deref for &mut T { + type Target = T; + fn deref(&self) -> &T { + loop {} + } + } // region:deref_mut #[lang = "deref_mut"] pub trait DerefMut: Deref { @@ -347,6 +361,27 @@ pub mod ops { fn add(self, rhs: Rhs) -> Self::Output; } // endregion:add + + // region:generator + mod generator { + use crate::pin::Pin; + + #[lang = "generator"] + pub trait Generator<R = ()> { + type Yield; + #[lang = "generator_return"] + type Return; + fn resume(self: Pin<&mut Self>, arg: R) -> GeneratorState<Self::Yield, Self::Return>; + } + + #[lang = "generator_state"] + pub enum GeneratorState<Y, R> { + Yielded(Y), + Complete(R), + } + } + pub use self::generator::{Generator, GeneratorState}; + // endregion:generator } // region:eq @@ -455,6 +490,19 @@ pub mod pin { pub struct Pin<P> { pointer: P, } + impl<P> Pin<P> { + pub fn new(pointer: P) -> Pin<P> { + loop {} + } + } + // region:deref + impl<P: crate::ops::Deref> crate::ops::Deref for Pin<P> { + type Target = P::Target; + fn deref(&self) -> &P::Target { + loop {} + } + } + // endregion:deref } // endregion:pin @@ -536,7 +584,7 @@ pub mod iter { } } } - pub use self::adapters::{Take, FilterMap}; + pub use self::adapters::{FilterMap, Take}; mod sources { mod repeat { |