@@ -626,6 +626,13 @@ let private tryGetMethodTyparOrdinalsAndGenericArity (g: TcGlobals) (var: Val) =
626626let private tryGetParameterTypeIdentities ( g : TcGlobals ) ( typarOrdinals : Map < Stamp , int >) ( var : Val ) =
627627 let parameterTypes =
628628 match var.MemberInfo, var.ValReprInfo with
629+ | Some _, Some valReprInfo when var.IsExtensionMember ->
630+ let numEnclosingTypars = CountEnclosingTyparsOfActualParentOfVal var
631+
632+ let _ , _ , argInfos , _ , _ =
633+ GetValReprTypeInCompiledForm g valReprInfo numEnclosingTypars var.Type var.Range
634+
635+ argInfos |> List.concat |> List.map fst
629636 | Some _, _ -> ArgInfosOfMember g ( mkLocalValRef var) |> List.concat |> List.map fst
630637 | None, Some valReprInfo ->
631638 let _ , argInfos , _ , _ = GetValReprTypeInFSharpForm g valReprInfo var.Type var.Range
@@ -1641,10 +1648,10 @@ let private slotParameterMetadataIdentity denv (var: Val) =
16411648 match var.ValReprInfo with
16421649 | None -> " none"
16431650 | Some( ValReprInfo(_, arguments, result)) ->
1644- // The instance receiver has no Param row and its source name does not affect metadata.
1651+ // Extension receivers are real parameters of static methods and retain their metadata.
16451652 let emittedArguments =
1646- match var.MemberInfo , arguments with
1647- | Some memberInfo , _ :: rest when memberInfo.MemberFlags.IsInstance -> rest
1653+ match arguments with
1654+ | _ :: rest when ValSpecIsCompiledAsInstance denv.g var -> rest
16481655 | _ -> arguments
16491656
16501657 identityNode
@@ -2355,6 +2362,21 @@ let private snapshotModuleEntity denv (moduleEntity: ModuleOrNamespace) path : E
23552362 IsSynthesized = false
23562363 }
23572364
2365+ /// Gets the emitted receiver name when an extension method lacks a signature argument name.
2366+ let private tryExtensionReceiverName ( var : Val ) expr =
2367+ match var.MemberInfo with
2368+ | Some memberInfo when var.IsExtensionMember && memberInfo.MemberFlags.IsInstance ->
2369+ // IlxGen.GenParams falls back to the implementation binder for unnamed signature arguments.
2370+ let rec receiverName expr =
2371+ match stripDebugPoints expr with
2372+ | Expr.TyLambda(_, _, body, _, _)
2373+ | Expr.TyChoose(_, body, _) -> receiverName body
2374+ | Expr.Lambda(_, _, _, receiver :: _, _, _, _) -> Some receiver.LogicalName
2375+ | _ -> None
2376+
2377+ receiverName expr
2378+ | _ -> None
2379+
23582380let rec private snapshotModuleBinding g denv ( path : string list ) ( map , entities ) binding =
23592381 match binding with
23602382 | ModuleOrNamespaceBinding.Binding b ->
@@ -2398,7 +2420,12 @@ and private tryGetContainingEntityFullName (var: Val) =
23982420 match var.MemberInfo with
23992421 | Some memberInfo ->
24002422 try
2401- let tyconRef = memberInfo.ApparentEnclosingEntity
2423+ let tyconRef =
2424+ if var.IsExtensionMember then
2425+ ( mkLocalValRef var) .DeclaringEntity
2426+ else
2427+ memberInfo.ApparentEnclosingEntity
2428+
24022429 let ilTypeRef = tyconRef.CompiledRepresentationForNamedType
24032430 Some( ilTypeRef.FullName)
24042431 with _ ->
@@ -2434,10 +2461,7 @@ and private snapshotBinding g denv path (TBind(var, expr, _)) =
24342461 with _ ->
24352462 None
24362463
2437- let isInstanceMember =
2438- match var.MemberInfo with
2439- | Some memberInfo -> memberInfo.MemberFlags.IsInstance
2440- | None -> false
2464+ let isInstanceMember = ValRefIsCompiledAsInstanceMember g vref
24412465
24422466 let totalArgCount =
24432467 var.ValReprInfo
@@ -2468,6 +2492,11 @@ and private snapshotBinding g denv path (TBind(var, expr, _)) =
24682492 |> List.collect ( List.map ( fun ( argInfo : ArgReprInfo ) -> argInfo.Name |> Option.map ( fun ident -> ident.idText)))
24692493 | None -> []
24702494
2495+ let parameterNames =
2496+ match parameterNames, tryExtensionReceiverName var expr with
2497+ | None :: rest, Some receiverName -> Some receiverName :: rest
2498+ | _ -> parameterNames
2499+
24712500 let parameterMetadataIdentity =
24722501 let argMetadata ( argInfo : ArgReprInfo ) =
24732502 argInfo.Attribs.AsList()
0 commit comments