Skip to content

Commit 8c0e9ce

Browse files
Maintain order
1 parent 1591500 commit 8c0e9ce

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

src/Compiler/Checking/Expressions/CheckExpressions.fs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7781,7 +7781,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
77817781

77827782
let spreadSrcs, fldsList, tpenv =
77837783
let spreadSrcs, flds, tpenv =
7784-
let rec loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads =
7784+
let rec loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads =
77857785
let (|LeftwardExplicit|NoLeftwardExplicit|) hasLeftwardExplicit = if hasLeftwardExplicit then LeftwardExplicit else NoLeftwardExplicit
77867786
let LeftwardExplicit = true
77877787
let NoLeftwardExplicit = false
@@ -7792,6 +7792,8 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
77927792
flds
77937793
|> Map.toList
77947794
|> List.collect (fun (_, (_, dupes)) -> dupes)
7795+
|> List.sortBy (fun (i, _) -> i)
7796+
|> List.map (fun (_, field) -> field)
77957797

77967798
List.rev spreadSrcs, flds, tpenv
77977799

@@ -7812,7 +7814,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78127814
flds |> Map.change fieldId.idText (function
78137815
// The first field of this name, explicit or spread.
78147816
| None ->
7815-
Some (LeftwardExplicit, [field])
7817+
Some (LeftwardExplicit, [i, field])
78167818

78177819
// Rightward explicit duplicate of leftward explicit field, potentially with intervening spreads.
78187820
//
@@ -7826,7 +7828,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78267828
// Keep both, but error.
78277829
| Some (LeftwardExplicit, dupes) ->
78287830
errorR (Duplicate ("field", fieldId.idText, m))
7829-
Some (LeftwardExplicit, field :: dupes)
7831+
Some (LeftwardExplicit, (i, field) :: dupes)
78307832

78317833
// Rightward explicit field shadowing leftward spread field.
78327834
//
@@ -7835,9 +7837,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78357837
//
78367838
// Keep right.
78377839
| Some (NoLeftwardExplicit, _dupes) ->
7838-
Some (LeftwardExplicit, [field]))
7840+
Some (LeftwardExplicit, [i, field]))
78397841

7840-
loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7842+
loopFieldsAndSpreads spreadSrcs flds (i + 1) tpenv fieldsAndSpreads
78417843

78427844
| SynExprRecordFieldOrSpread.Spread (SynExprSpread (expr = expr; without = _without; range = m), _) :: fieldsAndSpreads ->
78437845
checkLanguageFeatureAndRecover g.langVersion LanguageFeature.RecordSpreads m
@@ -7852,9 +7854,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78527854
let wrap, oldAddr, _readonly, _writeonly = mkExprAddrOfExpr g (isStructTy g tyOfSpreadSrcExpr) false NeverMutates spreadSrcExpr None m
78537855
spreadSrcAddrExpr, (fun expr -> wrap (mkCompGenLet m spreadSrcAddrVal oldAddr expr)) :: spreadSrcs
78547856

7855-
let rec loopFieldsFromSpread flds fieldsFromSpread =
7857+
let rec loopFieldsFromSpread flds i fieldsFromSpread =
78567858
match fieldsFromSpread with
7857-
| [] -> loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7859+
| [] -> loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads
78587860

78597861
| Item.RecdField fieldInfo :: fieldsFromSpread ->
78607862
let fieldExpr = mkRecdFieldGetViaExprAddr (spreadSrcAddrExpr, fieldInfo.RecdFieldRef, fieldInfo.TypeInst, m)
@@ -7865,7 +7867,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78657867
flds |> Map.change fieldId.idText (function
78667868
// The first field with this name, spread or explicit.
78677869
| None ->
7868-
Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7870+
Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
78697871

78707872
// Rightward spread field shadowing leftward explicit field.
78717873
//
@@ -7876,7 +7878,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78767878
| Some (LeftwardExplicit, _dupes) ->
78777879
let fmtedSpreadField = NicePrint.stringOfRecdField env.DisplayEnv cenv.infoReader fieldInfo.TyconRef fieldInfo.RecdField
78787880
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))])
78807882

78817883
// Spread field shadowing spread field.
78827884
//
@@ -7886,9 +7888,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78867888
//
78877889
// Keep right.
78887890
| Some (NoLeftwardExplicit, _dupes) ->
7889-
Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7891+
Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
78907892

7891-
loopFieldsFromSpread flds fieldsFromSpread
7893+
loopFieldsFromSpread flds (i + 1) fieldsFromSpread
78927894

78937895
| Item.AnonRecdField (anonInfo, tys, fieldIndex, _) :: fieldsFromSpread ->
78947896
let fieldExpr = mkAnonRecdFieldGet g (anonInfo, spreadSrcAddrExpr, tys, fieldIndex, m)
@@ -7899,7 +7901,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78997901
flds |> Map.change fieldId.idText (function
79007902
// The first field with this name, spread or explicit.
79017903
| None ->
7902-
Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7904+
Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
79037905

79047906
// Rightward spread field shadowing leftward explicit field.
79057907
//
@@ -7911,7 +7913,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
79117913
let typars = tryAppTy g ty |> ValueOption.map (snd >> List.choose (tryDestTyparTy g >> ValueOption.toOption)) |> ValueOption.defaultValue []
79127914
let fmtedSpreadField = LayoutRender.showL (NicePrint.prettyLayoutOfMemberSig env.DisplayEnv ([], fieldId.idText, typars, [], ty))
79137915
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))])
79157917

79167918
// Spread field shadowing spread field.
79177919
//
@@ -7921,11 +7923,11 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
79217923
//
79227924
// Keep right.
79237925
| Some (NoLeftwardExplicit, _dupes) ->
7924-
Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7926+
Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
79257927

7926-
loopFieldsFromSpread flds fieldsFromSpread
7928+
loopFieldsFromSpread flds (i + 1) fieldsFromSpread
79277929

7928-
| _ :: fieldsFromSpread -> loopFieldsFromSpread flds fieldsFromSpread
7930+
| _ :: fieldsFromSpread -> loopFieldsFromSpread flds i fieldsFromSpread
79297931

79307932
let recordFieldsFromSpread =
79317933
if isRecdTy g tyOfSpreadSrcExpr then
@@ -7938,13 +7940,13 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
79387940
|> List.mapi (fun i id -> Item.AnonRecdField (anonInfo, tys, i, id.idRange)))
79397941
|> ValueOption.defaultValue []
79407942

7941-
loopFieldsFromSpread flds recordFieldsFromSpread
7943+
loopFieldsFromSpread flds i recordFieldsFromSpread
79427944
else
79437945
if not expr.IsArbExprAndThusAlreadyReportedError then
79447946
errorR (Error (FSComp.SR.tcRecordExprSpreadSourceMustBeRecord (), m))
7945-
loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7947+
loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads
79467948

7947-
loopFieldsAndSpreads [] Map.empty tpenv synRecdFields
7949+
loopFieldsAndSpreads [] Map.empty 0 tpenv synRecdFields
79487950

79497951
let flds = if hasOrigExpr then GroupUpdatesToNestedFields flds else flds
79507952
// Check if the overall type is an anon record type and if so raise an copy-update syntax error

0 commit comments

Comments
 (0)