rustdoc-json: Rename Path::name
to path
, and give it path (again).
Closes https://github.com/rust-lang/rust/issues/135600 Effectivly reverts https://github.com/rust-lang/rust/pull/134880
This commit is contained in:
parent
9f4d9dc102
commit
9c0e32bcd2
12 changed files with 125 additions and 26 deletions
|
@ -622,7 +622,7 @@ impl FromClean<clean::Type> for Type {
|
|||
impl FromClean<clean::Path> for Path {
|
||||
fn from_clean(path: clean::Path, renderer: &JsonRenderer<'_>) -> Path {
|
||||
Path {
|
||||
name: path.last_opt().map_or(String::from(""), |s| String::from(s.as_str())),
|
||||
path: path.whole_name(),
|
||||
id: renderer.id_from_item_default(path.def_id().into()),
|
||||
args: path.segments.last().map(|args| Box::new(args.clone().args.into_json(renderer))),
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ pub type FxHashMap<K, V> = HashMap<K, V>; // re-export for use in src/librustdoc
|
|||
/// This integer is incremented with every breaking change to the API,
|
||||
/// and is returned along with the JSON blob as [`Crate::format_version`].
|
||||
/// Consuming code should assert that this value matches the format version(s) that it supports.
|
||||
pub const FORMAT_VERSION: u32 = 38;
|
||||
pub const FORMAT_VERSION: u32 = 39;
|
||||
|
||||
/// The root of the emitted JSON blob.
|
||||
///
|
||||
|
@ -1036,16 +1036,20 @@ pub enum Type {
|
|||
/// A type that has a simple path to it. This is the kind of type of structs, unions, enums, etc.
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
||||
pub struct Path {
|
||||
/// The name of the type as declared, e.g. in
|
||||
/// The path of the type.
|
||||
///
|
||||
/// This will be the path that is *used* (not where it is defined), so
|
||||
/// multiple `Path`s may have different values for this field even if
|
||||
/// they all refer to the same item. e.g.
|
||||
///
|
||||
/// ```rust
|
||||
/// mod foo {
|
||||
/// struct Bar;
|
||||
/// }
|
||||
/// pub type Vec1 = std::vec::Vec<i32>; // path: "std::vec::Vec"
|
||||
/// pub type Vec2 = Vec<i32>; // path: "Vec"
|
||||
/// pub type Vec3 = std::prelude::v1::Vec<i32>; // path: "std::prelude::v1::Vec"
|
||||
/// ```
|
||||
///
|
||||
/// for `foo::Bar`, this field will be `Bar`.
|
||||
pub name: String,
|
||||
//
|
||||
// Example tested in ./tests/rustdoc-json/path_name.rs
|
||||
pub path: String,
|
||||
/// The ID of the type.
|
||||
pub id: Id,
|
||||
/// Generic arguments to the type.
|
||||
|
|
|
@ -163,7 +163,7 @@ fn errors_on_missing_path() {
|
|||
sig: FunctionSignature {
|
||||
inputs: vec![],
|
||||
output: Some(Type::ResolvedPath(Path {
|
||||
name: "Bar".to_owned(),
|
||||
path: "Bar".to_owned(),
|
||||
id: Id(1),
|
||||
args: None,
|
||||
})),
|
||||
|
@ -191,7 +191,7 @@ fn errors_on_missing_path() {
|
|||
|
||||
check(&krate, &[Error {
|
||||
kind: ErrorKind::Custom(
|
||||
r#"No entry in '$.paths' for Path { name: "Bar", id: Id(1), args: None }"#.to_owned(),
|
||||
r#"No entry in '$.paths' for Path { path: "Bar", id: Id(1), args: None }"#.to_owned(),
|
||||
),
|
||||
id: Id(1),
|
||||
}]);
|
||||
|
|
10
tests/rustdoc-json/auxiliary/defines_and_reexports.rs
Normal file
10
tests/rustdoc-json/auxiliary/defines_and_reexports.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
pub mod m1 {
|
||||
pub struct InPubMod;
|
||||
}
|
||||
|
||||
mod m2 {
|
||||
pub struct InPrivMod;
|
||||
}
|
||||
|
||||
pub use m1::{InPubMod, InPubMod as InPubMod2};
|
||||
pub use m2::{InPrivMod, InPrivMod as InPrivMod2};
|
|
@ -4,5 +4,5 @@
|
|||
|
||||
//@ has "$.index[*][?(@.name=='Error')].inner.assoc_type"
|
||||
//@ has "$.index[*][?(@.name=='Error')].inner.assoc_type.type.resolved_path"
|
||||
//@ has "$.index[*][?(@.name=='Error')].inner.assoc_type.type.resolved_path.name" \"Infallible\"
|
||||
//@ has "$.index[*][?(@.name=='Error')].inner.assoc_type.type.resolved_path.path" \"Infallible\"
|
||||
pub struct ForBlanketTryFromImpl;
|
||||
|
|
|
@ -17,7 +17,7 @@ pub async fn get_int_async() -> i32 {
|
|||
42
|
||||
}
|
||||
|
||||
//@ is "$.index[*][?(@.name=='get_int_future')].inner.function.sig.output.impl_trait[0].trait_bound.trait.name" '"Future"'
|
||||
//@ is "$.index[*][?(@.name=='get_int_future')].inner.function.sig.output.impl_trait[0].trait_bound.trait.path" '"Future"'
|
||||
//@ is "$.index[*][?(@.name=='get_int_future')].inner.function.sig.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[0].name" '"Output"'
|
||||
//@ is "$.index[*][?(@.name=='get_int_future')].inner.function.sig.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[0].binding.equality.type.primitive" \"i32\"
|
||||
//@ is "$.index[*][?(@.name=='get_int_future')].inner.function.header.is_async" false
|
||||
|
@ -25,7 +25,7 @@ pub fn get_int_future() -> impl Future<Output = i32> {
|
|||
async { 42 }
|
||||
}
|
||||
|
||||
//@ is "$.index[*][?(@.name=='get_int_future_async')].inner.function.sig.output.impl_trait[0].trait_bound.trait.name" '"Future"'
|
||||
//@ is "$.index[*][?(@.name=='get_int_future_async')].inner.function.sig.output.impl_trait[0].trait_bound.trait.path" '"Future"'
|
||||
//@ is "$.index[*][?(@.name=='get_int_future_async')].inner.function.sig.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[0].name" '"Output"'
|
||||
//@ is "$.index[*][?(@.name=='get_int_future_async')].inner.function.sig.output.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[0].binding.equality.type.primitive" \"i32\"
|
||||
//@ is "$.index[*][?(@.name=='get_int_future_async')].inner.function.header.is_async" true
|
||||
|
|
|
@ -10,7 +10,7 @@ impl IntoIterator for AlwaysTrue {
|
|||
type Item = bool;
|
||||
|
||||
//@ count '$.index[*][?(@.docs=="type IntoIter")].inner.assoc_type.type.impl_trait[*]' 1
|
||||
//@ is '$.index[*][?(@.docs=="type IntoIter")].inner.assoc_type.type.impl_trait[0].trait_bound.trait.name' '"Iterator"'
|
||||
//@ is '$.index[*][?(@.docs=="type IntoIter")].inner.assoc_type.type.impl_trait[0].trait_bound.trait.path' '"Iterator"'
|
||||
//@ count '$.index[*][?(@.docs=="type IntoIter")].inner.assoc_type.type.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[*]' 1
|
||||
//@ is '$.index[*][?(@.docs=="type IntoIter")].inner.assoc_type.type.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[0].name' '"Item"'
|
||||
//@ is '$.index[*][?(@.docs=="type IntoIter")].inner.assoc_type.type.impl_trait[0].trait_bound.trait.args.angle_bracketed.constraints[0].binding.equality.type.primitive' '"bool"'
|
||||
|
|
83
tests/rustdoc-json/path_name.rs
Normal file
83
tests/rustdoc-json/path_name.rs
Normal file
|
@ -0,0 +1,83 @@
|
|||
// Test for the Path::name field within a single crate.
|
||||
//
|
||||
// See https://github.com/rust-lang/rust/issues/135600
|
||||
// and https://github.com/rust-lang/rust/pull/134880#issuecomment-2596386111
|
||||
//
|
||||
// ignore-tidy-linelength
|
||||
//@ aux-build: defines_and_reexports.rs
|
||||
extern crate defines_and_reexports;
|
||||
|
||||
mod priv_mod {
|
||||
pub struct InPrivMod;
|
||||
}
|
||||
|
||||
pub mod pub_mod {
|
||||
pub struct InPubMod;
|
||||
}
|
||||
|
||||
use priv_mod::InPrivMod as InPrivMod3;
|
||||
pub use priv_mod::{InPrivMod, InPrivMod as InPrivMod2};
|
||||
use pub_mod::InPubMod as InPubMod3;
|
||||
pub use pub_mod::{InPubMod, InPubMod as InPubMod2};
|
||||
|
||||
//@ is "$.index[*][?(@.name=='T0')].inner.type_alias.type.resolved_path.path" '"priv_mod::InPrivMod"'
|
||||
pub type T0 = priv_mod::InPrivMod;
|
||||
//@ is "$.index[*][?(@.name=='T1')].inner.type_alias.type.resolved_path.path" '"InPrivMod"'
|
||||
pub type T1 = InPrivMod;
|
||||
//@ is "$.index[*][?(@.name=='T2')].inner.type_alias.type.resolved_path.path" '"InPrivMod2"'
|
||||
pub type T2 = InPrivMod2;
|
||||
//@ is "$.index[*][?(@.name=='T3')].inner.type_alias.type.resolved_path.path" '"priv_mod::InPrivMod"'
|
||||
pub type T3 = InPrivMod3;
|
||||
|
||||
//@ is "$.index[*][?(@.name=='U0')].inner.type_alias.type.resolved_path.path" '"pub_mod::InPubMod"'
|
||||
pub type U0 = pub_mod::InPubMod;
|
||||
//@ is "$.index[*][?(@.name=='U1')].inner.type_alias.type.resolved_path.path" '"InPubMod"'
|
||||
pub type U1 = InPubMod;
|
||||
//@ is "$.index[*][?(@.name=='U2')].inner.type_alias.type.resolved_path.path" '"InPubMod2"'
|
||||
pub type U2 = InPubMod2;
|
||||
//@ is "$.index[*][?(@.name=='U3')].inner.type_alias.type.resolved_path.path" '"pub_mod::InPubMod"'
|
||||
pub type U3 = InPubMod3;
|
||||
|
||||
// Check we only have paths for structs at their original path
|
||||
//@ ismany "$.paths[*][?(@.crate_id==0 && @.kind=='struct')].path" '["path_name", "priv_mod", "InPrivMod"]' '["path_name", "pub_mod", "InPubMod"]'
|
||||
|
||||
pub use defines_and_reexports::{InPrivMod as XPrivMod, InPubMod as XPubMod};
|
||||
use defines_and_reexports::{InPrivMod as XPrivMod2, InPubMod as XPubMod2};
|
||||
|
||||
//@ is "$.index[*][?(@.name=='X0')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::m1::InPubMod"'
|
||||
pub type X0 = defines_and_reexports::m1::InPubMod;
|
||||
//@ is "$.index[*][?(@.name=='X1')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::InPubMod"'
|
||||
pub type X1 = defines_and_reexports::InPubMod;
|
||||
//@ is "$.index[*][?(@.name=='X2')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::InPubMod2"'
|
||||
pub type X2 = defines_and_reexports::InPubMod2;
|
||||
//@ is "$.index[*][?(@.name=='X3')].inner.type_alias.type.resolved_path.path" '"XPubMod"'
|
||||
pub type X3 = XPubMod;
|
||||
// N.B. This isn't the path as used *or* the original path!
|
||||
//@ is "$.index[*][?(@.name=='X4')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::InPubMod"'
|
||||
pub type X4 = XPubMod2;
|
||||
|
||||
//@ is "$.index[*][?(@.name=='Y1')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::InPrivMod"'
|
||||
pub type Y1 = defines_and_reexports::InPrivMod;
|
||||
//@ is "$.index[*][?(@.name=='Y2')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::InPrivMod2"'
|
||||
pub type Y2 = defines_and_reexports::InPrivMod2;
|
||||
//@ is "$.index[*][?(@.name=='Y3')].inner.type_alias.type.resolved_path.path" '"XPrivMod"'
|
||||
pub type Y3 = XPrivMod;
|
||||
//@ is "$.index[*][?(@.name=='Y4')].inner.type_alias.type.resolved_path.path" '"defines_and_reexports::InPrivMod"'
|
||||
pub type Y4 = XPrivMod2;
|
||||
|
||||
// For foreign items, $.paths contains the *origional* path, even if it's not publicly
|
||||
// assessable. This should probably be changed.
|
||||
|
||||
//@ has "$.paths[*].path" '["defines_and_reexports", "m1", "InPubMod"]'
|
||||
//@ has "$.paths[*].path" '["defines_and_reexports", "m2", "InPrivMod"]'
|
||||
//@ !has "$.paths[*].path" '["defines_and_reexports", "InPubMod"]'
|
||||
//@ !has "$.paths[*].path" '["defines_and_reexports", "InPrivMod"]'
|
||||
|
||||
// Tests for the example in the docs of Path::name.
|
||||
// If these change, chage the docs.
|
||||
//@ is "$.index[*][?(@.name=='Vec1')].inner.type_alias.type.resolved_path.path" '"std::vec::Vec"'
|
||||
pub type Vec1 = std::vec::Vec<i32>;
|
||||
//@ is "$.index[*][?(@.name=='Vec2')].inner.type_alias.type.resolved_path.path" '"Vec"'
|
||||
pub type Vec2 = Vec<i32>;
|
||||
//@ is "$.index[*][?(@.name=='Vec3')].inner.type_alias.type.resolved_path.path" '"std::prelude::v1::Vec"'
|
||||
pub type Vec3 = std::prelude::v1::Vec<i32>;
|
|
@ -2,11 +2,13 @@
|
|||
// ignore-tidy-linelength
|
||||
|
||||
mod secret {
|
||||
//@ set struct_secret = "$.index[*][?(@.name == 'Secret' && @.inner.struct)].id"
|
||||
pub struct Secret;
|
||||
}
|
||||
|
||||
//@ has "$.index[*][?(@.name=='get_secret')].inner.function"
|
||||
//@ is "$.index[*][?(@.name=='get_secret')].inner.function.sig.output.resolved_path.name" \"Secret\"
|
||||
//@ is "$.index[*][?(@.name=='get_secret')].inner.function.sig.output.resolved_path.path" '"secret::Secret"'
|
||||
//@ is "$.index[*][?(@.name=='get_secret')].inner.function.sig.output.resolved_path.id" $struct_secret
|
||||
pub fn get_secret() -> secret::Secret {
|
||||
secret::Secret
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@ use std::fmt::Debug;
|
|||
//@ has "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias"
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.generics" '{"params": [], "where_predicates": []}'
|
||||
//@ has "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path"
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.name" \"Box\"
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.path" \"Box\"
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.constraints" []
|
||||
//@ count "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args" 1
|
||||
//@ has "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait"
|
||||
|
@ -19,9 +19,9 @@ use std::fmt::Debug;
|
|||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].generic_params" []
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].generic_params" []
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[2].generic_params" []
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.name" '"Fn"'
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].trait.name" '"Send"'
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[2].trait.name" '"Sync"'
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.path" '"Fn"'
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].trait.path" '"Send"'
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[2].trait.path" '"Sync"'
|
||||
//@ is "$.index[*][?(@.name=='SyncIntGen')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.args" '{"parenthesized": {"inputs": [],"output": {"primitive": "i32"}}}'
|
||||
pub type SyncIntGen = Box<dyn Fn() -> i32 + Send + Sync + 'static>;
|
||||
|
||||
|
@ -34,13 +34,13 @@ pub type SyncIntGen = Box<dyn Fn() -> i32 + Send + Sync + 'static>;
|
|||
//@ is "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.lifetime" null
|
||||
//@ count "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[*]" 1
|
||||
//@ is "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[0].generic_params" '[{"kind": {"lifetime": {"outlives": []}},"name": "'\''b"}]'
|
||||
//@ is "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[0].trait.name" '"Fn"'
|
||||
//@ is "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[0].trait.path" '"Fn"'
|
||||
//@ has "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.inputs[0].borrowed_ref"
|
||||
//@ is "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.inputs[0].borrowed_ref.lifetime" "\"'b\""
|
||||
//@ has "$.index[*][?(@.name=='RefFn')].inner.type_alias.type.borrowed_ref.type.dyn_trait.traits[0].trait.args.parenthesized.output.borrowed_ref"
|
||||
//@ is "$.index[*][?(@.name=='RefFn')].inner.type_alias.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_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.name" '"Send"'
|
||||
//@ is "$.index[*][?(@.name=='WeirdOrder')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].trait.name" '"Debug"'
|
||||
//@ is "$.index[*][?(@.name=='WeirdOrder')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[0].trait.path" '"Send"'
|
||||
//@ is "$.index[*][?(@.name=='WeirdOrder')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.dyn_trait.traits[1].trait.path" '"Debug"'
|
||||
pub type WeirdOrder = Box<dyn Send + Debug>;
|
||||
|
|
|
@ -21,10 +21,10 @@ pub struct MyError {}
|
|||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.generics.params[0].kind.type.default" null
|
||||
//@ has "$.index[*][?(@.name=='MyResult')].inner.type_alias.generics.params[1].kind.type.default.resolved_path"
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.generics.params[1].kind.type.default.resolved_path.id" $my_error
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.generics.params[1].kind.type.default.resolved_path.name" \"MyError\"
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.generics.params[1].kind.type.default.resolved_path.path" \"MyError\"
|
||||
//@ has "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path"
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path.id" $result
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path.name" \"Result\"
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path.path" \"Result\"
|
||||
//@ is "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path.args.angle_bracketed.constraints" []
|
||||
//@ has "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[0].type.generic"
|
||||
//@ has "$.index[*][?(@.name=='MyResult')].inner.type_alias.type.resolved_path.args.angle_bracketed.args[1].type.generic"
|
||||
|
|
|
@ -15,7 +15,7 @@ where
|
|||
//@ is "$.index[*][?(@.name=='dynfn')].inner.function.sig.inputs[0][1].borrowed_ref.type.dyn_trait.lifetime" null
|
||||
//@ count "$.index[*][?(@.name=='dynfn')].inner.function.sig.inputs[0][1].borrowed_ref.type.dyn_trait.traits[*]" 1
|
||||
//@ is "$.index[*][?(@.name=='dynfn')].inner.function.sig.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.sig.inputs[0][1].borrowed_ref.type.dyn_trait.traits[0].trait.name" '"Fn"'
|
||||
//@ is "$.index[*][?(@.name=='dynfn')].inner.function.sig.inputs[0][1].borrowed_ref.type.dyn_trait.traits[0].trait.path" '"Fn"'
|
||||
pub fn dynfn(f: &dyn for<'a, 'b> Fn(&'a i32, &'b i32)) {
|
||||
let zero = 0;
|
||||
f(&zero, &zero);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue