2

Implement `#[rustc_must_implement_one_of]` attribute by WaffleLapkin · Pull Requ...

 2 years ago
source link: https://github.com/rust-lang/rust/pull/92164
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Copy link

Contributor

WaffleLapkin commented on Dec 21, 2021

edited

This PR adds a new attribute — #[rustc_must_implement_one_of] that allows changing the "minimal complete definition" of a trait. It's similar to GHC's minimal {-# MINIMAL #-} pragma, though #[rustc_must_implement_one_of] is weaker atm.

Such attribute was long wanted. It can be, for example, used in Read trait to make transitions to recently added read_buf easier:

#[rustc_must_implement_one_of(read, read_buf)]
pub trait Read {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
        let mut buf = ReadBuf::new(buf);
        self.read_buf(&mut buf)?;
        Ok(buf.filled_len())
    }

    fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> Result<()> {
        default_read_buf(|b| self.read(b), buf)
    }
}

impl Read for Ty0 {} 
//^ This will fail to compile even though all `Read` methods have default implementations

// Both of these will compile just fine
impl Read for Ty1 {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize> { /* ... */ }
}
impl Read for Ty2 {
    fn read_buf(&mut self, buf: &mut ReadBuf<'_>) -> Result<()> { /* ... */ }
}

For now, this is implemented as an internal attribute to start experimenting on the design of this feature. In the future we may want to extend it:

  • Allow arbitrary requirements like a | (b & c)
  • Allow multiple requirements like
    • #[rustc_must_implement_one_of(a, b)]
      #[rustc_must_implement_one_of(c, d)]
  • Make it appear in rustdoc documentation
  • Change the syntax?

Eventually, we should make an RFC and make this (or rather similar) attribute public.


I'm fairly new to compiler development and not at all sure if the implementation makes sense, but at least it passes tests :)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK