Skip to content

Provide proper encapsulation of StableMIR APIs #56

Open
rust-lang/rust
#120135

Description

The current crate structure of StableMIR is making it very hard to properly encapsulate our stable structures. All the internal details of stable items have to somehow be exposed in order to allow rustc_smir to build them.

For example, the definition of Ty exposes its internal representation:

pub struct Ty(pub usize);

There is no mechanism for us today to ensure that this usize corresponds to an index inside StableMIR. The Context trait is also exposed, even though we expect users to never invoke them directly.

The main problems I see with the lack of encapsulation are:

  1. Usability. It's confusing for users to know exactly what they can rely on, and what they shouldn't.
  2. Defining the boundaries of what is semantically versioned.
  3. APIs are very fragile. Users can easily make a mistake that will break a type invariant, which will result in one of the following:
    a. Their code will trigger an ICE
    b. The API may return inconsistent result
    c. We will have to constantly check for these invariants ourselves as much as possible and return Result for everything we do.

We should investigate what is the best mechanism to fix this.

Tasks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions