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: Dangling ID when foreign trait method doc linkes to foreign enum varant. #105025

Closed
aDotInTheVoid opened this issue Nov 28, 2022 · 2 comments · Fixed by #105182
Closed
Labels
A-rustdoc-json Area: Rustdoc JSON backend T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.

Comments

@aDotInTheVoid
Copy link
Member

// --- src/test/rustdoc-json/intra-doc-links/foreign_variant.rs ---
// aux-build: enum_variant_in_trait_method.rs

extern crate enum_variant_in_trait_method;
pub struct Local;
impl enum_variant_in_trait_method::Trait for Local {}

// --- src/test/rustdoc-json/intra-doc-links/auxiliary/enum_variant_in_trait_method.rs
pub trait Trait {
    /// [`Enum::Variant`]
    fn method() {}
}

pub enum Enum {
    Variant,
}

Produces (abridged):

{
  "crate_version": null,
  "external_crates": { ... },
  "format_version": 23,
  "includes_private": false,
  "index": {
    "0:0:1568": {
      "crate_id": 0,
      "docs": null,
      "id": "0:0:1568",
      "inner": {"is_crate": true, "is_stripped": false, "items": ["0:4:1566"]},
      "kind": "module",
      "links": {},
      "name": "foreign_variant"
    },
    "0:4:1566": {
      "crate_id": 0,
      "docs": null,
      "id": "0:4:1566",
      "inner": {
        "generics": {"params": [], "where_predicates": []},
        "impls": [ ..., "0:6"],
        "kind": "unit"
      },
      "kind": "struct",
      "links": {},
      "name": "Local"
    },
    "0:6": {
      "crate_id": 0,
      "docs": null,
      "id": "0:6",
      "inner": {
        "blanket_impl": null,
        "for": {
          "inner": {"args": {"angle_bracketed": {"args": [], "bindings": []}}, "id": "0:4:1566", "name": "Local"},
          "kind": "resolved_path"
        },
        "generics": {"params": [], "where_predicates": []},
        "is_unsafe": false,
        "items": [],
        "negative": false,
        "provided_trait_methods": ["method"],
        "synthetic": false,
        "trait": {"args": {"angle_bracketed": {"args": [], "bindings": []}}, "id": "20:3:1567", "name": "Trait"}
      },
      "kind": "impl",
      "links": {},
      "name": null
    },
    "20:3:1567": {
      "crate_id": 20,
      "docs": null,
      "id": "20:3:1567",
      "inner": {
        "bounds": [],
        "generics": {"params": [], "where_predicates": []},
        "implementations": [],
        "is_auto": false,
        "is_unsafe": false,
        "items": ["20:4:4198"]
      },
      "kind": "trait",
      "links": {},
      "name": "Trait"
    },
    "20:4:4198": {
      "crate_id": 20,
      "docs": "[`Enum::Variant`]",
      "id": "20:4:4198",
      "inner": {
        "decl": {"c_variadic": false, "inputs": [], "output": null},
        "generics": {"params": [], "where_predicates": []},
        "has_body": true,
        "header": {"abi": "Rust", "async": false, "const": false, "unsafe": false}
      },
      "kind": "function",
      "links": {"`Enum::Variant`": "20:6:65935"},
      "name": "method"
    }
  },
  "paths": {
    "0:0:1568": {"crate_id": 0, "kind": "module", "path": ["foreign_variant"]},
    "0:4:1566": {"crate_id": 0, "kind": "struct", "path": ["foreign_variant", "Local"]},
    "20:0:1565": {"crate_id": 20, "kind": "module", "path": ["enum_variant_in_trait_method"]},
    "20:3:1567": {"crate_id": 20, "kind": "trait", "path": ["enum_variant_in_trait_method", "Trait"]},
    "20:5:1826": {"crate_id": 20, "kind": "enum", "path": ["enum_variant_in_trait_method", "Enum"]},
    "2:0:481": {"crate_id": 2, "kind": "module", "path": ["core"]}
  },
  "root": "0:0:1568"
}

Causes where "links": {"Enum::Variant": "20:6:65935"}, is dangling, because the foreign enum variant wasn't inlined, but the local one was (and enum variants don't appear in path)

Caught by #105015, and blocks it from landing

@aDotInTheVoid
Copy link
Member Author

With the linked PR applied to jsondoclint, it catches this:

---- [rustdoc-json] src/test/rustdoc-json/intra-doc-links/foreign_variant.rs stdout ----

error: jsondoclint failed!
status: exit status: 1
command: "/home/nixon/dev/rust/rust/build/x86_64-unknown-linux-gnu/stage0-tools-bin/jsondoclint" "/home/nixon/dev/rust/rust/build/x86_64-unknown-linux-gnu/test/rustdoc-json/intra-doc-links/foreign_variant/foreign_variant.json"
stdout: none
--- stderr -------------------------------
20:6:65935 not in index or paths, but refered to at '$.index["20:4:4198"].links["`Enum::Variant`"]'
Error: Errors validating json /home/nixon/dev/rust/rust/build/x86_64-unknown-linux-gnu/test/rustdoc-json/intra-doc-links/foreign_variant/foreign_variant.json
------------------------------------------

Solution is probably not to inline foreign traits (would also solve #105025). I think this can be done without doing the big stable ID change

@aDotInTheVoid
Copy link
Member Author

@rustbot modify labels: +A-rustdoc-json +T-rustdoc

@rustbot rustbot added A-rustdoc-json Area: Rustdoc JSON backend T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. labels Nov 28, 2022
aDotInTheVoid added a commit to aDotInTheVoid/rust that referenced this issue Dec 2, 2022
@bors bors closed this as completed in 9afa850 Dec 3, 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 T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants