Skip to content

Commit ffa178a

Browse files
feat: Allow function and method resolvers to configure how aliases should be handled
1 parent a0e5879 commit ffa178a

File tree

9 files changed

+113
-13
lines changed

9 files changed

+113
-13
lines changed

compiler/pavexc/src/compiler/analyses/user_components/annotations/coordinates.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use super::{
1414
use crate::compiler::analyses::user_components::{UserComponent, UserComponentId};
1515
use crate::compiler::component::{DefaultStrategy, PrebuiltType};
1616
use pavex_bp_schema::{CloningPolicy, Lint, LintSetting};
17-
use rustdoc_resolver::{resolve_free_function, rustdoc_method2callable};
17+
use rustdoc_resolver::{TypeAliasResolution, resolve_free_function, rustdoc_method2callable};
1818

1919
/// Resolve coordinates to the annotation they point to.
2020
/// Then process the corresponding item.
@@ -212,9 +212,9 @@ pub(crate) fn resolve_annotation_coordinates(
212212

213213
let outcome = match annotation.impl_ {
214214
Some(ImplInfo { attached_to, impl_ }) => {
215-
rustdoc_method2callable(attached_to, impl_, &item, krate, krate_collection)
215+
rustdoc_method2callable(attached_to, impl_, &item, krate, krate_collection, TypeAliasResolution::ResolveThrough)
216216
}
217-
None => resolve_free_function(&item, krate, krate_collection)
217+
None => resolve_free_function(&item, krate, krate_collection, TypeAliasResolution::ResolveThrough)
218218
.map(rustdoc_ir::Callable::FreeFunction),
219219
};
220220
let callable = match outcome {

compiler/pavexc/src/compiler/analyses/user_components/annotations/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ use pavex_bp_schema::{CloningPolicy, Lifecycle, Lint, LintSetting};
3333
use pavexc_attr_parser::{AnnotationKind, AnnotationProperties};
3434
use rustdoc_ext::RustdocKindExt;
3535
use rustdoc_resolver::{
36-
resolve_free_function, rustdoc_method2callable, rustdoc_new_type_def2type,
37-
rustdoc_type_alias2type,
36+
TypeAliasResolution, resolve_free_function, rustdoc_method2callable,
37+
rustdoc_new_type_def2type, rustdoc_type_alias2type,
3838
};
3939
use rustdoc_types::{Item, ItemEnum};
4040

@@ -179,9 +179,9 @@ pub(super) fn register_imported_components(
179179

180180
let outcome = match annotation.impl_ {
181181
Some(ImplInfo { attached_to, impl_ }) => {
182-
rustdoc_method2callable(attached_to, impl_, &item, krate, krate_collection)
182+
rustdoc_method2callable(attached_to, impl_, &item, krate, krate_collection, TypeAliasResolution::ResolveThrough)
183183
}
184-
None => resolve_free_function(&item, krate, krate_collection)
184+
None => resolve_free_function(&item, krate, krate_collection, TypeAliasResolution::ResolveThrough)
185185
.map(rustdoc_ir::Callable::FreeFunction),
186186
};
187187
let callable = match outcome {

compiler/pavexc/src/compiler/framework_rustdoc.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::rustdoc::{CannotGetCrateData, CrateCollection};
1010
use rustdoc_ext::GlobalItemId;
1111
use rustdoc_ir::{CallableInput, FnHeader, RustIdentifier, TraitMethod, TraitMethodPath};
1212
use rustdoc_processor::queries::Crate;
13-
use rustdoc_resolver::{GenericBindings, resolve_type};
13+
use rustdoc_resolver::{GenericBindings, TypeAliasResolution, resolve_type};
1414

1515
use super::app::PAVEX_VERSION;
1616

@@ -157,6 +157,7 @@ pub(crate) fn resolve_type_path(raw_path: &str, krate_collection: &CrateCollecti
157157
&global_id.package_id,
158158
krate_collection,
159159
&GenericBindings::default(),
160+
TypeAliasResolution::ResolveThrough,
160161
)
161162
.expect("Failed to resolve default generic type");
162163
GenericArgument::TypeParameter(default)
@@ -198,7 +199,7 @@ pub(crate) fn resolve_framework_free_function(
198199
.unwrap_or_else(|e| panic!("Unknown free function path {}: {e:?}", segments.join("::")));
199200

200201
let item = krate.get_item_by_local_type_id(&global_id.rustdoc_item_id);
201-
let free_fn = rustdoc_resolver::resolve_free_function(&item, krate, krate_collection)
202+
let free_fn = rustdoc_resolver::resolve_free_function(&item, krate, krate_collection, TypeAliasResolution::ResolveThrough)
202203
.expect("Failed to resolve free function");
203204
Callable::FreeFunction(free_fn)
204205
}
@@ -249,6 +250,7 @@ pub(crate) fn resolve_framework_inherent_method(
249250
&item,
250251
krate,
251252
krate_collection,
253+
TypeAliasResolution::ResolveThrough,
252254
)
253255
.expect("Failed to resolve inherent method");
254256
return callable;
@@ -334,6 +336,7 @@ pub(crate) fn resolve_framework_trait_method(
334336
&krate.core.package_id,
335337
krate_collection,
336338
&generic_bindings,
339+
TypeAliasResolution::ResolveThrough,
337340
)
338341
.map_err(|e| {
339342
anyhow::anyhow!(
@@ -357,6 +360,7 @@ pub(crate) fn resolve_framework_trait_method(
357360
&krate.core.package_id,
358361
krate_collection,
359362
&generic_bindings,
363+
TypeAliasResolution::ResolveThrough,
360364
)
361365
.map_err(|e| {
362366
anyhow::anyhow!(

compiler/pavexc/src/compiler/traits.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustdoc_types::{GenericParamDefKind, ItemEnum, Type as RustdocType};
55

66
use crate::language::{PathType, Type};
77
use crate::rustdoc::{Crate, CrateCollection};
8-
use rustdoc_resolver::{GenericBindings, resolve_type};
8+
use rustdoc_resolver::{GenericBindings, TypeAliasResolution, resolve_type};
99

1010
/// It returns an error if `type_` doesn't implement the specified trait.
1111
///
@@ -102,6 +102,7 @@ pub(crate) fn implements_trait(
102102
&our_path_type.package_id,
103103
krate_collection,
104104
&generic_bindings,
105+
TypeAliasResolution::ResolveThrough,
105106
)?;
106107
generic_bindings
107108
.types
@@ -122,6 +123,7 @@ pub(crate) fn implements_trait(
122123
&our_path_type.package_id,
123124
krate_collection,
124125
&generic_bindings,
126+
TypeAliasResolution::ResolveThrough,
125127
)?;
126128
if implements_trait(krate_collection, &type_, expected_trait)? {
127129
return Ok(true);

rustdoc/rustdoc_resolver/src/free_fn.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ use rustdoc_processor::indexing::CrateIndexer;
1111
use rustdoc_processor::queries::Crate;
1212

1313
use crate::errors::*;
14+
use crate::resolve_type::TypeAliasResolution;
1415
use crate::resolve_type::resolve_type;
1516

1617
/// Convert a free function from `rustdoc_types` into a [`FreeFunction`].
1718
pub fn resolve_free_function<I: CrateIndexer>(
1819
item: &Item,
1920
krate: &Crate,
2021
krate_collection: &CrateCollection<I>,
22+
alias_resolution: TypeAliasResolution,
2123
) -> Result<FreeFunction, CallableResolutionError> {
2224
let ItemEnum::Function(inner) = &item.inner else {
2325
unreachable!("Expected a function item");
@@ -35,6 +37,7 @@ pub fn resolve_free_function<I: CrateIndexer>(
3537
&krate.core.package_id,
3638
krate_collection,
3739
&Default::default(),
40+
alias_resolution,
3841
) {
3942
Ok(t) => {
4043
inputs.push(CallableInput {
@@ -62,6 +65,7 @@ pub fn resolve_free_function<I: CrateIndexer>(
6265
&krate.core.package_id,
6366
krate_collection,
6467
&Default::default(),
68+
alias_resolution,
6569
) {
6670
Ok(t) => Some(t),
6771
Err(e) => {

rustdoc/rustdoc_resolver/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ mod type_def;
1313
pub use errors::*;
1414
pub use free_fn::resolve_free_function;
1515
pub use method::rustdoc_method2callable;
16-
pub use resolve_type::resolve_type;
16+
pub use resolve_type::{TypeAliasResolution, resolve_type};
1717
pub use type_def::{rustdoc_new_type_def2type, rustdoc_type_alias2type};
1818

1919
use ahash::HashMap;

rustdoc/rustdoc_resolver/src/method.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use rustdoc_processor::queries::Crate;
1616

1717
use crate::GenericBindings;
1818
use crate::errors::*;
19+
use crate::resolve_type::TypeAliasResolution;
1920
use crate::resolve_type::resolve_type;
2021

2122
/// Convert a method item retrieved from `rustdoc`'s JSON output to Pavex's internal
@@ -37,6 +38,7 @@ pub fn rustdoc_method2callable<I: CrateIndexer>(
3738
method_item: &Item,
3839
krate: &Crate,
3940
krate_collection: &CrateCollection<I>,
41+
alias_resolution: TypeAliasResolution,
4042
) -> Result<Callable, CallableResolutionError> {
4143
let impl_item = krate.get_item_by_local_type_id(&impl_id);
4244
let ItemEnum::Impl(impl_item) = &impl_item.inner else {
@@ -50,6 +52,7 @@ pub fn rustdoc_method2callable<I: CrateIndexer>(
5052
&krate.core.package_id,
5153
krate_collection,
5254
&generic_bindings,
55+
alias_resolution,
5356
) {
5457
Ok(t) => t,
5558
Err(e) => {
@@ -110,6 +113,7 @@ pub fn rustdoc_method2callable<I: CrateIndexer>(
110113
&krate.core.package_id,
111114
krate_collection,
112115
&generic_bindings,
116+
alias_resolution,
113117
) else {
114118
todo!()
115119
};
@@ -178,6 +182,7 @@ pub fn rustdoc_method2callable<I: CrateIndexer>(
178182
&krate.core.package_id,
179183
krate_collection,
180184
&generic_bindings,
185+
alias_resolution,
181186
) {
182187
Ok(t) => {
183188
inputs.push(CallableInput {
@@ -205,6 +210,7 @@ pub fn rustdoc_method2callable<I: CrateIndexer>(
205210
&krate.core.package_id,
206211
krate_collection,
207212
&generic_bindings,
213+
alias_resolution,
208214
) {
209215
Ok(t) => Some(t),
210216
Err(e) => {

0 commit comments

Comments
 (0)