diff --git a/compiler/ui_tests/reflection/const_generics_are_supported/diagnostics.dot b/compiler/ui_tests/reflection/const_generics_are_supported/diagnostics.dot index 29fd5e55d..8ff0241dc 100644 --- a/compiler/ui_tests/reflection/const_generics_are_supported/diagnostics.dot +++ b/compiler/ui_tests/reflection/const_generics_are_supported/diagnostics.dot @@ -29,15 +29,17 @@ digraph "GET / - 0" { } digraph "GET / - 1" { - 0 [ label = "0| app_e22d4bbe::character() -> app_e22d4bbe::CharConst<'a'>"] - 1 [ label = "1| app_e22d4bbe::boolean() -> app_e22d4bbe::BoolConst"] - 2 [ label = "2| app_e22d4bbe::numeric() -> app_e22d4bbe::NumericConst<8>"] - 3 [ label = "3| app_e22d4bbe::handler(app_e22d4bbe::NumericConst<8>, app_e22d4bbe::BoolConst, app_e22d4bbe::CharConst<'a'>) -> pavex::Response"] - 4 [ label = "4| ::into_response(pavex::Response) -> pavex::Response"] - 0 -> 3 [ ] - 1 -> 3 [ ] - 2 -> 3 [ ] + 0 [ label = "0| app_e22d4bbe::sized_array() -> app_e22d4bbe::SizedArray<4>"] + 1 [ label = "1| app_e22d4bbe::character() -> app_e22d4bbe::CharConst<'a'>"] + 2 [ label = "2| app_e22d4bbe::boolean() -> app_e22d4bbe::BoolConst"] + 3 [ label = "3| app_e22d4bbe::numeric() -> app_e22d4bbe::NumericConst<8>"] + 4 [ label = "4| app_e22d4bbe::handler(app_e22d4bbe::NumericConst<8>, app_e22d4bbe::BoolConst, app_e22d4bbe::CharConst<'a'>, app_e22d4bbe::SizedArray<4>) -> pavex::Response"] + 5 [ label = "5| ::into_response(pavex::Response) -> pavex::Response"] + 0 -> 4 [ ] + 1 -> 4 [ ] + 2 -> 4 [ ] 3 -> 4 [ ] + 4 -> 5 [ ] } digraph app_state { diff --git a/compiler/ui_tests/reflection/const_generics_are_supported/expectations/app.rs b/compiler/ui_tests/reflection/const_generics_are_supported/expectations/app.rs index fd8802fa6..a2421f7ed 100644 --- a/compiler/ui_tests/reflection/const_generics_are_supported/expectations/app.rs +++ b/compiler/ui_tests/reflection/const_generics_are_supported/expectations/app.rs @@ -149,11 +149,12 @@ pub mod route_1 { ::into_response(v2) } async fn handler() -> pavex::Response { - let v0 = app::character(); - let v1 = app::boolean(); - let v2 = app::numeric(); - let v3 = app::handler(v2, v1, v0); - ::into_response(v3) + let v0 = app::sized_array(); + let v1 = app::character(); + let v2 = app::boolean(); + let v3 = app::numeric(); + let v4 = app::handler(v3, v2, v1, v0); + ::into_response(v4) } struct Next0 where diff --git a/compiler/ui_tests/reflection/const_generics_are_supported/expectations/diagnostics.dot b/compiler/ui_tests/reflection/const_generics_are_supported/expectations/diagnostics.dot index dcb8e1918..7be068852 100644 --- a/compiler/ui_tests/reflection/const_generics_are_supported/expectations/diagnostics.dot +++ b/compiler/ui_tests/reflection/const_generics_are_supported/expectations/diagnostics.dot @@ -26,15 +26,17 @@ digraph "GET / - 0" { 2 -> 3 [ ] } digraph "GET / - 1" { - 0 [ label = "0| app::character() -> app::CharConst<'a'>"] - 1 [ label = "1| app::boolean() -> app::BoolConst"] - 2 [ label = "2| app::numeric() -> app::NumericConst<8>"] - 3 [ label = "3| app::handler(app::NumericConst<8>, app::BoolConst, app::CharConst<'a'>) -> pavex::Response"] - 4 [ label = "4| ::into_response(pavex::Response) -> pavex::Response"] - 0 -> 3 [ ] - 1 -> 3 [ ] - 2 -> 3 [ ] + 0 [ label = "0| app::sized_array() -> app::SizedArray<4>"] + 1 [ label = "1| app::character() -> app::CharConst<'a'>"] + 2 [ label = "2| app::boolean() -> app::BoolConst"] + 3 [ label = "3| app::numeric() -> app::NumericConst<8>"] + 4 [ label = "4| app::handler(app::NumericConst<8>, app::BoolConst, app::CharConst<'a'>, app::SizedArray<4>) -> pavex::Response"] + 5 [ label = "5| ::into_response(pavex::Response) -> pavex::Response"] + 0 -> 4 [ ] + 1 -> 4 [ ] + 2 -> 4 [ ] 3 -> 4 [ ] + 4 -> 5 [ ] } digraph app_state { 0 [ label = "0| crate::ApplicationState() -> crate::ApplicationState"] diff --git a/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/Cargo.toml b/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/Cargo.toml new file mode 100644 index 000000000..c1bcf992e --- /dev/null +++ b/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "application_e22d4bbe" +version = "0.1.0" +edition = "2021" + +[package.metadata.px.generate] +generator_type = "cargo_workspace_binary" +generator_name = "app_e22d4bbe" diff --git a/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/lib.rs b/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/lib.rs index 1ad3b68c5..5747dd55f 100644 --- a/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/lib.rs +++ b/compiler/ui_tests/reflection/const_generics_are_supported/generated_app/src/lib.rs @@ -149,11 +149,12 @@ pub mod route_1 { ::into_response(v2) } async fn handler() -> pavex::Response { - let v0 = app_e22d4bbe::character(); - let v1 = app_e22d4bbe::boolean(); - let v2 = app_e22d4bbe::numeric(); - let v3 = app_e22d4bbe::handler(v2, v1, v0); - ::into_response(v3) + let v0 = app_e22d4bbe::sized_array(); + let v1 = app_e22d4bbe::character(); + let v2 = app_e22d4bbe::boolean(); + let v3 = app_e22d4bbe::numeric(); + let v4 = app_e22d4bbe::handler(v3, v2, v1, v0); + ::into_response(v4) } struct Next0 where diff --git a/compiler/ui_tests/reflection/const_generics_are_supported/src/lib.rs b/compiler/ui_tests/reflection/const_generics_are_supported/src/lib.rs index 1c5e1db56..0a995f3a4 100644 --- a/compiler/ui_tests/reflection/const_generics_are_supported/src/lib.rs +++ b/compiler/ui_tests/reflection/const_generics_are_supported/src/lib.rs @@ -3,6 +3,7 @@ use pavex::{blueprint::from, Blueprint}; pub struct NumericConst; pub struct BoolConst; pub struct CharConst; +pub struct SizedArray(pub [u8; N]); #[pavex::request_scoped] pub fn numeric() -> NumericConst<8> { @@ -19,11 +20,17 @@ pub fn character() -> CharConst<'a'> { CharConst } +#[pavex::request_scoped] +pub fn sized_array() -> SizedArray<4> { + SizedArray([0; 4]) +} + #[pavex::get(path = "/")] pub fn handler( _n: NumericConst<8>, _b: BoolConst, _c: CharConst<'a'>, + _s: SizedArray<4>, ) -> pavex::Response { todo!() } diff --git a/rustdoc/rustdoc_resolver/src/resolve_type.rs b/rustdoc/rustdoc_resolver/src/resolve_type.rs index 642be2e30..3a9561c45 100644 --- a/rustdoc/rustdoc_resolver/src/resolve_type.rs +++ b/rustdoc/rustdoc_resolver/src/resolve_type.rs @@ -507,7 +507,12 @@ fn _resolve_type( })) } RustdocType::Array { type_, len } => { - let len: usize = len.parse().map_err(|_| { + let resolved_len = generic_bindings + .consts + .get(len) + .map(|s| s.as_str()) + .unwrap_or(len); + let len: usize = resolved_len.parse().map_err(|_| { TypeResolutionErrorDetails::UnsupportedArrayLength(UnsupportedArrayLength { len: len.clone(), })