@@ -119,7 +119,14 @@ fn infer_definition_types_cycle_recovery<'db>(
119
119
_cycle : & salsa:: Cycle ,
120
120
input : Definition < ' db > ,
121
121
) -> TypeInference < ' db > {
122
- tracing:: trace!( "infer_definition_types_cycle_recovery" ) ;
122
+ let file = input. file ( db) ;
123
+ let _span = tracing:: trace_span!(
124
+ "infer_definition_types_cycle_recovery" ,
125
+ range = ?input. kind( db) . target_range( ) ,
126
+ file = %file. path( db)
127
+ )
128
+ . entered ( ) ;
129
+
123
130
TypeInference :: cycle_fallback ( input. scope ( db) , todo_type ! ( "cycle recovery" ) )
124
131
}
125
132
@@ -317,7 +324,7 @@ impl<'db> TypeInference<'db> {
317
324
#[ track_caller]
318
325
pub ( crate ) fn expression_type ( & self , expression : ScopedExpressionId ) -> Type < ' db > {
319
326
self . try_expression_type ( expression) . expect (
320
- "expression should belong to this TypeInference region and
327
+ "expression should belong to this TypeInference region and \
321
328
TypeInferenceBuilder should have inferred a type for it",
322
329
)
323
330
}
@@ -1361,7 +1368,9 @@ impl<'db> TypeInferenceBuilder<'db> {
1361
1368
///
1362
1369
/// The annotated type is implicitly wrapped in a homogeneous tuple.
1363
1370
///
1364
- /// See `infer_parameter_definition` doc comment for some relevant observations about scopes.
1371
+ /// See [`infer_parameter_definition`] doc comment for some relevant observations about scopes.
1372
+ ///
1373
+ /// [`infer_parameter_definition`]: Self::infer_parameter_definition
1365
1374
fn infer_variadic_positional_parameter_definition (
1366
1375
& mut self ,
1367
1376
parameter : & ast:: Parameter ,
@@ -1390,7 +1399,9 @@ impl<'db> TypeInferenceBuilder<'db> {
1390
1399
///
1391
1400
/// The annotated type is implicitly wrapped in a string-keyed dictionary.
1392
1401
///
1393
- /// See `infer_parameter_definition` doc comment for some relevant observations about scopes.
1402
+ /// See [`infer_parameter_definition`] doc comment for some relevant observations about scopes.
1403
+ ///
1404
+ /// [`infer_parameter_definition`]: Self::infer_parameter_definition
1394
1405
fn infer_variadic_keyword_parameter_definition (
1395
1406
& mut self ,
1396
1407
parameter : & ast:: Parameter ,
@@ -3283,18 +3294,83 @@ impl<'db> TypeInferenceBuilder<'db> {
3283
3294
body : _,
3284
3295
} = lambda_expression;
3285
3296
3286
- if let Some ( parameters) = parameters {
3287
- for default in parameters
3288
- . iter_non_variadic_params ( )
3289
- . filter_map ( |param| param. default . as_deref ( ) )
3290
- {
3291
- self . infer_expression ( default) ;
3292
- }
3297
+ let parameters = if let Some ( parameters) = parameters {
3298
+ let positional_only = parameters
3299
+ . posonlyargs
3300
+ . iter ( )
3301
+ . map ( |parameter| {
3302
+ Parameter :: new (
3303
+ Some ( parameter. name ( ) . id . clone ( ) ) ,
3304
+ None ,
3305
+ ParameterKind :: PositionalOnly {
3306
+ default_ty : parameter
3307
+ . default ( )
3308
+ . map ( |default| self . infer_expression ( default) ) ,
3309
+ } ,
3310
+ )
3311
+ } )
3312
+ . collect :: < Vec < _ > > ( ) ;
3313
+ let positional_or_keyword = parameters
3314
+ . args
3315
+ . iter ( )
3316
+ . map ( |parameter| {
3317
+ Parameter :: new (
3318
+ Some ( parameter. name ( ) . id . clone ( ) ) ,
3319
+ None ,
3320
+ ParameterKind :: PositionalOrKeyword {
3321
+ default_ty : parameter
3322
+ . default ( )
3323
+ . map ( |default| self . infer_expression ( default) ) ,
3324
+ } ,
3325
+ )
3326
+ } )
3327
+ . collect :: < Vec < _ > > ( ) ;
3328
+ let variadic = parameters. vararg . as_ref ( ) . map ( |parameter| {
3329
+ Parameter :: new (
3330
+ Some ( parameter. name . id . clone ( ) ) ,
3331
+ None ,
3332
+ ParameterKind :: Variadic ,
3333
+ )
3334
+ } ) ;
3335
+ let keyword_only = parameters
3336
+ . kwonlyargs
3337
+ . iter ( )
3338
+ . map ( |parameter| {
3339
+ Parameter :: new (
3340
+ Some ( parameter. name ( ) . id . clone ( ) ) ,
3341
+ None ,
3342
+ ParameterKind :: KeywordOnly {
3343
+ default_ty : parameter
3344
+ . default ( )
3345
+ . map ( |default| self . infer_expression ( default) ) ,
3346
+ } ,
3347
+ )
3348
+ } )
3349
+ . collect :: < Vec < _ > > ( ) ;
3350
+ let keyword_variadic = parameters. kwarg . as_ref ( ) . map ( |parameter| {
3351
+ Parameter :: new (
3352
+ Some ( parameter. name . id . clone ( ) ) ,
3353
+ None ,
3354
+ ParameterKind :: KeywordVariadic ,
3355
+ )
3356
+ } ) ;
3293
3357
3294
- self . infer_parameters ( parameters) ;
3295
- }
3358
+ Parameters :: new (
3359
+ positional_only
3360
+ . into_iter ( )
3361
+ . chain ( positional_or_keyword)
3362
+ . chain ( variadic)
3363
+ . chain ( keyword_only)
3364
+ . chain ( keyword_variadic) ,
3365
+ )
3366
+ } else {
3367
+ Parameters :: empty ( )
3368
+ } ;
3296
3369
3297
- todo_type ! ( "typing.Callable type" )
3370
+ Type :: Callable ( CallableType :: General ( GeneralCallableType :: new (
3371
+ self . db ( ) ,
3372
+ Signature :: new ( parameters, Some ( todo_type ! ( "lambda return type" ) ) ) ,
3373
+ ) ) )
3298
3374
}
3299
3375
3300
3376
fn infer_call_expression ( & mut self , call_expression : & ast:: ExprCall ) -> Type < ' db > {
0 commit comments