@@ -35,6 +35,7 @@ mod display;
35
35
mod infer;
36
36
mod mro;
37
37
mod narrow;
38
+ mod string_annotation;
38
39
mod unpacker;
39
40
40
41
#[ salsa:: tracked( return_ref) ]
@@ -56,7 +57,7 @@ pub fn check_types(db: &dyn Db, file: File) -> TypeCheckDiagnostics {
56
57
57
58
/// Infer the public type of a symbol (its type as seen from outside its scope).
58
59
fn symbol_by_id < ' db > ( db : & ' db dyn Db , scope : ScopeId < ' db > , symbol : ScopedSymbolId ) -> Symbol < ' db > {
59
- let _span = tracing:: trace_span!( "symbol_ty_by_id " , ?symbol) . entered ( ) ;
60
+ let _span = tracing:: trace_span!( "symbol_by_id " , ?symbol) . entered ( ) ;
60
61
61
62
let use_def = use_def_map ( db, scope) ;
62
63
@@ -180,13 +181,21 @@ pub(crate) fn global_symbol<'db>(db: &'db dyn Db, file: File, name: &str) -> Sym
180
181
/// Infer the type of a binding.
181
182
pub ( crate ) fn binding_ty < ' db > ( db : & ' db dyn Db , definition : Definition < ' db > ) -> Type < ' db > {
182
183
let inference = infer_definition_types ( db, definition) ;
183
- inference. binding_ty ( definition)
184
+ if inference. is_eagerly_deferred ( definition) {
185
+ infer_deferred_types ( db, definition) . binding_ty ( definition)
186
+ } else {
187
+ inference. binding_ty ( definition)
188
+ }
184
189
}
185
190
186
191
/// Infer the type of a declaration.
187
192
fn declaration_ty < ' db > ( db : & ' db dyn Db , definition : Definition < ' db > ) -> Type < ' db > {
188
193
let inference = infer_definition_types ( db, definition) ;
189
- inference. declaration_ty ( definition)
194
+ if inference. is_eagerly_deferred ( definition) {
195
+ infer_deferred_types ( db, definition) . declaration_ty ( definition)
196
+ } else {
197
+ inference. declaration_ty ( definition)
198
+ }
190
199
}
191
200
192
201
/// Infer the type of a (possibly deferred) sub-expression of a [`Definition`].
@@ -2220,6 +2229,21 @@ impl<'db> IterationOutcome<'db> {
2220
2229
}
2221
2230
}
2222
2231
2232
+ #[ derive( Debug ) ]
2233
+ enum MaybeDeferred < ' db > {
2234
+ Type ( Type < ' db > ) ,
2235
+ Deferred ,
2236
+ }
2237
+
2238
+ impl < ' db > MaybeDeferred < ' db > {
2239
+ fn expect_type ( self ) -> Type < ' db > {
2240
+ match self {
2241
+ MaybeDeferred :: Type ( ty) => ty,
2242
+ MaybeDeferred :: Deferred => panic ! ( "expected a type, but got a deferred annotation" ) ,
2243
+ }
2244
+ }
2245
+ }
2246
+
2223
2247
#[ derive( Debug , Copy , Clone , PartialEq , Eq ) ]
2224
2248
pub enum Truthiness {
2225
2249
/// For an object `x`, `bool(x)` will always return `True`
0 commit comments