@@ -119,7 +119,14 @@ fn infer_definition_types_cycle_recovery<'db>(
119119 _cycle : & salsa:: Cycle ,
120120 input : Definition < ' db > ,
121121) -> 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+
123130 TypeInference :: cycle_fallback ( input. scope ( db) , todo_type ! ( "cycle recovery" ) )
124131}
125132
@@ -317,7 +324,7 @@ impl<'db> TypeInference<'db> {
317324 #[ track_caller]
318325 pub ( crate ) fn expression_type ( & self , expression : ScopedExpressionId ) -> Type < ' db > {
319326 self . try_expression_type ( expression) . expect (
320- "expression should belong to this TypeInference region and
327+ "expression should belong to this TypeInference region and \
321328 TypeInferenceBuilder should have inferred a type for it",
322329 )
323330 }
@@ -1361,7 +1368,9 @@ impl<'db> TypeInferenceBuilder<'db> {
13611368 ///
13621369 /// The annotated type is implicitly wrapped in a homogeneous tuple.
13631370 ///
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
13651374 fn infer_variadic_positional_parameter_definition (
13661375 & mut self ,
13671376 parameter : & ast:: Parameter ,
@@ -1390,7 +1399,9 @@ impl<'db> TypeInferenceBuilder<'db> {
13901399 ///
13911400 /// The annotated type is implicitly wrapped in a string-keyed dictionary.
13921401 ///
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
13941405 fn infer_variadic_keyword_parameter_definition (
13951406 & mut self ,
13961407 parameter : & ast:: Parameter ,
@@ -3283,18 +3294,83 @@ impl<'db> TypeInferenceBuilder<'db> {
32833294 body : _,
32843295 } = lambda_expression;
32853296
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+ } ) ;
32933357
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+ } ;
32963369
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+ ) ) )
32983374 }
32993375
33003376 fn infer_call_expression ( & mut self , call_expression : & ast:: ExprCall ) -> Type < ' db > {
0 commit comments