Skip to content

Commit 438c5ab

Browse files
committed
Added FieldIndexSet
1 parent 00bff1c commit 438c5ab

File tree

8 files changed

+62
-40
lines changed

8 files changed

+62
-40
lines changed

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
"name": "Run bench-compiler (.NET)",
6666
"program": "${workspaceFolder}/src/fable-standalone/test/bench-compiler/bin/Debug/netcoreapp3.1/bench-compiler.dll",
6767
// "args": ["${workspaceRoot}/tests/Main/Fable.Tests.fsproj", "out-tests"],
68-
"args": ["${workspaceRoot}/../fable-test/fable-test.fsproj", "out-test", "--typescript"],
68+
"args": ["${workspaceRoot}/../fable-test/fable-test.fsproj", "out-test", "--eraseUnions"],
6969
// "args": ["${workspaceRoot}/src/fable-library/Fable.Library.fsproj", "out-lib", "--typescript"],
7070
"cwd": "${workspaceFolder}/src/fable-standalone/test/bench-compiler"
7171
},

src/Fable.AST/Fable.fs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,11 @@ type GetKind =
269269
| ListTail
270270
| OptionValue
271271

272+
type SetKind =
273+
| ByKeySet of KeyKind
274+
| FieldIndexSet of string * int
275+
| ValueSet
276+
272277
type TestKind =
273278
| TypeTest of Type
274279
| OptionTest of isSome: bool
@@ -307,8 +312,8 @@ type Expr =
307312

308313
// Getters, setters and bindings
309314
| Let of bindings: (Ident * Expr) list * body: Expr
310-
| Get of Expr * GetKind * typ: Type * range: SourceLocation option
311-
| Set of Expr * key: KeyKind option * value: Expr * range: SourceLocation option
315+
| Get of Expr * kind: GetKind * typ: Type * range: SourceLocation option
316+
| Set of Expr * kind: SetKind * value: Expr * range: SourceLocation option
312317

313318
// Control flow
314319
| Sequential of Expr list

src/Fable.Transforms/FSharp2Fable.Util.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1324,7 +1324,7 @@ module Util =
13241324
let t = memb.CurriedParameterGroups.[0].[0].Type |> makeType Map.empty
13251325
let arg = callInfo.Args |> List.tryHead |> Option.defaultWith makeNull
13261326
let key = makeFieldKey name true t
1327-
Fable.Set(callee, Some key, arg, r)
1327+
Fable.Set(callee, Fable.ByKeySet key, arg, r)
13281328
else
13291329
getSimple callee name |> makeCall r typ callInfo
13301330

src/Fable.Transforms/FSharp2Fable.fs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,11 @@ let private transformNewUnion com ctx r fsType (unionCase: FSharpUnionCase) (arg
5353
match com, fsType, unionCase with
5454
| ErasedUnion(kind, tdef, _genArgs) ->
5555
match kind, argExprs with
56-
| EraseKind.AsNamedTuple caseRule, [] -> transformStringEnum caseRule unionCase
57-
| EraseKind.AsNamedTuple _, _ -> (makeStrConst unionCase.Name)::argExprs |> Fable.NewTuple |> makeValue r
56+
// | EraseKind.AsNamedTuple caseRule, [] -> transformStringEnum caseRule unionCase
57+
| EraseKind.AsNamedTuple _, _ ->
58+
let caseTag = unionCaseTag tdef unionCase |> makeIntConst
59+
let caseName = makeStrConst unionCase.CompiledName
60+
caseTag::caseName::argExprs |> Fable.NewTuple |> makeValue r
5861
| EraseKind.AsValue, [arg] -> arg
5962
| EraseKind.AsValue, _ -> failwith "Shouldn't happen, error?"
6063
| EraseKind.AsTuple, _ -> Fable.NewTuple argExprs |> makeValue r
@@ -221,11 +224,14 @@ let private transformUnionCaseTest (com: IFableCompiler) (ctx: Context) r
221224
| ErasedUnion(kind, tdef, genArgs) ->
222225
match kind with
223226
| EraseKind.AsNamedTuple caseRule ->
224-
if unionCase.UnionCaseFields.Count = 0 then
225-
return makeEqOp r unionExpr (transformStringEnum caseRule unionCase) BinaryEqualStrict
226-
else
227-
let name = Fable.Get(unionExpr, Fable.TupleIndex(0), Fable.String, None)
228-
return makeEqOp r name (makeStrConst unionCase.Name) BinaryEqualStrict
227+
let tag1 = Fable.Get(unionExpr, Fable.TupleIndex(0), Fable.Number Int32, None)
228+
let tag2 = unionCaseTag tdef unionCase |> makeIntConst
229+
return makeEqOp r tag1 tag2 BinaryEqualStrict
230+
// if unionCase.UnionCaseFields.Count = 0 then
231+
// return makeEqOp r unionExpr (transformStringEnum caseRule unionCase) BinaryEqualStrict
232+
// else
233+
// let name = Fable.Get(unionExpr, Fable.TupleIndex(0), Fable.String, None)
234+
// return makeEqOp r name (makeStrConst unionCase.Name) BinaryEqualStrict
229235
| EraseKind.AsValue ->
230236
let fi = unionCase.UnionCaseFields.[0]
231237
let typ =
@@ -685,7 +691,7 @@ let private transformExpr (com: IFableCompiler) (ctx: Context) fsExpr =
685691
if unionCase.UnionCaseFields.Count = 0 then
686692
return "StringEnum types cannot have fields" |> addErrorAndReturnNull com ctx.InlinePath r
687693
else
688-
return getByIndex 1
694+
return getByIndex 2
689695
| OptionUnion t ->
690696
return Fable.Get(unionExpr, Fable.OptionValue, makeType ctx.GenericArgs t, r)
691697
| ListUnion t ->
@@ -705,14 +711,19 @@ let private transformExpr (com: IFableCompiler) (ctx: Context) fsExpr =
705711
return Fable.Get(unionExpr, kind, typ, r)
706712

707713
| BasicPatterns.FSharpFieldSet(callee, calleeType, field, value) ->
714+
let r = makeRangeFrom fsExpr
708715
let! callee = transformExprOpt com ctx callee
709716
let! value = transformExpr com ctx value
710717
let callee =
711718
match callee with
712719
| Some callee -> callee
713720
| None -> entityRef com (FsEnt calleeType.TypeDefinition)
714-
let field = FsField field :> Fable.Field |> Fable.FieldKey |> Some
715-
return Fable.Set(callee, field, value, makeRangeFrom fsExpr)
721+
if isErasedRecord com calleeType then
722+
let index = calleeType.TypeDefinition.FSharpFields |> Seq.findIndex (fun x -> x.Name = field.Name)
723+
return Fable.Set(callee, Fable.FieldIndexSet(field.Name, index + 1), value, r)
724+
else
725+
let key = FsField field :> Fable.Field |> Fable.FieldKey
726+
return Fable.Set(callee, Fable.ByKeySet key, value, r)
716727

717728
| BasicPatterns.UnionCaseTag(unionExpr, _unionType) ->
718729
let! unionExpr = transformExpr com ctx unionExpr
@@ -734,7 +745,7 @@ let private transformExpr (com: IFableCompiler) (ctx: Context) fsExpr =
734745
return makeCall r Fable.Unit info valToSet
735746
| _ ->
736747
let valToSet = makeValueFrom com ctx r valToSet
737-
return Fable.Set(valToSet, None, valueExpr, r)
748+
return Fable.Set(valToSet, Fable.ValueSet, valueExpr, r)
738749

739750
| BasicPatterns.NewArray(FableType com ctx elTyp, argExprs) ->
740751
let! argExprs = transformExprList com ctx argExprs

src/Fable.Transforms/Fable2Babel.fs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,9 +1215,10 @@ module Util =
12151215
let value = com.TransformAsExpr(ctx, value) |> wrapIntExpression value.Type
12161216
let var =
12171217
match setKind with
1218-
| None -> var
1219-
| Some(Fable.FieldKey fi) -> get None var fi.Name
1220-
| Some(Fable.ExprKey(TransformExpr com ctx e)) -> getExpr None var e
1218+
| Fable.ValueSet -> var
1219+
| Fable.ByKeySet(Fable.FieldKey fi) -> get None var fi.Name
1220+
| Fable.ByKeySet(Fable.ExprKey(TransformExpr com ctx e)) -> getExpr None var e
1221+
| Fable.FieldIndexSet (_, index) -> getExpr None var (ofInt index)
12211222
assign range var value
12221223

12231224
let transformBindingExprBody (com: IBabelCompiler) ctx (var: Fable.Ident) (value: Fable.Expr) =
@@ -1610,10 +1611,11 @@ module Util =
16101611
| Fable.Set(TransformExpr com ctx expr, kind, value, _range) ->
16111612
let ret =
16121613
match kind with
1613-
| None -> Assign expr
1614-
| Some(Fable.ExprKey(TransformExpr com ctx prop)) -> getExpr None expr prop |> Assign
1615-
| Some(Fable.FieldKey fi) -> get None expr fi.Name |> Assign
1616-
com.TransformAsStatements(ctx, Some ret, value)
1614+
| Fable.ValueSet -> expr
1615+
| Fable.ByKeySet(Fable.ExprKey(TransformExpr com ctx prop)) -> getExpr None expr prop
1616+
| Fable.ByKeySet(Fable.FieldKey fi) -> get None expr fi.Name
1617+
| Fable.FieldIndexSet (_, index) -> getExpr None expr (ofInt index)
1618+
com.TransformAsStatements(ctx, Some (Assign ret), value)
16171619

16181620
| Fable.IfThenElse(guardExpr, thenExpr, elseExpr, r) ->
16191621
let asStatement =

src/Fable.Transforms/FableTransforms.fs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ let visit f e =
7070
IfThenElse(f cond, f thenExpr, f elseExpr, r)
7171
| Set(e, kind, v, r) ->
7272
match kind with
73-
| Some(ExprKey e2) ->
74-
Set(f e, Some(ExprKey(f e2)), f v, r)
75-
| Some(FieldKey _) | None -> Set(f e, kind, f v, r)
73+
| ByKeySet(ExprKey e2) ->
74+
Set(f e, ByKeySet(ExprKey(f e2)), f v, r)
75+
| _ -> Set(f e, kind, f v, r)
7676
| WhileLoop(e1, e2, r) -> WhileLoop(f e1, f e2, r)
7777
| ForLoop(i, e1, e2, e3, up, r) -> ForLoop(i, f e1, f e2, f e3, up, r)
7878
| TryCatch(body, catch, finalizer, r) ->
@@ -138,8 +138,8 @@ let getSubExpressions = function
138138
| IfThenElse(cond, thenExpr, elseExpr, _) -> [cond; thenExpr; elseExpr]
139139
| Set(e, kind, v, _) ->
140140
match kind with
141-
| Some(ExprKey e2) -> [e; e2; v]
142-
| Some(FieldKey _) | None -> [e; v]
141+
| ByKeySet(ExprKey e2) -> [e; e2; v]
142+
| _ -> [e; v]
143143
| WhileLoop(e1, e2, _) -> [e1; e2]
144144
| ForLoop(_, e1, e2, e3, _, _) -> [e1; e2; e3]
145145
| TryCatch(body, catch, finalizer, _) ->
@@ -478,9 +478,9 @@ module private Transforms =
478478
let uci = com.GetEntity(ent).UnionCases.[tag]
479479
let args = uncurryConsArgs args uci.UnionCaseFields
480480
Value(NewUnion(args, tag, ent, genArgs), r)
481-
| Set(e, Some(FieldKey fi), value, r) ->
481+
| Set(e, ByKeySet(FieldKey fi), value, r) ->
482482
let value = uncurryArgs com false [fi.FieldType] [value]
483-
Set(e, Some(FieldKey fi), List.head value, r)
483+
Set(e, ByKeySet(FieldKey fi), List.head value, r)
484484
| e -> e
485485

486486
let rec uncurryApplications (com: Compiler) e =

src/Fable.Transforms/Replacements.fs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ let makeRefFromMutableValue com ctx (value: Expr) =
382382
let getter = Delegate([], value, None)
383383
let setter =
384384
let v = makeUniqueIdent ctx Any "v"
385-
Delegate([v], Set(value, None, IdentExpr v, None), None)
385+
Delegate([v], Set(value, ValueSet, IdentExpr v, None), None)
386386
Helper.LibCall(com, "Types", "FSharpRef", t, [getter; setter], isJsConstructor=true)
387387

388388
let turnLastArgIntoRef com ctx args =
@@ -926,7 +926,7 @@ let makePojoFromLambda com arg =
926926
| Lambda(_, lambdaBody, _) ->
927927
(flattenSequential lambdaBody, Some []) ||> List.foldBack (fun statement acc ->
928928
match acc, statement with
929-
| Some acc, Set(_, Some(FieldKey fi), value, _) ->
929+
| Some acc, Set(_, ByKeySet(FieldKey fi), value, _) ->
930930
objValue (fi.Name, value)::acc |> Some
931931
| _ -> None)
932932
| _ -> None
@@ -1212,7 +1212,7 @@ let fableCoreLib (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisArg: Exp
12121212
| "op_Dynamic", [left; memb] ->
12131213
getExpr r t left memb |> Some
12141214
| "op_DynamicAssignment", [callee; prop; MaybeLambdaUncurriedAtCompileTime value] ->
1215-
Set(callee, Some(ExprKey prop), value, r) |> Some
1215+
Set(callee, ByKeySet(ExprKey prop), value, r) |> Some
12161216
| ("op_Dollar"|"createNew" as m), callee::args ->
12171217
let args = destructureTupleArgs args
12181218
if m = "createNew" then "new $0($1...)" else "$0($1...)"
@@ -1254,7 +1254,7 @@ let fableCoreLib (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisArg: Exp
12541254
| _ -> None
12551255

12561256
let getReference r t expr = get r t expr "contents"
1257-
let setReference r expr value = Set(expr, Some(ExprKey(makeStrConst "contents")), value, r)
1257+
let setReference r expr value = Set(expr, ByKeySet(ExprKey(makeStrConst "contents")), value, r)
12581258
let newReference com r t value = Helper.LibCall(com, "Types", "FSharpRef", t, [value], isJsConstructor=true, ?loc=r)
12591259

12601260
let references (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisArg: Expr option) (args: Expr list) =
@@ -1736,7 +1736,7 @@ let resizeArrays (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (this
17361736
| ".ctor", _, args ->
17371737
Helper.GlobalCall("Array", t, args, memb="from", ?loc=r) |> Some
17381738
| "get_Item", Some ar, [idx] -> getExpr r t ar idx |> Some
1739-
| "set_Item", Some ar, [idx; value] -> Set(ar, Some(ExprKey idx), value, r) |> Some
1739+
| "set_Item", Some ar, [idx; value] -> Set(ar, ByKeySet(ExprKey idx), value, r) |> Some
17401740
| "Add", Some ar, [arg] ->
17411741
"void ($0)" |> emitJsExpr r t [Helper.InstanceCall(ar, "push", t, [arg])] |> Some
17421742
| "Remove", Some ar, [arg] ->
@@ -1824,7 +1824,7 @@ let arrays (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (thisArg: E
18241824
match i.CompiledName, thisArg, args with
18251825
| "get_Length", Some arg, _ -> get r t arg "length" |> Some
18261826
| "get_Item", Some arg, [idx] -> getExpr r t arg idx |> Some
1827-
| "set_Item", Some arg, [idx; value] -> Set(arg, Some(ExprKey idx), value, r) |> Some
1827+
| "set_Item", Some arg, [idx; value] -> Set(arg, ByKeySet(ExprKey idx), value, r) |> Some
18281828
| "Copy", None, [source; target; count] ->
18291829
Helper.LibCall(com, "Array", "copyTo", t, [source; makeIntConst 0; target; makeIntConst 0; count], i.SignatureArgTypes, ?loc=r) |> Some
18301830
| "Copy", None, [source; sourceIndex; target; targetIndex; count] ->
@@ -1854,7 +1854,7 @@ let arrayModule (com: ICompiler) (ctx: Context) r (t: Type) (i: CallInfo) (_: Ex
18541854
| ("Length" | "Count"), [arg] -> get r t arg "length" |> Some
18551855
| "Item", [idx; ar] -> getExpr r t ar idx |> Some
18561856
| "Get", [ar; idx] -> getExpr r t ar idx |> Some
1857-
| "Set", [ar; idx; value] -> Set(ar, Some(ExprKey idx), value, r) |> Some
1857+
| "Set", [ar; idx; value] -> Set(ar, ByKeySet(ExprKey idx), value, r) |> Some
18581858
| "ZeroCreate", [count] -> createArray count None |> Some
18591859
| "Create", [count; value] -> createArray count (Some value) |> Some
18601860
| "Empty", _ ->
@@ -2235,7 +2235,7 @@ let intrinsicFunctions (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisAr
22352235
| "MakeDecimal", _, _ -> decimals com ctx r t i thisArg args
22362236
| "GetString", _, [ar; idx]
22372237
| "GetArray", _, [ar; idx] -> getExpr r t ar idx |> Some
2238-
| "SetArray", _, [ar; idx; value] -> Set(ar, Some(ExprKey idx), value, r) |> Some
2238+
| "SetArray", _, [ar; idx; value] -> Set(ar, ByKeySet(ExprKey idx), value, r) |> Some
22392239
| ("GetArraySlice" | "GetStringSlice"), None, [ar; lower; upper] ->
22402240
let upper =
22412241
match upper with
@@ -2607,7 +2607,7 @@ let timers (com: ICompiler) (ctx: Context) r t (i: CallInfo) (thisArg: Expr opti
26072607
match i.CompiledName, thisArg, args with
26082608
| ".ctor", _, _ -> Helper.LibCall(com, "Timer", "default", t, args, i.SignatureArgTypes, isJsConstructor=true, ?loc=r) |> Some
26092609
| Naming.StartsWith "get_" meth, Some x, _ -> get r t x meth |> Some
2610-
| Naming.StartsWith "set_" meth, Some x, [value] -> Set(x, Some(ExprKey(makeStrConst meth)), value, r) |> Some
2610+
| Naming.StartsWith "set_" meth, Some x, [value] -> Set(x, ByKeySet(ExprKey(makeStrConst meth)), value, r) |> Some
26112611
| meth, Some x, args -> Helper.InstanceCall(x, meth, t, args, i.SignatureArgTypes, ?loc=r) |> Some
26122612
| _ -> None
26132613

src/fable-standalone/test/bench-compiler/package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"private": true,
3-
"_type": "module",
3+
"type": "module",
44
"scripts": {
55
"build-cli": "dotnet run -c Release -p ../../../Fable.Cli -- bench-compiler.fsproj --outDir out-node",
66
"postbuild-cli": "npm run rollup-bundle",
@@ -44,9 +44,13 @@
4444
"build-tests-dotnet-ts": "dotnet run -c Release ../../../../tests/Main/Fable.Tests.fsproj out-tests --typescript",
4545
"build-tests-dotnet-opt": "dotnet run -c Release ../../../../tests/Main/Fable.Tests.fsproj out-tests --optimize",
4646
"build-tests-node": "node out-node/app.js ../../../../tests/Main/Fable.Tests.fsproj out-tests",
47-
"_pretests": "npm run build-tests-dotnet -- --eraseUnions",
4847
"tests": "npm run mocha -- out-tests -r esm --colors",
4948

49+
"prebuild-fable-library": "dotnet run -c Release ../../../fable-library/Fable.Library.fsproj ./out-lib --eraseUnions",
50+
"build-fable-library": "npm run tsc -- -p ../../../fable-library --outDir ./out-lib",
51+
"prebuild-tests": "git clean -fdx && npm run build-fable-library",
52+
"build-tests": "npm run build-tests-dotnet -- --eraseUnions",
53+
5054
"tsc": "node ../../../../node_modules/typescript/bin/tsc",
5155
"babel": "node ../../../../node_modules/@babel/cli/bin/babel",
5256
"mocha": "node ../../../../node_modules/mocha/bin/mocha",

0 commit comments

Comments
 (0)