Skip to content

rustdoc-json: impl dyn Trait gets discarded #133719

Description

@aDotInTheVoid

For the following code:

pub trait T1 {
    fn number(&self) -> i32;
}

impl dyn T1 {
    pub fn number_plus_one(&self) {
        self.number() + 1
    }
}

generates

{
  "format_version": 36,
  "includes_private": false,
  "index": {
    "0": {
      "attrs": [],
      "crate_id": 0,
      "deprecation": null,
      "docs": null,
      "id": 0,
      "inner": {"function": { ... }},
      "name": "number",
      "visibility": "default"
    },
    "1": {
      "attrs": [],
      "crate_id": 0,
      "deprecation": null,
      "docs": null,
      "id": 1,
      "inner": {
        "trait": {
          "bounds": [],
          "generics": {"params": [], "where_predicates": []},
          "implementations": [],
          "is_auto": false,
          "is_dyn_compatible": true,
          "is_unsafe": false,
          "items": [0]
        }
      },
      "name": "T1",
      "visibility": "public"
    },
    "2": {
      "attrs": [],
      "crate_id": 0,
      "deprecation": null,
      "docs": null,
      "id": 2,
      "inner": {"module": {"is_crate": true, "is_stripped": false, "items": [1]}},
      "name": "on_dyn_trait",
      "visibility": "public"
    }
  },
  "root": 2
}

(full).

There's nothing included for the number_plus_one method, but there should be.

The HTML backend get this right, so the releavent info is availible in clean:

Image

I'm not sure what's the best way to store this is in the format: Putting it into the implementations field seems wrong, as impl dyn T1 isn't an implementation of T1, but an implementation on dyn T1. I'd love to hear people's thoughts on this.

Activity

  1. added
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Dec 1, 2024
  2. added
    T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.
    and removed
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Dec 1, 2024
  3. obi1kenobi commented on Dec 2, 2024

    @obi1kenobi
    Member

    I'd expect a few things to happen in the rustdoc JSON here:

    • an impl item corresponding to the impl dyn T1 block
    • that impl item containing a number_plus_one function ("method") item
    • some form of "relationship" from T1 to impl dyn T1, which isn't the implementations field but something else.

    Ideally, the approach would rhyme with how we represent other edge cases like impl .. for &mut:

    pub trait T1 {}
    
    struct Example;
    
    impl T1 for Example {}
    
    // This impl is unrelated to the one above, and isn't technically on `Example`!
    // And yet it's related to `Example` so it probably should be linked
    // from the `Example` item in some manner.
    impl T1 for &mut Example {}
  4. added a commit that references this issue on Dec 2, 2024
  5. added a commit that references this issue on Dec 2, 2024
  6. added
    A-dyn-traitArea: trait objects, vtable layout
    C-bugCategory: This is a bug.
    on Dec 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-dyn-traitArea: trait objects, vtable layoutA-rustdoc-jsonArea: Rustdoc JSON backendC-bugCategory: This is a bug.T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions