@@ -4673,11 +4673,11 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv: SyntacticUnscope
46734673 | SynType.AnonRecd(isStruct, args,m) ->
46744674 let tupInfo = mkTupInfo isStruct
46754675 let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv (args |> List.map snd |> List.map (fun x -> (false,x))) m
4676- let unsortedIds = args |> List.map fst |> List.toArray
4677- let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, tupInfo, unsortedIds )
4676+ let unsortedFieldIds = args |> List.map fst |> List.toArray
4677+ let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, tupInfo, unsortedFieldIds )
46784678 // Sort into canonical order
4679- let sortedArgTys , sortedCheckedArgTys = List.zip args args' |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds .[i].idText) |> List.map snd |> List.unzip
4680- sortedArgTys |> List.iteri (fun i (x,_) ->
4679+ let sortedFieldTys , sortedCheckedArgTys = List.zip args args' |> List.indexed |> List.sortBy (fun (i,_) -> unsortedFieldIds .[i].idText) |> List.map snd |> List.unzip
4680+ sortedFieldTys |> List.iteri (fun i (x,_) ->
46814681 let item = Item.AnonRecdField(anonInfo, sortedCheckedArgTys, i, x.idRange)
46824682 CallNameResolutionSink cenv.tcSink (x.idRange,env.NameEnv,item,item,emptyTyparInst,ItemOccurence.UseInType,env.DisplayEnv,env.eAccessRights))
46834683 TType_anon(anonInfo, sortedCheckedArgTys),tpenv
@@ -5879,8 +5879,8 @@ and TcExprUndelayed cenv overallTy env tpenv (synExpr: SynExpr) =
58795879 let expr = mkAnyTupled cenv.g m tupInfo args' argTys
58805880 expr, tpenv
58815881
5882- | SynExpr.AnonRecd (isStruct, optOrigExpr, unsortedArgs , mWholeExpr) ->
5883- TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs , mWholeExpr)
5882+ | SynExpr.AnonRecd (isStruct, optOrigExpr, unsortedFieldExprs , mWholeExpr) ->
5883+ TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedFieldExprs , mWholeExpr)
58845884
58855885 | SynExpr.ArrayOrList (isArray, args, m) ->
58865886 CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights)
@@ -7036,26 +7036,39 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr
70367036
70377037
70387038// Check '{| .... |}'
7039- and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) =
7039+ and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigSynExpr, unsortedFieldIdsAndSynExprsGiven, mWholeExpr) =
7040+ let unsortedFieldSynExprsGiven = List.map snd unsortedFieldIdsAndSynExprsGiven
70407041
7041- match optOrigExpr with
7042+ match optOrigSynExpr with
70427043 | None ->
7043- let unsortedIds = unsortedArgs |> List.map fst |> List.toArray
7044- let anonInfo, sortedArgTys = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedIds
7044+ let unsortedFieldIds = unsortedFieldIdsAndSynExprsGiven |> List.map fst |> List.toArray
7045+ let anonInfo, sortedFieldTys = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedFieldIds
70457046
70467047 // Sort into canonical order
7047- let sortedIndexedArgs = unsortedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText)
7048+ let sortedIndexedArgs =
7049+ unsortedFieldIdsAndSynExprsGiven
7050+ |> List.indexed
7051+ |> List.sortBy (fun (i,_) -> unsortedFieldIds.[i].idText)
7052+
7053+ // Map from sorted indexes to unsorted indexes
70487054 let sigma = List.map fst sortedIndexedArgs |> List.toArray
7049- let sortedArgs = List.map snd sortedIndexedArgs
7050- sortedArgs |> List.iteri (fun j (x, _) ->
7051- let item = Item.AnonRecdField(anonInfo, sortedArgTys, j, x.idRange)
7055+ let sortedFieldExprs = List.map snd sortedIndexedArgs
7056+
7057+ sortedFieldExprs |> List.iteri (fun j (x, _) ->
7058+ let item = Item.AnonRecdField(anonInfo, sortedFieldTys, j, x.idRange)
70527059 CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights))
7053- let unsortedArgTys = sortedArgTys |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.map snd
7054- let flexes = unsortedArgTys |> List.map (fun _ -> true)
7055- let unsortedCheckedArgs, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedArgTys (List.map snd unsortedArgs)
7056- let sortedCheckedArgs = unsortedCheckedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd
70577060
7058- mkAnonRecd cenv.g mWholeExpr anonInfo sortedCheckedArgs sortedArgTys, tpenv
7061+ let unsortedFieldTys =
7062+ sortedFieldTys
7063+ |> List.indexed
7064+ |> List.sortBy (fun (sortedIdx, _) -> sigma.[sortedIdx])
7065+ |> List.map snd
7066+
7067+ let flexes = unsortedFieldTys |> List.map (fun _ -> true)
7068+
7069+ let unsortedCheckedArgs, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedFieldTys unsortedFieldSynExprsGiven
7070+
7071+ mkAnonRecd cenv.g mWholeExpr anonInfo unsortedFieldIds unsortedCheckedArgs unsortedFieldTys, tpenv
70597072
70607073 | Some (origExpr, _) ->
70617074 // The fairly complex case '{| origExpr with X = 1; Y = 2 |}'
@@ -7088,7 +7101,7 @@ and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs
70887101 /// - Choice1Of2 for a new binding
70897102 /// - Choice2Of2 for a binding coming from the original expression
70907103 let unsortedIdAndExprsAll =
7091- [| for (id, e) in unsortedArgs do
7104+ [| for (id, e) in unsortedFieldIdsAndSynExprsGiven do
70927105 yield (id, Choice1Of2 e)
70937106 match tryDestAnonRecdTy cenv.g origExprTy with
70947107 | ValueSome (anonInfo, tinst) ->
@@ -7104,32 +7117,61 @@ and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs
71047117 error (Error (FSComp.SR.tcCopyAndUpdateNeedsRecordType(), mOrigExpr)) |]
71057118 |> Array.distinctBy (fst >> textOfId)
71067119
7107- let unsortedIdsAll = Array.map fst unsortedIdAndExprsAll
7108- let anonInfo, sortedArgTysAll = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedIdsAll
7109- let sortedIndexedArgsAll = unsortedIdAndExprsAll |> Array.indexed |> Array.sortBy (snd >> fst >> textOfId)
7110- let sigma = Array.map fst sortedIndexedArgsAll // map from sorted indexes to unsorted indexes
7111- let sortedArgsAll = Array.map snd sortedIndexedArgsAll
7112- sortedArgsAll |> Array.iteri (fun j (x, expr) ->
7120+ let unsortedFieldIdsAll = Array.map fst unsortedIdAndExprsAll
7121+
7122+ let anonInfo, sortedFieldTysAll = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedFieldIdsAll
7123+
7124+ let sortedIndexedFieldsAll = unsortedIdAndExprsAll |> Array.indexed |> Array.sortBy (snd >> fst >> textOfId)
7125+
7126+ // map from sorted indexes to unsorted indexes
7127+ let sigma = Array.map fst sortedIndexedFieldsAll
7128+
7129+ let sortedFieldsAll = Array.map snd sortedIndexedFieldsAll
7130+
7131+ // Report _all_ identifiers to name resolution. We should likely just report the ones
7132+ // that are explicit in source code.
7133+ sortedFieldsAll |> Array.iteri (fun j (x, expr) ->
71137134 match expr with
71147135 | Choice1Of2 _ ->
7115- let item = Item.AnonRecdField(anonInfo, sortedArgTysAll , j, x.idRange)
7136+ let item = Item.AnonRecdField(anonInfo, sortedFieldTysAll , j, x.idRange)
71167137 CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)
71177138 | Choice2Of2 _ -> ())
71187139
7119- let unsortedArgTysNew = sortedArgTysAll |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.take unsortedArgs.Length |> List.map snd
7120- let flexes = unsortedArgTysNew |> List.map (fun _ -> true)
7140+ let unsortedFieldTysAll =
7141+ sortedFieldTysAll
7142+ |> List.indexed
7143+ |> List.sortBy (fun (sortedIdx, _) -> sigma.[sortedIdx])
7144+ |> List.map snd
7145+
7146+ let unsortedFieldTysGiven =
7147+ unsortedFieldTysAll
7148+ |> List.take unsortedFieldIdsAndSynExprsGiven.Length
7149+
7150+ let flexes = unsortedFieldTysGiven |> List.map (fun _ -> true)
71217151
7122- let unsortedCheckedArgsNew, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedArgTysNew (List.map snd unsortedArgs)
7123- let sortedArgTysAllArray = Array.ofList sortedArgTysAll
7124- let unsortedCheckedArgsNewArray = unsortedCheckedArgsNew |> List.toArray
7125- let sortedCheckedArgsAll =
7126- sortedArgsAll |> Array.mapi (fun j (_, expr) ->
7152+ // Check the expressions in unsorted order
7153+ let unsortedFieldExprsGiven, tpenv =
7154+ TcExprs cenv env mWholeExpr tpenv flexes unsortedFieldTysGiven unsortedFieldSynExprsGiven
7155+
7156+ let unsortedFieldExprsGiven = unsortedFieldExprsGiven |> List.toArray
7157+
7158+ let unsortedFieldIds =
7159+ unsortedIdAndExprsAll
7160+ |> Array.map fst
7161+
7162+ let unsortedFieldExprs =
7163+ unsortedIdAndExprsAll
7164+ |> Array.mapi (fun unsortedIdx (_, expr) ->
71277165 match expr with
7128- | Choice1Of2 _ -> unsortedCheckedArgsNewArray.[sigma.[j]]
7129- | Choice2Of2 subExpr -> UnifyTypes cenv env mOrigExpr (tyOfExpr cenv.g subExpr) sortedArgTysAllArray.[j]; subExpr)
7166+ | Choice1Of2 _ -> unsortedFieldExprsGiven.[unsortedIdx]
7167+ | Choice2Of2 subExpr -> UnifyTypes cenv env mOrigExpr (tyOfExpr cenv.g subExpr) unsortedFieldTysAll.[unsortedIdx]; subExpr)
7168+ |> List.ofArray
71307169
7131- let expr = mkAnonRecd cenv.g mWholeExpr anonInfo (List.ofArray sortedCheckedArgsAll) sortedArgTysAll
7170+ // Permute the expressions to sorted order in the TAST
7171+ let expr = mkAnonRecd cenv.g mWholeExpr anonInfo unsortedFieldIds unsortedFieldExprs unsortedFieldTysAll
71327172 let expr = wrap expr
7173+
7174+ // Bind the original expression
71337175 let expr = mkCompGenLet mOrigExpr oldv origExprChecked expr
71347176 expr, tpenv
71357177
0 commit comments