Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rustdoc json: Associated constants in impl have wrong representation #81340

Closed
HeroicKatora opened this issue Jan 24, 2021 · 0 comments · Fixed by #98577
Closed

Rustdoc json: Associated constants in impl have wrong representation #81340

HeroicKatora opened this issue Jan 24, 2021 · 0 comments · Fixed by #98577
Labels
A-rustdoc-json Area: Rustdoc JSON backend C-bug Category: This is a bug. requires-nightly This issue requires a nightly compiler in some way. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.

Comments

@HeroicKatora
Copy link
Contributor

HeroicKatora commented Jan 24, 2021

This affects rustdoc json output

struct Simple;

/// Compare output for this inherent impl:
impl Simple {
    pub const CONSTANT: usize = 0;
}

pub trait EasyToImpl {
    type ToDeclare;
    const An_ATTRIBTE: usize;
}

/// versus this trait impl
impl EasyToImpl for Simple {
    type ToDeclare = usize;
    const An_ATTRIBTE: usize = 0;
}

I expected to see this happen: The constant in the first impl is printed with ItemEnum::Constant, the type and constant declaration in EasyToImpl with ItemEnum::{AssocTypeItem, AssocConstItem}, and the corresponding type definition in the second impl with ItemEnum::{Typedef, Constant}.

Instead, this happened: The constant definitions in both impls are the odd one out. They uses the
ItemEnum::AssocConstItem form instead and their definitions are in the default attribute.

The raw json produced
{"root":"0:0","crate_version":null,"includes_private":false,"index":{"0:0":{"id":"0:0","crate_id":0,"name":"example_crate","source":{"filename":"src/lib.rs","begin":[1,0],"end":[21,1]},"visibility":"public","docs":"","links":{},"attrs":["#![no_std]","#![feature(no_core)]","#![no_core]"],"deprecation":null,"kind":"module","inner":{"is_crate":true,"items":["0:1","0:5"]}},"0:7":{"id":"0:7","crate_id":0,"name":"An_ATTRIBTE","source":{"filename":"src/lib.rs","begin":[14,4],"end":[14,29]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"assoc_const","inner":{"type":{"kind":"primitive","inner":"usize"},"default":null}},"0:10":{"id":"0:10","crate_id":0,"name":"An_ATTRIBTE","source":{"filename":"src/lib.rs","begin":[20,4],"end":[20,33]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"assoc_const","inner":{"type":{"kind":"primitive","inner":"usize"},"default":"0"}},"0:4":{"id":"0:4","crate_id":0,"name":"CONSTANT","source":{"filename":"src/lib.rs","begin":[9,4],"end":[9,34]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"assoc_const","inner":{"type":{"kind":"primitive","inner":"usize"},"default":"0"}},"0:1":{"id":"0:1","crate_id":0,"name":"Simple","source":{"filename":"src/lib.rs","begin":[5,0],"end":[5,18]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"struct","inner":{"struct_type":"unit","generics":{"params":[],"where_predicates":[]},"fields_stripped":false,"fields":[],"impls":["0:3","0:8"]}},"0:5":{"id":"0:5","crate_id":0,"name":"EasyToImpl","source":{"filename":"src/lib.rs","begin":[12,0],"end":[15,1]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"trait","inner":{"is_auto":false,"is_unsafe":false,"items":["0:6","0:7"],"generics":{"params":[],"where_predicates":[]},"bounds":[],"implementors":["0:8"]}},"0:8":{"id":"0:8","crate_id":0,"name":null,"source":{"filename":"src/lib.rs","begin":[18,0],"end":[21,1]},"visibility":"crate","docs":"versus this trait impl","links":{},"attrs":[],"deprecation":null,"kind":"impl","inner":{"is_unsafe":false,"generics":{"params":[],"where_predicates":[]},"provided_trait_methods":[],"trait":{"kind":"resolved_path","inner":{"name":"EasyToImpl","id":"0:5","args":{"angle_bracketed":{"args":[],"bindings":[]}},"param_names":[]}},"for":{"kind":"resolved_path","inner":{"name":"Simple","id":"0:1","args":{"angle_bracketed":{"args":[],"bindings":[]}},"param_names":[]}},"items":["0:9","0:10"],"negative":false,"synthetic":false,"blanket_impl":null}},"0:9":{"id":"0:9","crate_id":0,"name":"ToDeclare","source":{"filename":"src/lib.rs","begin":[19,4],"end":[19,27]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"typedef","inner":{"type":{"kind":"primitive","inner":"usize"},"generics":{"params":[],"where_predicates":[]}}},"0:3":{"id":"0:3","crate_id":0,"name":null,"source":{"filename":"src/lib.rs","begin":[8,0],"end":[10,1]},"visibility":"crate","docs":"Compare output for this inherent impl:","links":{},"attrs":[],"deprecation":null,"kind":"impl","inner":{"is_unsafe":false,"generics":{"params":[],"where_predicates":[]},"provided_trait_methods":[],"trait":null,"for":{"kind":"resolved_path","inner":{"name":"Simple","id":"0:1","args":{"angle_bracketed":{"args":[],"bindings":[]}},"param_names":[]}},"items":["0:4"],"negative":false,"synthetic":false,"blanket_impl":null}},"0:6":{"id":"0:6","crate_id":0,"name":"ToDeclare","source":{"filename":"src/lib.rs","begin":[13,4],"end":[13,19]},"visibility":"public","docs":"","links":{},"attrs":[],"deprecation":null,"kind":"assoc_type","inner":{"bounds":[],"default":null}}},"paths":{"0:5":{"crate_id":0,"path":["example_crate","EasyToImpl"],"kind":"trait"},"0:9":{"crate_id":0,"path":["example_crate","ToDeclare"],"kind":"typedef"},"0:0":{"crate_id":0,"path":["example_crate"],"kind":"module"},"0:1":{"crate_id":0,"path":["example_crate","Simple"],"kind":"struct"}},"external_crates":{},"format_version":1}
Debug print of the item kinds in the impls
[src/frontend/rustdoc/mod.rs:786] krate.index.get(item_id) = Some(
    Item {
        id: Id(
            "0:38",
        ),
        crate_id: 0,
        name: Some(
            "CONSTANT",
        ),
        source: Some(
            Span {
                filename: "src/lib.rs",
                begin: (
                    69,
                    4,
                ),
                end: (
                    69,
                    34,
                ),
            },
        ),
        visibility: Public,
        docs: "",
        links: {},
        attrs: [],
        deprecation: None,
        kind: AssocConst,
        inner: AssocConstItem {
            type_: Primitive(
                "usize",
            ),
            default: Some(
                "0",
            ),
        },
    },
)
[src/frontend/rustdoc/mod.rs:786] krate.index.get(item_id) = Some(
    Item {
        id: Id(
            "0:41",
        ),
        crate_id: 0,
        name: Some(
            "ToDeclare",
        ),
        source: Some(
            Span {
                filename: "src/lib.rs",
                begin: (
                    79,
                    4,
                ),
                end: (
                    79,
                    27,
                ),
            },
        ),
        visibility: Public,
        docs: "",
        links: {},
        attrs: [],
        deprecation: None,
        kind: Typedef,
        inner: TypedefItem(
            Typedef {
                type_: Primitive(
                    "usize",
                ),
                generics: Generics {
                    params: [],
                    where_predicates: [],
                },
            },
        ),
    },
)
[src/frontend/rustdoc/mod.rs:786] krate.index.get(item_id) = Some(
    Item {
        id: Id(
            "0:42",
        ),
        crate_id: 0,
        name: Some(
            "An_ATTRIBTE",
        ),
        source: Some(
            Span {
                filename: "src/lib.rs",
                begin: (
                    80,
                    4,
                ),
                end: (
                    80,
                    33,
                ),
            },
        ),
        visibility: Public,
        docs: "",
        links: {},
        attrs: [],
        deprecation: None,
        kind: AssocConst,
        inner: AssocConstItem {
            type_: Primitive(
                "usize",
            ),
            default: Some(
                "0",
            ),
        },
    },
)

Meta

rustc --version --verbose:

cargo 1.51.0-nightly (a73e5b7d5 2021-01-12)
@HeroicKatora HeroicKatora added the C-bug Category: This is a bug. label Jan 24, 2021
@jyn514 jyn514 added A-rustdoc-json Area: Rustdoc JSON backend T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. requires-nightly This issue requires a nightly compiler in some way. labels Jan 24, 2021
@bors bors closed this as completed in d0ae6eb Jun 28, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-rustdoc-json Area: Rustdoc JSON backend C-bug Category: This is a bug. requires-nightly This issue requires a nightly compiler in some way. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.
Projects
None yet
3 participants