Skip to content

Assist/Codelens to show size of type #4091

Closed

Description

@TimoFreiberg

Example:
()<|> -> shows 0
char<|> -> shows 4
struct Foo<|> { ... } shows whatever std::mem::size_of::<Foo>() returns

Activity

  1. bjorn3 commented on Apr 22, 2020

    @bjorn3
    Member

    This is going to be very hard to implement, as this basically requires a reimplementation of the layout code in rustc: https://github.com/rust-lang/rust/blob/8ce3f840ae9b735a66531996c32330f24b877cb0/src/librustc_middle/ty/layout.rs is 2776 lines long. It also depends on the exact version of rustc you are using, so it would have to be changed constantly.

  2. Diggsey commented on Apr 22, 2020

    @Diggsey

    It also depends on the compilation target...

  3. TimoFreiberg commented on Apr 22, 2020

    @TimoFreiberg
    ContributorAuthor

    Maybe when the librarification progresses, rust-analyzer and rustc could use the same code?

  4. matklad commented on Apr 23, 2020

    @matklad
    Contributor

    Yeah, I feel like this is obviously something we should have. More deneraly, we should have an intention to see the whole layout. But it's also true that even MVP version of this would required a lot of progress on modularisation front

  5. added
    S-unactionableIssue requires feedback, design decisions or is blocked on other work
    on Dec 23, 2020
  6. wrenger commented on Jul 27, 2022

    @wrenger

    I do miss this a lot. Especially since clangd can show you the size of a struct and the size and offset of its fields.
    Also cargo +nightly rustc -- -Zprint-type-sizes or const asserts with size_of are somewhat tedious...

  7. lnicola commented on Aug 8, 2022

    @lnicola
    Member

    #12972 is an interesting feature request: it asks for the type of each variant in an enum.

  8. oxalica commented on Aug 8, 2022

    @oxalica
    Contributor

    @bjorn3

    This is going to be very hard to implement, as this basically requires a reimplementation of the layout code in rustc: [...] is 2776 lines long

    If we only need the size, maintaining (align, size, niche) for each type should be enough. No need for the exact layout and arrangement. It would be much easier.

  9. bjorn3 commented on Aug 8, 2022

    @bjorn3
    Member

    If we only need the size, maintaining (align, size, niche) for each type should be enough. No need for the exact layout and arrangement. It would be much easier.

    I don't think it would be much easier. Maybe a bit.

  10. kyrias commented on Oct 13, 2022

    @kyrias

    This would be particularly useful for the implicit futures created by async functions, as per rust-lang/rust-clippy#5263.

  11. added a commit that references this issue on Dec 7, 2022
  12. lnicola commented on Dec 12, 2022

    @lnicola
    Member

    Initial support added in #13490.

  13. jplatte commented on Dec 12, 2022

    @jplatte
    Contributor

    I find the comments inside the hovers a bit distracting, maybe they should be opt-in? It's information I need very rarely.

  14. flodiebold commented on Dec 12, 2022

    @flodiebold
    Member

    We should make it configurable, but opt-out as usual.

  15. 6 remaining items

  16. NobodyXu commented on Dec 13, 2022

    @NobodyXu

    No, as r-a doesn't support generator and closure captures yet

    I would really love to see that.

  17. bjorn3 commented on Dec 13, 2022

    @bjorn3
    Member

    For example, cargo_toml::Manifest on x86_64 is > 4000B and it's really hard to find this out just by reading the docs (because they don't document this).

    Nightly rustdoc has --show-type-layout. For an example of how this looks see https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html#layout

  18. NobodyXu commented on Dec 13, 2022

    @NobodyXu

    For example, cargo_toml::Manifest on x86_64 is > 4000B and it's really hard to find this out just by reading the docs (because they don't document this).

    Nightly rustdoc has --show-type-layout. For an example of how this looks see https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html#layout

    Thanks, that will very helpful and I hope it gets turned on by default so that the size info will be accessible on docs.rs instead of requiring building doc on local.

    Though I guess it won't show Future generated by async fn/async {}.

  19. StripedMonkey commented on Dec 13, 2022

    @StripedMonkey

    Someone messing with a sockaddr_in is not going to wait for the IDE to tell them how to do it.

    Maybe. I'm not convinced someone throwing themselves in from a C background would say it's obvious non-repr structs don't have a defined memory layout. Missized allocations and naive assumptions about layout aren't exactly uncommon in the C (or cpp) world.

  20. lnicola commented on Dec 13, 2022

    @lnicola
    Member

    Missized allocations and naive assumptions about layout aren't exactly uncommon in the C (or cpp) world.

    Exactly. And that's without the IDE showing them the type layout, so having this information available won't matter if you really insist on doing it.

    But Rust developers need to use unsafe and generally know they'd need #[repr(C)] in this case. At least some of the cases you've pointed to were prompted by standard library API limitations.

  21. hkalbasi commented on Dec 13, 2022

    @hkalbasi
    Member

    Maybe we can add a (unstable) to message if the type is not recursively #[repr(C)]

  22. StripedMonkey commented on Dec 13, 2022

    @StripedMonkey

    Exactly. And that's without the IDE showing them the type layout, so having this information available won't matter if you really insist on doing it.

    Rust is a language that tends to push you in safe directions, and the point that I had originally made was that very smart people made a very poor choice to rely on UB in memory layouts without anything suggesting that it was ok to do. Api limitations or not adding alignment and size information to something which is undefined makes things like my original post was referencing easier to stumble through or think is ok. Not every person using rust, even unsafe rust, knows or understands everything. Tools should point you in the right direction. Not just provide foot guns for people who don't know better.

    Adding some annotation to indicate that the layout is unstable is a good suggestion, and would resolve my objections to putting it on non-repr structs.

  23. added
    C-featureCategory: feature request
    A-idegeneral IDE features
    and removed
    S-unactionableIssue requires feedback, design decisions or is blocked on other work
    on Jan 19, 2023
  24. hkalbasi commented on May 17, 2023

    @hkalbasi
    Member

    #12972 is an interesting feature request: it asks for the type of each variant in an enum.

    Is this a well defined concept? In my understanding, layout of a variant has the same size as the layout of its enum, it just has more paddings.

  25. Veykril commented on May 18, 2023

    @Veykril
    Member

    Cargo has a lint that triggers when the biggest variant is a lot bigger than the second biggest. So the request there is really (I think), what is the variant's size disregarding it being an enum (so no tag, no padding from other variants, effectively handling it as a struct).

  26. hkalbasi commented on May 18, 2023

    @hkalbasi
    Member

    Layout of enum variant is implemented in #14845. I'm going to close this issue, feel free to open more specific ones if needed.

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-idegeneral IDE featuresC-featureCategory: feature request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions