@@ -7781,7 +7781,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7781
7781
7782
7782
let spreadSrcs, fldsList, tpenv =
7783
7783
let spreadSrcs, flds, tpenv =
7784
- let rec loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads =
7784
+ let rec loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads =
7785
7785
let (|LeftwardExplicit|NoLeftwardExplicit|) hasLeftwardExplicit = if hasLeftwardExplicit then LeftwardExplicit else NoLeftwardExplicit
7786
7786
let LeftwardExplicit = true
7787
7787
let NoLeftwardExplicit = false
@@ -7792,6 +7792,8 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7792
7792
flds
7793
7793
|> Map.toList
7794
7794
|> List.collect (fun (_, (_, dupes)) -> dupes)
7795
+ |> List.sortBy (fun (i, _) -> i)
7796
+ |> List.map (fun (_, field) -> field)
7795
7797
7796
7798
List.rev spreadSrcs, flds, tpenv
7797
7799
@@ -7812,7 +7814,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7812
7814
flds |> Map.change fieldId.idText (function
7813
7815
// The first field of this name, explicit or spread.
7814
7816
| None ->
7815
- Some (LeftwardExplicit, [field])
7817
+ Some (LeftwardExplicit, [i, field])
7816
7818
7817
7819
// Rightward explicit duplicate of leftward explicit field, potentially with intervening spreads.
7818
7820
//
@@ -7826,7 +7828,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7826
7828
// Keep both, but error.
7827
7829
| Some (LeftwardExplicit, dupes) ->
7828
7830
errorR (Duplicate ("field", fieldId.idText, m))
7829
- Some (LeftwardExplicit, field :: dupes)
7831
+ Some (LeftwardExplicit, (i, field) :: dupes)
7830
7832
7831
7833
// Rightward explicit field shadowing leftward spread field.
7832
7834
//
@@ -7835,9 +7837,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7835
7837
//
7836
7838
// Keep right.
7837
7839
| Some (NoLeftwardExplicit, _dupes) ->
7838
- Some (LeftwardExplicit, [field]))
7840
+ Some (LeftwardExplicit, [i, field]))
7839
7841
7840
- loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7842
+ loopFieldsAndSpreads spreadSrcs flds (i + 1) tpenv fieldsAndSpreads
7841
7843
7842
7844
| SynExprRecordFieldOrSpread.Spread (SynExprSpread (expr = expr; without = _without; range = m), _) :: fieldsAndSpreads ->
7843
7845
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.RecordSpreads m
@@ -7852,9 +7854,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7852
7854
let wrap, oldAddr, _readonly, _writeonly = mkExprAddrOfExpr g (isStructTy g tyOfSpreadSrcExpr) false NeverMutates spreadSrcExpr None m
7853
7855
spreadSrcAddrExpr, (fun expr -> wrap (mkCompGenLet m spreadSrcAddrVal oldAddr expr)) :: spreadSrcs
7854
7856
7855
- let rec loopFieldsFromSpread flds fieldsFromSpread =
7857
+ let rec loopFieldsFromSpread flds i fieldsFromSpread =
7856
7858
match fieldsFromSpread with
7857
- | [] -> loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7859
+ | [] -> loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads
7858
7860
7859
7861
| Item.RecdField fieldInfo :: fieldsFromSpread ->
7860
7862
let fieldExpr = mkRecdFieldGetViaExprAddr (spreadSrcAddrExpr, fieldInfo.RecdFieldRef, fieldInfo.TypeInst, m)
@@ -7865,7 +7867,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7865
7867
flds |> Map.change fieldId.idText (function
7866
7868
// The first field with this name, spread or explicit.
7867
7869
| None ->
7868
- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7870
+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7869
7871
7870
7872
// Rightward spread field shadowing leftward explicit field.
7871
7873
//
@@ -7876,7 +7878,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7876
7878
| Some (LeftwardExplicit, _dupes) ->
7877
7879
let fmtedSpreadField = NicePrint.stringOfRecdField env.DisplayEnv cenv.infoReader fieldInfo.TyconRef fieldInfo.RecdField
7878
7880
warning (Error (FSComp.SR.tcRecordExprSpreadFieldShadowsExplicitField fmtedSpreadField, m))
7879
- Some (LeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7881
+ Some (LeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7880
7882
7881
7883
// Spread field shadowing spread field.
7882
7884
//
@@ -7886,9 +7888,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7886
7888
//
7887
7889
// Keep right.
7888
7890
| Some (NoLeftwardExplicit, _dupes) ->
7889
- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7891
+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7890
7892
7891
- loopFieldsFromSpread flds fieldsFromSpread
7893
+ loopFieldsFromSpread flds (i + 1) fieldsFromSpread
7892
7894
7893
7895
| Item.AnonRecdField (anonInfo, tys, fieldIndex, _) :: fieldsFromSpread ->
7894
7896
let fieldExpr = mkAnonRecdFieldGet g (anonInfo, spreadSrcAddrExpr, tys, fieldIndex, m)
@@ -7899,7 +7901,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7899
7901
flds |> Map.change fieldId.idText (function
7900
7902
// The first field with this name, spread or explicit.
7901
7903
| None ->
7902
- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7904
+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7903
7905
7904
7906
// Rightward spread field shadowing leftward explicit field.
7905
7907
//
@@ -7911,7 +7913,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7911
7913
let typars = tryAppTy g ty |> ValueOption.map (snd >> List.choose (tryDestTyparTy g >> ValueOption.toOption)) |> ValueOption.defaultValue []
7912
7914
let fmtedSpreadField = LayoutRender.showL (NicePrint.prettyLayoutOfMemberSig env.DisplayEnv ([], fieldId.idText, typars, [], ty))
7913
7915
warning (Error (FSComp.SR.tcRecordExprSpreadFieldShadowsExplicitField fmtedSpreadField, m))
7914
- Some (LeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7916
+ Some (LeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7915
7917
7916
7918
// Spread field shadowing spread field.
7917
7919
//
@@ -7921,11 +7923,11 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7921
7923
//
7922
7924
// Keep right.
7923
7925
| Some (NoLeftwardExplicit, _dupes) ->
7924
- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7926
+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7925
7927
7926
- loopFieldsFromSpread flds fieldsFromSpread
7928
+ loopFieldsFromSpread flds (i + 1) fieldsFromSpread
7927
7929
7928
- | _ :: fieldsFromSpread -> loopFieldsFromSpread flds fieldsFromSpread
7930
+ | _ :: fieldsFromSpread -> loopFieldsFromSpread flds i fieldsFromSpread
7929
7931
7930
7932
let recordFieldsFromSpread =
7931
7933
if isRecdTy g tyOfSpreadSrcExpr then
@@ -7938,13 +7940,13 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
7938
7940
|> List.mapi (fun i id -> Item.AnonRecdField (anonInfo, tys, i, id.idRange)))
7939
7941
|> ValueOption.defaultValue []
7940
7942
7941
- loopFieldsFromSpread flds recordFieldsFromSpread
7943
+ loopFieldsFromSpread flds i recordFieldsFromSpread
7942
7944
else
7943
7945
if not expr.IsArbExprAndThusAlreadyReportedError then
7944
7946
errorR (Error (FSComp.SR.tcRecordExprSpreadSourceMustBeRecord (), m))
7945
- loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7947
+ loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads
7946
7948
7947
- loopFieldsAndSpreads [] Map.empty tpenv synRecdFields
7949
+ loopFieldsAndSpreads [] Map.empty 0 tpenv synRecdFields
7948
7950
7949
7951
let flds = if hasOrigExpr then GroupUpdatesToNestedFields flds else flds
7950
7952
// Check if the overall type is an anon record type and if so raise an copy-update syntax error
0 commit comments