From 21517923e13bf608675fa5cd6c2ba9187105e210 Mon Sep 17 00:00:00 2001 From: Marcin S Date: Thu, 18 May 2023 08:44:00 -0400 Subject: [PATCH 01/10] Document stack-protector option Only updated `exploit-mitigations.md` to reflect that the option exists. Removed the alternatives mentioned as they are not actually implemented yet. As this is an unstable feature, should it be added to `unstable-book` also? I didn't do that because I couldn't find the tracking issue for it. (There should be one to track stabilization of the feature.) --- src/doc/rustc/src/exploit-mitigations.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/doc/rustc/src/exploit-mitigations.md b/src/doc/rustc/src/exploit-mitigations.md index 98b49e07171c2..a677cd4b389af 100644 --- a/src/doc/rustc/src/exploit-mitigations.md +++ b/src/doc/rustc/src/exploit-mitigations.md @@ -115,9 +115,9 @@ equivalent. Stack smashing protection - No + Yes - + Nightly @@ -432,9 +432,7 @@ saved return instruction pointer, and checking if this value has changed when returning from a function. This is also known as “Stack Protector” or “Stack Smashing Protector (SSP)”. -The Rust compiler does not support stack smashing protection. However, more -comprehensive alternatives to stack smashing protection exist, such as -shadow and safe stack (see backward-edge control flow protection). +The Rust compiler supports stack smashing protection on nightly builds[42]. ![Screenshot of IDA Pro listing cross references to __stack_chk_fail in hello-rust.](images/image3.png "Cross references to __stack_chk_fail in hello-rust.") Fig. 14. IDA Pro listing cross references to `__stack_chk_fail` in @@ -697,3 +695,6 @@ defaults (unrelated to `READ_IMPLIES_EXEC`). 41. “ControlFlowIntegrity.” The Rust Unstable Book. [https://doc.rust-lang.org/unstable-book/compiler-flags/sanitizer.html#controlflowintegrity](../unstable-book/compiler-flags/sanitizer.html#controlflowintegrity). + +42. bbjornse. “add codegen option for using LLVM stack smash protection #84197.” + GitHub. From a4d6d9a24fddd74d8be54e454e17ed53a5d82514 Mon Sep 17 00:00:00 2001 From: Marcin S Date: Sun, 21 May 2023 08:22:03 -0400 Subject: [PATCH 02/10] doc: Update exploit-mitigations.md, update image3.png --- src/doc/rustc/src/exploit-mitigations.md | 6 +++--- src/doc/rustc/src/images/image3.png | Bin 72412 -> 19069 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/doc/rustc/src/exploit-mitigations.md b/src/doc/rustc/src/exploit-mitigations.md index a677cd4b389af..a82a53248d485 100644 --- a/src/doc/rustc/src/exploit-mitigations.md +++ b/src/doc/rustc/src/exploit-mitigations.md @@ -439,9 +439,9 @@ Fig. 14. IDA Pro listing cross references to `__stack_chk_fail` in hello-rust. To check if stack smashing protection is enabled for a given binary, search -for cross references to `__stack_chk_fail`. The only cross references to -`__stack_chk_fail` in hello-rust are from the statically-linked libbacktrace -library (see Fig. 14). +for cross references to `__stack_chk_fail`. The presence of these +cross-references in Rust-compiled code (e.g., `hello_rust::main`) indicates +that the stack smashing protection is enabled (see Fig. 14). ### Forward-edge control flow protection diff --git a/src/doc/rustc/src/images/image3.png b/src/doc/rustc/src/images/image3.png index a49e14b5ed22298a41d2e7bdd4b56a396b42fb94..ef02c605ead8a217a6991f4e7c137ee73ac6c520 100644 GIT binary patch literal 19069 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

4B*du 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 From f098e160ab4562dbe0049094557a3e4b6110e98c Mon Sep 17 00:00:00 2001 From: rustbot <47979223+rustbot@users.noreply.github.com> Date: Mon, 22 May 2023 13:00:33 -0400 Subject: [PATCH 03/10] Update books --- src/doc/embedded-book | 2 +- src/doc/nomicon | 2 +- src/doc/reference | 2 +- src/doc/rustc-dev-guide | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/doc/embedded-book b/src/doc/embedded-book index d9eb4c3f75435..f2aed2fe8e9f5 160000 --- a/src/doc/embedded-book +++ b/src/doc/embedded-book @@ -1 +1 @@ -Subproject commit d9eb4c3f75435b008881062ffa77bf0d1527b37d +Subproject commit f2aed2fe8e9f55508c86ba3aa4b6789b18a08a22 diff --git a/src/doc/nomicon b/src/doc/nomicon index b5f7500fc4077..b5f018fb5930c 160000 --- a/src/doc/nomicon +++ b/src/doc/nomicon @@ -1 +1 @@ -Subproject commit b5f7500fc40775096c2bbd204eae096612cf9047 +Subproject commit b5f018fb5930cb733b0a8aaf2eed975d4771e74d diff --git a/src/doc/reference b/src/doc/reference index 28dc0f3576b55..47b54b5f1f66b 160000 --- a/src/doc/reference +++ b/src/doc/reference @@ -1 +1 @@ -Subproject commit 28dc0f3576b55f5e57c5d6e65cd68ba3161e9fd5 +Subproject commit 47b54b5f1f66bd43042d3ae846bacb7a926964c0 diff --git a/src/doc/rustc-dev-guide b/src/doc/rustc-dev-guide index 28dbeaf5c44bc..f1e637883fafe 160000 --- a/src/doc/rustc-dev-guide +++ b/src/doc/rustc-dev-guide @@ -1 +1 @@ -Subproject commit 28dbeaf5c44bc7f5111ad412e99f2d7c5cec6c90 +Subproject commit f1e637883fafeb83bdd5906ee7f467e4d35b7337 From a5e51013753ca75c239403b47af1e605f5af2a64 Mon Sep 17 00:00:00 2001 From: Luca Palmieri <20745048+LukeMathWalker@users.noreply.github.com> Date: Mon, 22 May 2023 18:17:52 +0100 Subject: [PATCH 04/10] Serialize all enums as externally tagged to guarantee compatibility with binary formats such as bincode or postcard --- src/rustdoc-json-types/lib.rs | 6 +- tests/rustdoc-json/assoc_items.rs | 27 +++--- tests/rustdoc-json/blanket_impls.rs | 6 +- .../rustdoc-json/enums/discriminant/basic.rs | 12 +-- tests/rustdoc-json/enums/discriminant/expr.rs | 36 ++++---- .../rustdoc-json/enums/discriminant/limits.rs | 32 +++---- .../discriminant/num_underscore_and_suffix.rs | 18 ++-- .../only_some_have_discriminant.rs | 10 ++- .../rustdoc-json/enums/discriminant/struct.rs | 12 +-- .../rustdoc-json/enums/discriminant/tuple.rs | 12 +-- .../enums/doc_link_to_foreign_variant.rs | 2 +- tests/rustdoc-json/enums/field_hidden.rs | 4 +- tests/rustdoc-json/enums/kind.rs | 28 +++--- .../rustdoc-json/enums/struct_field_hidden.rs | 8 +- .../rustdoc-json/enums/tuple_fields_hidden.rs | 80 ++++++++--------- tests/rustdoc-json/enums/use_glob.rs | 8 +- tests/rustdoc-json/enums/use_variant.rs | 8 +- .../rustdoc-json/enums/use_variant_foreign.rs | 2 +- tests/rustdoc-json/enums/variant_struct.rs | 8 +- .../enums/variant_tuple_struct.rs | 8 +- tests/rustdoc-json/fn_pointer/abi.rs | 14 +-- tests/rustdoc-json/fn_pointer/generics.rs | 15 ++-- tests/rustdoc-json/fn_pointer/qualifiers.rs | 14 +-- tests/rustdoc-json/fns/abi.rs | 14 +-- tests/rustdoc-json/fns/async_return.rs | 26 +++--- tests/rustdoc-json/fns/extern_c_variadic.rs | 4 +- tests/rustdoc-json/fns/generic_args.rs | 88 +++++++++---------- tests/rustdoc-json/fns/generic_returns.rs | 9 +- tests/rustdoc-json/fns/generics.rs | 29 +++--- tests/rustdoc-json/fns/pattern_arg.rs | 4 +- tests/rustdoc-json/fns/qualifiers.rs | 36 ++++---- tests/rustdoc-json/fns/return_type_alias.rs | 3 +- .../generic-associated-types/gats.rs | 36 ++++---- tests/rustdoc-json/glob_import.rs | 2 +- tests/rustdoc-json/impls/auto.rs | 3 +- tests/rustdoc-json/impls/foreign_for_local.rs | 8 +- .../rustdoc-json/impls/import_from_private.rs | 16 ++-- tests/rustdoc-json/impls/local_for_foreign.rs | 8 +- tests/rustdoc-json/impls/local_for_local.rs | 8 +- .../impls/local_for_local_primitive.rs | 7 +- .../rustdoc-json/impls/local_for_primitive.rs | 2 +- tests/rustdoc-json/lifetime/longest.rs | 37 ++++---- tests/rustdoc-json/lifetime/outlives.rs | 32 ++++--- tests/rustdoc-json/methods/abi.rs | 28 +++--- tests/rustdoc-json/methods/qualifiers.rs | 36 ++++---- tests/rustdoc-json/nested.rs | 31 +++---- tests/rustdoc-json/non_lifetime_binders.rs | 10 +-- .../primitives/local_primitive.rs | 2 +- .../primitives/primitive_impls.rs | 6 +- .../rustdoc-json/primitives/primitive_type.rs | 15 ++-- .../rustdoc-json/primitives/use_primitive.rs | 4 +- .../reexport/doc_inline_external_crate.rs | 5 +- .../reexport/export_extern_crate_as_self.rs | 2 +- .../reexport/extern_crate_glob.rs | 5 +- tests/rustdoc-json/reexport/glob_collision.rs | 28 +++--- tests/rustdoc-json/reexport/glob_empty_mod.rs | 4 +- tests/rustdoc-json/reexport/glob_extern.rs | 13 ++- tests/rustdoc-json/reexport/glob_private.rs | 20 +++-- .../rustdoc-json/reexport/in_root_and_mod.rs | 4 +- .../reexport/in_root_and_mod_pub.rs | 16 ++-- tests/rustdoc-json/reexport/macro.rs | 5 +- .../rustdoc-json/reexport/mod_not_included.rs | 4 +- .../reexport/private_twice_one_inline.rs | 10 +-- .../reexport/private_two_names.rs | 16 ++-- .../reexport_method_from_private_module.rs | 4 +- tests/rustdoc-json/reexport/rename_private.rs | 4 +- tests/rustdoc-json/reexport/rename_public.rs | 11 +-- .../reexport/same_name_different_types.rs | 8 +- .../same_type_reexported_more_than_once.rs | 12 +-- tests/rustdoc-json/reexport/simple_private.rs | 8 +- tests/rustdoc-json/reexport/simple_public.rs | 9 +- tests/rustdoc-json/return_private.rs | 4 +- tests/rustdoc-json/structs/plain_all_pub.rs | 8 +- .../rustdoc-json/structs/plain_doc_hidden.rs | 6 +- tests/rustdoc-json/structs/plain_empty.rs | 6 +- tests/rustdoc-json/structs/plain_pub_priv.rs | 6 +- tests/rustdoc-json/structs/tuple.rs | 4 +- tests/rustdoc-json/structs/tuple_empty.rs | 2 +- tests/rustdoc-json/structs/tuple_pub_priv.rs | 8 +- tests/rustdoc-json/structs/unit.rs | 4 +- tests/rustdoc-json/structs/with_generics.rs | 14 +-- tests/rustdoc-json/structs/with_primitives.rs | 12 +-- tests/rustdoc-json/traits/has_body.rs | 14 +-- tests/rustdoc-json/traits/implementors.rs | 10 +-- tests/rustdoc-json/traits/supertrait.rs | 16 ++-- tests/rustdoc-json/traits/trait_alias.rs | 18 ++-- tests/rustdoc-json/type/dyn.rs | 68 +++++++------- tests/rustdoc-json/type/extern.rs | 3 +- tests/rustdoc-json/type/fn_lifetime.rs | 39 ++++---- tests/rustdoc-json/type/generic_default.rs | 42 ++++----- tests/rustdoc-json/type/hrtb.rs | 18 ++-- .../type/inherent_associated_type.rs | 13 ++- .../type/inherent_associated_type_bound.rs | 14 ++- .../inherent_associated_type_projections.rs | 13 ++- tests/rustdoc-json/unions/impl.rs | 6 +- tests/rustdoc-json/unions/union.rs | 8 +- 96 files changed, 703 insertions(+), 715 deletions(-) diff --git a/src/rustdoc-json-types/lib.rs b/src/rustdoc-json-types/lib.rs index 3556834071fc9..ba8eeaa66824a 100644 --- a/src/rustdoc-json-types/lib.rs +++ b/src/rustdoc-json-types/lib.rs @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use std::path::PathBuf; /// rustdoc format-version. -pub const FORMAT_VERSION: u32 = 25; +pub const FORMAT_VERSION: u32 = 26; /// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information /// about the language items in the local crate, as well as info about external items to allow @@ -83,7 +83,6 @@ pub struct Item { /// Stringified versions of the attributes on this item (e.g. `"#[inline]"`) pub attrs: Vec, pub deprecation: Option, - #[serde(flatten)] pub inner: ItemEnum, } @@ -222,7 +221,7 @@ pub enum ItemKind { } #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[serde(tag = "kind", content = "inner", rename_all = "snake_case")] +#[serde(rename_all = "snake_case")] pub enum ItemEnum { Module(Module), ExternCrate { @@ -543,7 +542,6 @@ pub enum Term { #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] -#[serde(tag = "kind", content = "inner")] pub enum Type { /// Structs, enums, and unions ResolvedPath(Path), diff --git a/tests/rustdoc-json/assoc_items.rs b/tests/rustdoc-json/assoc_items.rs index 6d7f6bb969fb1..05c2d4283934c 100644 --- a/tests/rustdoc-json/assoc_items.rs +++ b/tests/rustdoc-json/assoc_items.rs @@ -3,35 +3,32 @@ pub struct Simple; impl Simple { - // @is "$.index[*][?(@.name=='CONSTANT')].kind" \"assoc_const\" + // @has "$.index[*][?(@.name=='CONSTANT')].inner.assoc_const" pub const CONSTANT: usize = 0; } pub trait EasyToImpl { - // @is "$.index[*][?(@.docs=='ToDeclare trait')].kind" \"assoc_type\" - // @is "$.index[*][?(@.docs=='ToDeclare trait')].inner.default" null - // @is "$.index[*][?(@.docs=='ToDeclare trait')].inner.bounds" [] + // @has "$.index[*][?(@.docs=='ToDeclare trait')].inner.assoc_type" + // @is "$.index[*][?(@.docs=='ToDeclare trait')].inner.assoc_type.default" null + // @is "$.index[*][?(@.docs=='ToDeclare trait')].inner.assoc_type.bounds" [] /// ToDeclare trait type ToDeclare; - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].kind" \"assoc_const\" - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].inner.default" null - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].inner.type.kind" '"primitive"' - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].inner.type.inner" '"usize"' + // @has "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].inner.assoc_const" + // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].inner.assoc_const.default" null + // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE trait')].inner.assoc_const.type.primitive" '"usize"' /// AN_ATTRIBUTE trait const AN_ATTRIBUTE: usize; } impl EasyToImpl for Simple { - // @is "$.index[*][?(@.docs=='ToDeclare impl')].kind" '"assoc_type"' - // @is "$.index[*][?(@.docs=='ToDeclare impl')].inner.default.kind" \"primitive\" - // @is "$.index[*][?(@.docs=='ToDeclare impl')].inner.default.inner" \"usize\" + // @has "$.index[*][?(@.docs=='ToDeclare impl')].inner.assoc_type" + // @is "$.index[*][?(@.docs=='ToDeclare impl')].inner.assoc_type.default.primitive" \"usize\" /// ToDeclare impl type ToDeclare = usize; - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].kind" '"assoc_const"' - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].inner.type.kind" \"primitive\" - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].inner.type.inner" \"usize\" - // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].inner.default" \"12\" + // @has "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].inner.assoc_const" + // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].inner.assoc_const.type.primitive" \"usize\" + // @is "$.index[*][?(@.docs=='AN_ATTRIBUTE impl')].inner.assoc_const.default" \"12\" /// AN_ATTRIBUTE impl const AN_ATTRIBUTE: usize = 12; } diff --git a/tests/rustdoc-json/blanket_impls.rs b/tests/rustdoc-json/blanket_impls.rs index c5cc87ca1eb30..a2a5c4a71460c 100644 --- a/tests/rustdoc-json/blanket_impls.rs +++ b/tests/rustdoc-json/blanket_impls.rs @@ -2,7 +2,7 @@ #![no_std] -// @has "$.index[*][?(@.name=='Error')].kind" \"assoc_type\" -// @has "$.index[*][?(@.name=='Error')].inner.default.kind" \"resolved_path\" -// @has "$.index[*][?(@.name=='Error')].inner.default.inner.name" \"Infallible\" +// @has "$.index[*][?(@.name=='Error')].inner.assoc_type" +// @has "$.index[*][?(@.name=='Error')].inner.assoc_type.default.resolved_path" +// @has "$.index[*][?(@.name=='Error')].inner.assoc_type.default.resolved_path.name" \"Infallible\" pub struct ForBlanketTryFromImpl; diff --git a/tests/rustdoc-json/enums/discriminant/basic.rs b/tests/rustdoc-json/enums/discriminant/basic.rs index 06906df3b2c64..dbfc5c2cf6bc8 100644 --- a/tests/rustdoc-json/enums/discriminant/basic.rs +++ b/tests/rustdoc-json/enums/discriminant/basic.rs @@ -1,12 +1,12 @@ #[repr(i8)] pub enum Ordering { - // @is "$.index[*][?(@.name=='Less')].inner.discriminant.expr" '"-1"' - // @is "$.index[*][?(@.name=='Less')].inner.discriminant.value" '"-1"' + // @is "$.index[*][?(@.name=='Less')].inner.variant.discriminant.expr" '"-1"' + // @is "$.index[*][?(@.name=='Less')].inner.variant.discriminant.value" '"-1"' Less = -1, - // @is "$.index[*][?(@.name=='Equal')].inner.discriminant.expr" '"0"' - // @is "$.index[*][?(@.name=='Equal')].inner.discriminant.value" '"0"' + // @is "$.index[*][?(@.name=='Equal')].inner.variant.discriminant.expr" '"0"' + // @is "$.index[*][?(@.name=='Equal')].inner.variant.discriminant.value" '"0"' Equal = 0, - // @is "$.index[*][?(@.name=='Greater')].inner.discriminant.expr" '"1"' - // @is "$.index[*][?(@.name=='Greater')].inner.discriminant.value" '"1"' + // @is "$.index[*][?(@.name=='Greater')].inner.variant.discriminant.expr" '"1"' + // @is "$.index[*][?(@.name=='Greater')].inner.variant.discriminant.value" '"1"' Greater = 1, } diff --git a/tests/rustdoc-json/enums/discriminant/expr.rs b/tests/rustdoc-json/enums/discriminant/expr.rs index e639965e79b42..ddcad58a55001 100644 --- a/tests/rustdoc-json/enums/discriminant/expr.rs +++ b/tests/rustdoc-json/enums/discriminant/expr.rs @@ -1,30 +1,30 @@ pub enum Foo { - // @is "$.index[*][?(@.name=='Addition')].inner.discriminant.value" '"0"' - // @is "$.index[*][?(@.name=='Addition')].inner.discriminant.expr" '"{ _ }"' + // @is "$.index[*][?(@.name=='Addition')].inner.variant.discriminant.value" '"0"' + // @is "$.index[*][?(@.name=='Addition')].inner.variant.discriminant.expr" '"{ _ }"' Addition = 0 + 0, - // @is "$.index[*][?(@.name=='Bin')].inner.discriminant.value" '"1"' - // @is "$.index[*][?(@.name=='Bin')].inner.discriminant.expr" '"0b1"' + // @is "$.index[*][?(@.name=='Bin')].inner.variant.discriminant.value" '"1"' + // @is "$.index[*][?(@.name=='Bin')].inner.variant.discriminant.expr" '"0b1"' Bin = 0b1, - // @is "$.index[*][?(@.name=='Oct')].inner.discriminant.value" '"2"' - // @is "$.index[*][?(@.name=='Oct')].inner.discriminant.expr" '"0o2"' + // @is "$.index[*][?(@.name=='Oct')].inner.variant.discriminant.value" '"2"' + // @is "$.index[*][?(@.name=='Oct')].inner.variant.discriminant.expr" '"0o2"' Oct = 0o2, - // @is "$.index[*][?(@.name=='PubConst')].inner.discriminant.value" '"3"' - // @is "$.index[*][?(@.name=='PubConst')].inner.discriminant.expr" '"THREE"' + // @is "$.index[*][?(@.name=='PubConst')].inner.variant.discriminant.value" '"3"' + // @is "$.index[*][?(@.name=='PubConst')].inner.variant.discriminant.expr" '"THREE"' PubConst = THREE, - // @is "$.index[*][?(@.name=='Hex')].inner.discriminant.value" '"4"' - // @is "$.index[*][?(@.name=='Hex')].inner.discriminant.expr" '"0x4"' + // @is "$.index[*][?(@.name=='Hex')].inner.variant.discriminant.value" '"4"' + // @is "$.index[*][?(@.name=='Hex')].inner.variant.discriminant.expr" '"0x4"' Hex = 0x4, - // @is "$.index[*][?(@.name=='Cast')].inner.discriminant.value" '"5"' - // @is "$.index[*][?(@.name=='Cast')].inner.discriminant.expr" '"{ _ }"' + // @is "$.index[*][?(@.name=='Cast')].inner.variant.discriminant.value" '"5"' + // @is "$.index[*][?(@.name=='Cast')].inner.variant.discriminant.expr" '"{ _ }"' Cast = 5 as isize, - // @is "$.index[*][?(@.name=='PubCall')].inner.discriminant.value" '"6"' - // @is "$.index[*][?(@.name=='PubCall')].inner.discriminant.expr" '"{ _ }"' + // @is "$.index[*][?(@.name=='PubCall')].inner.variant.discriminant.value" '"6"' + // @is "$.index[*][?(@.name=='PubCall')].inner.variant.discriminant.expr" '"{ _ }"' PubCall = six(), - // @is "$.index[*][?(@.name=='PrivCall')].inner.discriminant.value" '"7"' - // @is "$.index[*][?(@.name=='PrivCall')].inner.discriminant.expr" '"{ _ }"' + // @is "$.index[*][?(@.name=='PrivCall')].inner.variant.discriminant.value" '"7"' + // @is "$.index[*][?(@.name=='PrivCall')].inner.variant.discriminant.expr" '"{ _ }"' PrivCall = seven(), - // @is "$.index[*][?(@.name=='PrivConst')].inner.discriminant.value" '"8"' - // @is "$.index[*][?(@.name=='PrivConst')].inner.discriminant.expr" '"EIGHT"' + // @is "$.index[*][?(@.name=='PrivConst')].inner.variant.discriminant.value" '"8"' + // @is "$.index[*][?(@.name=='PrivConst')].inner.variant.discriminant.expr" '"EIGHT"' PrivConst = EIGHT, } diff --git a/tests/rustdoc-json/enums/discriminant/limits.rs b/tests/rustdoc-json/enums/discriminant/limits.rs index e56d5594f2fc9..47fb7040896c3 100644 --- a/tests/rustdoc-json/enums/discriminant/limits.rs +++ b/tests/rustdoc-json/enums/discriminant/limits.rs @@ -4,40 +4,40 @@ #[repr(u64)] pub enum U64 { - // @is "$.index[*][?(@.name=='U64Min')].inner.discriminant.value" '"0"' - // @is "$.index[*][?(@.name=='U64Min')].inner.discriminant.expr" '"u64::MIN"' + // @is "$.index[*][?(@.name=='U64Min')].inner.variant.discriminant.value" '"0"' + // @is "$.index[*][?(@.name=='U64Min')].inner.variant.discriminant.expr" '"u64::MIN"' U64Min = u64::MIN, - // @is "$.index[*][?(@.name=='U64Max')].inner.discriminant.value" '"18446744073709551615"' - // @is "$.index[*][?(@.name=='U64Max')].inner.discriminant.expr" '"u64::MAX"' + // @is "$.index[*][?(@.name=='U64Max')].inner.variant.discriminant.value" '"18446744073709551615"' + // @is "$.index[*][?(@.name=='U64Max')].inner.variant.discriminant.expr" '"u64::MAX"' U64Max = u64::MAX, } #[repr(i64)] pub enum I64 { - // @is "$.index[*][?(@.name=='I64Min')].inner.discriminant.value" '"-9223372036854775808"' - // @is "$.index[*][?(@.name=='I64Min')].inner.discriminant.expr" '"i64::MIN"' + // @is "$.index[*][?(@.name=='I64Min')].inner.variant.discriminant.value" '"-9223372036854775808"' + // @is "$.index[*][?(@.name=='I64Min')].inner.variant.discriminant.expr" '"i64::MIN"' I64Min = i64::MIN, - // @is "$.index[*][?(@.name=='I64Max')].inner.discriminant.value" '"9223372036854775807"' - // @is "$.index[*][?(@.name=='I64Max')].inner.discriminant.expr" '"i64::MAX"' + // @is "$.index[*][?(@.name=='I64Max')].inner.variant.discriminant.value" '"9223372036854775807"' + // @is "$.index[*][?(@.name=='I64Max')].inner.variant.discriminant.expr" '"i64::MAX"' I64Max = i64::MAX, } #[repr(u128)] pub enum U128 { - // @is "$.index[*][?(@.name=='U128Min')].inner.discriminant.value" '"0"' - // @is "$.index[*][?(@.name=='U128Min')].inner.discriminant.expr" '"u128::MIN"' + // @is "$.index[*][?(@.name=='U128Min')].inner.variant.discriminant.value" '"0"' + // @is "$.index[*][?(@.name=='U128Min')].inner.variant.discriminant.expr" '"u128::MIN"' U128Min = u128::MIN, - // @is "$.index[*][?(@.name=='U128Max')].inner.discriminant.value" '"340282366920938463463374607431768211455"' - // @is "$.index[*][?(@.name=='U128Max')].inner.discriminant.expr" '"u128::MAX"' + // @is "$.index[*][?(@.name=='U128Max')].inner.variant.discriminant.value" '"340282366920938463463374607431768211455"' + // @is "$.index[*][?(@.name=='U128Max')].inner.variant.discriminant.expr" '"u128::MAX"' U128Max = u128::MAX, } #[repr(i128)] pub enum I128 { - // @is "$.index[*][?(@.name=='I128Min')].inner.discriminant.value" '"-170141183460469231731687303715884105728"' - // @is "$.index[*][?(@.name=='I128Min')].inner.discriminant.expr" '"i128::MIN"' + // @is "$.index[*][?(@.name=='I128Min')].inner.variant.discriminant.value" '"-170141183460469231731687303715884105728"' + // @is "$.index[*][?(@.name=='I128Min')].inner.variant.discriminant.expr" '"i128::MIN"' I128Min = i128::MIN, - // @is "$.index[*][?(@.name=='I128Max')].inner.discriminant.value" '"170141183460469231731687303715884105727"' - // @is "$.index[*][?(@.name=='I128Max')].inner.discriminant.expr" '"i128::MAX"' + // @is "$.index[*][?(@.name=='I128Max')].inner.variant.discriminant.value" '"170141183460469231731687303715884105727"' + // @is "$.index[*][?(@.name=='I128Max')].inner.variant.discriminant.expr" '"i128::MAX"' I128Max = i128::MAX, } diff --git a/tests/rustdoc-json/enums/discriminant/num_underscore_and_suffix.rs b/tests/rustdoc-json/enums/discriminant/num_underscore_and_suffix.rs index 6889b305ffb41..9c3db81c66336 100644 --- a/tests/rustdoc-json/enums/discriminant/num_underscore_and_suffix.rs +++ b/tests/rustdoc-json/enums/discriminant/num_underscore_and_suffix.rs @@ -1,15 +1,17 @@ +// ignore-tidy-linelength + #[repr(u32)] pub enum Foo { - // @is "$.index[*][?(@.name=='Basic')].inner.discriminant.value" '"0"' - // @is "$.index[*][?(@.name=='Basic')].inner.discriminant.expr" '"0"' + // @is "$.index[*][?(@.name=='Basic')].inner.variant.discriminant.value" '"0"' + // @is "$.index[*][?(@.name=='Basic')].inner.variant.discriminant.expr" '"0"' Basic = 0, - // @is "$.index[*][?(@.name=='Suffix')].inner.discriminant.value" '"10"' - // @is "$.index[*][?(@.name=='Suffix')].inner.discriminant.expr" '"10u32"' + // @is "$.index[*][?(@.name=='Suffix')].inner.variant.discriminant.value" '"10"' + // @is "$.index[*][?(@.name=='Suffix')].inner.variant.discriminant.expr" '"10u32"' Suffix = 10u32, - // @is "$.index[*][?(@.name=='Underscore')].inner.discriminant.value" '"100"' - // @is "$.index[*][?(@.name=='Underscore')].inner.discriminant.expr" '"1_0_0"' + // @is "$.index[*][?(@.name=='Underscore')].inner.variant.discriminant.value" '"100"' + // @is "$.index[*][?(@.name=='Underscore')].inner.variant.discriminant.expr" '"1_0_0"' Underscore = 1_0_0, - // @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.discriminant.value" '"1000"' - // @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.discriminant.expr" '"1_0_0_0u32"' + // @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.variant.discriminant.value" '"1000"' + // @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.variant.discriminant.expr" '"1_0_0_0u32"' SuffixUnderscore = 1_0_0_0u32, } diff --git a/tests/rustdoc-json/enums/discriminant/only_some_have_discriminant.rs b/tests/rustdoc-json/enums/discriminant/only_some_have_discriminant.rs index 6a4f54de61745..38ba1caf140b1 100644 --- a/tests/rustdoc-json/enums/discriminant/only_some_have_discriminant.rs +++ b/tests/rustdoc-json/enums/discriminant/only_some_have_discriminant.rs @@ -1,10 +1,12 @@ +// ignore-tidy-linelength + pub enum Foo { - // @is "$.index[*][?(@.name=='Has')].inner.discriminant" '{"expr":"0", "value":"0"}' + // @is "$.index[*][?(@.name=='Has')].inner.variant.discriminant" '{"expr":"0", "value":"0"}' Has = 0, - // @is "$.index[*][?(@.name=='Doesnt')].inner.discriminant" null + // @is "$.index[*][?(@.name=='Doesnt')].inner.variant.discriminant" null Doesnt, - // @is "$.index[*][?(@.name=='AlsoDoesnt')].inner.discriminant" null + // @is "$.index[*][?(@.name=='AlsoDoesnt')].inner.variant.discriminant" null AlsoDoesnt, - // @is "$.index[*][?(@.name=='AlsoHas')].inner.discriminant" '{"expr":"44", "value":"44"}' + // @is "$.index[*][?(@.name=='AlsoHas')].inner.variant.discriminant" '{"expr":"44", "value":"44"}' AlsoHas = 44, } diff --git a/tests/rustdoc-json/enums/discriminant/struct.rs b/tests/rustdoc-json/enums/discriminant/struct.rs index e91a632a3b38e..c4b087c3635ac 100644 --- a/tests/rustdoc-json/enums/discriminant/struct.rs +++ b/tests/rustdoc-json/enums/discriminant/struct.rs @@ -3,13 +3,13 @@ #[repr(i32)] // @is "$.index[*][?(@.name=='Foo')].attrs" '["#[repr(i32)]"]' pub enum Foo { - // @is "$.index[*][?(@.name=='Struct')].inner.discriminant" null - // @count "$.index[*][?(@.name=='Struct')].inner.kind.struct.fields[*]" 0 + // @is "$.index[*][?(@.name=='Struct')].inner.variant.discriminant" null + // @count "$.index[*][?(@.name=='Struct')].inner.variant.kind.struct.fields[*]" 0 Struct {}, - // @is "$.index[*][?(@.name=='StructWithDiscr')].inner.discriminant" '{"expr": "42", "value": "42"}' - // @count "$.index[*][?(@.name=='StructWithDiscr')].inner.kind.struct.fields[*]" 1 + // @is "$.index[*][?(@.name=='StructWithDiscr')].inner.variant.discriminant" '{"expr": "42", "value": "42"}' + // @count "$.index[*][?(@.name=='StructWithDiscr')].inner.variant.kind.struct.fields[*]" 1 StructWithDiscr { x: i32 } = 42, - // @is "$.index[*][?(@.name=='StructWithHexDiscr')].inner.discriminant" '{"expr": "0x42", "value": "66"}' - // @count "$.index[*][?(@.name=='StructWithHexDiscr')].inner.kind.struct.fields[*]" 2 + // @is "$.index[*][?(@.name=='StructWithHexDiscr')].inner.variant.discriminant" '{"expr": "0x42", "value": "66"}' + // @count "$.index[*][?(@.name=='StructWithHexDiscr')].inner.variant.kind.struct.fields[*]" 2 StructWithHexDiscr { x: i32, y: bool } = 0x42, } diff --git a/tests/rustdoc-json/enums/discriminant/tuple.rs b/tests/rustdoc-json/enums/discriminant/tuple.rs index b94d5739eabcb..7da82ec8ea4c1 100644 --- a/tests/rustdoc-json/enums/discriminant/tuple.rs +++ b/tests/rustdoc-json/enums/discriminant/tuple.rs @@ -3,13 +3,13 @@ #[repr(u32)] // @is "$.index[*][?(@.name=='Foo')].attrs" '["#[repr(u32)]"]' pub enum Foo { - // @is "$.index[*][?(@.name=='Tuple')].inner.discriminant" null - // @count "$.index[*][?(@.name=='Tuple')].inner.kind.tuple[*]" 0 + // @is "$.index[*][?(@.name=='Tuple')].inner.variant.discriminant" null + // @count "$.index[*][?(@.name=='Tuple')].inner.variant.kind.tuple[*]" 0 Tuple(), - // @is "$.index[*][?(@.name=='TupleWithDiscr')].inner.discriminant" '{"expr": "1", "value": "1"}' - // @count "$.index[*][?(@.name=='TupleWithDiscr')].inner.kind.tuple[*]" 1 + // @is "$.index[*][?(@.name=='TupleWithDiscr')].inner.variant.discriminant" '{"expr": "1", "value": "1"}' + // @count "$.index[*][?(@.name=='TupleWithDiscr')].inner.variant.kind.tuple[*]" 1 TupleWithDiscr(i32) = 1, - // @is "$.index[*][?(@.name=='TupleWithBinDiscr')].inner.discriminant" '{"expr": "0b10", "value": "2"}' - // @count "$.index[*][?(@.name=='TupleWithBinDiscr')].inner.kind.tuple[*]" 2 + // @is "$.index[*][?(@.name=='TupleWithBinDiscr')].inner.variant.discriminant" '{"expr": "0b10", "value": "2"}' + // @count "$.index[*][?(@.name=='TupleWithBinDiscr')].inner.variant.kind.tuple[*]" 2 TupleWithBinDiscr(i32, i32) = 0b10, } diff --git a/tests/rustdoc-json/enums/doc_link_to_foreign_variant.rs b/tests/rustdoc-json/enums/doc_link_to_foreign_variant.rs index 470b195a29247..b00156124fc2d 100644 --- a/tests/rustdoc-json/enums/doc_link_to_foreign_variant.rs +++ b/tests/rustdoc-json/enums/doc_link_to_foreign_variant.rs @@ -5,7 +5,7 @@ extern crate color; use color::Color::Red; -// @set red = "$.index[*][?(@.inner.is_crate == true)].links.Red" +// @set red = "$.index[*][?(@.inner.module.is_crate)].links.Red" // @!has "$.index[*][?(@.name == 'Red')]" // @!has "$.index[*][?(@.name == 'Color')]" diff --git a/tests/rustdoc-json/enums/field_hidden.rs b/tests/rustdoc-json/enums/field_hidden.rs index 78a05431472cb..5c0d0ffd3dfbe 100644 --- a/tests/rustdoc-json/enums/field_hidden.rs +++ b/tests/rustdoc-json/enums/field_hidden.rs @@ -5,8 +5,8 @@ // @has "$.index[*][?(@.name=='ParseError')]" // @has "$.index[*][?(@.name=='UnexpectedEndTag')]" -// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.kind.tuple" [null] -// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.discriminant" null +// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant.kind.tuple" [null] +// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant.discriminant" null pub enum ParseError { UnexpectedEndTag(#[doc(hidden)] u32), diff --git a/tests/rustdoc-json/enums/kind.rs b/tests/rustdoc-json/enums/kind.rs index 1787a859c8b37..e283c07400655 100644 --- a/tests/rustdoc-json/enums/kind.rs +++ b/tests/rustdoc-json/enums/kind.rs @@ -5,28 +5,28 @@ pub enum Foo { // @set Unit = "$.index[*][?(@.name=='Unit')].id" - // @is "$.index[*][?(@.name=='Unit')].inner.kind" '"plain"' + // @is "$.index[*][?(@.name=='Unit')].inner.variant.kind" '"plain"' Unit, // @set Named = "$.index[*][?(@.name=='Named')].id" - // @is "$.index[*][?(@.name=='Named')].inner.kind.struct" '{"fields": [], "fields_stripped": false}' + // @is "$.index[*][?(@.name=='Named')].inner.variant.kind.struct" '{"fields": [], "fields_stripped": false}' Named {}, // @set Tuple = "$.index[*][?(@.name=='Tuple')].id" - // @is "$.index[*][?(@.name=='Tuple')].inner.kind.tuple" [] + // @is "$.index[*][?(@.name=='Tuple')].inner.variant.kind.tuple" [] Tuple(), // @set NamedField = "$.index[*][?(@.name=='NamedField')].id" - // @set x = "$.index[*][?(@.name=='x' && @.kind=='struct_field')].id" - // @is "$.index[*][?(@.name=='NamedField')].inner.kind.struct.fields[*]" $x - // @is "$.index[*][?(@.name=='NamedField')].inner.kind.struct.fields_stripped" false + // @set x = "$.index[*][?(@.name=='x' && @.inner.struct_field)].id" + // @is "$.index[*][?(@.name=='NamedField')].inner.variant.kind.struct.fields[*]" $x + // @is "$.index[*][?(@.name=='NamedField')].inner.variant.kind.struct.fields_stripped" false NamedField { x: i32 }, // @set TupleField = "$.index[*][?(@.name=='TupleField')].id" - // @set tup_field = "$.index[*][?(@.name=='0' && @.kind=='struct_field')].id" - // @is "$.index[*][?(@.name=='TupleField')].inner.kind.tuple[*]" $tup_field + // @set tup_field = "$.index[*][?(@.name=='0' && @.inner.struct_field)].id" + // @is "$.index[*][?(@.name=='TupleField')].inner.variant.kind.tuple[*]" $tup_field TupleField(i32), } -// @is "$.index[*][?(@.name=='Foo')].inner.variants[0]" $Unit -// @is "$.index[*][?(@.name=='Foo')].inner.variants[1]" $Named -// @is "$.index[*][?(@.name=='Foo')].inner.variants[2]" $Tuple -// @is "$.index[*][?(@.name=='Foo')].inner.variants[3]" $NamedField -// @is "$.index[*][?(@.name=='Foo')].inner.variants[4]" $TupleField -// @count "$.index[*][?(@.name=='Foo')].inner.variants[*]" 5 +// @is "$.index[*][?(@.name=='Foo')].inner.enum.variants[0]" $Unit +// @is "$.index[*][?(@.name=='Foo')].inner.enum.variants[1]" $Named +// @is "$.index[*][?(@.name=='Foo')].inner.enum.variants[2]" $Tuple +// @is "$.index[*][?(@.name=='Foo')].inner.enum.variants[3]" $NamedField +// @is "$.index[*][?(@.name=='Foo')].inner.enum.variants[4]" $TupleField +// @count "$.index[*][?(@.name=='Foo')].inner.enum.variants[*]" 5 diff --git a/tests/rustdoc-json/enums/struct_field_hidden.rs b/tests/rustdoc-json/enums/struct_field_hidden.rs index de939cde2e7b3..2676c4e415782 100644 --- a/tests/rustdoc-json/enums/struct_field_hidden.rs +++ b/tests/rustdoc-json/enums/struct_field_hidden.rs @@ -9,8 +9,8 @@ pub enum Foo { // @set y = "$.index[*][?(@.name=='y')].id" y: i32, }, - // @is "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields_stripped" true - // @is "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields[0]" $b - // @is "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields[1]" $y - // @count "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields[*]" 2 + // @is "$.index[*][?(@.name=='Variant')].inner.variant.kind.struct.fields_stripped" true + // @is "$.index[*][?(@.name=='Variant')].inner.variant.kind.struct.fields[0]" $b + // @is "$.index[*][?(@.name=='Variant')].inner.variant.kind.struct.fields[1]" $y + // @count "$.index[*][?(@.name=='Variant')].inner.variant.kind.struct.fields[*]" 2 } diff --git a/tests/rustdoc-json/enums/tuple_fields_hidden.rs b/tests/rustdoc-json/enums/tuple_fields_hidden.rs index 70bfbb81826be..3aeb0356420a4 100644 --- a/tests/rustdoc-json/enums/tuple_fields_hidden.rs +++ b/tests/rustdoc-json/enums/tuple_fields_hidden.rs @@ -14,47 +14,47 @@ // @set 3.3.1 = "$.index[*][?(@.docs=='3.3.1')].id" pub enum EnumWithStrippedTupleVariants { - // @count "$.index[*][?(@.name=='None')].inner.kind.tuple[*]" 0 + // @count "$.index[*][?(@.name=='None')].inner.variant.kind.tuple[*]" 0 None(), - // @count "$.index[*][?(@.name=='One')].inner.kind.tuple[*]" 1 - // @is "$.index[*][?(@.name=='One')].inner.kind.tuple[0]" $1.1.0 + // @count "$.index[*][?(@.name=='One')].inner.variant.kind.tuple[*]" 1 + // @is "$.index[*][?(@.name=='One')].inner.variant.kind.tuple[0]" $1.1.0 One(/** 1.1.0*/ bool), - // @count "$.index[*][?(@.name=='OneHidden')].inner.kind.tuple[*]" 1 - // @is "$.index[*][?(@.name=='OneHidden')].inner.kind.tuple[0]" null + // @count "$.index[*][?(@.name=='OneHidden')].inner.variant.kind.tuple[*]" 1 + // @is "$.index[*][?(@.name=='OneHidden')].inner.variant.kind.tuple[0]" null OneHidden(#[doc(hidden)] bool), - // @count "$.index[*][?(@.name=='Two')].inner.kind.tuple[*]" 2 - // @is "$.index[*][?(@.name=='Two')].inner.kind.tuple[0]" $2.1.0 - // @is "$.index[*][?(@.name=='Two')].inner.kind.tuple[1]" $2.1.1 + // @count "$.index[*][?(@.name=='Two')].inner.variant.kind.tuple[*]" 2 + // @is "$.index[*][?(@.name=='Two')].inner.variant.kind.tuple[0]" $2.1.0 + // @is "$.index[*][?(@.name=='Two')].inner.variant.kind.tuple[1]" $2.1.1 Two(/** 2.1.0*/ bool, /** 2.1.1*/ bool), - // @count "$.index[*][?(@.name=='TwoLeftHidden')].inner.kind.tuple[*]" 2 - // @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.kind.tuple[0]" null - // @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.kind.tuple[1]" $2.2.1 + // @count "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant.kind.tuple[*]" 2 + // @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant.kind.tuple[0]" null + // @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant.kind.tuple[1]" $2.2.1 TwoLeftHidden(#[doc(hidden)] bool, /** 2.2.1*/ bool), - // @count "$.index[*][?(@.name=='TwoRightHidden')].inner.kind.tuple[*]" 2 - // @is "$.index[*][?(@.name=='TwoRightHidden')].inner.kind.tuple[0]" $2.3.0 - // @is "$.index[*][?(@.name=='TwoRightHidden')].inner.kind.tuple[1]" null + // @count "$.index[*][?(@.name=='TwoRightHidden')].inner.variant.kind.tuple[*]" 2 + // @is "$.index[*][?(@.name=='TwoRightHidden')].inner.variant.kind.tuple[0]" $2.3.0 + // @is "$.index[*][?(@.name=='TwoRightHidden')].inner.variant.kind.tuple[1]" null TwoRightHidden(/** 2.3.0*/ bool, #[doc(hidden)] bool), - // @count "$.index[*][?(@.name=='TwoBothHidden')].inner.kind.tuple[*]" 2 - // @is "$.index[*][?(@.name=='TwoBothHidden')].inner.kind.tuple[0]" null - // @is "$.index[*][?(@.name=='TwoBothHidden')].inner.kind.tuple[1]" null + // @count "$.index[*][?(@.name=='TwoBothHidden')].inner.variant.kind.tuple[*]" 2 + // @is "$.index[*][?(@.name=='TwoBothHidden')].inner.variant.kind.tuple[0]" null + // @is "$.index[*][?(@.name=='TwoBothHidden')].inner.variant.kind.tuple[1]" null TwoBothHidden(#[doc(hidden)] bool, #[doc(hidden)] bool), - // @count "$.index[*][?(@.name=='Three1')].inner.kind.tuple[*]" 3 - // @is "$.index[*][?(@.name=='Three1')].inner.kind.tuple[0]" null - // @is "$.index[*][?(@.name=='Three1')].inner.kind.tuple[1]" $3.1.1 - // @is "$.index[*][?(@.name=='Three1')].inner.kind.tuple[2]" $3.1.2 + // @count "$.index[*][?(@.name=='Three1')].inner.variant.kind.tuple[*]" 3 + // @is "$.index[*][?(@.name=='Three1')].inner.variant.kind.tuple[0]" null + // @is "$.index[*][?(@.name=='Three1')].inner.variant.kind.tuple[1]" $3.1.1 + // @is "$.index[*][?(@.name=='Three1')].inner.variant.kind.tuple[2]" $3.1.2 Three1(#[doc(hidden)] bool, /** 3.1.1*/ bool, /** 3.1.2*/ bool), - // @count "$.index[*][?(@.name=='Three2')].inner.kind.tuple[*]" 3 - // @is "$.index[*][?(@.name=='Three2')].inner.kind.tuple[0]" $3.2.0 - // @is "$.index[*][?(@.name=='Three2')].inner.kind.tuple[1]" null - // @is "$.index[*][?(@.name=='Three2')].inner.kind.tuple[2]" $3.2.2 + // @count "$.index[*][?(@.name=='Three2')].inner.variant.kind.tuple[*]" 3 + // @is "$.index[*][?(@.name=='Three2')].inner.variant.kind.tuple[0]" $3.2.0 + // @is "$.index[*][?(@.name=='Three2')].inner.variant.kind.tuple[1]" null + // @is "$.index[*][?(@.name=='Three2')].inner.variant.kind.tuple[2]" $3.2.2 Three2(/** 3.2.0*/ bool, #[doc(hidden)] bool, /** 3.2.2*/ bool), - // @count "$.index[*][?(@.name=='Three3')].inner.kind.tuple[*]" 3 - // @is "$.index[*][?(@.name=='Three3')].inner.kind.tuple[0]" $3.3.0 - // @is "$.index[*][?(@.name=='Three3')].inner.kind.tuple[1]" $3.3.1 - // @is "$.index[*][?(@.name=='Three3')].inner.kind.tuple[2]" null + // @count "$.index[*][?(@.name=='Three3')].inner.variant.kind.tuple[*]" 3 + // @is "$.index[*][?(@.name=='Three3')].inner.variant.kind.tuple[0]" $3.3.0 + // @is "$.index[*][?(@.name=='Three3')].inner.variant.kind.tuple[1]" $3.3.1 + // @is "$.index[*][?(@.name=='Three3')].inner.variant.kind.tuple[2]" null Three3(/** 3.3.0*/ bool, /** 3.3.1*/ bool, #[doc(hidden)] bool), } @@ -70,14 +70,14 @@ pub enum EnumWithStrippedTupleVariants { // @is "$.index[*][?(@.docs=='3.3.0')].name" '"0"' // @is "$.index[*][?(@.docs=='3.3.1')].name" '"1"' -// @is "$.index[*][?(@.docs=='1.1.0')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='2.1.0')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='2.1.1')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='2.2.1')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='2.3.0')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='3.1.1')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='3.1.2')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='3.2.0')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='3.2.2')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='3.3.0')].inner" '{"kind": "primitive", "inner": "bool"}' -// @is "$.index[*][?(@.docs=='3.3.1')].inner" '{"kind": "primitive", "inner": "bool"}' +// @is "$.index[*][?(@.docs=='1.1.0')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='2.1.0')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='2.1.1')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='2.2.1')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='2.3.0')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='3.1.1')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='3.1.2')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='3.2.0')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='3.2.2')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='3.3.0')].inner.struct_field" '{"primitive": "bool"}' +// @is "$.index[*][?(@.docs=='3.3.1')].inner.struct_field" '{"primitive": "bool"}' diff --git a/tests/rustdoc-json/enums/use_glob.rs b/tests/rustdoc-json/enums/use_glob.rs index 62b8b832afdaa..49990ec53315f 100644 --- a/tests/rustdoc-json/enums/use_glob.rs +++ b/tests/rustdoc-json/enums/use_glob.rs @@ -10,9 +10,9 @@ pub enum Color { Blue, } -// @set use_Color = "$.index[*][?(@.kind == 'import')].id" -// @is "$.index[*][?(@.kind == 'import')].inner.id" $Color -// @is "$.index[*][?(@.kind == 'import')].inner.glob" true +// @set use_Color = "$.index[*][?(@.inner.import)].id" +// @is "$.index[*][?(@.inner.import)].inner.import.id" $Color +// @is "$.index[*][?(@.inner.import)].inner.import.glob" true pub use Color::*; -// @ismany "$.index[*][?(@.name == 'use_glob')].inner.items[*]" $Color $use_Color +// @ismany "$.index[*][?(@.name == 'use_glob')].inner.module.items[*]" $Color $use_Color diff --git a/tests/rustdoc-json/enums/use_variant.rs b/tests/rustdoc-json/enums/use_variant.rs index 5f0d2b9b1ec84..8190e1cbe81d3 100644 --- a/tests/rustdoc-json/enums/use_variant.rs +++ b/tests/rustdoc-json/enums/use_variant.rs @@ -6,10 +6,10 @@ pub enum AlwaysNone { // @set None = "$.index[*][?(@.name == 'None')].id" None, } -// @is "$.index[*][?(@.name == 'AlwaysNone')].inner.variants[*]" $None +// @is "$.index[*][?(@.name == 'AlwaysNone')].inner.enum.variants[*]" $None -// @set use_None = "$.index[*][?(@.kind == 'import')].id" -// @is "$.index[*][?(@.kind == 'import')].inner.id" $None +// @set use_None = "$.index[*][?(@.inner.import)].id" +// @is "$.index[*][?(@.inner.import)].inner.import.id" $None pub use AlwaysNone::None; -// @ismany "$.index[*][?(@.name == 'use_variant')].inner.items[*]" $AlwaysNone $use_None +// @ismany "$.index[*][?(@.name == 'use_variant')].inner.module.items[*]" $AlwaysNone $use_None diff --git a/tests/rustdoc-json/enums/use_variant_foreign.rs b/tests/rustdoc-json/enums/use_variant_foreign.rs index 11bb6ce1f3a0c..a79e899d85f3f 100644 --- a/tests/rustdoc-json/enums/use_variant_foreign.rs +++ b/tests/rustdoc-json/enums/use_variant_foreign.rs @@ -2,7 +2,7 @@ extern crate color; -// @is "$.index[*][?(@.inner.name == 'Red')].kind" '"import"' +// @has "$.index[*].inner.import[?(@.name == 'Red')]" pub use color::Color::Red; // @!has "$.index[*][?(@.name == 'Red')]" diff --git a/tests/rustdoc-json/enums/variant_struct.rs b/tests/rustdoc-json/enums/variant_struct.rs index bc870c502a011..fe40f1a5d5db6 100644 --- a/tests/rustdoc-json/enums/variant_struct.rs +++ b/tests/rustdoc-json/enums/variant_struct.rs @@ -1,10 +1,10 @@ // @is "$.index[*][?(@.name=='EnumStruct')].visibility" \"public\" -// @is "$.index[*][?(@.name=='EnumStruct')].kind" \"enum\" +// @has "$.index[*][?(@.name=='EnumStruct')].inner.enum" pub enum EnumStruct { - // @is "$.index[*][?(@.name=='x')].kind" \"struct_field\" + // @has "$.index[*][?(@.name=='x')].inner.struct_field" // @set x = "$.index[*][?(@.name=='x')].id" - // @is "$.index[*][?(@.name=='y')].kind" \"struct_field\" + // @has "$.index[*][?(@.name=='y')].inner.struct_field" // @set y = "$.index[*][?(@.name=='y')].id" - // @ismany "$.index[*][?(@.name=='VariantS')].inner.kind.struct.fields[*]" $x $y + // @ismany "$.index[*][?(@.name=='VariantS')].inner.variant.kind.struct.fields[*]" $x $y VariantS { x: u32, y: String }, } diff --git a/tests/rustdoc-json/enums/variant_tuple_struct.rs b/tests/rustdoc-json/enums/variant_tuple_struct.rs index d1207bbfb18da..358fc1079cb83 100644 --- a/tests/rustdoc-json/enums/variant_tuple_struct.rs +++ b/tests/rustdoc-json/enums/variant_tuple_struct.rs @@ -1,10 +1,10 @@ // @is "$.index[*][?(@.name=='EnumTupleStruct')].visibility" \"public\" -// @is "$.index[*][?(@.name=='EnumTupleStruct')].kind" \"enum\" +// @has "$.index[*][?(@.name=='EnumTupleStruct')].inner.enum" pub enum EnumTupleStruct { - // @is "$.index[*][?(@.name=='0')].kind" \"struct_field\" + // @has "$.index[*][?(@.name=='0')].inner.struct_field" // @set f0 = "$.index[*][?(@.name=='0')].id" - // @is "$.index[*][?(@.name=='1')].kind" \"struct_field\" + // @has "$.index[*][?(@.name=='1')].inner.struct_field" // @set f1 = "$.index[*][?(@.name=='1')].id" - // @ismany "$.index[*][?(@.name=='VariantA')].inner.kind.tuple[*]" $f0 $f1 + // @ismany "$.index[*][?(@.name=='VariantA')].inner.variant.kind.tuple[*]" $f0 $f1 VariantA(u32, String), } diff --git a/tests/rustdoc-json/fn_pointer/abi.rs b/tests/rustdoc-json/fn_pointer/abi.rs index 6a30acc2cc32c..77c0e82330f26 100644 --- a/tests/rustdoc-json/fn_pointer/abi.rs +++ b/tests/rustdoc-json/fn_pointer/abi.rs @@ -2,23 +2,23 @@ #![feature(abi_vectorcall)] -// @is "$.index[*][?(@.name=='AbiRust')].inner.type.inner.header.abi" \"Rust\" +// @is "$.index[*][?(@.name=='AbiRust')].inner.typedef.type.function_pointer.header.abi" \"Rust\" pub type AbiRust = fn(); -// @is "$.index[*][?(@.name=='AbiC')].inner.type.inner.header.abi" '{"C": {"unwind": false}}' +// @is "$.index[*][?(@.name=='AbiC')].inner.typedef.type.function_pointer.header.abi" '{"C": {"unwind": false}}' pub type AbiC = extern "C" fn(); -// @is "$.index[*][?(@.name=='AbiSystem')].inner.type.inner.header.abi" '{"System": {"unwind": false}}' +// @is "$.index[*][?(@.name=='AbiSystem')].inner.typedef.type.function_pointer.header.abi" '{"System": {"unwind": false}}' pub type AbiSystem = extern "system" fn(); -// @is "$.index[*][?(@.name=='AbiCUnwind')].inner.type.inner.header.abi" '{"C": {"unwind": true}}' +// @is "$.index[*][?(@.name=='AbiCUnwind')].inner.typedef.type.function_pointer.header.abi" '{"C": {"unwind": true}}' pub type AbiCUnwind = extern "C-unwind" fn(); -// @is "$.index[*][?(@.name=='AbiSystemUnwind')].inner.type.inner.header.abi" '{"System": {"unwind": true}}' +// @is "$.index[*][?(@.name=='AbiSystemUnwind')].inner.typedef.type.function_pointer.header.abi" '{"System": {"unwind": true}}' pub type AbiSystemUnwind = extern "system-unwind" fn(); -// @is "$.index[*][?(@.name=='AbiVecorcall')].inner.type.inner.header.abi.Other" '"\"vectorcall\""' +// @is "$.index[*][?(@.name=='AbiVecorcall')].inner.typedef.type.function_pointer.header.abi.Other" '"\"vectorcall\""' pub type AbiVecorcall = extern "vectorcall" fn(); -// @is "$.index[*][?(@.name=='AbiVecorcallUnwind')].inner.type.inner.header.abi.Other" '"\"vectorcall-unwind\""' +// @is "$.index[*][?(@.name=='AbiVecorcallUnwind')].inner.typedef.type.function_pointer.header.abi.Other" '"\"vectorcall-unwind\""' pub type AbiVecorcallUnwind = extern "vectorcall-unwind" fn(); diff --git a/tests/rustdoc-json/fn_pointer/generics.rs b/tests/rustdoc-json/fn_pointer/generics.rs index a93b01ac2c4eb..48672f12da1a4 100644 --- a/tests/rustdoc-json/fn_pointer/generics.rs +++ b/tests/rustdoc-json/fn_pointer/generics.rs @@ -3,12 +3,11 @@ #![feature(no_core)] #![no_core] -// @count "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.decl.inputs[*]" 1 -// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.decl.inputs[0][0]" '"val"' -// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.decl.inputs[0][1].kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.decl.inputs[0][1].inner.lifetime" \"\'c\" -// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.decl.output" '{ "kind": "primitive", "inner": "i32" }' -// @count "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.generic_params[*]" 1 -// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.generic_params[0].name" \"\'c\" -// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.type.inner.generic_params[0].kind" '{ "lifetime": { "outlives": [] } }' +// @count "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.decl.inputs[*]" 1 +// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.decl.inputs[0][0]" '"val"' +// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.decl.inputs[0][1].borrowed_ref.lifetime" \"\'c\" +// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.decl.output.primitive" \"i32\" +// @count "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.generic_params[*]" 1 +// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.generic_params[0].name" \"\'c\" +// @is "$.index[*][?(@.name=='WithHigherRankTraitBounds')].inner.typedef.type.function_pointer.generic_params[0].kind" '{ "lifetime": { "outlives": [] } }' pub type WithHigherRankTraitBounds = for<'c> fn(val: &'c i32) -> i32; diff --git a/tests/rustdoc-json/fn_pointer/qualifiers.rs b/tests/rustdoc-json/fn_pointer/qualifiers.rs index bd65bb3eefe2c..0ab776c21eda2 100644 --- a/tests/rustdoc-json/fn_pointer/qualifiers.rs +++ b/tests/rustdoc-json/fn_pointer/qualifiers.rs @@ -1,9 +1,11 @@ -// @is "$.index[*][?(@.name=='FnPointer')].inner.type.inner.header.unsafe" false -// @is "$.index[*][?(@.name=='FnPointer')].inner.type.inner.header.const" false -// @is "$.index[*][?(@.name=='FnPointer')].inner.type.inner.header.async" false +// ignore-tidy-linelength + +// @is "$.index[*][?(@.name=='FnPointer')].inner.typedef.type.function_pointer.header.unsafe" false +// @is "$.index[*][?(@.name=='FnPointer')].inner.typedef.type.function_pointer.header.const" false +// @is "$.index[*][?(@.name=='FnPointer')].inner.typedef.type.function_pointer.header.async" false pub type FnPointer = fn(); -// @is "$.index[*][?(@.name=='UnsafePointer')].inner.type.inner.header.unsafe" true -// @is "$.index[*][?(@.name=='UnsafePointer')].inner.type.inner.header.const" false -// @is "$.index[*][?(@.name=='UnsafePointer')].inner.type.inner.header.async" false +// @is "$.index[*][?(@.name=='UnsafePointer')].inner.typedef.type.function_pointer.header.unsafe" true +// @is "$.index[*][?(@.name=='UnsafePointer')].inner.typedef.type.function_pointer.header.const" false +// @is "$.index[*][?(@.name=='UnsafePointer')].inner.typedef.type.function_pointer.header.async" false pub type UnsafePointer = unsafe fn(); diff --git a/tests/rustdoc-json/fns/abi.rs b/tests/rustdoc-json/fns/abi.rs index 7a5dbee730c7d..d7b98b5924b84 100644 --- a/tests/rustdoc-json/fns/abi.rs +++ b/tests/rustdoc-json/fns/abi.rs @@ -2,23 +2,23 @@ #![feature(abi_vectorcall)] -// @is "$.index[*][?(@.name=='abi_rust')].inner.header.abi" \"Rust\" +// @is "$.index[*][?(@.name=='abi_rust')].inner.function.header.abi" \"Rust\" pub fn abi_rust() {} -// @is "$.index[*][?(@.name=='abi_c')].inner.header.abi" '{"C": {"unwind": false}}' +// @is "$.index[*][?(@.name=='abi_c')].inner.function.header.abi" '{"C": {"unwind": false}}' pub extern "C" fn abi_c() {} -// @is "$.index[*][?(@.name=='abi_system')].inner.header.abi" '{"System": {"unwind": false}}' +// @is "$.index[*][?(@.name=='abi_system')].inner.function.header.abi" '{"System": {"unwind": false}}' pub extern "system" fn abi_system() {} -// @is "$.index[*][?(@.name=='abi_c_unwind')].inner.header.abi" '{"C": {"unwind": true}}' +// @is "$.index[*][?(@.name=='abi_c_unwind')].inner.function.header.abi" '{"C": {"unwind": true}}' pub extern "C-unwind" fn abi_c_unwind() {} -// @is "$.index[*][?(@.name=='abi_system_unwind')].inner.header.abi" '{"System": {"unwind": true}}' +// @is "$.index[*][?(@.name=='abi_system_unwind')].inner.function.header.abi" '{"System": {"unwind": true}}' pub extern "system-unwind" fn abi_system_unwind() {} -// @is "$.index[*][?(@.name=='abi_vectorcall')].inner.header.abi.Other" '"\"vectorcall\""' +// @is "$.index[*][?(@.name=='abi_vectorcall')].inner.function.header.abi.Other" '"\"vectorcall\""' pub extern "vectorcall" fn abi_vectorcall() {} -// @is "$.index[*][?(@.name=='abi_vectorcall_unwind')].inner.header.abi.Other" '"\"vectorcall-unwind\""' +// @is "$.index[*][?(@.name=='abi_vectorcall_unwind')].inner.function.header.abi.Other" '"\"vectorcall-unwind\""' pub extern "vectorcall-unwind" fn abi_vectorcall_unwind() {} diff --git a/tests/rustdoc-json/fns/async_return.rs b/tests/rustdoc-json/fns/async_return.rs index b89781ca92da6..8192f2e6ae633 100644 --- a/tests/rustdoc-json/fns/async_return.rs +++ b/tests/rustdoc-json/fns/async_return.rs @@ -5,32 +5,30 @@ use std::future::Future; -// @is "$.index[*][?(@.name=='get_int')].inner.decl.output" '{"inner": "i32", "kind": "primitive"}' -// @is "$.index[*][?(@.name=='get_int')].inner.header.async" false +// @is "$.index[*][?(@.name=='get_int')].inner.function.decl.output.primitive" \"i32\" +// @is "$.index[*][?(@.name=='get_int')].inner.function.header.async" false pub fn get_int() -> i32 { 42 } -// @is "$.index[*][?(@.name=='get_int_async')].inner.decl.output" '{"inner": "i32", "kind": "primitive"}' -// @is "$.index[*][?(@.name=='get_int_async')].inner.header.async" true +// @is "$.index[*][?(@.name=='get_int_async')].inner.function.decl.output.primitive" \"i32\" +// @is "$.index[*][?(@.name=='get_int_async')].inner.function.header.async" true pub async fn get_int_async() -> i32 { 42 } -// @is "$.index[*][?(@.name=='get_int_future')].inner.decl.output.kind" '"impl_trait"' -// @is "$.index[*][?(@.name=='get_int_future')].inner.decl.output.inner[0].trait_bound.trait.name" '"Future"' -// @is "$.index[*][?(@.name=='get_int_future')].inner.decl.output.inner[0].trait_bound.trait.args.angle_bracketed.bindings[0].name" '"Output"' -// @is "$.index[*][?(@.name=='get_int_future')].inner.decl.output.inner[0].trait_bound.trait.args.angle_bracketed.bindings[0].binding.equality.type" '{"inner": "i32", "kind": "primitive"}' -// @is "$.index[*][?(@.name=='get_int_future')].inner.header.async" false +// @is "$.index[*][?(@.name=='get_int_future')].inner.function.decl.output.impl_trait[0].trait_bound.trait.name" '"Future"' +// @is "$.index[*][?(@.name=='get_int_future')].inner.function.decl.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.bindings[0].name" '"Output"' +// @is "$.index[*][?(@.name=='get_int_future')].inner.function.decl.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.bindings[0].binding.equality.type.primitive" \"i32\" +// @is "$.index[*][?(@.name=='get_int_future')].inner.function.header.async" false pub fn get_int_future() -> impl Future { async { 42 } } -// @is "$.index[*][?(@.name=='get_int_future_async')].inner.decl.output.kind" '"impl_trait"' -// @is "$.index[*][?(@.name=='get_int_future_async')].inner.decl.output.inner[0].trait_bound.trait.name" '"Future"' -// @is "$.index[*][?(@.name=='get_int_future_async')].inner.decl.output.inner[0].trait_bound.trait.args.angle_bracketed.bindings[0].name" '"Output"' -// @is "$.index[*][?(@.name=='get_int_future_async')].inner.decl.output.inner[0].trait_bound.trait.args.angle_bracketed.bindings[0].binding.equality.type" '{"inner": "i32", "kind": "primitive"}' -// @is "$.index[*][?(@.name=='get_int_future_async')].inner.header.async" true +// @is "$.index[*][?(@.name=='get_int_future_async')].inner.function.decl.output.impl_trait[0].trait_bound.trait.name" '"Future"' +// @is "$.index[*][?(@.name=='get_int_future_async')].inner.function.decl.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.bindings[0].name" '"Output"' +// @is "$.index[*][?(@.name=='get_int_future_async')].inner.function.decl.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.bindings[0].binding.equality.type.primitive" \"i32\" +// @is "$.index[*][?(@.name=='get_int_future_async')].inner.function.header.async" true pub async fn get_int_future_async() -> impl Future { async { 42 } } diff --git a/tests/rustdoc-json/fns/extern_c_variadic.rs b/tests/rustdoc-json/fns/extern_c_variadic.rs index 33bebbab5e008..d6ea343b9911a 100644 --- a/tests/rustdoc-json/fns/extern_c_variadic.rs +++ b/tests/rustdoc-json/fns/extern_c_variadic.rs @@ -2,8 +2,8 @@ #![no_core] extern "C" { - // @is "$.index[*][?(@.name == 'not_variadic')].inner.decl.c_variadic" false + // @is "$.index[*][?(@.name == 'not_variadic')].inner.function.decl.c_variadic" false pub fn not_variadic(_: i32); - // @is "$.index[*][?(@.name == 'variadic')].inner.decl.c_variadic" true + // @is "$.index[*][?(@.name == 'variadic')].inner.function.decl.c_variadic" true pub fn variadic(_: i32, ...); } diff --git a/tests/rustdoc-json/fns/generic_args.rs b/tests/rustdoc-json/fns/generic_args.rs index eec295efec0f0..539d17f831ebf 100644 --- a/tests/rustdoc-json/fns/generic_args.rs +++ b/tests/rustdoc-json/fns/generic_args.rs @@ -9,59 +9,55 @@ pub trait Foo {} // @set generic_foo = "$.index[*][?(@.name=='GenericFoo')].id" pub trait GenericFoo<'a> {} -// @is "$.index[*][?(@.name=='generics')].inner.generics.where_predicates" "[]" -// @count "$.index[*][?(@.name=='generics')].inner.generics.params[*]" 1 -// @is "$.index[*][?(@.name=='generics')].inner.generics.params[0].name" '"F"' -// @is "$.index[*][?(@.name=='generics')].inner.generics.params[0].kind.type.default" 'null' -// @count "$.index[*][?(@.name=='generics')].inner.generics.params[0].kind.type.bounds[*]" 1 -// @is "$.index[*][?(@.name=='generics')].inner.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" '$foo' -// @count "$.index[*][?(@.name=='generics')].inner.decl.inputs[*]" 1 -// @is "$.index[*][?(@.name=='generics')].inner.decl.inputs[0][0]" '"f"' -// @is "$.index[*][?(@.name=='generics')].inner.decl.inputs[0][1].kind" '"generic"' -// @is "$.index[*][?(@.name=='generics')].inner.decl.inputs[0][1].inner" '"F"' +// @is "$.index[*][?(@.name=='generics')].inner.function.generics.where_predicates" "[]" +// @count "$.index[*][?(@.name=='generics')].inner.function.generics.params[*]" 1 +// @is "$.index[*][?(@.name=='generics')].inner.function.generics.params[0].name" '"F"' +// @is "$.index[*][?(@.name=='generics')].inner.function.generics.params[0].kind.type.default" 'null' +// @count "$.index[*][?(@.name=='generics')].inner.function.generics.params[0].kind.type.bounds[*]" 1 +// @is "$.index[*][?(@.name=='generics')].inner.function.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" '$foo' +// @count "$.index[*][?(@.name=='generics')].inner.function.decl.inputs[*]" 1 +// @is "$.index[*][?(@.name=='generics')].inner.function.decl.inputs[0][0]" '"f"' +// @is "$.index[*][?(@.name=='generics')].inner.function.decl.inputs[0][1].generic" '"F"' pub fn generics(f: F) {} -// @is "$.index[*][?(@.name=='impl_trait')].inner.generics.where_predicates" "[]" -// @count "$.index[*][?(@.name=='impl_trait')].inner.generics.params[*]" 1 -// @is "$.index[*][?(@.name=='impl_trait')].inner.generics.params[0].name" '"impl Foo"' -// @is "$.index[*][?(@.name=='impl_trait')].inner.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $foo -// @count "$.index[*][?(@.name=='impl_trait')].inner.decl.inputs[*]" 1 -// @is "$.index[*][?(@.name=='impl_trait')].inner.decl.inputs[0][0]" '"f"' -// @is "$.index[*][?(@.name=='impl_trait')].inner.decl.inputs[0][1].kind" '"impl_trait"' -// @count "$.index[*][?(@.name=='impl_trait')].inner.decl.inputs[0][1].inner[*]" 1 -// @is "$.index[*][?(@.name=='impl_trait')].inner.decl.inputs[0][1].inner[0].trait_bound.trait.id" $foo +// @is "$.index[*][?(@.name=='impl_trait')].inner.function.generics.where_predicates" "[]" +// @count "$.index[*][?(@.name=='impl_trait')].inner.function.generics.params[*]" 1 +// @is "$.index[*][?(@.name=='impl_trait')].inner.function.generics.params[0].name" '"impl Foo"' +// @is "$.index[*][?(@.name=='impl_trait')].inner.function.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $foo +// @count "$.index[*][?(@.name=='impl_trait')].inner.function.decl.inputs[*]" 1 +// @is "$.index[*][?(@.name=='impl_trait')].inner.function.decl.inputs[0][0]" '"f"' +// @count "$.index[*][?(@.name=='impl_trait')].inner.function.decl.inputs[0][1].impl_trait[*]" 1 +// @is "$.index[*][?(@.name=='impl_trait')].inner.function.decl.inputs[0][1].impl_trait[0].trait_bound.trait.id" $foo pub fn impl_trait(f: impl Foo) {} -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.params[*]" 3 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.params[0].name" '"F"' -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.params[0].kind" '{"type": {"bounds": [], "default": null, "synthetic": false}}' -// @count "$.index[*][?(@.name=='where_clase')].inner.decl.inputs[*]" 3 -// @is "$.index[*][?(@.name=='where_clase')].inner.decl.inputs[0][0]" '"f"' -// @is "$.index[*][?(@.name=='where_clase')].inner.decl.inputs[0][1].kind" '"generic"' -// @is "$.index[*][?(@.name=='where_clase')].inner.decl.inputs[0][1].inner" '"F"' -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[*]" 3 +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.params[*]" 3 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.params[0].name" '"F"' +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.params[0].kind" '{"type": {"bounds": [], "default": null, "synthetic": false}}' +// @count "$.index[*][?(@.name=='where_clase')].inner.function.decl.inputs[*]" 3 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.decl.inputs[0][0]" '"f"' +// @is "$.index[*][?(@.name=='where_clase')].inner.function.decl.inputs[0][1].generic" '"F"' +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[*]" 3 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[0].bound_predicate.type" '{"inner": "F", "kind": "generic"}' -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[0].bound_predicate.bounds[*]" 1 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[0].bound_predicate.bounds[0].trait_bound.trait.id" $foo +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[0].bound_predicate.type.generic" \"F\" +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[0].bound_predicate.bounds[*]" 1 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[0].bound_predicate.bounds[0].trait_bound.trait.id" $foo -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.type" '{"inner": "G", "kind": "generic"}' -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.bounds[*]" 1 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.trait.id" $generic_foo -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.generic_params[*]" 1 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.generic_params[0].name" \"\'a\" -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.generic_params[0].kind" '{ "lifetime": { "outlives": [] } }' -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[1].bound_predicate.generic_params" "[]" +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.type.generic" \"G\" +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.bounds[*]" 1 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.trait.id" $generic_foo +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.generic_params[*]" 1 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.generic_params[0].name" \"\'a\" +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.bounds[0].trait_bound.generic_params[0].kind.lifetime.outlives" "[]" +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[1].bound_predicate.generic_params" "[]" -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.type.kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.type.inner.lifetime" \"\'b\" -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.type.inner.type" '{"inner": "H", "kind": "generic"}' -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.bounds[*]" 1 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.bounds[0].trait_bound.trait.id" $foo -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.bounds[0].trait_bound.generic_params" "[]" -// @count "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.generic_params[*]" 1 -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.generic_params[0].name" \"\'b\" -// @is "$.index[*][?(@.name=='where_clase')].inner.generics.where_predicates[2].bound_predicate.generic_params[0].kind" '{ "lifetime": { "outlives": [] } }' +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.type.borrowed_ref.lifetime" \"\'b\" +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.type.borrowed_ref.type.generic" \"H\" +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.bounds[*]" 1 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.bounds[0].trait_bound.trait.id" $foo +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.bounds[0].trait_bound.generic_params" "[]" +// @count "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.generic_params[*]" 1 +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.generic_params[0].name" \"\'b\" +// @is "$.index[*][?(@.name=='where_clase')].inner.function.generics.where_predicates[2].bound_predicate.generic_params[0].kind.lifetime.outlives" "[]" pub fn where_clase(f: F, g: G, h: H) where F: Foo, diff --git a/tests/rustdoc-json/fns/generic_returns.rs b/tests/rustdoc-json/fns/generic_returns.rs index a9bc2d5d727d3..27d842066f4e2 100644 --- a/tests/rustdoc-json/fns/generic_returns.rs +++ b/tests/rustdoc-json/fns/generic_returns.rs @@ -3,15 +3,14 @@ #![feature(no_core)] #![no_core] -// @count "$.index[*][?(@.name=='generic_returns')].inner.items[*]" 2 +// @count "$.index[*][?(@.name=='generic_returns')].inner.module.items[*]" 2 // @set foo = "$.index[*][?(@.name=='Foo')].id" pub trait Foo {} -// @is "$.index[*][?(@.name=='get_foo')].inner.decl.inputs" [] -// @is "$.index[*][?(@.name=='get_foo')].inner.decl.output.kind" '"impl_trait"' -// @count "$.index[*][?(@.name=='get_foo')].inner.decl.output.inner[*]" 1 -// @is "$.index[*][?(@.name=='get_foo')].inner.decl.output.inner[0].trait_bound.trait.id" $foo +// @is "$.index[*][?(@.name=='get_foo')].inner.function.decl.inputs" [] +// @count "$.index[*][?(@.name=='get_foo')].inner.function.decl.output.impl_trait[*]" 1 +// @is "$.index[*][?(@.name=='get_foo')].inner.function.decl.output.impl_trait[0].trait_bound.trait.id" $foo pub fn get_foo() -> impl Foo { Fooer {} } diff --git a/tests/rustdoc-json/fns/generics.rs b/tests/rustdoc-json/fns/generics.rs index 7b70ff1df6b09..5239a6f21f534 100644 --- a/tests/rustdoc-json/fns/generics.rs +++ b/tests/rustdoc-json/fns/generics.rs @@ -6,21 +6,20 @@ // @set wham_id = "$.index[*][?(@.name=='Wham')].id" pub trait Wham {} -// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.generics.where_predicates" [] -// @count "$.index[*][?(@.name=='one_generic_param_fn')].inner.generics.params[*]" 1 -// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.generics.params[0].name" '"T"' -// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.generics.params[0].kind.type.synthetic" false -// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $wham_id -// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.decl.inputs" '[["w", {"inner": "T", "kind": "generic"}]]' +// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.function.generics.where_predicates" [] +// @count "$.index[*][?(@.name=='one_generic_param_fn')].inner.function.generics.params[*]" 1 +// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.function.generics.params[0].name" '"T"' +// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.function.generics.params[0].kind.type.synthetic" false +// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.function.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $wham_id +// @is "$.index[*][?(@.name=='one_generic_param_fn')].inner.function.decl.inputs" '[["w", {"generic": "T"}]]' pub fn one_generic_param_fn(w: T) {} -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.generics.where_predicates" [] -// @count "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.generics.params[*]" 1 -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.generics.params[0].name" '"impl Wham"' -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.generics.params[0].kind.type.synthetic" true -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $wham_id -// @count "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.decl.inputs[*]" 1 -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.decl.inputs[0][0]" '"w"' -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.decl.inputs[0][1].kind" '"impl_trait"' -// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.decl.inputs[0][1].inner[0].trait_bound.trait.id" $wham_id +// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.generics.where_predicates" [] +// @count "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.generics.params[*]" 1 +// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.generics.params[0].name" '"impl Wham"' +// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.generics.params[0].kind.type.synthetic" true +// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $wham_id +// @count "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.decl.inputs[*]" 1 +// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.decl.inputs[0][0]" '"w"' +// @is "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.function.decl.inputs[0][1].impl_trait[0].trait_bound.trait.id" $wham_id pub fn one_synthetic_generic_param_fn(w: impl Wham) {} diff --git a/tests/rustdoc-json/fns/pattern_arg.rs b/tests/rustdoc-json/fns/pattern_arg.rs index 32b7da0fae4e2..55f24797ac0dc 100644 --- a/tests/rustdoc-json/fns/pattern_arg.rs +++ b/tests/rustdoc-json/fns/pattern_arg.rs @@ -1,7 +1,7 @@ -// @is "$.index[*][?(@.name=='fst')].inner.decl.inputs[0][0]" '"(x, _)"' +// @is "$.index[*][?(@.name=='fst')].inner.function.decl.inputs[0][0]" '"(x, _)"' pub fn fst((x, _): (X, Y)) -> X { x } -// @is "$.index[*][?(@.name=='drop_int')].inner.decl.inputs[0][0]" '"_"' +// @is "$.index[*][?(@.name=='drop_int')].inner.function.decl.inputs[0][0]" '"_"' pub fn drop_int(_: i32) {} diff --git a/tests/rustdoc-json/fns/qualifiers.rs b/tests/rustdoc-json/fns/qualifiers.rs index 7ff542900423b..643865a3f07f1 100644 --- a/tests/rustdoc-json/fns/qualifiers.rs +++ b/tests/rustdoc-json/fns/qualifiers.rs @@ -1,33 +1,33 @@ // edition:2018 -// @is "$.index[*][?(@.name=='nothing_fn')].inner.header.async" false -// @is "$.index[*][?(@.name=='nothing_fn')].inner.header.const" false -// @is "$.index[*][?(@.name=='nothing_fn')].inner.header.unsafe" false +// @is "$.index[*][?(@.name=='nothing_fn')].inner.function.header.async" false +// @is "$.index[*][?(@.name=='nothing_fn')].inner.function.header.const" false +// @is "$.index[*][?(@.name=='nothing_fn')].inner.function.header.unsafe" false pub fn nothing_fn() {} -// @is "$.index[*][?(@.name=='unsafe_fn')].inner.header.async" false -// @is "$.index[*][?(@.name=='unsafe_fn')].inner.header.const" false -// @is "$.index[*][?(@.name=='unsafe_fn')].inner.header.unsafe" true +// @is "$.index[*][?(@.name=='unsafe_fn')].inner.function.header.async" false +// @is "$.index[*][?(@.name=='unsafe_fn')].inner.function.header.const" false +// @is "$.index[*][?(@.name=='unsafe_fn')].inner.function.header.unsafe" true pub unsafe fn unsafe_fn() {} -// @is "$.index[*][?(@.name=='const_fn')].inner.header.async" false -// @is "$.index[*][?(@.name=='const_fn')].inner.header.const" true -// @is "$.index[*][?(@.name=='const_fn')].inner.header.unsafe" false +// @is "$.index[*][?(@.name=='const_fn')].inner.function.header.async" false +// @is "$.index[*][?(@.name=='const_fn')].inner.function.header.const" true +// @is "$.index[*][?(@.name=='const_fn')].inner.function.header.unsafe" false pub const fn const_fn() {} -// @is "$.index[*][?(@.name=='async_fn')].inner.header.async" true -// @is "$.index[*][?(@.name=='async_fn')].inner.header.const" false -// @is "$.index[*][?(@.name=='async_fn')].inner.header.unsafe" false +// @is "$.index[*][?(@.name=='async_fn')].inner.function.header.async" true +// @is "$.index[*][?(@.name=='async_fn')].inner.function.header.const" false +// @is "$.index[*][?(@.name=='async_fn')].inner.function.header.unsafe" false pub async fn async_fn() {} -// @is "$.index[*][?(@.name=='async_unsafe_fn')].inner.header.async" true -// @is "$.index[*][?(@.name=='async_unsafe_fn')].inner.header.const" false -// @is "$.index[*][?(@.name=='async_unsafe_fn')].inner.header.unsafe" true +// @is "$.index[*][?(@.name=='async_unsafe_fn')].inner.function.header.async" true +// @is "$.index[*][?(@.name=='async_unsafe_fn')].inner.function.header.const" false +// @is "$.index[*][?(@.name=='async_unsafe_fn')].inner.function.header.unsafe" true pub async unsafe fn async_unsafe_fn() {} -// @is "$.index[*][?(@.name=='const_unsafe_fn')].inner.header.async" false -// @is "$.index[*][?(@.name=='const_unsafe_fn')].inner.header.const" true -// @is "$.index[*][?(@.name=='const_unsafe_fn')].inner.header.unsafe" true +// @is "$.index[*][?(@.name=='const_unsafe_fn')].inner.function.header.async" false +// @is "$.index[*][?(@.name=='const_unsafe_fn')].inner.function.header.const" true +// @is "$.index[*][?(@.name=='const_unsafe_fn')].inner.function.header.unsafe" true pub const unsafe fn const_unsafe_fn() {} // It's impossible for a function to be both const and async, so no test for that diff --git a/tests/rustdoc-json/fns/return_type_alias.rs b/tests/rustdoc-json/fns/return_type_alias.rs index 2578bb49ad339..e8a7dce8b0aac 100644 --- a/tests/rustdoc-json/fns/return_type_alias.rs +++ b/tests/rustdoc-json/fns/return_type_alias.rs @@ -3,8 +3,7 @@ /// @set foo = "$.index[*][?(@.name=='Foo')].id" pub type Foo = i32; -// @is "$.index[*][?(@.name=='demo')].inner.decl.output.kind" '"resolved_path"' -// @is "$.index[*][?(@.name=='demo')].inner.decl.output.inner.id" $foo +// @is "$.index[*][?(@.name=='demo')].inner.function.decl.output.resolved_path.id" $foo pub fn demo() -> Foo { 42 } diff --git a/tests/rustdoc-json/generic-associated-types/gats.rs b/tests/rustdoc-json/generic-associated-types/gats.rs index e5809783aecac..99c57ff654093 100644 --- a/tests/rustdoc-json/generic-associated-types/gats.rs +++ b/tests/rustdoc-json/generic-associated-types/gats.rs @@ -9,34 +9,32 @@ pub trait Sized {} pub trait Display {} pub trait LendingIterator { - // @count "$.index[*][?(@.name=='LendingItem')].inner.generics.params[*]" 1 - // @is "$.index[*][?(@.name=='LendingItem')].inner.generics.params[*].name" \"\'a\" - // @count "$.index[*][?(@.name=='LendingItem')].inner.generics.where_predicates[*]" 1 - // @is "$.index[*][?(@.name=='LendingItem')].inner.generics.where_predicates[*].bound_predicate.type.inner" \"Self\" - // @is "$.index[*][?(@.name=='LendingItem')].inner.generics.where_predicates[*].bound_predicate.bounds[*].outlives" \"\'a\" - // @count "$.index[*][?(@.name=='LendingItem')].inner.bounds[*]" 1 + // @count "$.index[*][?(@.name=='LendingItem')].inner.assoc_type.generics.params[*]" 1 + // @is "$.index[*][?(@.name=='LendingItem')].inner.assoc_type.generics.params[*].name" \"\'a\" + // @count "$.index[*][?(@.name=='LendingItem')].inner.assoc_type.generics.where_predicates[*]" 1 + // @is "$.index[*][?(@.name=='LendingItem')].inner.assoc_type.generics.where_predicates[*].bound_predicate.type.generic" \"Self\" + // @is "$.index[*][?(@.name=='LendingItem')].inner.assoc_type.generics.where_predicates[*].bound_predicate.bounds[*].outlives" \"\'a\" + // @count "$.index[*][?(@.name=='LendingItem')].inner.assoc_type.bounds[*]" 1 type LendingItem<'a>: Display where Self: 'a; - // @is "$.index[*][?(@.name=='lending_next')].inner.decl.output.kind" \"qualified_path\" - // @count "$.index[*][?(@.name=='lending_next')].inner.decl.output.inner.args.angle_bracketed.args[*]" 1 - // @count "$.index[*][?(@.name=='lending_next')].inner.decl.output.inner.args.angle_bracketed.bindings[*]" 0 - // @is "$.index[*][?(@.name=='lending_next')].inner.decl.output.inner.self_type.inner" \"Self\" - // @is "$.index[*][?(@.name=='lending_next')].inner.decl.output.inner.name" \"LendingItem\" + // @count "$.index[*][?(@.name=='lending_next')].inner.function.decl.output.qualified_path.args.angle_bracketed.args[*]" 1 + // @count "$.index[*][?(@.name=='lending_next')].inner.function.decl.output.qualified_path.args.angle_bracketed.bindings[*]" 0 + // @is "$.index[*][?(@.name=='lending_next')].inner.function.decl.output.qualified_path.self_type.generic" \"Self\" + // @is "$.index[*][?(@.name=='lending_next')].inner.function.decl.output.qualified_path.name" \"LendingItem\" fn lending_next<'a>(&'a self) -> Self::LendingItem<'a>; } pub trait Iterator { - // @count "$.index[*][?(@.name=='Item')].inner.generics.params[*]" 0 - // @count "$.index[*][?(@.name=='Item')].inner.generics.where_predicates[*]" 0 - // @count "$.index[*][?(@.name=='Item')].inner.bounds[*]" 1 + // @count "$.index[*][?(@.name=='Item')].inner.assoc_type.generics.params[*]" 0 + // @count "$.index[*][?(@.name=='Item')].inner.assoc_type.generics.where_predicates[*]" 0 + // @count "$.index[*][?(@.name=='Item')].inner.assoc_type.bounds[*]" 1 type Item: Display; - // @is "$.index[*][?(@.name=='next')].inner.decl.output.kind" \"qualified_path\" - // @count "$.index[*][?(@.name=='next')].inner.decl.output.inner.args.angle_bracketed.args[*]" 0 - // @count "$.index[*][?(@.name=='next')].inner.decl.output.inner.args.angle_bracketed.bindings[*]" 0 - // @is "$.index[*][?(@.name=='next')].inner.decl.output.inner.self_type.inner" \"Self\" - // @is "$.index[*][?(@.name=='next')].inner.decl.output.inner.name" \"Item\" + // @count "$.index[*][?(@.name=='next')].inner.function.decl.output.qualified_path.args.angle_bracketed.args[*]" 0 + // @count "$.index[*][?(@.name=='next')].inner.function.decl.output.qualified_path.args.angle_bracketed.bindings[*]" 0 + // @is "$.index[*][?(@.name=='next')].inner.function.decl.output.qualified_path.self_type.generic" \"Self\" + // @is "$.index[*][?(@.name=='next')].inner.function.decl.output.qualified_path.name" \"Item\" fn next<'a>(&'a self) -> Self::Item; } diff --git a/tests/rustdoc-json/glob_import.rs b/tests/rustdoc-json/glob_import.rs index 00051b1219974..f37ce0abb4144 100644 --- a/tests/rustdoc-json/glob_import.rs +++ b/tests/rustdoc-json/glob_import.rs @@ -5,7 +5,7 @@ #![no_core] // @has "$.index[*][?(@.name=='glob')]" -// @has "$.index[*][?(@.kind=='import')].inner.name" \"*\" +// @has "$.index[*][?(@.inner.import)].inner.import.name" \"*\" mod m1 { diff --git a/tests/rustdoc-json/impls/auto.rs b/tests/rustdoc-json/impls/auto.rs index 50d8524142730..ace37e5b3dfe3 100644 --- a/tests/rustdoc-json/impls/auto.rs +++ b/tests/rustdoc-json/impls/auto.rs @@ -12,7 +12,8 @@ impl Foo { } // Testing spans, so all tests below code -// @is "$.index[*][?(@.kind=='impl' && @.inner.synthetic==true)].span" null // @is "$.index[*][?(@.docs=='has span')].span.begin" "[10, 0]" // @is "$.index[*][?(@.docs=='has span')].span.end" "[12, 1]" +// FIXME: this doesn't work due to https://github.com/freestrings/jsonpath/issues/91 +// is "$.index[*][?(@.inner.impl.synthetic==true)].span" null pub struct Foo; diff --git a/tests/rustdoc-json/impls/foreign_for_local.rs b/tests/rustdoc-json/impls/foreign_for_local.rs index 290c2d571e874..20e1cecd778cd 100644 --- a/tests/rustdoc-json/impls/foreign_for_local.rs +++ b/tests/rustdoc-json/impls/foreign_for_local.rs @@ -3,7 +3,7 @@ extern crate foreign_trait; /// ForeignTrait id hack pub use foreign_trait::ForeignTrait as _; -// @set ForeignTrait = "$.index[*][?(@.docs=='ForeignTrait id hack')].inner.id" +// @set ForeignTrait = "$.index[*][?(@.docs=='ForeignTrait id hack')].inner.import.id" pub struct LocalStruct; // @set LocalStruct = "$.index[*][?(@.name=='LocalStruct')].id" @@ -12,7 +12,7 @@ pub struct LocalStruct; impl foreign_trait::ForeignTrait for LocalStruct {} // @set impl = "$.index[*][?(@.docs=='foreign for local')].id" -// @is "$.index[*][?(@.docs=='foreign for local')].inner.for.inner.id" $LocalStruct -// @is "$.index[*][?(@.docs=='foreign for local')].inner.trait.id" $ForeignTrait +// @is "$.index[*][?(@.docs=='foreign for local')].inner.impl.for.resolved_path.id" $LocalStruct +// @is "$.index[*][?(@.docs=='foreign for local')].inner.impl.trait.id" $ForeignTrait -// @has "$.index[*][?(@.name=='LocalStruct')].inner.impls[*]" $impl +// @has "$.index[*][?(@.name=='LocalStruct')].inner.struct.impls[*]" $impl diff --git a/tests/rustdoc-json/impls/import_from_private.rs b/tests/rustdoc-json/impls/import_from_private.rs index fa88b6113a581..d2b0665dcafac 100644 --- a/tests/rustdoc-json/impls/import_from_private.rs +++ b/tests/rustdoc-json/impls/import_from_private.rs @@ -4,19 +4,19 @@ #![no_core] mod bar { - // @set baz = "$.index[*][?(@.kind=='struct')].id" + // @set baz = "$.index[*][?(@.inner.struct)].id" pub struct Baz; - // @set impl = "$.index[*][?(@.kind=='impl')].id" + // @set impl = "$.index[*][?(@.inner.impl)].id" impl Baz { - // @set doit = "$.index[*][?(@.kind=='function')].id" + // @set doit = "$.index[*][?(@.inner.function)].id" pub fn doit() {} } } -// @set import = "$.index[*][?(@.kind=='import')].id" +// @set import = "$.index[*][?(@.inner.import)].id" pub use bar::Baz; -// @is "$.index[*][?(@.kind=='module')].inner.items[*]" $import -// @is "$.index[*][?(@.kind=='import')].inner.id" $baz -// @is "$.index[*][?(@.kind=='struct')].inner.impls[*]" $impl -// @is "$.index[*][?(@.kind=='impl')].inner.items[*]" $doit +// @is "$.index[*].inner.module.items[*]" $import +// @is "$.index[*].inner.import.id" $baz +// @is "$.index[*].inner.struct.impls[*]" $impl +// @is "$.index[*].inner.impl.items[*]" $doit diff --git a/tests/rustdoc-json/impls/local_for_foreign.rs b/tests/rustdoc-json/impls/local_for_foreign.rs index 74f2f08b5a42f..72352ce88da02 100644 --- a/tests/rustdoc-json/impls/local_for_foreign.rs +++ b/tests/rustdoc-json/impls/local_for_foreign.rs @@ -3,7 +3,7 @@ extern crate foreign_struct; /// ForeignStruct id hack pub use foreign_struct::ForeignStruct as _; -// @set ForeignStruct = "$.index[*][?(@.docs=='ForeignStruct id hack')].inner.id" +// @set ForeignStruct = "$.index[*][?(@.docs=='ForeignStruct id hack')].inner.import.id" pub trait LocalTrait {} // @set LocalTrait = "$.index[*][?(@.name=='LocalTrait')].id" @@ -12,7 +12,7 @@ pub trait LocalTrait {} impl LocalTrait for foreign_struct::ForeignStruct {} // @set impl = "$.index[*][?(@.docs=='local for foreign')].id" -// @is "$.index[*][?(@.docs=='local for foreign')].inner.trait.id" $LocalTrait -// @is "$.index[*][?(@.docs=='local for foreign')].inner.for.inner.id" $ForeignStruct +// @is "$.index[*][?(@.docs=='local for foreign')].inner.impl.trait.id" $LocalTrait +// @is "$.index[*][?(@.docs=='local for foreign')].inner.impl.for.resolved_path.id" $ForeignStruct -// @is "$.index[*][?(@.name=='LocalTrait')].inner.implementations[*]" $impl +// @is "$.index[*][?(@.name=='LocalTrait')].inner.trait.implementations[*]" $impl diff --git a/tests/rustdoc-json/impls/local_for_local.rs b/tests/rustdoc-json/impls/local_for_local.rs index 93dedb7ec92d2..37a720003295a 100644 --- a/tests/rustdoc-json/impls/local_for_local.rs +++ b/tests/rustdoc-json/impls/local_for_local.rs @@ -9,7 +9,7 @@ pub trait Trait {} /// impl impl Trait for Struct {} -// @is "$.index[*][?(@.name=='Struct')].inner.impls[*]" $impl -// @is "$.index[*][?(@.name=='Trait')].inner.implementations[*]" $impl -// @is "$.index[*][?(@.docs=='impl')].inner.trait.id" $trait -// @is "$.index[*][?(@.docs=='impl')].inner.for.inner.id" $struct +// @is "$.index[*][?(@.name=='Struct')].inner.struct.impls[*]" $impl +// @is "$.index[*][?(@.name=='Trait')].inner.trait.implementations[*]" $impl +// @is "$.index[*][?(@.docs=='impl')].inner.impl.trait.id" $trait +// @is "$.index[*][?(@.docs=='impl')].inner.impl.for.resolved_path.id" $struct diff --git a/tests/rustdoc-json/impls/local_for_local_primitive.rs b/tests/rustdoc-json/impls/local_for_local_primitive.rs index 8383dcc0482ea..769dd3f0a2c02 100644 --- a/tests/rustdoc-json/impls/local_for_local_primitive.rs +++ b/tests/rustdoc-json/impls/local_for_local_primitive.rs @@ -5,14 +5,13 @@ // @set Local = "$.index[*][?(@.name=='Local')].id" pub trait Local {} -// @is "$.index[*][?(@.docs=='Local for bool')].inner.trait.id" $Local -// @is "$.index[*][?(@.docs=='Local for bool')].inner.for.kind" '"primitive"' -// @is "$.index[*][?(@.docs=='Local for bool')].inner.for.inner" '"bool"' +// @is "$.index[*][?(@.docs=='Local for bool')].inner.impl.trait.id" $Local +// @is "$.index[*][?(@.docs=='Local for bool')].inner.impl.for.primitive" '"bool"' /// Local for bool impl Local for bool {} // @set impl = "$.index[*][?(@.docs=='Local for bool')].id" -// @is "$.index[*][?(@.name=='Local')].inner.implementations[*]" $impl +// @is "$.index[*][?(@.name=='Local')].inner.trait.implementations[*]" $impl // FIXME(#101695): Test bool's `impls` include "Local for bool" // @has "$.index[*][?(@.name=='bool')]" diff --git a/tests/rustdoc-json/impls/local_for_primitive.rs b/tests/rustdoc-json/impls/local_for_primitive.rs index 7702a526fd844..85278c0e08c80 100644 --- a/tests/rustdoc-json/impls/local_for_primitive.rs +++ b/tests/rustdoc-json/impls/local_for_primitive.rs @@ -2,6 +2,6 @@ pub trait Local {} // @set impl = "$.index[*][?(@.docs=='local for bool')].id" -// @is "$.index[*][?(@.name=='Local')].inner.implementations[*]" $impl +// @is "$.index[*][?(@.name=='Local')].inner.trait.implementations[*]" $impl /// local for bool impl Local for bool {} diff --git a/tests/rustdoc-json/lifetime/longest.rs b/tests/rustdoc-json/lifetime/longest.rs index 326dab8e57ace..dc28258a8b674 100644 --- a/tests/rustdoc-json/lifetime/longest.rs +++ b/tests/rustdoc-json/lifetime/longest.rs @@ -3,30 +3,27 @@ #![feature(no_core)] #![no_core] -// @is "$.index[*][?(@.name=='longest')].inner.generics.params[0].name" \"\'a\" -// @is "$.index[*][?(@.name=='longest')].inner.generics.params[0].kind" '{"lifetime": {"outlives": []}}' -// @is "$.index[*][?(@.name=='longest')].inner.generics.params[0].kind" '{"lifetime": {"outlives": []}}' -// @count "$.index[*][?(@.name=='longest')].inner.generics.params[*]" 1 -// @is "$.index[*][?(@.name=='longest')].inner.generics.where_predicates" [] +// @is "$.index[*][?(@.name=='longest')].inner.function.generics.params[0].name" \"\'a\" +// @is "$.index[*][?(@.name=='longest')].inner.function.generics.params[0].kind" '{"lifetime": {"outlives": []}}' +// @is "$.index[*][?(@.name=='longest')].inner.function.generics.params[0].kind" '{"lifetime": {"outlives": []}}' +// @count "$.index[*][?(@.name=='longest')].inner.function.generics.params[*]" 1 +// @is "$.index[*][?(@.name=='longest')].inner.function.generics.where_predicates" [] -// @count "$.index[*][?(@.name=='longest')].inner.decl.inputs[*]" 2 -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[0][0]" '"l"' -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[1][0]" '"r"' +// @count "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[*]" 2 +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[0][0]" '"l"' +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[1][0]" '"r"' -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[0][1].kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[0][1].inner.lifetime" \"\'a\" -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[0][1].inner.mutable" false -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[0][1].inner.type" '{"inner": "str", "kind": "primitive"}' +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[0][1].borrowed_ref.lifetime" \"\'a\" +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[0][1].borrowed_ref.mutable" false +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[0][1].borrowed_ref.type.primitive" \"str\" -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[1][1].kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[1][1].inner.lifetime" \"\'a\" -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[1][1].inner.mutable" false -// @is "$.index[*][?(@.name=='longest')].inner.decl.inputs[1][1].inner.type" '{"inner": "str", "kind": "primitive"}' +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[1][1].borrowed_ref.lifetime" \"\'a\" +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[1][1].borrowed_ref.mutable" false +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.inputs[1][1].borrowed_ref.type.primitive" \"str\" -// @is "$.index[*][?(@.name=='longest')].inner.decl.output.kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='longest')].inner.decl.output.inner.lifetime" \"\'a\" -// @is "$.index[*][?(@.name=='longest')].inner.decl.output.inner.mutable" false -// @is "$.index[*][?(@.name=='longest')].inner.decl.output.inner.type" '{"inner": "str", "kind": "primitive"}' +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.output.borrowed_ref.lifetime" \"\'a\" +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.output.borrowed_ref.mutable" false +// @is "$.index[*][?(@.name=='longest')].inner.function.decl.output.borrowed_ref.type.primitive" \"str\" pub fn longest<'a>(l: &'a str, r: &'a str) -> &'a str { if l.len() > r.len() { l } else { r } diff --git a/tests/rustdoc-json/lifetime/outlives.rs b/tests/rustdoc-json/lifetime/outlives.rs index e15a533efdc03..6e105b382b001 100644 --- a/tests/rustdoc-json/lifetime/outlives.rs +++ b/tests/rustdoc-json/lifetime/outlives.rs @@ -3,21 +3,19 @@ #![feature(no_core)] #![no_core] -// @count "$.index[*][?(@.name=='foo')].inner.generics.params[*]" 3 -// @is "$.index[*][?(@.name=='foo')].inner.generics.where_predicates" [] -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[0].name" \"\'a\" -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[1].name" \"\'b\" -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[2].name" '"T"' -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[0].kind.lifetime.outlives" [] -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[1].kind.lifetime.outlives" [\"\'a\"] -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[2].kind.type.default" null -// @count "$.index[*][?(@.name=='foo')].inner.generics.params[2].kind.type.bounds[*]" 1 -// @is "$.index[*][?(@.name=='foo')].inner.generics.params[2].kind.type.bounds[0].outlives" \"\'b\" -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].inner.lifetime" \"\'a\" -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].inner.mutable" false -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].inner.type.kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].inner.type.inner.lifetime" \"\'b\" -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].inner.type.inner.mutable" false -// @is "$.index[*][?(@.name=='foo')].inner.decl.inputs[0][1].inner.type.inner.type" '{"inner": "T", "kind": "generic"}' +// @count "$.index[*][?(@.name=='foo')].inner.function.generics.params[*]" 3 +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.where_predicates" [] +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[0].name" \"\'a\" +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[1].name" \"\'b\" +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[2].name" '"T"' +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[0].kind.lifetime.outlives" [] +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[1].kind.lifetime.outlives" [\"\'a\"] +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[2].kind.type.default" null +// @count "$.index[*][?(@.name=='foo')].inner.function.generics.params[2].kind.type.bounds[*]" 1 +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.params[2].kind.type.bounds[0].outlives" \"\'b\" +// @is "$.index[*][?(@.name=='foo')].inner.function.decl.inputs[0][1].borrowed_ref.lifetime" \"\'a\" +// @is "$.index[*][?(@.name=='foo')].inner.function.decl.inputs[0][1].borrowed_ref.mutable" false +// @is "$.index[*][?(@.name=='foo')].inner.function.decl.inputs[0][1].borrowed_ref.type.borrowed_ref.lifetime" \"\'b\" +// @is "$.index[*][?(@.name=='foo')].inner.function.decl.inputs[0][1].borrowed_ref.type.borrowed_ref.mutable" false +// @is "$.index[*][?(@.name=='foo')].inner.function.decl.inputs[0][1].borrowed_ref.type.borrowed_ref.type.generic" \"T\" pub fn foo<'a, 'b: 'a, T: 'b>(_: &'a &'b T) {} diff --git a/tests/rustdoc-json/methods/abi.rs b/tests/rustdoc-json/methods/abi.rs index fd03d92d65b97..b8279298c1e71 100644 --- a/tests/rustdoc-json/methods/abi.rs +++ b/tests/rustdoc-json/methods/abi.rs @@ -8,47 +8,47 @@ pub struct Foo; impl Foo { - // @is "$.index[*][?(@.name=='abi_rust')].inner.header.abi" \"Rust\" + // @is "$.index[*][?(@.name=='abi_rust')].inner.function.header.abi" \"Rust\" pub fn abi_rust() {} - // @is "$.index[*][?(@.name=='abi_c')].inner.header.abi" '{"C": {"unwind": false}}' + // @is "$.index[*][?(@.name=='abi_c')].inner.function.header.abi" '{"C": {"unwind": false}}' pub extern "C" fn abi_c() {} - // @is "$.index[*][?(@.name=='abi_system')].inner.header.abi" '{"System": {"unwind": false}}' + // @is "$.index[*][?(@.name=='abi_system')].inner.function.header.abi" '{"System": {"unwind": false}}' pub extern "system" fn abi_system() {} - // @is "$.index[*][?(@.name=='abi_c_unwind')].inner.header.abi" '{"C": {"unwind": true}}' + // @is "$.index[*][?(@.name=='abi_c_unwind')].inner.function.header.abi" '{"C": {"unwind": true}}' pub extern "C-unwind" fn abi_c_unwind() {} - // @is "$.index[*][?(@.name=='abi_system_unwind')].inner.header.abi" '{"System": {"unwind": true}}' + // @is "$.index[*][?(@.name=='abi_system_unwind')].inner.function.header.abi" '{"System": {"unwind": true}}' pub extern "system-unwind" fn abi_system_unwind() {} - // @is "$.index[*][?(@.name=='abi_vectorcall')].inner.header.abi.Other" '"\"vectorcall\""' + // @is "$.index[*][?(@.name=='abi_vectorcall')].inner.function.header.abi.Other" '"\"vectorcall\""' pub extern "vectorcall" fn abi_vectorcall() {} - // @is "$.index[*][?(@.name=='abi_vectorcall_unwind')].inner.header.abi.Other" '"\"vectorcall-unwind\""' + // @is "$.index[*][?(@.name=='abi_vectorcall_unwind')].inner.function.header.abi.Other" '"\"vectorcall-unwind\""' pub extern "vectorcall-unwind" fn abi_vectorcall_unwind() {} } pub trait Bar { - // @is "$.index[*][?(@.name=='trait_abi_rust')].inner.header.abi" \"Rust\" + // @is "$.index[*][?(@.name=='trait_abi_rust')].inner.function.header.abi" \"Rust\" fn trait_abi_rust() {} - // @is "$.index[*][?(@.name=='trait_abi_c')].inner.header.abi" '{"C": {"unwind": false}}' + // @is "$.index[*][?(@.name=='trait_abi_c')].inner.function.header.abi" '{"C": {"unwind": false}}' extern "C" fn trait_abi_c() {} - // @is "$.index[*][?(@.name=='trait_abi_system')].inner.header.abi" '{"System": {"unwind": false}}' + // @is "$.index[*][?(@.name=='trait_abi_system')].inner.function.header.abi" '{"System": {"unwind": false}}' extern "system" fn trait_abi_system() {} - // @is "$.index[*][?(@.name=='trait_abi_c_unwind')].inner.header.abi" '{"C": {"unwind": true}}' + // @is "$.index[*][?(@.name=='trait_abi_c_unwind')].inner.function.header.abi" '{"C": {"unwind": true}}' extern "C-unwind" fn trait_abi_c_unwind() {} - // @is "$.index[*][?(@.name=='trait_abi_system_unwind')].inner.header.abi" '{"System": {"unwind": true}}' + // @is "$.index[*][?(@.name=='trait_abi_system_unwind')].inner.function.header.abi" '{"System": {"unwind": true}}' extern "system-unwind" fn trait_abi_system_unwind() {} - // @is "$.index[*][?(@.name=='trait_abi_vectorcall')].inner.header.abi.Other" '"\"vectorcall\""' + // @is "$.index[*][?(@.name=='trait_abi_vectorcall')].inner.function.header.abi.Other" '"\"vectorcall\""' extern "vectorcall" fn trait_abi_vectorcall() {} - // @is "$.index[*][?(@.name=='trait_abi_vectorcall_unwind')].inner.header.abi.Other" '"\"vectorcall-unwind\""' + // @is "$.index[*][?(@.name=='trait_abi_vectorcall_unwind')].inner.function.header.abi.Other" '"\"vectorcall-unwind\""' extern "vectorcall-unwind" fn trait_abi_vectorcall_unwind() {} } diff --git a/tests/rustdoc-json/methods/qualifiers.rs b/tests/rustdoc-json/methods/qualifiers.rs index b9a5e56012e3a..65977bc826fe9 100644 --- a/tests/rustdoc-json/methods/qualifiers.rs +++ b/tests/rustdoc-json/methods/qualifiers.rs @@ -3,34 +3,34 @@ pub struct Foo; impl Foo { - // @is "$.index[*][?(@.name=='const_meth')].inner.header.async" false - // @is "$.index[*][?(@.name=='const_meth')].inner.header.const" true - // @is "$.index[*][?(@.name=='const_meth')].inner.header.unsafe" false + // @is "$.index[*][?(@.name=='const_meth')].inner.function.header.async" false + // @is "$.index[*][?(@.name=='const_meth')].inner.function.header.const" true + // @is "$.index[*][?(@.name=='const_meth')].inner.function.header.unsafe" false pub const fn const_meth() {} - // @is "$.index[*][?(@.name=='nothing_meth')].inner.header.async" false - // @is "$.index[*][?(@.name=='nothing_meth')].inner.header.const" false - // @is "$.index[*][?(@.name=='nothing_meth')].inner.header.unsafe" false + // @is "$.index[*][?(@.name=='nothing_meth')].inner.function.header.async" false + // @is "$.index[*][?(@.name=='nothing_meth')].inner.function.header.const" false + // @is "$.index[*][?(@.name=='nothing_meth')].inner.function.header.unsafe" false pub fn nothing_meth() {} - // @is "$.index[*][?(@.name=='unsafe_meth')].inner.header.async" false - // @is "$.index[*][?(@.name=='unsafe_meth')].inner.header.const" false - // @is "$.index[*][?(@.name=='unsafe_meth')].inner.header.unsafe" true + // @is "$.index[*][?(@.name=='unsafe_meth')].inner.function.header.async" false + // @is "$.index[*][?(@.name=='unsafe_meth')].inner.function.header.const" false + // @is "$.index[*][?(@.name=='unsafe_meth')].inner.function.header.unsafe" true pub unsafe fn unsafe_meth() {} - // @is "$.index[*][?(@.name=='async_meth')].inner.header.async" true - // @is "$.index[*][?(@.name=='async_meth')].inner.header.const" false - // @is "$.index[*][?(@.name=='async_meth')].inner.header.unsafe" false + // @is "$.index[*][?(@.name=='async_meth')].inner.function.header.async" true + // @is "$.index[*][?(@.name=='async_meth')].inner.function.header.const" false + // @is "$.index[*][?(@.name=='async_meth')].inner.function.header.unsafe" false pub async fn async_meth() {} - // @is "$.index[*][?(@.name=='async_unsafe_meth')].inner.header.async" true - // @is "$.index[*][?(@.name=='async_unsafe_meth')].inner.header.const" false - // @is "$.index[*][?(@.name=='async_unsafe_meth')].inner.header.unsafe" true + // @is "$.index[*][?(@.name=='async_unsafe_meth')].inner.function.header.async" true + // @is "$.index[*][?(@.name=='async_unsafe_meth')].inner.function.header.const" false + // @is "$.index[*][?(@.name=='async_unsafe_meth')].inner.function.header.unsafe" true pub async unsafe fn async_unsafe_meth() {} - // @is "$.index[*][?(@.name=='const_unsafe_meth')].inner.header.async" false - // @is "$.index[*][?(@.name=='const_unsafe_meth')].inner.header.const" true - // @is "$.index[*][?(@.name=='const_unsafe_meth')].inner.header.unsafe" true + // @is "$.index[*][?(@.name=='const_unsafe_meth')].inner.function.header.async" false + // @is "$.index[*][?(@.name=='const_unsafe_meth')].inner.function.header.const" true + // @is "$.index[*][?(@.name=='const_unsafe_meth')].inner.function.header.unsafe" true pub const unsafe fn const_unsafe_meth() {} // It's impossible for a method to be both const and async, so no test for that diff --git a/tests/rustdoc-json/nested.rs b/tests/rustdoc-json/nested.rs index ee2d2efa960e8..e012cfc5014ca 100644 --- a/tests/rustdoc-json/nested.rs +++ b/tests/rustdoc-json/nested.rs @@ -2,30 +2,31 @@ // compile-flags: --crate-version 1.0.0 // @is "$.crate_version" \"1.0.0\" -// @is "$.index[*][?(@.name=='nested')].kind" \"module\" -// @is "$.index[*][?(@.name=='nested')].inner.is_crate" true +// @has "$.index[*][?(@.name=='nested')].inner.module" +// @is "$.index[*][?(@.name=='nested')].inner.module.is_crate" true // @set l1_id = "$.index[*][?(@.name=='l1')].id" -// @ismany "$.index[*][?(@.name=='nested')].inner.items[*]" $l1_id +// @ismany "$.index[*][?(@.name=='nested')].inner.module.items[*]" $l1_id -// @is "$.index[*][?(@.name=='l1')].kind" \"module\" -// @is "$.index[*][?(@.name=='l1')].inner.is_crate" false +// @has "$.index[*][?(@.name=='l1')].inner.module" +// @is "$.index[*][?(@.name=='l1')].inner.module.is_crate" false pub mod l1 { - // @is "$.index[*][?(@.name=='l3')].kind" \"module\" - // @is "$.index[*][?(@.name=='l3')].inner.is_crate" false + // @has "$.index[*][?(@.name=='l3')].inner.module" + // @is "$.index[*][?(@.name=='l3')].inner.module.is_crate" false // @set l3_id = "$.index[*][?(@.name=='l3')].id" pub mod l3 { - // @is "$.index[*][?(@.name=='L4')].kind" \"struct\" - // @is "$.index[*][?(@.name=='L4')].inner.kind" \"unit\" + // @has "$.index[*][?(@.name=='L4')].inner.struct" + // @is "$.index[*][?(@.name=='L4')].inner.struct.kind" '"unit"' // @set l4_id = "$.index[*][?(@.name=='L4')].id" - // @ismany "$.index[*][?(@.name=='l3')].inner.items[*]" $l4_id + // @ismany "$.index[*][?(@.name=='l3')].inner.module.items[*]" $l4_id pub struct L4; } - // @is "$.index[*][?(@.inner.source=='l3::L4')].kind" \"import\" - // @is "$.index[*][?(@.inner.source=='l3::L4')].inner.glob" false - // @is "$.index[*][?(@.inner.source=='l3::L4')].inner.id" $l4_id - // @set l4_use_id = "$.index[*][?(@.inner.source=='l3::L4')].id" + // @is "$.index[*][?(@.inner.import)].inner.import.glob" false + // @is "$.index[*][?(@.inner.import)].inner.import.source" '"l3::L4"' + // @is "$.index[*][?(@.inner.import)].inner.import.glob" false + // @is "$.index[*][?(@.inner.import)].inner.import.id" $l4_id + // @set l4_use_id = "$.index[*][?(@.inner.import)].id" pub use l3::L4; } -// @ismany "$.index[*][?(@.name=='l1')].inner.items[*]" $l3_id $l4_use_id +// @ismany "$.index[*][?(@.name=='l1')].inner.module.items[*]" $l3_id $l4_use_id diff --git a/tests/rustdoc-json/non_lifetime_binders.rs b/tests/rustdoc-json/non_lifetime_binders.rs index ca5a008344af2..cabee0b1caa5a 100644 --- a/tests/rustdoc-json/non_lifetime_binders.rs +++ b/tests/rustdoc-json/non_lifetime_binders.rs @@ -16,9 +16,9 @@ struct PhantomData; pub struct Wrapper(PhantomData); -// @count "$.index[*][?(@.name=='foo')].inner.generics.where_predicates[0].bound_predicate.generic_params[*]" 2 -// @is "$.index[*][?(@.name=='foo')].inner.generics.where_predicates[0].bound_predicate.generic_params[0].name" \"\'a\" -// @is "$.index[*][?(@.name=='foo')].inner.generics.where_predicates[0].bound_predicate.generic_params[0].kind" '{ "lifetime": { "outlives": [] } }' -// @is "$.index[*][?(@.name=='foo')].inner.generics.where_predicates[0].bound_predicate.generic_params[1].name" \"T\" -// @is "$.index[*][?(@.name=='foo')].inner.generics.where_predicates[0].bound_predicate.generic_params[1].kind" '{ "type": { "bounds": [], "default": null, "synthetic": false } }' +// @count "$.index[*][?(@.name=='foo')].inner.function.generics.where_predicates[0].bound_predicate.generic_params[*]" 2 +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.where_predicates[0].bound_predicate.generic_params[0].name" \"\'a\" +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.where_predicates[0].bound_predicate.generic_params[0].kind" '{ "lifetime": { "outlives": [] } }' +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.where_predicates[0].bound_predicate.generic_params[1].name" \"T\" +// @is "$.index[*][?(@.name=='foo')].inner.function.generics.where_predicates[0].bound_predicate.generic_params[1].kind" '{ "type": { "bounds": [], "default": null, "synthetic": false } }' pub fn foo() where for<'a, T> &'a Wrapper: Trait {} diff --git a/tests/rustdoc-json/primitives/local_primitive.rs b/tests/rustdoc-json/primitives/local_primitive.rs index 0cf479faf294c..562c7e4d79bbc 100644 --- a/tests/rustdoc-json/primitives/local_primitive.rs +++ b/tests/rustdoc-json/primitives/local_primitive.rs @@ -14,7 +14,7 @@ mod prim_i32 {} // @set local_i32 = "$.index[*][?(@.name=='i32')].id" // @has "$.index[*][?(@.name=='local_primitive')]" -// @ismany "$.index[*][?(@.name=='local_primitive')].inner.items[*]" $local_i32 +// @ismany "$.index[*][?(@.name=='local_primitive')].inner.module.items[*]" $local_i32 // @is "$.index[*][?(@.name=='local_primitive')].links['prim@i32']" $local_i32 // Let's ensure the `prim_i32` module isn't present in the output JSON: diff --git a/tests/rustdoc-json/primitives/primitive_impls.rs b/tests/rustdoc-json/primitives/primitive_impls.rs index 85d179ee45f36..4b7b7646b8930 100644 --- a/tests/rustdoc-json/primitives/primitive_impls.rs +++ b/tests/rustdoc-json/primitives/primitive_impls.rs @@ -15,7 +15,7 @@ impl i32 { self } - // @is "$.index[*][?(@.docs=='Only core can do this')].inner.items[*]" $identity + // @is "$.index[*][?(@.docs=='Only core can do this')].inner.impl.items[*]" $identity } // @set Trait = "$.index[*][?(@.name=='Trait')].id" @@ -30,5 +30,5 @@ mod prim_i32 {} // @set i32 = "$.index[*][?(@.docs=='i32')].id" // @is "$.index[*][?(@.docs=='i32')].name" '"i32"' -// @is "$.index[*][?(@.docs=='i32')].inner.name" '"i32"' -// @ismany "$.index[*][?(@.docs=='i32')].inner.impls[*]" $impl_i32 $impl_trait_for_i32 +// @is "$.index[*][?(@.docs=='i32')].inner.primitive.name" '"i32"' +// @ismany "$.index[*][?(@.docs=='i32')].inner.primitive.impls[*]" $impl_i32 $impl_trait_for_i32 diff --git a/tests/rustdoc-json/primitives/primitive_type.rs b/tests/rustdoc-json/primitives/primitive_type.rs index 8024044bc05ab..5f251b3b89010 100644 --- a/tests/rustdoc-json/primitives/primitive_type.rs +++ b/tests/rustdoc-json/primitives/primitive_type.rs @@ -1,22 +1,17 @@ #![feature(never_type)] // @is "$.index[*][?(@.name=='PrimNever')].visibility" \"public\" -// @is "$.index[*][?(@.name=='PrimNever')].inner.type.kind" \"primitive\" -// @is "$.index[*][?(@.name=='PrimNever')].inner.type.inner" \"never\" +// @is "$.index[*][?(@.name=='PrimNever')].inner.typedef.type.primitive" \"never\" pub type PrimNever = !; -// @is "$.index[*][?(@.name=='PrimStr')].inner.type.kind" \"primitive\" -// @is "$.index[*][?(@.name=='PrimStr')].inner.type.inner" \"str\" +// @is "$.index[*][?(@.name=='PrimStr')].inner.typedef.type.primitive" \"str\" pub type PrimStr = str; -// @is "$.index[*][?(@.name=='PrimBool')].inner.type.kind" \"primitive\" -// @is "$.index[*][?(@.name=='PrimBool')].inner.type.inner" \"bool\" +// @is "$.index[*][?(@.name=='PrimBool')].inner.typedef.type.primitive" \"bool\" pub type PrimBool = bool; -// @is "$.index[*][?(@.name=='PrimChar')].inner.type.kind" \"primitive\" -// @is "$.index[*][?(@.name=='PrimChar')].inner.type.inner" \"char\" +// @is "$.index[*][?(@.name=='PrimChar')].inner.typedef.type.primitive" \"char\" pub type PrimChar = char; -// @is "$.index[*][?(@.name=='PrimU8')].inner.type.kind" \"primitive\" -// @is "$.index[*][?(@.name=='PrimU8')].inner.type.inner" \"u8\" +// @is "$.index[*][?(@.name=='PrimU8')].inner.typedef.type.primitive" \"u8\" pub type PrimU8 = u8; diff --git a/tests/rustdoc-json/primitives/use_primitive.rs b/tests/rustdoc-json/primitives/use_primitive.rs index 5180a804f07ba..f8118b82094e1 100644 --- a/tests/rustdoc-json/primitives/use_primitive.rs +++ b/tests/rustdoc-json/primitives/use_primitive.rs @@ -13,8 +13,8 @@ mod usize {} // @!is "$.index[*][?(@.name=='checked_add')]" $local_crate_id // @!has "$.index[*][?(@.name=='is_ascii_uppercase')]" -// @is "$.index[*][?(@.kind=='import' && @.inner.name=='my_i32')].inner.id" null +// @is "$.index[*].inner.import[?(@.name=='my_i32')].id" null pub use i32 as my_i32; -// @is "$.index[*][?(@.kind=='import' && @.inner.name=='u32')].inner.id" null +// @is "$.index[*].inner.import[?(@.name=='u32')].id" null pub use u32; diff --git a/tests/rustdoc-json/reexport/doc_inline_external_crate.rs b/tests/rustdoc-json/reexport/doc_inline_external_crate.rs index 40b681d7dbbef..1c5fed8c6b2b7 100644 --- a/tests/rustdoc-json/reexport/doc_inline_external_crate.rs +++ b/tests/rustdoc-json/reexport/doc_inline_external_crate.rs @@ -1,10 +1,11 @@ // Regression Test for https://github.com/rust-lang/rust/issues/110138 // aux-build: enum_with_discriminant.rs +// ignore-tidy-linelength #[doc(inline)] pub extern crate enum_with_discriminant; // @!has '$.index[*][?(@.docs == "Should not be inlined")]' -// @is '$.index[*][?(@.name == "enum_with_discriminant")].kind' '"extern_crate"' +// @has '$.index[*][?(@.name == "enum_with_discriminant")].inner.extern_crate' // @set enum_with_discriminant = '$.index[*][?(@.name == "enum_with_discriminant")].id' -// @is '$.index[*][?(@.name == "doc_inline_external_crate")].inner.items[*]' $enum_with_discriminant +// @is '$.index[*][?(@.name == "doc_inline_external_crate")].inner.module.items[*]' $enum_with_discriminant diff --git a/tests/rustdoc-json/reexport/export_extern_crate_as_self.rs b/tests/rustdoc-json/reexport/export_extern_crate_as_self.rs index f076feb7185a7..37ca279b352ca 100644 --- a/tests/rustdoc-json/reexport/export_extern_crate_as_self.rs +++ b/tests/rustdoc-json/reexport/export_extern_crate_as_self.rs @@ -7,5 +7,5 @@ // ignore-tidy-linelength -// @is "$.index[*][?(@.kind=='module')].name" \"export_extern_crate_as_self\" +// @is "$.index[*][?(@.inner.module)].name" \"export_extern_crate_as_self\" pub extern crate self as export_extern_crate_as_self; // Must be the same name as the crate already has diff --git a/tests/rustdoc-json/reexport/extern_crate_glob.rs b/tests/rustdoc-json/reexport/extern_crate_glob.rs index 8efb94fd3f17a..553ee79b44e4b 100644 --- a/tests/rustdoc-json/reexport/extern_crate_glob.rs +++ b/tests/rustdoc-json/reexport/extern_crate_glob.rs @@ -6,5 +6,6 @@ extern crate enum_with_discriminant; pub use enum_with_discriminant::*; // @!has '$.index[*][?(@.docs == "Should not be inlined")]' -// @set use = '$.index[*][?(@.inner.name == "enum_with_discriminant")].id' -// @is '$.index[*][?(@.name == "extern_crate_glob")].inner.items[*]' $use +// @is '$.index[*][?(@.inner.import)].inner.import.name' \"enum_with_discriminant\" +// @set use = '$.index[*][?(@.inner.import)].id' +// @is '$.index[*][?(@.name == "extern_crate_glob")].inner.module.items[*]' $use diff --git a/tests/rustdoc-json/reexport/glob_collision.rs b/tests/rustdoc-json/reexport/glob_collision.rs index f91144dbfad50..dee35ba78dc45 100644 --- a/tests/rustdoc-json/reexport/glob_collision.rs +++ b/tests/rustdoc-json/reexport/glob_collision.rs @@ -3,26 +3,28 @@ #![feature(no_core)] #![no_core] -// @set m1 = "$.index[*][?(@.name == 'm1' && @.kind == 'module')].id" -// @is "$.index[*][?(@.name == 'm1' && @.kind == 'module')].inner.items" [] -// @is "$.index[*][?(@.name == 'm1' && @.kind == 'module')].inner.is_stripped" true +// @set m1 = "$.index[*][?(@.name == 'm1' && @.inner.module)].id" +// @is "$.index[*][?(@.name == 'm1')].inner.module.items" [] +// @is "$.index[*][?(@.name == 'm1')].inner.module.is_stripped" true mod m1 { pub fn f() {} } -// @set m2 = "$.index[*][?(@.name == 'm2' && @.kind == 'module')].id" -// @is "$.index[*][?(@.name == 'm2' && @.kind == 'module')].inner.items" [] -// @is "$.index[*][?(@.name == 'm2' && @.kind == 'module')].inner.is_stripped" true +// @set m2 = "$.index[*][?(@.name == 'm2' && @.inner.module)].id" +// @is "$.index[*][?(@.name == 'm2')].inner.module.items" [] +// @is "$.index[*][?(@.name == 'm2')].inner.module.is_stripped" true mod m2 { pub fn f(_: u8) {} } -// @set m1_use = "$.index[*][?(@.inner.name=='m1')].id" -// @is "$.index[*][?(@.inner.name=='m1')].inner.id" $m1 -// @is "$.index[*][?(@.inner.name=='m1')].inner.glob" true +// @set m1_use = "$.index[*][?(@.docs=='m1 re-export')].id" +// @is "$.index[*].inner.import[?(@.name=='m1')].id" $m1 +// @is "$.index[*].inner.import[?(@.name=='m1')].glob" true +/// m1 re-export pub use m1::*; -// @set m2_use = "$.index[*][?(@.inner.name=='m2')].id" -// @is "$.index[*][?(@.inner.name=='m2')].inner.id" $m2 -// @is "$.index[*][?(@.inner.name=='m2')].inner.glob" true +// @set m2_use = "$.index[*][?(@.docs=='m2 re-export')].id" +// @is "$.index[*].inner.import[?(@.name=='m2')].id" $m2 +// @is "$.index[*].inner.import[?(@.name=='m2')].glob" true +/// m2 re-export pub use m2::*; -// @ismany "$.index[*][?(@.inner.is_crate==true)].inner.items[*]" $m1_use $m2_use +// @ismany "$.index[*].inner.module[?(@.is_crate==true)].items[*]" $m1_use $m2_use diff --git a/tests/rustdoc-json/reexport/glob_empty_mod.rs b/tests/rustdoc-json/reexport/glob_empty_mod.rs index da68228352c1c..8b7150c8fd706 100644 --- a/tests/rustdoc-json/reexport/glob_empty_mod.rs +++ b/tests/rustdoc-json/reexport/glob_empty_mod.rs @@ -1,8 +1,8 @@ // Regression test for https://github.com/rust-lang/rust/issues/100973 -// @is "$.index[*][?(@.name=='m1' && @.kind == 'module')].inner.is_stripped" true +// @is "$.index[*][?(@.name=='m1' && @.inner.module)].inner.module.is_stripped" true // @set m1 = "$.index[*][?(@.name=='m1')].id" mod m1 {} -// @is "$.index[*][?(@.inner.name=='m1' && @.kind=='import')].inner.id" $m1 +// @is "$.index[*][?(@.inner.import)].inner.import.id" $m1 pub use m1::*; diff --git a/tests/rustdoc-json/reexport/glob_extern.rs b/tests/rustdoc-json/reexport/glob_extern.rs index 7a1e8c11ffa75..78edfaf0aa8d7 100644 --- a/tests/rustdoc-json/reexport/glob_extern.rs +++ b/tests/rustdoc-json/reexport/glob_extern.rs @@ -3,8 +3,7 @@ #![no_core] #![feature(no_core)] -// @is "$.index[*][?(@.name=='mod1')].kind" \"module\" -// @is "$.index[*][?(@.name=='mod1')].inner.is_stripped" "true" +// @is "$.index[*][?(@.name=='mod1')].inner.module.is_stripped" "true" mod mod1 { extern "C" { // @set public_fn_id = "$.index[*][?(@.name=='public_fn')].id" @@ -12,12 +11,12 @@ mod mod1 { // @!has "$.index[*][?(@.name=='private_fn')]" fn private_fn(); } - // @ismany "$.index[*][?(@.name=='mod1')].inner.items[*]" $public_fn_id + // @ismany "$.index[*][?(@.name=='mod1')].inner.module.items[*]" $public_fn_id // @set mod1_id = "$.index[*][?(@.name=='mod1')].id" } -// @is "$.index[*][?(@.kind=='import')].inner.glob" true -// @is "$.index[*][?(@.kind=='import')].inner.id" $mod1_id -// @set use_id = "$.index[*][?(@.kind=='import')].id" -// @ismany "$.index[*][?(@.name=='glob_extern')].inner.items[*]" $use_id +// @is "$.index[*][?(@.inner.import)].inner.import.glob" true +// @is "$.index[*][?(@.inner.import)].inner.import.id" $mod1_id +// @set use_id = "$.index[*][?(@.inner.import)].id" +// @ismany "$.index[*][?(@.name=='glob_extern')].inner.module.items[*]" $use_id pub use mod1::*; diff --git a/tests/rustdoc-json/reexport/glob_private.rs b/tests/rustdoc-json/reexport/glob_private.rs index 3a83a20818b8a..ae4e87d23bc54 100644 --- a/tests/rustdoc-json/reexport/glob_private.rs +++ b/tests/rustdoc-json/reexport/glob_private.rs @@ -3,11 +3,9 @@ #![no_core] #![feature(no_core)] -// @is "$.index[*][?(@.name=='mod1')].kind" \"module\" -// @is "$.index[*][?(@.name=='mod1')].inner.is_stripped" "true" +// @is "$.index[*][?(@.name=='mod1')].inner.module.is_stripped" "true" mod mod1 { - // @is "$.index[*][?(@.name=='mod2')].kind" \"module\" - // @is "$.index[*][?(@.name=='mod2')].inner.is_stripped" "true" + // @is "$.index[*][?(@.name=='mod2')].inner.module.is_stripped" "true" mod mod2 { // @set m2pub_id = "$.index[*][?(@.name=='Mod2Public')].id" pub struct Mod2Public; @@ -16,7 +14,9 @@ mod mod1 { struct Mod2Private; } - // @set mod2_use_id = "$.index[*][?(@.kind=='import' && @.inner.name=='mod2')].id" + // @set mod2_use_id = "$.index[*][?(@.docs=='Mod2 re-export')].id" + // @is "$.index[*][?(@.docs=='Mod2 re-export')].inner.import.name" \"mod2\" + /// Mod2 re-export pub use self::mod2::*; // @set m1pub_id = "$.index[*][?(@.name=='Mod1Public')].id" @@ -25,9 +25,11 @@ mod mod1 { struct Mod1Private; } -// @set mod1_use_id = "$.index[*][?(@.kind=='import' && @.inner.name=='mod1')].id" +// @set mod1_use_id = "$.index[*][?(@.docs=='Mod1 re-export')].id" +// @is "$.index[*][?(@.docs=='Mod1 re-export')].inner.import.name" \"mod1\" +/// Mod1 re-export pub use mod1::*; -// @ismany "$.index[*][?(@.name=='mod2')].inner.items[*]" $m2pub_id -// @ismany "$.index[*][?(@.name=='mod1')].inner.items[*]" $m1pub_id $mod2_use_id -// @ismany "$.index[*][?(@.name=='glob_private')].inner.items[*]" $mod1_use_id +// @ismany "$.index[*][?(@.name=='mod2')].inner.module.items[*]" $m2pub_id +// @ismany "$.index[*][?(@.name=='mod1')].inner.module.items[*]" $m1pub_id $mod2_use_id +// @ismany "$.index[*][?(@.name=='glob_private')].inner.module.items[*]" $mod1_use_id diff --git a/tests/rustdoc-json/reexport/in_root_and_mod.rs b/tests/rustdoc-json/reexport/in_root_and_mod.rs index 7b97ebf2129eb..f81445bd48da8 100644 --- a/tests/rustdoc-json/reexport/in_root_and_mod.rs +++ b/tests/rustdoc-json/reexport/in_root_and_mod.rs @@ -7,10 +7,10 @@ mod foo { pub struct Foo; } -// @has "$.index[*][?(@.kind=='import' && @.inner.source=='foo::Foo')]" +// @has "$.index[*].inner[?(@.import.source=='foo::Foo')]" pub use foo::Foo; pub mod bar { - // @has "$.index[*][?(@.kind=='import' && @.inner.source=='crate::foo::Foo')]" + // @has "$.index[*].inner[?(@.import.source=='crate::foo::Foo')]" pub use crate::foo::Foo; } diff --git a/tests/rustdoc-json/reexport/in_root_and_mod_pub.rs b/tests/rustdoc-json/reexport/in_root_and_mod_pub.rs index f6d932d927b8d..c5c41b25f7ec0 100644 --- a/tests/rustdoc-json/reexport/in_root_and_mod_pub.rs +++ b/tests/rustdoc-json/reexport/in_root_and_mod_pub.rs @@ -3,18 +3,20 @@ pub mod foo { // @set bar_id = "$.index[*][?(@.name=='Bar')].id" - // @ismany "$.index[*][?(@.name=='foo')].inner.items[*]" $bar_id + // @ismany "$.index[*][?(@.name=='foo')].inner.module.items[*]" $bar_id pub struct Bar; } -// @set root_import_id = "$.index[*][?(@.inner.source=='foo::Bar')].id" -// @is "$.index[*][?(@.inner.source=='foo::Bar')].inner.id" $bar_id -// @has "$.index[*][?(@.name=='in_root_and_mod_pub')].inner.items[*]" $root_import_id +// @set root_import_id = "$.index[*][?(@.docs=='Outer re-export')].id" +// @is "$.index[*].inner[?(@.import.source=='foo::Bar')].import.id" $bar_id +// @has "$.index[*][?(@.name=='in_root_and_mod_pub')].inner.module.items[*]" $root_import_id +/// Outer re-export pub use foo::Bar; pub mod baz { - // @set baz_import_id = "$.index[*][?(@.inner.source=='crate::foo::Bar')].id" - // @is "$.index[*][?(@.inner.source=='crate::foo::Bar')].inner.id" $bar_id - // @ismany "$.index[*][?(@.name=='baz')].inner.items[*]" $baz_import_id + // @set baz_import_id = "$.index[*][?(@.docs=='Inner re-export')].id" + // @is "$.index[*].inner[?(@.import.source=='crate::foo::Bar')].import.id" $bar_id + // @ismany "$.index[*][?(@.name=='baz')].inner.module.items[*]" $baz_import_id + /// Inner re-export pub use crate::foo::Bar; } diff --git a/tests/rustdoc-json/reexport/macro.rs b/tests/rustdoc-json/reexport/macro.rs index b4882100f0656..ac0632b98a95a 100644 --- a/tests/rustdoc-json/reexport/macro.rs +++ b/tests/rustdoc-json/reexport/macro.rs @@ -9,7 +9,8 @@ macro_rules! repro { () => {}; } -// @set repro2_id = "$.index[*][?(@.inner.name=='repro2')].id" +// @set repro2_id = "$.index[*][?(@.docs=='Re-export')].id" +/// Re-export pub use crate::repro as repro2; -// @ismany "$.index[*][?(@.name=='macro')].inner.items[*]" $repro_id $repro2_id +// @ismany "$.index[*][?(@.name=='macro')].inner.module.items[*]" $repro_id $repro2_id diff --git a/tests/rustdoc-json/reexport/mod_not_included.rs b/tests/rustdoc-json/reexport/mod_not_included.rs index 7b7600ef20f08..1c49f213d1a71 100644 --- a/tests/rustdoc-json/reexport/mod_not_included.rs +++ b/tests/rustdoc-json/reexport/mod_not_included.rs @@ -9,6 +9,6 @@ mod m1 { pub use m1::x; -// @has "$.index[*][?(@.name=='x' && @.kind=='function')]" -// @has "$.index[*][?(@.kind=='import' && @.inner.name=='x')].inner.source" '"m1::x"' +// @has "$.index[*][?(@.name=='x' && @.inner.function)]" +// @has "$.index[*].inner[?(@.import.name=='x')].import.source" '"m1::x"' // @!has "$.index[*][?(@.name=='m1')]" diff --git a/tests/rustdoc-json/reexport/private_twice_one_inline.rs b/tests/rustdoc-json/reexport/private_twice_one_inline.rs index 687a3b2ac8b2c..8c8152bd16c3b 100644 --- a/tests/rustdoc-json/reexport/private_twice_one_inline.rs +++ b/tests/rustdoc-json/reexport/private_twice_one_inline.rs @@ -11,18 +11,18 @@ extern crate pub_struct as foo; #[doc(inline)] // @set crate_use_id = "$.index[*][?(@.docs=='Hack A')].id" -// @set foo_id = "$.index[*][?(@.docs=='Hack A')].inner.id" +// @set foo_id = "$.index[*][?(@.docs=='Hack A')].inner.import.id" /// Hack A pub use foo::Foo; // @set bar_id = "$.index[*][?(@.name=='bar')].id" pub mod bar { - // @is "$.index[*][?(@.docs=='Hack B')].inner.id" $foo_id + // @is "$.index[*][?(@.docs=='Hack B')].inner.import.id" $foo_id // @set bar_use_id = "$.index[*][?(@.docs=='Hack B')].id" - // @ismany "$.index[*][?(@.name=='bar')].inner.items[*]" $bar_use_id + // @ismany "$.index[*][?(@.name=='bar')].inner.module.items[*]" $bar_use_id /// Hack B pub use foo::Foo; } -// @ismany "$.index[*][?(@.kind=='import')].id" $crate_use_id $bar_use_id -// @ismany "$.index[*][?(@.name=='private_twice_one_inline')].inner.items[*]" $bar_id $crate_use_id +// @ismany "$.index[*][?(@.inner.import)].id" $crate_use_id $bar_use_id +// @ismany "$.index[*][?(@.name=='private_twice_one_inline')].inner.module.items[*]" $bar_id $crate_use_id diff --git a/tests/rustdoc-json/reexport/private_two_names.rs b/tests/rustdoc-json/reexport/private_two_names.rs index 9858538a9d046..cdcbf2a2bc86c 100644 --- a/tests/rustdoc-json/reexport/private_two_names.rs +++ b/tests/rustdoc-json/reexport/private_two_names.rs @@ -8,15 +8,19 @@ // @!has "$.index[*][?(@.name=='style')]" mod style { - // @set color_struct_id = "$.index[*][?(@.kind=='struct' && @.name=='Color')].id" + // @set color_struct_id = "$.index[*][?(@.inner.struct && @.name=='Color')].id" pub struct Color; } -// @is "$.index[*][?(@.kind=='import' && @.inner.name=='Color')].inner.id" $color_struct_id -// @set color_export_id = "$.index[*][?(@.kind=='import' && @.inner.name=='Color')].id" +// @is "$.index[*][?(@.docs=='First re-export')].inner.import.id" $color_struct_id +// @is "$.index[*][?(@.docs=='First re-export')].inner.import.name" \"Color\" +// @set color_export_id = "$.index[*][?(@.docs=='First re-export')].id" +/// First re-export pub use style::Color; -// @is "$.index[*][?(@.kind=='import' && @.inner.name=='Colour')].inner.id" $color_struct_id -// @set colour_export_id = "$.index[*][?(@.kind=='import' && @.inner.name=='Colour')].id" +// @is "$.index[*][?(@.docs=='Second re-export')].inner.import.id" $color_struct_id +// @is "$.index[*][?(@.docs=='Second re-export')].inner.import.name" \"Colour\" +// @set colour_export_id = "$.index[*][?(@.docs=='Second re-export')].id" +/// Second re-export pub use style::Color as Colour; -// @ismany "$.index[*][?(@.name=='private_two_names')].inner.items[*]" $color_export_id $colour_export_id +// @ismany "$.index[*][?(@.name=='private_two_names')].inner.module.items[*]" $color_export_id $colour_export_id diff --git a/tests/rustdoc-json/reexport/reexport_method_from_private_module.rs b/tests/rustdoc-json/reexport/reexport_method_from_private_module.rs index 239b1a23b43d7..61075088af9dd 100644 --- a/tests/rustdoc-json/reexport/reexport_method_from_private_module.rs +++ b/tests/rustdoc-json/reexport/reexport_method_from_private_module.rs @@ -1,9 +1,9 @@ // Regression test for . // @set impl_S = "$.index[*][?(@.docs=='impl S')].id" -// @has "$.index[*][?(@.name=='S')].inner.impls[*]" $impl_S +// @has "$.index[*][?(@.name=='S')].inner.struct.impls[*]" $impl_S // @set is_present = "$.index[*][?(@.name=='is_present')].id" -// @is "$.index[*][?(@.docs=='impl S')].inner.items[*]" $is_present +// @is "$.index[*][?(@.docs=='impl S')].inner.impl.items[*]" $is_present // @!has "$.index[*][?(@.name=='hidden_impl')]" // @!has "$.index[*][?(@.name=='hidden_fn')]" diff --git a/tests/rustdoc-json/reexport/rename_private.rs b/tests/rustdoc-json/reexport/rename_private.rs index 8fd850f9b1370..9114460231dc8 100644 --- a/tests/rustdoc-json/reexport/rename_private.rs +++ b/tests/rustdoc-json/reexport/rename_private.rs @@ -3,11 +3,11 @@ #![no_core] #![feature(no_core)] -// @!has "$.index[*][?(@.kind=='inner')]" +// @!has "$.index[*][?(@.name=='inner')]" mod inner { // @has "$.index[*][?(@.name=='Public')]" pub struct Public; } -// @is "$.index[*][?(@.kind=='import')].inner.name" \"NewName\" +// @is "$.index[*][?(@.inner.import)].inner.import.name" \"NewName\" pub use inner::Public as NewName; diff --git a/tests/rustdoc-json/reexport/rename_public.rs b/tests/rustdoc-json/reexport/rename_public.rs index e30907fe25618..d0fd314bd8c99 100644 --- a/tests/rustdoc-json/reexport/rename_public.rs +++ b/tests/rustdoc-json/reexport/rename_public.rs @@ -6,12 +6,13 @@ // @set inner_id = "$.index[*][?(@.name=='inner')].id" pub mod inner { // @set public_id = "$.index[*][?(@.name=='Public')].id" - // @ismany "$.index[*][?(@.name=='inner')].inner.items[*]" $public_id + // @ismany "$.index[*][?(@.name=='inner')].inner.module.items[*]" $public_id pub struct Public; } -// @set import_id = "$.index[*][?(@.inner.name=='NewName')].id" -// @!has "$.index[*][?(@.inner.name=='Public')]" -// @is "$.index[*][?(@.inner.name=='NewName')].inner.source" \"inner::Public\" +// @set import_id = "$.index[*][?(@.docs=='Re-export')].id" +// @!has "$.index[*].inner[?(@.import.name=='Public')]" +// @is "$.index[*].inner[?(@.import.name=='NewName')].import.source" \"inner::Public\" +/// Re-export pub use inner::Public as NewName; -// @ismany "$.index[*][?(@.name=='rename_public')].inner.items[*]" $inner_id $import_id +// @ismany "$.index[*][?(@.name=='rename_public')].inner.module.items[*]" $inner_id $import_id diff --git a/tests/rustdoc-json/reexport/same_name_different_types.rs b/tests/rustdoc-json/reexport/same_name_different_types.rs index 2314a4eb90940..6a765b733016e 100644 --- a/tests/rustdoc-json/reexport/same_name_different_types.rs +++ b/tests/rustdoc-json/reexport/same_name_different_types.rs @@ -16,10 +16,10 @@ pub mod nested { pub fn Foo() {} } -// @ismany "$.index[*][?(@.inner.name == 'Foo' && @.kind == 'import')].inner.id" $foo_fn $foo_struct -// @ismany "$.index[*][?(@.inner.name == 'Bar' && @.kind == 'import')].inner.id" $foo_fn $foo_struct +// @ismany "$.index[*].inner[?(@.import.name == 'Foo')].import.id" $foo_fn $foo_struct +// @ismany "$.index[*].inner[?(@.import.name == 'Bar')].import.id" $foo_fn $foo_struct -// @count "$.index[*][?(@.inner.name == 'Foo' && @.kind == 'import')]" 2 +// @count "$.index[*].inner[?(@.import.name == 'Foo')]" 2 pub use nested::Foo; -// @count "$.index[*][?(@.inner.name == 'Bar' && @.kind == 'import')]" 2 +// @count "$.index[*].inner[?(@.import.name == 'Bar')]" 2 pub use Foo as Bar; diff --git a/tests/rustdoc-json/reexport/same_type_reexported_more_than_once.rs b/tests/rustdoc-json/reexport/same_type_reexported_more_than_once.rs index 880dbdc4416e9..a00547dc34811 100644 --- a/tests/rustdoc-json/reexport/same_type_reexported_more_than_once.rs +++ b/tests/rustdoc-json/reexport/same_type_reexported_more_than_once.rs @@ -11,11 +11,13 @@ mod inner { pub trait Trait {} } -// @set export_id = "$.index[*][?(@.inner.name=='Trait')].id" -// @is "$.index[*][?(@.inner.name=='Trait')].inner.id" $trait_id +// @set export_id = "$.index[*][?(@.docs=='First re-export')].id" +// @is "$.index[*].inner[?(@.import.name=='Trait')].import.id" $trait_id +/// First re-export pub use inner::Trait; -// @set reexport_id = "$.index[*][?(@.inner.name=='Reexport')].id" -// @is "$.index[*][?(@.inner.name=='Reexport')].inner.id" $trait_id +// @set reexport_id = "$.index[*][?(@.docs=='Second re-export')].id" +// @is "$.index[*].inner[?(@.import.name=='Reexport')].import.id" $trait_id +/// Second re-export pub use inner::Trait as Reexport; -// @ismany "$.index[*][?(@.name=='same_type_reexported_more_than_once')].inner.items[*]" $reexport_id $export_id +// @ismany "$.index[*][?(@.name=='same_type_reexported_more_than_once')].inner.module.items[*]" $reexport_id $export_id diff --git a/tests/rustdoc-json/reexport/simple_private.rs b/tests/rustdoc-json/reexport/simple_private.rs index d058ce0598d43..462efee51bf40 100644 --- a/tests/rustdoc-json/reexport/simple_private.rs +++ b/tests/rustdoc-json/reexport/simple_private.rs @@ -8,9 +8,9 @@ mod inner { pub struct Public; } -// @is "$.index[*][?(@.kind=='import')].inner.name" \"Public\" -// @is "$.index[*][?(@.kind=='import')].inner.id" $pub_id -// @set use_id = "$.index[*][?(@.kind=='import')].id" +// @is "$.index[*][?(@.inner.import)].inner.import.name" \"Public\" +// @is "$.index[*][?(@.inner.import)].inner.import.id" $pub_id +// @set use_id = "$.index[*][?(@.inner.import)].id" pub use inner::Public; -// @ismany "$.index[*][?(@.name=='simple_private')].inner.items[*]" $use_id +// @ismany "$.index[*][?(@.name=='simple_private')].inner.module.items[*]" $use_id diff --git a/tests/rustdoc-json/reexport/simple_public.rs b/tests/rustdoc-json/reexport/simple_public.rs index e64a0dcb769fa..1373f96f87f07 100644 --- a/tests/rustdoc-json/reexport/simple_public.rs +++ b/tests/rustdoc-json/reexport/simple_public.rs @@ -7,12 +7,13 @@ pub mod inner { // @set public_id = "$.index[*][?(@.name=='Public')].id" - // @ismany "$.index[*][?(@.name=='inner')].inner.items[*]" $public_id + // @ismany "$.index[*][?(@.name=='inner')].inner.module.items[*]" $public_id pub struct Public; } -// @set import_id = "$.index[*][?(@.inner.name=='Public')].id" -// @is "$.index[*][?(@.inner.name=='Public')].inner.source" \"inner::Public\" +// @set import_id = "$.index[*][?(@.docs=='Outer')].id" +// @is "$.index[*][?(@.docs=='Outer')].inner.import.source" \"inner::Public\" +/// Outer pub use inner::Public; -// @ismany "$.index[*][?(@.name=='simple_public')].inner.items[*]" $import_id $inner_id +// @ismany "$.index[*][?(@.name=='simple_public')].inner.module.items[*]" $import_id $inner_id diff --git a/tests/rustdoc-json/return_private.rs b/tests/rustdoc-json/return_private.rs index a8d1fae30dfef..0ce81b5e59fa6 100644 --- a/tests/rustdoc-json/return_private.rs +++ b/tests/rustdoc-json/return_private.rs @@ -8,8 +8,8 @@ mod secret { pub struct Secret; } -// @is "$.index[*][?(@.name=='get_secret')].kind" \"function\" -// @is "$.index[*][?(@.name=='get_secret')].inner.decl.output.inner.name" \"secret::Secret\" +// @has "$.index[*][?(@.name=='get_secret')].inner.function" +// @is "$.index[*][?(@.name=='get_secret')].inner.function.decl.output.resolved_path.name" \"secret::Secret\" pub fn get_secret() -> secret::Secret { secret::Secret } diff --git a/tests/rustdoc-json/structs/plain_all_pub.rs b/tests/rustdoc-json/structs/plain_all_pub.rs index b86ab93c264d5..777260100d6f1 100644 --- a/tests/rustdoc-json/structs/plain_all_pub.rs +++ b/tests/rustdoc-json/structs/plain_all_pub.rs @@ -5,7 +5,7 @@ pub struct Demo { // @set x = "$.index[*][?(@.name=='x')].id" // @set y = "$.index[*][?(@.name=='y')].id" -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[0]" $x -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[1]" $y -// @count "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[*]" 2 -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields_stripped" false +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[0]" $x +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[1]" $y +// @count "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[*]" 2 +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields_stripped" false diff --git a/tests/rustdoc-json/structs/plain_doc_hidden.rs b/tests/rustdoc-json/structs/plain_doc_hidden.rs index 7800b55a481ac..1ff4489ef6b62 100644 --- a/tests/rustdoc-json/structs/plain_doc_hidden.rs +++ b/tests/rustdoc-json/structs/plain_doc_hidden.rs @@ -6,6 +6,6 @@ pub struct Demo { // @set x = "$.index[*][?(@.name=='x')].id" // @!has "$.index[*][?(@.name=='y')].id" -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[0]" $x -// @count "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[*]" 1 -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields_stripped" true +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[0]" $x +// @count "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[*]" 1 +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields_stripped" true diff --git a/tests/rustdoc-json/structs/plain_empty.rs b/tests/rustdoc-json/structs/plain_empty.rs index 1d01b8bc14a81..c037c0251b9c8 100644 --- a/tests/rustdoc-json/structs/plain_empty.rs +++ b/tests/rustdoc-json/structs/plain_empty.rs @@ -1,5 +1,5 @@ // @is "$.index[*][?(@.name=='PlainEmpty')].visibility" \"public\" -// @is "$.index[*][?(@.name=='PlainEmpty')].kind" \"struct\" -// @is "$.index[*][?(@.name=='PlainEmpty')].inner.kind.plain.fields_stripped" false -// @is "$.index[*][?(@.name=='PlainEmpty')].inner.kind.plain.fields" [] +// @has "$.index[*][?(@.name=='PlainEmpty')].inner.struct" +// @is "$.index[*][?(@.name=='PlainEmpty')].inner.struct.kind.plain.fields_stripped" false +// @is "$.index[*][?(@.name=='PlainEmpty')].inner.struct.kind.plain.fields" [] pub struct PlainEmpty {} diff --git a/tests/rustdoc-json/structs/plain_pub_priv.rs b/tests/rustdoc-json/structs/plain_pub_priv.rs index 9b771224d9741..ff061be62d133 100644 --- a/tests/rustdoc-json/structs/plain_pub_priv.rs +++ b/tests/rustdoc-json/structs/plain_pub_priv.rs @@ -4,6 +4,6 @@ pub struct Demo { } // @set x = "$.index[*][?(@.name=='x')].id" -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[0]" $x -// @count "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields[*]" 1 -// @is "$.index[*][?(@.name=='Demo')].inner.kind.plain.fields_stripped" true +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[0]" $x +// @count "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields[*]" 1 +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.plain.fields_stripped" true diff --git a/tests/rustdoc-json/structs/tuple.rs b/tests/rustdoc-json/structs/tuple.rs index 6bdb753ee0136..16ab95ed27150 100644 --- a/tests/rustdoc-json/structs/tuple.rs +++ b/tests/rustdoc-json/structs/tuple.rs @@ -1,4 +1,4 @@ // @is "$.index[*][?(@.name=='Tuple')].visibility" \"public\" -// @is "$.index[*][?(@.name=='Tuple')].kind" \"struct\" -// @is "$.index[*][?(@.name=='Tuple')].inner.kind.tuple" '[null, null]' +// @has "$.index[*][?(@.name=='Tuple')].inner.struct" +// @is "$.index[*][?(@.name=='Tuple')].inner.struct.kind.tuple" '[null, null]' pub struct Tuple(u32, String); diff --git a/tests/rustdoc-json/structs/tuple_empty.rs b/tests/rustdoc-json/structs/tuple_empty.rs index 0ad6a89547fc3..4d4af8558bbc5 100644 --- a/tests/rustdoc-json/structs/tuple_empty.rs +++ b/tests/rustdoc-json/structs/tuple_empty.rs @@ -1,2 +1,2 @@ -// @is "$.index[*][?(@.name=='TupleUnit')].inner.kind.tuple" [] +// @is "$.index[*][?(@.name=='TupleUnit')].inner.struct.kind.tuple" [] pub struct TupleUnit(); diff --git a/tests/rustdoc-json/structs/tuple_pub_priv.rs b/tests/rustdoc-json/structs/tuple_pub_priv.rs index 9d5a1d1c8be7f..a669ba1dfcc6b 100644 --- a/tests/rustdoc-json/structs/tuple_pub_priv.rs +++ b/tests/rustdoc-json/structs/tuple_pub_priv.rs @@ -7,7 +7,7 @@ pub struct Demo( // @set field = "$.index[*][?(@.docs=='field')].id" -// @is "$.index[*][?(@.name=='Demo')].inner.kind.tuple[0]" null -// @is "$.index[*][?(@.name=='Demo')].inner.kind.tuple[1]" $field -// @is "$.index[*][?(@.name=='Demo')].inner.kind.tuple[2]" null -// @count "$.index[*][?(@.name=='Demo')].inner.kind.tuple[*]" 3 +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.tuple[0]" null +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.tuple[1]" $field +// @is "$.index[*][?(@.name=='Demo')].inner.struct.kind.tuple[2]" null +// @count "$.index[*][?(@.name=='Demo')].inner.struct.kind.tuple[*]" 3 diff --git a/tests/rustdoc-json/structs/unit.rs b/tests/rustdoc-json/structs/unit.rs index 265709717212f..640d3fb786523 100644 --- a/tests/rustdoc-json/structs/unit.rs +++ b/tests/rustdoc-json/structs/unit.rs @@ -1,4 +1,4 @@ // @is "$.index[*][?(@.name=='Unit')].visibility" \"public\" -// @is "$.index[*][?(@.name=='Unit')].kind" \"struct\" -// @is "$.index[*][?(@.name=='Unit')].inner.kind" \"unit\" +// @has "$.index[*][?(@.name=='Unit')].inner.struct" +// @is "$.index[*][?(@.name=='Unit')].inner.struct.kind" \"unit\" pub struct Unit; diff --git a/tests/rustdoc-json/structs/with_generics.rs b/tests/rustdoc-json/structs/with_generics.rs index 00474800a0e54..d721cbdbe2573 100644 --- a/tests/rustdoc-json/structs/with_generics.rs +++ b/tests/rustdoc-json/structs/with_generics.rs @@ -1,13 +1,13 @@ use std::collections::HashMap; // @is "$.index[*][?(@.name=='WithGenerics')].visibility" \"public\" -// @is "$.index[*][?(@.name=='WithGenerics')].kind" \"struct\" -// @is "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[0].name" \"T\" -// @is "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[0].kind.type.bounds" [] -// @is "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].name" \"U\" -// @is "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].kind.type.bounds" [] -// @is "$.index[*][?(@.name=='WithGenerics')].inner.kind.plain.fields_stripped" true -// @is "$.index[*][?(@.name=='WithGenerics')].inner.kind.plain.fields" [] +// @has "$.index[*][?(@.name=='WithGenerics')].inner.struct" +// @is "$.index[*][?(@.name=='WithGenerics')].inner.struct.generics.params[0].name" \"T\" +// @is "$.index[*][?(@.name=='WithGenerics')].inner.struct.generics.params[0].kind.type.bounds" [] +// @is "$.index[*][?(@.name=='WithGenerics')].inner.struct.generics.params[1].name" \"U\" +// @is "$.index[*][?(@.name=='WithGenerics')].inner.struct.generics.params[1].kind.type.bounds" [] +// @is "$.index[*][?(@.name=='WithGenerics')].inner.struct.kind.plain.fields_stripped" true +// @is "$.index[*][?(@.name=='WithGenerics')].inner.struct.kind.plain.fields" [] pub struct WithGenerics { stuff: Vec, things: HashMap, diff --git a/tests/rustdoc-json/structs/with_primitives.rs b/tests/rustdoc-json/structs/with_primitives.rs index 9c5a37f3957c0..e0285a9e68840 100644 --- a/tests/rustdoc-json/structs/with_primitives.rs +++ b/tests/rustdoc-json/structs/with_primitives.rs @@ -1,9 +1,11 @@ +// ignore-tidy-linelength + // @is "$.index[*][?(@.name=='WithPrimitives')].visibility" \"public\" -// @is "$.index[*][?(@.name=='WithPrimitives')].kind" \"struct\" -// @is "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].name" \"\'a\" -// @is "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].kind.lifetime.outlives" [] -// @is "$.index[*][?(@.name=='WithPrimitives')].inner.kind.plain.fields_stripped" true -// @is "$.index[*][?(@.name=='WithPrimitives')].inner.kind.plain.fields" [] +// @has "$.index[*][?(@.name=='WithPrimitives')].inner.struct" +// @is "$.index[*][?(@.name=='WithPrimitives')].inner.struct.generics.params[0].name" \"\'a\" +// @is "$.index[*][?(@.name=='WithPrimitives')].inner.struct.generics.params[0].kind.lifetime.outlives" [] +// @is "$.index[*][?(@.name=='WithPrimitives')].inner.struct.kind.plain.fields_stripped" true +// @is "$.index[*][?(@.name=='WithPrimitives')].inner.struct.kind.plain.fields" [] pub struct WithPrimitives<'a> { num: u32, s: &'a str, diff --git a/tests/rustdoc-json/traits/has_body.rs b/tests/rustdoc-json/traits/has_body.rs index a57cb97d4a6a2..219e2d9bc54f4 100644 --- a/tests/rustdoc-json/traits/has_body.rs +++ b/tests/rustdoc-json/traits/has_body.rs @@ -1,21 +1,21 @@ // @has "$.index[*][?(@.name=='Foo')]" pub trait Foo { - // @is "$.index[*][?(@.name=='no_self')].inner.has_body" false + // @is "$.index[*][?(@.name=='no_self')].inner.function.has_body" false fn no_self(); - // @is "$.index[*][?(@.name=='move_self')].inner.has_body" false + // @is "$.index[*][?(@.name=='move_self')].inner.function.has_body" false fn move_self(self); - // @is "$.index[*][?(@.name=='ref_self')].inner.has_body" false + // @is "$.index[*][?(@.name=='ref_self')].inner.function.has_body" false fn ref_self(&self); - // @is "$.index[*][?(@.name=='no_self_def')].inner.has_body" true + // @is "$.index[*][?(@.name=='no_self_def')].inner.function.has_body" true fn no_self_def() {} - // @is "$.index[*][?(@.name=='move_self_def')].inner.has_body" true + // @is "$.index[*][?(@.name=='move_self_def')].inner.function.has_body" true fn move_self_def(self) {} - // @is "$.index[*][?(@.name=='ref_self_def')].inner.has_body" true + // @is "$.index[*][?(@.name=='ref_self_def')].inner.function.has_body" true fn ref_self_def(&self) {} } pub trait Bar: Clone { - // @is "$.index[*][?(@.name=='method')].inner.has_body" false + // @is "$.index[*][?(@.name=='method')].inner.function.has_body" false fn method(&self, param: usize); } diff --git a/tests/rustdoc-json/traits/implementors.rs b/tests/rustdoc-json/traits/implementors.rs index db3fe5df73920..7d351ad61be24 100644 --- a/tests/rustdoc-json/traits/implementors.rs +++ b/tests/rustdoc-json/traits/implementors.rs @@ -2,18 +2,18 @@ #![no_core] // @set wham = "$.index[*][?(@.name=='Wham')].id" -// @count "$.index[*][?(@.name=='Wham')].inner.implementations[*]" 1 -// @set gmWham = "$.index[*][?(@.name=='Wham')].inner.implementations[0]" +// @count "$.index[*][?(@.name=='Wham')].inner.trait.implementations[*]" 1 +// @set gmWham = "$.index[*][?(@.name=='Wham')].inner.trait.implementations[0]" pub trait Wham {} -// @count "$.index[*][?(@.name=='GeorgeMichael')].inner.impls[*]" 1 -// @is "$.index[*][?(@.name=='GeorgeMichael')].inner.impls[0]" $gmWham +// @count "$.index[*][?(@.name=='GeorgeMichael')].inner.struct.impls[*]" 1 +// @is "$.index[*][?(@.name=='GeorgeMichael')].inner.struct.impls[0]" $gmWham // @set gm = "$.index[*][?(@.name=='Wham')].id" // jsonpath_lib isnt expressive enough (for now) to get the "impl" item, so we // just check it isn't pointing to the type, but when you port to jsondocck-ng // check what the impl item is -// @!is "$.index[*][?(@.name=='Wham')].inner.implementations[0]" $gm +// @!is "$.index[*][?(@.name=='Wham')].inner.trait.implementations[0]" $gm pub struct GeorgeMichael {} impl Wham for GeorgeMichael {} diff --git a/tests/rustdoc-json/traits/supertrait.rs b/tests/rustdoc-json/traits/supertrait.rs index 4048fdd74b490..2123ac40427ea 100644 --- a/tests/rustdoc-json/traits/supertrait.rs +++ b/tests/rustdoc-json/traits/supertrait.rs @@ -8,19 +8,19 @@ pub trait Loud {} // @set very_loud_id = "$.index[*][?(@.name=='VeryLoud')].id" -// @count "$.index[*][?(@.name=='VeryLoud')].inner.bounds[*]" 1 -// @is "$.index[*][?(@.name=='VeryLoud')].inner.bounds[0].trait_bound.trait.id" $loud_id +// @count "$.index[*][?(@.name=='VeryLoud')].inner.trait.bounds[*]" 1 +// @is "$.index[*][?(@.name=='VeryLoud')].inner.trait.bounds[0].trait_bound.trait.id" $loud_id pub trait VeryLoud: Loud {} // @set sounds_good_id = "$.index[*][?(@.name=='SoundsGood')].id" pub trait SoundsGood {} -// @count "$.index[*][?(@.name=='MetalBand')].inner.bounds[*]" 2 -// @is "$.index[*][?(@.name=='MetalBand')].inner.bounds[0].trait_bound.trait.id" $very_loud_id -// @is "$.index[*][?(@.name=='MetalBand')].inner.bounds[1].trait_bound.trait.id" $sounds_good_id +// @count "$.index[*][?(@.name=='MetalBand')].inner.trait.bounds[*]" 2 +// @is "$.index[*][?(@.name=='MetalBand')].inner.trait.bounds[0].trait_bound.trait.id" $very_loud_id +// @is "$.index[*][?(@.name=='MetalBand')].inner.trait.bounds[1].trait_bound.trait.id" $sounds_good_id pub trait MetalBand: VeryLoud + SoundsGood {} -// @count "$.index[*][?(@.name=='DnabLatem')].inner.bounds[*]" 2 -// @is "$.index[*][?(@.name=='DnabLatem')].inner.bounds[1].trait_bound.trait.id" $very_loud_id -// @is "$.index[*][?(@.name=='DnabLatem')].inner.bounds[0].trait_bound.trait.id" $sounds_good_id +// @count "$.index[*][?(@.name=='DnabLatem')].inner.trait.bounds[*]" 2 +// @is "$.index[*][?(@.name=='DnabLatem')].inner.trait.bounds[1].trait_bound.trait.id" $very_loud_id +// @is "$.index[*][?(@.name=='DnabLatem')].inner.trait.bounds[0].trait_bound.trait.id" $sounds_good_id pub trait DnabLatem: SoundsGood + VeryLoud {} diff --git a/tests/rustdoc-json/traits/trait_alias.rs b/tests/rustdoc-json/traits/trait_alias.rs index 35db9296cddb2..4fcc26f7de2ce 100644 --- a/tests/rustdoc-json/traits/trait_alias.rs +++ b/tests/rustdoc-json/traits/trait_alias.rs @@ -4,24 +4,24 @@ #![feature(trait_alias)] // @set Orig = "$.index[*][?(@.name == 'Orig')].id" -// @is "$.index[*][?(@.name == 'Orig')].kind" '"trait"' +// @has "$.index[*][?(@.name == 'Orig')].inner.trait" pub trait Orig {} // @set Alias = "$.index[*][?(@.name == 'Alias')].id" -// @is "$.index[*][?(@.name == 'Alias')].kind" '"trait_alias"' -// @is "$.index[*][?(@.name == 'Alias')].inner.generics" '{"params": [], "where_predicates": []}' -// @count "$.index[*][?(@.name == 'Alias')].inner.params[*]" 1 -// @is "$.index[*][?(@.name == 'Alias')].inner.params[0].trait_bound.trait.id" $Orig -// @is "$.index[*][?(@.name == 'Alias')].inner.params[0].trait_bound.trait.args.angle_bracketed.args[0].type.inner" '"i32"' +// @has "$.index[*][?(@.name == 'Alias')].inner.trait_alias" +// @is "$.index[*][?(@.name == 'Alias')].inner.trait_alias.generics" '{"params": [], "where_predicates": []}' +// @count "$.index[*][?(@.name == 'Alias')].inner.trait_alias.params[*]" 1 +// @is "$.index[*][?(@.name == 'Alias')].inner.trait_alias.params[0].trait_bound.trait.id" $Orig +// @is "$.index[*][?(@.name == 'Alias')].inner.trait_alias.params[0].trait_bound.trait.args.angle_bracketed.args[0].type.primitive" '"i32"' pub trait Alias = Orig; pub struct Struct; impl Orig for Struct {} -// @is "$.index[*][?(@.name=='takes_alias')].inner.decl.inputs[0][1].kind" '"impl_trait"' -// @is "$.index[*][?(@.name=='takes_alias')].inner.decl.inputs[0][1].inner[0].trait_bound.trait.id" $Alias -// @is "$.index[*][?(@.name=='takes_alias')].inner.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $Alias +// @has "$.index[*][?(@.name=='takes_alias')].inner.function.decl.inputs[0][1].impl_trait" +// @is "$.index[*][?(@.name=='takes_alias')].inner.function.decl.inputs[0][1].impl_trait[0].trait_bound.trait.id" $Alias +// @is "$.index[*][?(@.name=='takes_alias')].inner.function.generics.params[0].kind.type.bounds[0].trait_bound.trait.id" $Alias pub fn takes_alias(_: impl Alias) {} // FIXME: Should the trait be mentioned in both the decl and generics? diff --git a/tests/rustdoc-json/type/dyn.rs b/tests/rustdoc-json/type/dyn.rs index eaf249252e33a..e5ee60fad59f4 100644 --- a/tests/rustdoc-json/type/dyn.rs +++ b/tests/rustdoc-json/type/dyn.rs @@ -1,46 +1,46 @@ // ignore-tidy-linelength use std::fmt::Debug; -// @count "$.index[*][?(@.name=='dyn')].inner.items[*]" 3 +// @count "$.index[*][?(@.name=='dyn')].inner.module.items[*]" 3 // @set sync_int_gen = "$.index[*][?(@.name=='SyncIntGen')].id" // @set ref_fn = "$.index[*][?(@.name=='RefFn')].id" // @set weird_order = "$.index[*][?(@.name=='WeirdOrder')].id" -// @ismany "$.index[*][?(@.name=='dyn')].inner.items[*]" $sync_int_gen $ref_fn $weird_order +// @ismany "$.index[*][?(@.name=='dyn')].inner.module.items[*]" $sync_int_gen $ref_fn $weird_order -// @is "$.index[*][?(@.name=='SyncIntGen')].kind" \"typedef\" -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.generics" '{"params": [], "where_predicates": []}' -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.kind" \"resolved_path\" -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.name" \"Box\" -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.bindings" [] -// @count "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args" 1 -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.kind" \"dyn_trait\" -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.lifetime" \"\'static\" -// @count "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[*]" 3 -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[0].generic_params" [] -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[1].generic_params" [] -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[2].generic_params" [] -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[0].trait.name" '"Fn"' -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[1].trait.name" '"Send"' -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[2].trait.name" '"Sync"' -// @is "$.index[*][?(@.name=='SyncIntGen')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[0].trait.args" '{"parenthesized": {"inputs": [],"output": {"inner": "i32","kind": "primitive"}}}' +// @has "$.index[*][?(@.name=='SyncIntGen')].inner.typedef" +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.generics" '{"params": [], "where_predicates": []}' +// @has "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path" +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.name" \"Box\" +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.bindings" [] +// @count "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args" 1 +// @has "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait" +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.lifetime" \"\'static\" +// @count "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[*]" 3 +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].generic_params" [] +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].generic_params" [] +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[2].generic_params" [] +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.name" '"Fn"' +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].trait.name" '"Send"' +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[2].trait.name" '"Sync"' +// @is "$.index[*][?(@.name=='SyncIntGen')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.args" '{"parenthesized": {"inputs": [],"output": {"primitive": "i32"}}}' pub type SyncIntGen = Box i32 + Send + Sync + 'static>; -// @is "$.index[*][?(@.name=='RefFn')].kind" \"typedef\" -// @is "$.index[*][?(@.name=='RefFn')].inner.generics" '{"params": [{"kind": {"lifetime": {"outlives": []}},"name": "'\''a"}],"where_predicates": []}' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.mutable" 'false' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.lifetime" "\"'a\"" -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.kind" '"dyn_trait"' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.lifetime" null -// @count "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[*]" 1 -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[0].generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[0].trait.name" '"Fn"' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[0].trait.args.parenthesized.inputs[0].kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[0].trait.args.parenthesized.inputs[0].inner.lifetime" "\"'b\"" -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[0].trait.args.parenthesized.output.kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='RefFn')].inner.type.inner.type.inner.traits[0].trait.args.parenthesized.output.inner.lifetime" "\"'b\"" +// @has "$.index[*][?(@.name=='RefFn')].inner.typedef" +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.generics" '{"params": [{"kind": {"lifetime": {"outlives": []}},"name": "'\''a"}],"where_predicates": []}' +// @has "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref" +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.mutable" 'false' +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.lifetime" "\"'a\"" +// @has "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait" +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.lifetime" null +// @count "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[*]" 1 +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[0].generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]' +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[0].trait.name" '"Fn"' +// @has "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.inputs[0].borrowed_ref" +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.inputs[0].borrowed_ref.lifetime" "\"'b\"" +// @has "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.output.borrowed_ref" +// @is "$.index[*][?(@.name=='RefFn')].inner.typedef.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.output.borrowed_ref.lifetime" "\"'b\"" pub type RefFn<'a> = &'a dyn for<'b> Fn(&'b i32) -> &'b i32; -// @is "$.index[*][?(@.name=='WeirdOrder')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[0].trait.name" '"Send"' -// @is "$.index[*][?(@.name=='WeirdOrder')].inner.type.inner.args.angle_bracketed.args[0].type.inner.traits[1].trait.name" '"Debug"' +// @is "$.index[*][?(@.name=='WeirdOrder')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.name" '"Send"' +// @is "$.index[*][?(@.name=='WeirdOrder')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].trait.name" '"Debug"' pub type WeirdOrder = Box; diff --git a/tests/rustdoc-json/type/extern.rs b/tests/rustdoc-json/type/extern.rs index d287d5ebec543..c30146ce9e036 100644 --- a/tests/rustdoc-json/type/extern.rs +++ b/tests/rustdoc-json/type/extern.rs @@ -6,5 +6,4 @@ extern { } // @is "$.index[*][?(@.docs=='No inner information')].name" '"Foo"' -// @is "$.index[*][?(@.docs=='No inner information')].kind" '"foreign_type"' -// @!has "$.index[*][?(@.docs=='No inner information')].inner" +// @is "$.index[*][?(@.docs=='No inner information')].inner" \"foreign_type\" diff --git a/tests/rustdoc-json/type/fn_lifetime.rs b/tests/rustdoc-json/type/fn_lifetime.rs index d7216ec7675a3..424c5dce273a2 100644 --- a/tests/rustdoc-json/type/fn_lifetime.rs +++ b/tests/rustdoc-json/type/fn_lifetime.rs @@ -1,27 +1,26 @@ // ignore-tidy-linelength -// @is "$.index[*][?(@.name=='GenericFn')].kind" \"typedef\" +// @has "$.index[*][?(@.name=='GenericFn')].inner.typedef" -// @ismany "$.index[*][?(@.name=='GenericFn')].inner.generics.params[*].name" \"\'a\" -// @has "$.index[*][?(@.name=='GenericFn')].inner.generics.params[*].kind.lifetime" -// @count "$.index[*][?(@.name=='GenericFn')].inner.generics.params[*].kind.lifetime.outlives[*]" 0 -// @count "$.index[*][?(@.name=='GenericFn')].inner.generics.where_predicates[*]" 0 -// @is "$.index[*][?(@.name=='GenericFn')].inner.type.kind" \"function_pointer\" -// @count "$.index[*][?(@.name=='GenericFn')].inner.type.inner.generic_params[*]" 0 -// @count "$.index[*][?(@.name=='GenericFn')].inner.type.inner.decl.inputs[*]" 1 -// @is "$.index[*][?(@.name=='GenericFn')].inner.type.inner.decl.inputs[*][1].inner.lifetime" \"\'a\" -// @is "$.index[*][?(@.name=='GenericFn')].inner.type.inner.decl.output.inner.lifetime" \"\'a\" +// @ismany "$.index[*][?(@.name=='GenericFn')].inner.typedef.generics.params[*].name" \"\'a\" +// @has "$.index[*][?(@.name=='GenericFn')].inner.typedef.generics.params[*].kind.lifetime" +// @count "$.index[*][?(@.name=='GenericFn')].inner.typedef.generics.params[*].kind.lifetime.outlives[*]" 0 +// @count "$.index[*][?(@.name=='GenericFn')].inner.typedef.generics.where_predicates[*]" 0 +// @count "$.index[*][?(@.name=='GenericFn')].inner.typedef.type.function_pointer.generic_params[*]" 0 +// @count "$.index[*][?(@.name=='GenericFn')].inner.typedef.type.function_pointer.decl.inputs[*]" 1 +// @is "$.index[*][?(@.name=='GenericFn')].inner.typedef.type.function_pointer.decl.inputs[*][1].borrowed_ref.lifetime" \"\'a\" +// @is "$.index[*][?(@.name=='GenericFn')].inner.typedef.type.function_pointer.decl.output.borrowed_ref.lifetime" \"\'a\" pub type GenericFn<'a> = fn(&'a i32) -> &'a i32; -// @is "$.index[*][?(@.name=='ForAll')].kind" \"typedef\" -// @count "$.index[*][?(@.name=='ForAll')].inner.generics.params[*]" 0 -// @count "$.index[*][?(@.name=='ForAll')].inner.generics.where_predicates[*]" 0 -// @count "$.index[*][?(@.name=='ForAll')].inner.type.inner.generic_params[*]" 1 -// @is "$.index[*][?(@.name=='ForAll')].inner.type.inner.generic_params[*].name" \"\'a\" -// @has "$.index[*][?(@.name=='ForAll')].inner.type.inner.generic_params[*].kind.lifetime" -// @count "$.index[*][?(@.name=='ForAll')].inner.type.inner.generic_params[*].kind.lifetime.outlives[*]" 0 -// @count "$.index[*][?(@.name=='ForAll')].inner.type.inner.decl.inputs[*]" 1 -// @is "$.index[*][?(@.name=='ForAll')].inner.type.inner.decl.inputs[*][1].inner.lifetime" \"\'a\" -// @is "$.index[*][?(@.name=='ForAll')].inner.type.inner.decl.output.inner.lifetime" \"\'a\" +// @has "$.index[*][?(@.name=='ForAll')].inner.typedef" +// @count "$.index[*][?(@.name=='ForAll')].inner.typedef.generics.params[*]" 0 +// @count "$.index[*][?(@.name=='ForAll')].inner.typedef.generics.where_predicates[*]" 0 +// @count "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.generic_params[*]" 1 +// @is "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.generic_params[*].name" \"\'a\" +// @has "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.generic_params[*].kind.lifetime" +// @count "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.generic_params[*].kind.lifetime.outlives[*]" 0 +// @count "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.decl.inputs[*]" 1 +// @is "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.decl.inputs[*][1].borrowed_ref.lifetime" \"\'a\" +// @is "$.index[*][?(@.name=='ForAll')].inner.typedef.type.function_pointer.decl.output.borrowed_ref.lifetime" \"\'a\" pub type ForAll = for<'a> fn(&'a i32) -> &'a i32; diff --git a/tests/rustdoc-json/type/generic_default.rs b/tests/rustdoc-json/type/generic_default.rs index 9c6d4540bfb59..b46428745324f 100644 --- a/tests/rustdoc-json/type/generic_default.rs +++ b/tests/rustdoc-json/type/generic_default.rs @@ -9,25 +9,25 @@ pub enum Result { // @set my_error = "$.index[*][?(@.name=='MyError')].id" pub struct MyError {} -// @is "$.index[*][?(@.name=='MyResult')].kind" \"typedef\" -// @count "$.index[*][?(@.name=='MyResult')].inner.generics.where_predicates[*]" 0 -// @count "$.index[*][?(@.name=='MyResult')].inner.generics.params[*]" 2 -// @is "$.index[*][?(@.name=='MyResult')].inner.generics.params[0].name" \"T\" -// @is "$.index[*][?(@.name=='MyResult')].inner.generics.params[1].name" \"E\" -// @has "$.index[*][?(@.name=='MyResult')].inner.generics.params[0].kind.type" -// @has "$.index[*][?(@.name=='MyResult')].inner.generics.params[1].kind.type" -// @count "$.index[*][?(@.name=='MyResult')].inner.generics.params[0].kind.type.bounds[*]" 0 -// @count "$.index[*][?(@.name=='MyResult')].inner.generics.params[1].kind.type.bounds[*]" 0 -// @is "$.index[*][?(@.name=='MyResult')].inner.generics.params[0].kind.type.default" null -// @is "$.index[*][?(@.name=='MyResult')].inner.generics.params[1].kind.type.default.kind" \"resolved_path\" -// @is "$.index[*][?(@.name=='MyResult')].inner.generics.params[1].kind.type.default.inner.id" $my_error -// @is "$.index[*][?(@.name=='MyResult')].inner.generics.params[1].kind.type.default.inner.name" \"MyError\" -// @is "$.index[*][?(@.name=='MyResult')].inner.type.kind" \"resolved_path\" -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.id" $result -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.name" \"Result\" -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.args.angle_bracketed.bindings" [] -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.args.angle_bracketed.args[0].type.kind" \"generic\" -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.args.angle_bracketed.args[1].type.kind" \"generic\" -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.args.angle_bracketed.args[0].type.inner" \"T\" -// @is "$.index[*][?(@.name=='MyResult')].inner.type.inner.args.angle_bracketed.args[1].type.inner" \"E\" +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef" +// @count "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.where_predicates[*]" 0 +// @count "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[*]" 2 +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[0].name" \"T\" +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[1].name" \"E\" +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[0].kind.type" +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[1].kind.type" +// @count "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[0].kind.type.bounds[*]" 0 +// @count "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[1].kind.type.bounds[*]" 0 +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[0].kind.type.default" null +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[1].kind.type.default.resolved_path" +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[1].kind.type.default.resolved_path.id" $my_error +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.generics.params[1].kind.type.default.resolved_path.name" \"MyError\" +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path" +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.id" $result +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.name" \"Result\" +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.args.angle_bracketed.bindings" [] +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.generic" +// @has "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.args.angle_bracketed.args[1].type.generic" +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.args.angle_bracketed.args[0].type.generic" \"T\" +// @is "$.index[*][?(@.name=='MyResult')].inner.typedef.type.resolved_path.args.angle_bracketed.args[1].type.generic" \"E\" pub type MyResult = Result; diff --git a/tests/rustdoc-json/type/hrtb.rs b/tests/rustdoc-json/type/hrtb.rs index 2c4ee00d468d4..f7ac878ceaa7e 100644 --- a/tests/rustdoc-json/type/hrtb.rs +++ b/tests/rustdoc-json/type/hrtb.rs @@ -1,7 +1,7 @@ // ignore-tidy-linelength -// @is "$.index[*][?(@.name=='genfn')].inner.generics.where_predicates[0].bound_predicate.type" '{"inner": "F","kind": "generic"}' -// @is "$.index[*][?(@.name=='genfn')].inner.generics.where_predicates[0].bound_predicate.generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''a"},{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]' +// @is "$.index[*][?(@.name=='genfn')].inner.function.generics.where_predicates[0].bound_predicate.type" '{"generic": "F"}' +// @is "$.index[*][?(@.name=='genfn')].inner.function.generics.where_predicates[0].bound_predicate.generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''a"},{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]' pub fn genfn(f: F) where for<'a, 'b> F: Fn(&'a i32, &'b i32), @@ -10,14 +10,12 @@ where f(&zero, &zero); } -// @is "$.index[*][?(@.name=='dynfn')].inner.generics" '{"params": [], "where_predicates": []}' -// @is "$.index[*][?(@.name=='dynfn')].inner.generics" '{"params": [], "where_predicates": []}' -// @is "$.index[*][?(@.name=='dynfn')].inner.decl.inputs[0][1].kind" '"borrowed_ref"' -// @is "$.index[*][?(@.name=='dynfn')].inner.decl.inputs[0][1].inner.type.kind" '"dyn_trait"' -// @is "$.index[*][?(@.name=='dynfn')].inner.decl.inputs[0][1].inner.type.inner.lifetime" null -// @count "$.index[*][?(@.name=='dynfn')].inner.decl.inputs[0][1].inner.type.inner.traits[*]" 1 -// @is "$.index[*][?(@.name=='dynfn')].inner.decl.inputs[0][1].inner.type.inner.traits[0].generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''a"},{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]' -// @is "$.index[*][?(@.name=='dynfn')].inner.decl.inputs[0][1].inner.type.inner.traits[0].trait.name" '"Fn"' +// @is "$.index[*][?(@.name=='dynfn')].inner.function.generics" '{"params": [], "where_predicates": []}' +// @is "$.index[*][?(@.name=='dynfn')].inner.function.generics" '{"params": [], "where_predicates": []}' +// @is "$.index[*][?(@.name=='dynfn')].inner.function.decl.inputs[0][1].borrowed_ref.type.dyn_trait.lifetime" null +// @count "$.index[*][?(@.name=='dynfn')].inner.function.decl.inputs[0][1].borrowed_ref.type.dyn_trait.traits[*]" 1 +// @is "$.index[*][?(@.name=='dynfn')].inner.function.decl.inputs[0][1].borrowed_ref.type.dyn_trait.traits[0].generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''a"},{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]' +// @is "$.index[*][?(@.name=='dynfn')].inner.function.decl.inputs[0][1].borrowed_ref.type.dyn_trait.traits[0].trait.name" '"Fn"' pub fn dynfn(f: &dyn for<'a, 'b> Fn(&'a i32, &'b i32)) { let zero = 0; f(&zero, &zero); diff --git a/tests/rustdoc-json/type/inherent_associated_type.rs b/tests/rustdoc-json/type/inherent_associated_type.rs index ed63def93df0c..64c6c53ce4721 100644 --- a/tests/rustdoc-json/type/inherent_associated_type.rs +++ b/tests/rustdoc-json/type/inherent_associated_type.rs @@ -12,11 +12,9 @@ pub struct Owner; pub fn create() -> Owner::Metadata { OwnerMetadata } -// @is '$.index[*][?(@.name=="create")].inner.decl.output.kind' '"qualified_path"' -// @is '$.index[*][?(@.name=="create")].inner.decl.output.inner.name' '"Metadata"' -// @is '$.index[*][?(@.name=="create")].inner.decl.output.inner.trait' null -// @is '$.index[*][?(@.name=="create")].inner.decl.output.inner.self_type.kind' '"resolved_path"' -// @is '$.index[*][?(@.name=="create")].inner.decl.output.inner.self_type.inner.id' $Owner +// @is '$.index[*][?(@.name=="create")].inner.function.decl.output.qualified_path.name' '"Metadata"' +// @is '$.index[*][?(@.name=="create")].inner.function.decl.output.qualified_path.trait' null +// @is '$.index[*][?(@.name=="create")].inner.function.decl.output.qualified_path.self_type.resolved_path.id' $Owner /// impl impl Owner { @@ -24,6 +22,5 @@ impl Owner { pub type Metadata = OwnerMetadata; } // @set iat = '$.index[*][?(@.docs=="iat")].id' -// @is '$.index[*][?(@.docs=="impl")].inner.items[*]' $iat -// @is '$.index[*][?(@.docs=="iat")].kind' '"assoc_type"' -// @is '$.index[*][?(@.docs=="iat")].inner.default.inner.id' $OwnerMetadata +// @is '$.index[*][?(@.docs=="impl")].inner.impl.items[*]' $iat +// @is '$.index[*][?(@.docs=="iat")].inner.assoc_type.default.resolved_path.id' $OwnerMetadata diff --git a/tests/rustdoc-json/type/inherent_associated_type_bound.rs b/tests/rustdoc-json/type/inherent_associated_type_bound.rs index a089600b692d6..2e9b13d0cac23 100644 --- a/tests/rustdoc-json/type/inherent_associated_type_bound.rs +++ b/tests/rustdoc-json/type/inherent_associated_type_bound.rs @@ -5,14 +5,12 @@ // @set Carrier = '$.index[*][?(@.name=="Carrier")].id' pub struct Carrier<'a>(&'a ()); -// @is '$.index[*][?(@.name=="User")].inner.type.kind' '"function_pointer"' -// @is '$.index[*][?(@.name=="User")].inner.type.inner.generic_params[*].name' \""'b"\" -// @is '$.index[*][?(@.name=="User")].inner.type.inner.decl.inputs[0][1].kind' '"qualified_path"' -// @is '$.index[*][?(@.name=="User")].inner.type.inner.decl.inputs[0][1].inner.self_type.inner.id' $Carrier -// @is '$.index[*][?(@.name=="User")].inner.type.inner.decl.inputs[0][1].inner.self_type.inner.args.angle_bracketed.args[0].lifetime' \""'b"\" -// @is '$.index[*][?(@.name=="User")].inner.type.inner.decl.inputs[0][1].inner.name' '"Focus"' -// @is '$.index[*][?(@.name=="User")].inner.type.inner.decl.inputs[0][1].inner.trait' null -// @is '$.index[*][?(@.name=="User")].inner.type.inner.decl.inputs[0][1].inner.args.angle_bracketed.args[0].type.inner' '"i32"' +// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.generic_params[*].name' \""'b"\" +// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.self_type.resolved_path.id' $Carrier +// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.self_type.resolved_path.args.angle_bracketed.args[0].lifetime' \""'b"\" +// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.name' '"Focus"' +// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.trait' null +// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.args.angle_bracketed.args[0].type.primitive' '"i32"' pub type User = for<'b> fn(Carrier<'b>::Focus); diff --git a/tests/rustdoc-json/type/inherent_associated_type_projections.rs b/tests/rustdoc-json/type/inherent_associated_type_projections.rs index 30c68bfe56c91..942e323efca3e 100644 --- a/tests/rustdoc-json/type/inherent_associated_type_projections.rs +++ b/tests/rustdoc-json/type/inherent_associated_type_projections.rs @@ -5,11 +5,10 @@ // @set Parametrized = '$.index[*][?(@.name=="Parametrized")].id' pub struct Parametrized(T); -// @is '$.index[*][?(@.name=="Test")].inner.type.kind' '"qualified_path"' -// @is '$.index[*][?(@.name=="Test")].inner.type.inner.self_type.inner.id' $Parametrized -// @is '$.index[*][?(@.name=="Test")].inner.type.inner.self_type.inner.args.angle_bracketed.args[0].type' '{"inner": "i32", "kind": "primitive"}' -// @is '$.index[*][?(@.name=="Test")].inner.type.inner.name' '"Proj"' -// @is '$.index[*][?(@.name=="Test")].inner.type.inner.trait' null +// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.self_type.resolved_path.id' $Parametrized +// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.self_type.resolved_path.args.angle_bracketed.args[0].type.primitive' \"i32\" +// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.name' '"Proj"' +// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.trait' null pub type Test = Parametrized::Proj; /// param_bool @@ -29,5 +28,5 @@ impl Parametrized { // @set param_bool_proj = '$.index[*][?(@.docs=="param_bool_proj")].id' // @set param_i32_proj = '$.index[*][?(@.docs=="param_i32_proj")].id' -// @is '$.index[*][?(@.docs=="param_bool")].inner.items[*]' $param_bool_proj -// @is '$.index[*][?(@.docs=="param_i32")].inner.items[*]' $param_i32_proj +// @is '$.index[*][?(@.docs=="param_bool")].inner.impl.items[*]' $param_bool_proj +// @is '$.index[*][?(@.docs=="param_i32")].inner.impl.items[*]' $param_i32_proj diff --git a/tests/rustdoc-json/unions/impl.rs b/tests/rustdoc-json/unions/impl.rs index 4454a69ecd1bf..7456892df1bb2 100644 --- a/tests/rustdoc-json/unions/impl.rs +++ b/tests/rustdoc-json/unions/impl.rs @@ -1,15 +1,15 @@ #![no_std] // @is "$.index[*][?(@.name=='Ux')].visibility" \"public\" -// @is "$.index[*][?(@.name=='Ux')].kind" \"union\" +// @has "$.index[*][?(@.name=='Ux')].inner.union" pub union Ux { a: u32, b: u64 } // @is "$.index[*][?(@.name=='Num')].visibility" \"public\" -// @is "$.index[*][?(@.name=='Num')].kind" \"trait\" +// @has "$.index[*][?(@.name=='Num')].inner.trait" pub trait Num {} -// @count "$.index[*][?(@.name=='Ux')].inner.impls" 1 +// @count "$.index[*][?(@.name=='Ux')].inner.union.impls" 1 impl Num for Ux {} diff --git a/tests/rustdoc-json/unions/union.rs b/tests/rustdoc-json/unions/union.rs index c9df2b81c4b0f..22b70e1ce8c50 100644 --- a/tests/rustdoc-json/unions/union.rs +++ b/tests/rustdoc-json/unions/union.rs @@ -1,6 +1,6 @@ // @has "$.index[*][?(@.name=='Union')].visibility" \"public\" -// @has "$.index[*][?(@.name=='Union')].kind" \"union\" -// @!has "$.index[*][?(@.name=='Union')].inner.struct_type" +// @has "$.index[*][?(@.name=='Union')].inner.union" +// @!has "$.index[*][?(@.name=='Union')].inner.union.struct_type" // @set Union = "$.index[*][?(@.name=='Union')].id" pub union Union { int: i32, @@ -8,8 +8,8 @@ pub union Union { } -// @is "$.index[*][?(@.name=='make_int_union')].inner.decl.output.kind" '"resolved_path"' -// @is "$.index[*][?(@.name=='make_int_union')].inner.decl.output.inner.id" $Union +// @has "$.index[*][?(@.name=='make_int_union')].inner.function.decl.output.resolved_path" +// @is "$.index[*][?(@.name=='make_int_union')].inner.function.decl.output.resolved_path.id" $Union pub fn make_int_union(int: i32) -> Union { Union { int } } From cd7688bd30ccd5a8c6748301441d9b4d10603de6 Mon Sep 17 00:00:00 2001 From: Luca Palmieri <20745048+LukeMathWalker@users.noreply.github.com> Date: Mon, 22 May 2023 18:26:20 +0100 Subject: [PATCH 05/10] Verify that `ItemEnum` can be serialized and then deserialized using bincode --- Cargo.lock | 10 ++++++++++ src/rustdoc-json-types/Cargo.toml | 1 + src/rustdoc-json-types/tests.rs | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04c804d19a4f2..b003916b03d63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,6 +246,15 @@ dependencies = [ "serde", ] +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -4351,6 +4360,7 @@ dependencies = [ name = "rustdoc-json-types" version = "0.1.0" dependencies = [ + "bincode", "rustc-hash", "serde", "serde_json", diff --git a/src/rustdoc-json-types/Cargo.toml b/src/rustdoc-json-types/Cargo.toml index d63caa7ad7010..d3548036d4c72 100644 --- a/src/rustdoc-json-types/Cargo.toml +++ b/src/rustdoc-json-types/Cargo.toml @@ -12,3 +12,4 @@ rustc-hash = "1.1.0" [dev-dependencies] serde_json = "1.0" +bincode = "1" diff --git a/src/rustdoc-json-types/tests.rs b/src/rustdoc-json-types/tests.rs index 399ff54b29497..1126d5f786f4d 100644 --- a/src/rustdoc-json-types/tests.rs +++ b/src/rustdoc-json-types/tests.rs @@ -8,11 +8,15 @@ fn test_struct_info_roundtrip() { impls: vec![], }); + // JSON let struct_json = serde_json::to_string(&s).unwrap(); - let de_s = serde_json::from_str(&struct_json).unwrap(); - assert_eq!(s, de_s); + + // Bincode + let encoded: Vec = bincode::serialize(&s).unwrap(); + let decoded: ItemEnum = bincode::deserialize(&encoded).unwrap(); + assert_eq!(s, decoded); } #[test] @@ -24,9 +28,13 @@ fn test_union_info_roundtrip() { impls: vec![], }); + // JSON let union_json = serde_json::to_string(&u).unwrap(); - let de_u = serde_json::from_str(&union_json).unwrap(); - assert_eq!(u, de_u); + + // Bincode + let encoded: Vec = bincode::serialize(&u).unwrap(); + let decoded: ItemEnum = bincode::deserialize(&encoded).unwrap(); + assert_eq!(u, decoded); } From a2007ef15adf64f0e04e88af819e25d3c55fdeac Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Mon, 22 May 2023 11:00:43 -0700 Subject: [PATCH 06/10] Update reference --- src/doc/reference | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/doc/reference b/src/doc/reference index 47b54b5f1f66b..553d99b02a53b 160000 --- a/src/doc/reference +++ b/src/doc/reference @@ -1 +1 @@ -Subproject commit 47b54b5f1f66bd43042d3ae846bacb7a926964c0 +Subproject commit 553d99b02a53b4133a40d5bd2e19958c67487c00 From 778abc7a00dff4271b48a5cd0fa256b9c28965f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=C3=B3n=20Orell=20Valerian=20Liehr?= Date: Fri, 12 May 2023 01:36:37 +0200 Subject: [PATCH 07/10] properly pretty-print inherent projections --- .../rustc_const_eval/src/util/type_name.rs | 3 ++- compiler/rustc_middle/src/ty/print/pretty.rs | 22 ++++++++++++++++++- compiler/rustc_symbol_mangling/src/legacy.rs | 4 +++- compiler/rustc_symbol_mangling/src/v0.rs | 3 ++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_const_eval/src/util/type_name.rs b/compiler/rustc_const_eval/src/util/type_name.rs index 4e80a28518668..11ad5b49df2ef 100644 --- a/compiler/rustc_const_eval/src/util/type_name.rs +++ b/compiler/rustc_const_eval/src/util/type_name.rs @@ -58,11 +58,12 @@ impl<'tcx> Printer<'tcx> for AbsolutePathPrinter<'tcx> { // Types with identity (print the module path). ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs) | ty::FnDef(def_id, substs) - | ty::Alias(_, ty::AliasTy { def_id, substs, .. }) + | ty::Alias(ty::Projection | ty::Opaque, ty::AliasTy { def_id, substs, .. }) | ty::Closure(def_id, substs) | ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs), ty::Foreign(def_id) => self.print_def_path(def_id, &[]), + ty::Alias(ty::Inherent, _) => bug!("type_name: unexpected inherent projection"), ty::GeneratorWitness(_) => bug!("type_name: unexpected `GeneratorWitness`"), ty::GeneratorWitnessMIR(..) => bug!("type_name: unexpected `GeneratorWitnessMIR`"), } diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index a8193c3e5591f..e381c1812eda6 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -1164,6 +1164,22 @@ pub trait PrettyPrinter<'tcx>: traits.entry(trait_ref).or_default().extend(proj_ty); } + fn pretty_print_inherent_projection( + self, + alias_ty: &ty::AliasTy<'tcx>, + ) -> Result { + let def_key = self.tcx().def_key(alias_ty.def_id); + self.path_generic_args( + |cx| { + cx.path_append( + |cx| cx.path_qualified(alias_ty.self_ty(), None), + &def_key.disambiguated_data, + ) + }, + &alias_ty.substs[1..], + ) + } + fn ty_infer_name(&self, _: ty::TyVid) -> Option { None } @@ -2821,7 +2837,11 @@ define_print_and_forward_display! { } ty::AliasTy<'tcx> { - p!(print_def_path(self.def_id, self.substs)); + if let DefKind::Impl { of_trait: false } = cx.tcx().def_kind(cx.tcx().parent(self.def_id)) { + p!(pretty_print_inherent_projection(self)) + } else { + p!(print_def_path(self.def_id, self.substs)); + } } ty::ClosureKind { diff --git a/compiler/rustc_symbol_mangling/src/legacy.rs b/compiler/rustc_symbol_mangling/src/legacy.rs index a3f262905c74f..254ede4e6a00a 100644 --- a/compiler/rustc_symbol_mangling/src/legacy.rs +++ b/compiler/rustc_symbol_mangling/src/legacy.rs @@ -220,7 +220,7 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> { match *ty.kind() { // Print all nominal types as paths (unlike `pretty_print_type`). ty::FnDef(def_id, substs) - | ty::Alias(_, ty::AliasTy { def_id, substs, .. }) + | ty::Alias(ty::Projection | ty::Opaque, ty::AliasTy { def_id, substs, .. }) | ty::Closure(def_id, substs) | ty::Generator(def_id, substs, _) => self.print_def_path(def_id, substs), @@ -241,6 +241,8 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> { Ok(self) } + ty::Alias(ty::Inherent, _) => panic!("unexpected inherent projection"), + _ => self.pretty_print_type(ty), } } diff --git a/compiler/rustc_symbol_mangling/src/v0.rs b/compiler/rustc_symbol_mangling/src/v0.rs index 2235524129e62..4cccc6398927c 100644 --- a/compiler/rustc_symbol_mangling/src/v0.rs +++ b/compiler/rustc_symbol_mangling/src/v0.rs @@ -433,7 +433,7 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> { // Mangle all nominal types as paths. ty::Adt(ty::AdtDef(Interned(&ty::AdtDefData { did: def_id, .. }, _)), substs) | ty::FnDef(def_id, substs) - | ty::Alias(_, ty::AliasTy { def_id, substs, .. }) + | ty::Alias(ty::Projection | ty::Opaque, ty::AliasTy { def_id, substs, .. }) | ty::Closure(def_id, substs) | ty::Generator(def_id, substs, _) => { self = self.print_def_path(def_id, substs)?; @@ -482,6 +482,7 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> { self = r.print(self)?; } + ty::Alias(ty::Inherent, _) => bug!("symbol_names: unexpected inherent projection"), ty::GeneratorWitness(_) => bug!("symbol_names: unexpected `GeneratorWitness`"), ty::GeneratorWitnessMIR(..) => bug!("symbol_names: unexpected `GeneratorWitnessMIR`"), } From c41b2089c7a059a7ce86107b8f3528c05ca11254 Mon Sep 17 00:00:00 2001 From: bohan Date: Fri, 19 May 2023 21:12:08 +0800 Subject: [PATCH 08/10] fix(resolve): not defined `extern crate shadow_name` --- compiler/rustc_resolve/src/build_reduced_graph.rs | 5 +++++ compiler/rustc_resolve/src/lib.rs | 2 +- tests/ui/imports/issue-109148.rs | 15 +++++++++++++++ tests/ui/imports/issue-109148.stderr | 13 +++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tests/ui/imports/issue-109148.rs create mode 100644 tests/ui/imports/issue-109148.stderr diff --git a/compiler/rustc_resolve/src/build_reduced_graph.rs b/compiler/rustc_resolve/src/build_reduced_graph.rs index 08b73ebb69470..b3d0e4ba25894 100644 --- a/compiler/rustc_resolve/src/build_reduced_graph.rs +++ b/compiler/rustc_resolve/src/build_reduced_graph.rs @@ -873,6 +873,11 @@ impl<'a, 'b, 'tcx> BuildReducedGraphVisitor<'a, 'b, 'tcx> { let msg = "macro-expanded `extern crate` items cannot \ shadow names passed with `--extern`"; self.r.tcx.sess.span_err(item.span, msg); + // `return` is intended to discard this binding because it's an + // unregistered ambiguity error which would result in a panic + // caused by inconsistency `path_res` + // more details: https://github.com/rust-lang/rust/pull/111761 + return; } } let entry = self.r.extern_prelude.entry(ident.normalize_to_macros_2_0()).or_insert( diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index 3cdc3f0ecf892..1e31a0ff27824 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -106,7 +106,7 @@ impl Determinacy { /// A specific scope in which a name can be looked up. /// This enum is currently used only for early resolution (imports and macros), /// but not for late resolution yet. -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Debug)] enum Scope<'a> { DeriveHelpers(LocalExpnId), DeriveHelpersCompat, diff --git a/tests/ui/imports/issue-109148.rs b/tests/ui/imports/issue-109148.rs new file mode 100644 index 0000000000000..694cb494a15dc --- /dev/null +++ b/tests/ui/imports/issue-109148.rs @@ -0,0 +1,15 @@ +// edition: 2021 + +// https://github.com/rust-lang/rust/pull/111761#issuecomment-1557777314 +macro_rules! m { + () => { + extern crate core as std; + //~^ ERROR macro-expanded `extern crate` items cannot shadow names passed with `--extern` + } +} + +m!(); + +use std::mem; + +fn main() {} diff --git a/tests/ui/imports/issue-109148.stderr b/tests/ui/imports/issue-109148.stderr new file mode 100644 index 0000000000000..6cc1221cfe993 --- /dev/null +++ b/tests/ui/imports/issue-109148.stderr @@ -0,0 +1,13 @@ +error: macro-expanded `extern crate` items cannot shadow names passed with `--extern` + --> $DIR/issue-109148.rs:6:9 + | +LL | extern crate core as std; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | m!(); + | ---- in this macro invocation + | + = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + From 24be25f134ecadbcb235a46d76a37ffcbce15ce5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 23 May 2023 15:26:59 +0200 Subject: [PATCH 09/10] Migrate GUI colors test to original CSS color format --- tests/rustdoc-gui/jump-to-def-background.goml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/rustdoc-gui/jump-to-def-background.goml b/tests/rustdoc-gui/jump-to-def-background.goml index 3a7d48284d7c8..6adc36b0edb1c 100644 --- a/tests/rustdoc-gui/jump-to-def-background.goml +++ b/tests/rustdoc-gui/jump-to-def-background.goml @@ -17,6 +17,6 @@ define-function: ( }, ) -call-function: ("check-background-color", ("ayu", "rgb(51, 51, 51)")) -call-function: ("check-background-color", ("dark", "rgb(51, 51, 51)")) -call-function: ("check-background-color", ("light", "rgb(238, 238, 238)")) +call-function: ("check-background-color", ("ayu", "#333")) +call-function: ("check-background-color", ("dark", "#333")) +call-function: ("check-background-color", ("light", "#eee")) From 9bbdfea23cb14a8e8c68ad3728304a6e7926185e Mon Sep 17 00:00:00 2001 From: Ramon de C Valle Date: Mon, 22 May 2023 22:51:03 +0000 Subject: [PATCH 10/10] CFI: Fix encode_region: unexpected ReEarlyBound(0, 'a) Fixes #111515 and complements #106547 by adding support for encoding early bound regions and also excluding projections when transforming trait objects' traits into their identities before emitting type checks. --- .../src/typeid/typeid_itanium_cxx_abi.rs | 14 ++++----- ...i-emit-type-metadata-id-itanium-cxx-abi.rs | 18 +++++------ ...er-cfi-emit-type-metadata-trait-objects.rs | 31 +++++++++++++++++++ ...r-kcfi-emit-type-metadata-trait-objects.rs | 31 +++++++++++++++++++ 4 files changed, 78 insertions(+), 16 deletions(-) diff --git a/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs b/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs index 51d508a580b92..da8a16dee8ac7 100644 --- a/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs +++ b/compiler/rustc_symbol_mangling/src/typeid/typeid_itanium_cxx_abi.rs @@ -272,12 +272,11 @@ fn encode_region<'tcx>( s.push('E'); compress(dict, DictKey::Region(region), &mut s); } - RegionKind::ReErased => { + RegionKind::ReEarlyBound(..) | RegionKind::ReErased => { s.push_str("u6region"); compress(dict, DictKey::Region(region), &mut s); } - RegionKind::ReEarlyBound(..) - | RegionKind::ReFree(..) + RegionKind::ReFree(..) | RegionKind::ReStatic | RegionKind::ReError(_) | RegionKind::ReVar(..) @@ -704,14 +703,15 @@ fn transform_predicates<'tcx>( ) -> &'tcx List> { let predicates: Vec> = predicates .iter() - .map(|predicate| match predicate.skip_binder() { + .filter_map(|predicate| match predicate.skip_binder() { ty::ExistentialPredicate::Trait(trait_ref) => { let trait_ref = ty::TraitRef::identity(tcx, trait_ref.def_id); - ty::Binder::dummy(ty::ExistentialPredicate::Trait( + Some(ty::Binder::dummy(ty::ExistentialPredicate::Trait( ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref), - )) + ))) } - _ => predicate, + ty::ExistentialPredicate::Projection(..) => None, + ty::ExistentialPredicate::AutoTrait(..) => Some(predicate), }) .collect(); tcx.mk_poly_existential_predicates(&predicates) diff --git a/tests/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs b/tests/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs index 3aa16d9f64550..ebb26cd35c09c 100644 --- a/tests/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs +++ b/tests/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs @@ -536,15 +536,15 @@ pub fn foo149(_: Type14, _: Type14, _: Type14) { } // CHECK: ![[TYPE93]] = !{i64 0, !"_ZTSFvPFu3i32S_EE"} // CHECK: ![[TYPE94]] = !{i64 0, !"_ZTSFvPFu3i32S_ES0_E"} // CHECK: ![[TYPE95]] = !{i64 0, !"_ZTSFvPFu3i32S_ES0_S0_E"} -// CHECK: ![[TYPE96]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEEE"} -// CHECK: ![[TYPE97]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEES6_E"} -// CHECK: ![[TYPE98]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEES6_S6_E"} -// CHECK: ![[TYPE99]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEEE"} -// CHECK: ![[TYPE100]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEES6_E"} -// CHECK: ![[TYPE101]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEES6_S6_E"} -// CHECK: ![[TYPE102]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEEE"} -// CHECK: ![[TYPE103]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEES6_E"} -// CHECK: ![[TYPE104]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5paramEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIu5tupleIu3i32EES1_u6regionEES6_S6_E"} +// CHECK: ![[TYPE96]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5paramEu6regionEEE"} +// CHECK: ![[TYPE97]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5paramEu6regionEES3_E"} +// CHECK: ![[TYPE98]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5paramEu6regionEES3_S3_E"} +// CHECK: ![[TYPE99]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5paramEu6regionEEE"} +// CHECK: ![[TYPE100]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5paramEu6regionEES3_E"} +// CHECK: ![[TYPE101]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5paramEu6regionEES3_S3_E"} +// CHECK: ![[TYPE102]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5paramEu6regionEEE"} +// CHECK: ![[TYPE103]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5paramEu6regionEES3_E"} +// CHECK: ![[TYPE104]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5paramEu6regionEES3_S3_E"} // CHECK: ![[TYPE105]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtC{{[[:print:]]+}}_4core6marker4Sendu6regionEEE"} // CHECK: ![[TYPE106]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtC{{[[:print:]]+}}_4core6marker4Sendu6regionEES2_E"} // CHECK: ![[TYPE107]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtC{{[[:print:]]+}}_4core6marker4Sendu6regionEES2_S2_E"} diff --git a/tests/codegen/sanitizer-cfi-emit-type-metadata-trait-objects.rs b/tests/codegen/sanitizer-cfi-emit-type-metadata-trait-objects.rs index 18914049a103d..0f79adab7bd6a 100644 --- a/tests/codegen/sanitizer-cfi-emit-type-metadata-trait-objects.rs +++ b/tests/codegen/sanitizer-cfi-emit-type-metadata-trait-objects.rs @@ -39,6 +39,20 @@ impl Trait3 for T { } } +pub trait Trait4<'a, T> { + type Output: 'a; + fn qux(&self, _: &T) -> Self::Output; +} + +pub struct Type4; + +impl<'a, T, U> Trait4<'a, U> for T { + type Output = &'a i32; + fn qux(&self, _: &U) -> Self::Output { + &0 + } +} + pub fn foo1(a: &dyn Trait1) { a.foo(); // CHECK-LABEL: define{{.*}}4foo1{{.*}}!type !{{[0-9]+}} @@ -84,6 +98,23 @@ pub fn bar3() { // CHECK: call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%[0-9]}}, metadata !"[[TYPE3:[[:print:]]+]]") } +pub fn foo4<'a>(a: &dyn Trait4<'a, Type4, Output = &'a i32>) { + let b = Type4; + a.qux(&b); + // CHECK-LABEL: define{{.*}}4foo4{{.*}}!type !{{[0-9]+}} + // CHECK: call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%[0-9]}}, metadata !"[[TYPE4:[[:print:]]+]]") +} + +pub fn bar4<'a>() { + let a = Type4; + foo4(&a); + let b = &a as &dyn Trait4<'a, Type4, Output = &'a i32>; + b.qux(&a); + // CHECK-LABEL: define{{.*}}4bar4{{.*}}!type !{{[0-9]+}} + // CHECK: call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%[0-9]}}, metadata !"[[TYPE4:[[:print:]]+]]") +} + // CHECK: !{{[0-9]+}} = !{i64 0, !"[[TYPE1]]"} // CHECK: !{{[0-9]+}} = !{i64 0, !"[[TYPE2]]"} // CHECK: !{{[0-9]+}} = !{i64 0, !"[[TYPE3]]"} +// CHECK: !{{[0-9]+}} = !{i64 0, !"[[TYPE4]]"} diff --git a/tests/codegen/sanitizer-kcfi-emit-type-metadata-trait-objects.rs b/tests/codegen/sanitizer-kcfi-emit-type-metadata-trait-objects.rs index a46f09556966f..004a67e7df2ee 100644 --- a/tests/codegen/sanitizer-kcfi-emit-type-metadata-trait-objects.rs +++ b/tests/codegen/sanitizer-kcfi-emit-type-metadata-trait-objects.rs @@ -63,6 +63,20 @@ impl Trait3 for T { } } +pub trait Trait4<'a, T> { + type Output: 'a; + fn qux(&self, _: &T) -> Self::Output; +} + +pub struct Type4; + +impl<'a, T, U> Trait4<'a, U> for T { + type Output = &'a i32; + fn qux(&self, _: &U) -> Self::Output { + &0 + } +} + pub fn foo1(a: &dyn Trait1) { a.foo(); // CHECK-LABEL: define{{.*}}4foo1{{.*}}!{{|kcfi_type}} !{{[0-9]+}} @@ -108,6 +122,23 @@ pub fn bar3() { // CHECK: call void %{{[0-9]}}({{\{\}\*|ptr}} align 1 {{%[a-z]\.0|%_[0-9]}}, {{\{\}\*|ptr|%Type3\*}} align 1 {{%[a-z]\.0|%_[0-9]}}){{.*}}[ "kcfi"(i32 [[TYPE3:[[:print:]]+]]) ] } +pub fn foo4<'a>(a: &dyn Trait4<'a, Type4, Output = &'a i32>) { + let b = Type4; + a.qux(&b); + // CHECK-LABEL: define{{.*}}4foo4{{.*}}!{{|kcfi_type}} !{{[0-9]+}} + // CHECK: call align 4 {{ptr|i32\*}} %{{[0-9]}}({{\{\}\*|ptr}} align 1 {{%[a-z]\.0|%_[0-9]}}, {{\{\}\*|ptr|%Type4\*}} align 1 {{%[a-z]\.0|%_[0-9]}}){{.*}}[ "kcfi"(i32 [[TYPE4:[[:print:]]+]]) ] +} + +pub fn bar4<'a>() { + let a = Type4; + foo4(&a); + let b = &a as &dyn Trait4<'a, Type4, Output = &'a i32>; + b.qux(&a); + // CHECK-LABEL: define{{.*}}4bar4{{.*}}!{{|kcfi_type}} !{{[0-9]+}} + // CHECK: call align 4 {{ptr|i32\*}} %{{[0-9]}}({{\{\}\*|ptr}} align 1 {{%[a-z]\.0|%_[0-9]}}, {{\{\}\*|ptr|%Type4\*}} align 1 {{%[a-z]\.0|%_[0-9]}}){{.*}}[ "kcfi"(i32 [[TYPE4:[[:print:]]+]]) ] +} + // CHECK: !{{[0-9]+}} = !{i32 [[TYPE1]]} // CHECK: !{{[0-9]+}} = !{i32 [[TYPE2]]} // CHECK: !{{[0-9]+}} = !{i32 [[TYPE3]]} +// CHECK: !{{[0-9]+}} = !{i32 [[TYPE4]]}