Skip to content

Commit 4e93c01

Browse files
committed
Implement NormalizeFn in the back end
1 parent 72953f4 commit 4e93c01

File tree

25 files changed

+1230
-122
lines changed

25 files changed

+1230
-122
lines changed

chalk-integration/src/db.rs

+17-3
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use chalk_ir::{
1313
UnificationDatabase, Variances,
1414
};
1515
use chalk_solve::rust_ir::{
16-
AdtDatum, AdtRepr, AssociatedTyDatum, AssociatedTyValue, AssociatedTyValueId, ClosureKind,
17-
FnDefDatum, FnDefInputsAndOutputDatum, GeneratorDatum, GeneratorWitnessDatum, ImplDatum,
18-
OpaqueTyDatum, TraitDatum, WellKnownTrait,
16+
AdtDatum, AdtRepr, AssociatedFnValue, AssociatedFnValueId, AssociatedTyDatum,
17+
AssociatedTyValue, AssociatedTyValueId, ClosureKind, FnDefDatum, FnDefInputsAndOutputDatum,
18+
GeneratorDatum, GeneratorWitnessDatum, ImplDatum, OpaqueTyDatum, TraitDatum, WellKnownTrait,
1919
};
2020
use chalk_solve::{RustIrDatabase, Solution, SubstitutionResult};
2121
use salsa::Database;
@@ -91,6 +91,13 @@ impl RustIrDatabase<ChalkIr> for ChalkDatabase {
9191
self.program_ir().unwrap().associated_ty_data(ty)
9292
}
9393

94+
fn associated_fn_data(
95+
&self,
96+
f: chalk_ir::AssocFnDefId<ChalkIr>,
97+
) -> Arc<chalk_solve::rust_ir::AssociatedFnDatum<ChalkIr>> {
98+
self.program_ir().unwrap().associated_fn_data(f)
99+
}
100+
94101
fn trait_datum(&self, id: TraitId<ChalkIr>) -> Arc<TraitDatum<ChalkIr>> {
95102
self.program_ir().unwrap().trait_datum(id)
96103
}
@@ -106,6 +113,13 @@ impl RustIrDatabase<ChalkIr> for ChalkDatabase {
106113
self.program_ir().unwrap().associated_ty_values[&id].clone()
107114
}
108115

116+
fn associated_fn_value(
117+
&self,
118+
id: AssociatedFnValueId<ChalkIr>,
119+
) -> Arc<AssociatedFnValue<ChalkIr>> {
120+
self.program_ir().unwrap().associated_fn_values[&id].clone()
121+
}
122+
109123
fn opaque_ty_data(&self, id: OpaqueTyId<ChalkIr>) -> Arc<OpaqueTyDatum<ChalkIr>> {
110124
self.program_ir().unwrap().opaque_ty_data(id)
111125
}

chalk-integration/src/error.rs

+59
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,21 @@ impl std::error::Error for ChalkError {}
5757
pub enum RustIrError {
5858
InvalidParameterName(Identifier),
5959
InvalidTraitName(Identifier),
60+
InvalidImplName(Identifier),
61+
InvalidImplMemberName(Identifier, Identifier),
6062
NotTrait(Identifier),
6163
NotStruct(Identifier),
64+
NotAssociatedType(Identifier),
65+
NotAssociatedFn(Identifier),
66+
AmbiguousProjection(Identifier),
6267
DuplicateOrShadowedParameters,
6368
AutoTraitAssociatedTypes(Identifier),
6469
AutoTraitParameters(Identifier),
6570
AutoTraitWhereClauses(Identifier),
6671
InvalidFundamentalTypesParameters(Identifier),
6772
NegativeImplAssociatedValues(Identifier),
6873
MissingAssociatedType(Identifier),
74+
MissingAssociatedFn(Identifier),
6975
IncorrectNumberOfVarianceParameters {
7076
identifier: Identifier,
7177
expected: usize,
@@ -81,6 +87,11 @@ pub enum RustIrError {
8187
expected: usize,
8288
actual: usize,
8389
},
90+
IncorrectNumberOfAssociatedFnParameters {
91+
identifier: Identifier,
92+
expected: usize,
93+
actual: usize,
94+
},
8495
IncorrectParameterKind {
8596
identifier: Identifier,
8697
expected: Kind,
@@ -96,6 +107,11 @@ pub enum RustIrError {
96107
expected: Kind,
97108
actual: Kind,
98109
},
110+
IncorrectAssociatedFnParameterKind {
111+
identifier: Identifier,
112+
expected: Kind,
113+
actual: Kind,
114+
},
99115
CannotApplyTypeParameter(Identifier),
100116
InvalidExternAbi(Atom),
101117
}
@@ -107,6 +123,12 @@ impl std::fmt::Display for RustIrError {
107123
write!(f, "invalid parameter name `{}`", name)
108124
}
109125
RustIrError::InvalidTraitName(name) => write!(f, "invalid trait name `{}`", name),
126+
RustIrError::InvalidImplName(name) => write!(f, "invalid impl name `{}`", name),
127+
RustIrError::InvalidImplMemberName(impl_name, member_name) => write!(
128+
f,
129+
"invalid impl member name `{}::{}`",
130+
impl_name, member_name
131+
),
110132
RustIrError::NotTrait(name) => write!(
111133
f,
112134
"expected a trait, found `{}`, which is not a trait",
@@ -117,6 +139,22 @@ impl std::fmt::Display for RustIrError {
117139
"expected a struct, found `{}`, which is not a struct",
118140
name
119141
),
142+
RustIrError::NotAssociatedType(name) => write!(
143+
f,
144+
"expected an associated type, found `{}`, which is not",
145+
name
146+
),
147+
RustIrError::NotAssociatedFn(name) => write!(
148+
f,
149+
"expected an associated fn, found `{}`, which is not",
150+
name
151+
),
152+
RustIrError::AmbiguousProjection(name) => write!(
153+
f,
154+
"projection refers to `{}` which is both a fn and a type",
155+
name
156+
),
157+
120158
RustIrError::DuplicateOrShadowedParameters => {
121159
write!(f, "duplicate or shadowed parameters")
122160
}
@@ -142,6 +180,9 @@ impl std::fmt::Display for RustIrError {
142180
RustIrError::MissingAssociatedType(name) => {
143181
write!(f, "no associated type `{}` defined in trait", name)
144182
}
183+
RustIrError::MissingAssociatedFn(name) => {
184+
write!(f, "no associated fn `{}` defined in trait", name)
185+
}
145186
RustIrError::IncorrectNumberOfVarianceParameters {
146187
identifier,
147188
expected,
@@ -169,6 +210,15 @@ impl std::fmt::Display for RustIrError {
169210
"wrong number of parameters for associated type `{}` (expected {}, got {})",
170211
identifier, expected, actual
171212
),
213+
RustIrError::IncorrectNumberOfAssociatedFnParameters {
214+
identifier,
215+
expected,
216+
actual,
217+
} => write!(
218+
f,
219+
"wrong number of parameters for associated fn `{}` (expected {}, got {})",
220+
identifier, expected, actual
221+
),
172222
RustIrError::IncorrectParameterKind {
173223
identifier,
174224
expected,
@@ -196,6 +246,15 @@ impl std::fmt::Display for RustIrError {
196246
"incorrect associated type parameter kind for `{}`: expected {}, found {}",
197247
identifier, expected, actual
198248
),
249+
RustIrError::IncorrectAssociatedFnParameterKind {
250+
identifier,
251+
expected,
252+
actual,
253+
} => write!(
254+
f,
255+
"incorrect associated fn parameter kind for `{}`: expected {}, found {}",
256+
identifier, expected, actual
257+
),
199258
RustIrError::CannotApplyTypeParameter(name) => {
200259
write!(f, "cannot apply type parameter `{}`", name)
201260
}

0 commit comments

Comments
 (0)