@@ -812,7 +812,8 @@ module Util =
812812 let getUnionCaseName ( uci : Fable.UnionCase ) =
813813 match uci.CompiledName with Some cname -> cname | None -> uci.Name
814814
815- let getUnionExprTag r expr =
815+ let getUnionExprTag ( com : IBabelCompiler ) ctx r ( fableExpr : Fable.Expr ) =
816+ let expr = com.TransformAsExpr( ctx, fableExpr)
816817 getExpr r expr ( Expression.stringLiteral( " tag" ))
817818
818819 /// Wrap int expressions with `| 0` to help optimization of JS VMs
@@ -958,20 +959,21 @@ module Util =
958959 | Fable.EnumConstant( x,_) ->
959960 com.TransformAsExpr( ctx, x)
960961 | Fable.NewRecord( values, ent, genArgs) ->
962+ let ent = com.GetEntity( ent)
961963 let values = List.mapToArray ( fun x -> com.TransformAsExpr( ctx, x)) values
962- let consRef = com.GetEntity ( ent) |> jsConstructor com ctx
964+ let consRef = ent |> jsConstructor com ctx
963965 let typeParamInst =
964966 if com.Options.Typescript && ( ent.FullName = Types.reference)
965967 then makeGenTypeParamInst com ctx genArgs
966968 else None
967969 Expression.newExpression( consRef, values, ?typeArguments= typeParamInst, ?loc= r)
968970 | Fable.NewAnonymousRecord( values, fieldNames, _ genArgs) ->
969971 let values = List.mapToArray ( fun x -> com.TransformAsExpr( ctx, x)) values
970- Array.zip fieldNames values
971- |> makeJsObject
972+ Array.zip fieldNames values |> makeJsObject
972973 | Fable.NewUnion( values, tag, ent, genArgs) ->
973- let consRef = com.GetEntity( ent) |> jsConstructor com ctx
974+ let ent = com.GetEntity( ent)
974975 let values = List.map ( fun x -> com.TransformAsExpr( ctx, x)) values
976+ let consRef = ent |> jsConstructor com ctx
975977 let typeParamInst =
976978 if com.Options.Typescript
977979 then makeGenTypeParamInst com ctx genArgs
@@ -1185,8 +1187,8 @@ module Util =
11851187 | statements -> Statement.ifStatement( guardExpr, thenStmnt, Statement.blockStatement( statements), ?loc= r)
11861188 |> Array.singleton
11871189
1188- let transformGet ( com : IBabelCompiler ) ctx range typ fableExpr ( getKind : Fable.GetKind ) =
1189- match getKind with
1190+ let transformGet ( com : IBabelCompiler ) ctx range typ fableExpr kind =
1191+ match kind with
11901192 | Fable.ByKey key ->
11911193 let fableExpr =
11921194 match fableExpr with
@@ -1199,6 +1201,10 @@ module Util =
11991201 | Fable.ExprKey( TransformExpr com ctx prop) -> getExpr range expr prop
12001202 | Fable.FieldKey field -> get range expr field.Name
12011203
1204+ | Fable.FieldGet ( field, index) ->
1205+ let expr = com.TransformAsExpr( ctx, fableExpr)
1206+ get range expr field.Name
1207+
12021208 | Fable.ListHead ->
12031209 // get range (com.TransformAsExpr(ctx, fableExpr)) "head"
12041210 libCall com ctx range " List" " head" [| com.TransformAsExpr( ctx, fableExpr)|]
@@ -1221,21 +1227,22 @@ module Util =
12211227 else expr
12221228
12231229 | Fable.UnionTag ->
1224- com.TransformAsExpr ( ctx, fableExpr ) |> getUnionExprTag range
1230+ getUnionExprTag com ctx range fableExpr
12251231
1226- | Fable.UnionField( idx , _) ->
1232+ | Fable.UnionField( index , _) ->
12271233 let expr = com.TransformAsExpr( ctx, fableExpr)
1228- getExpr range ( getExpr None expr ( Expression.stringLiteral( " fields" ))) ( ofInt idx )
1234+ getExpr range ( getExpr None expr ( Expression.stringLiteral( " fields" ))) ( ofInt index )
12291235
1230- let transformSet ( com : IBabelCompiler ) ctx range var ( value : Fable.Expr ) setKind =
1231- let var = com.TransformAsExpr( ctx, var )
1236+ let transformSet ( com : IBabelCompiler ) ctx range fableExpr ( value : Fable.Expr ) kind =
1237+ let expr = com.TransformAsExpr( ctx, fableExpr )
12321238 let value = com.TransformAsExpr( ctx, value) |> wrapIntExpression value.Type
1233- let var =
1234- match setKind with
1235- | None -> var
1236- | Some( Fable.FieldKey fi) -> get None var fi.Name
1237- | Some( Fable.ExprKey( TransformExpr com ctx e)) -> getExpr None var e
1238- assign range var value
1239+ let ret =
1240+ match kind with
1241+ | Fable.ValueSet -> expr
1242+ | Fable.ByKeySet( Fable.FieldKey fi) -> get None expr fi.Name
1243+ | Fable.ByKeySet( Fable.ExprKey( TransformExpr com ctx e)) -> getExpr None expr e
1244+ | Fable.FieldSet ( field, index) -> get None expr field.Name
1245+ assign range ret value
12391246
12401247 let transformBindingExprBody ( com : IBabelCompiler ) ( ctx : Context ) ( var : Fable.Ident ) ( value : Fable.Expr ) =
12411248 match value with
@@ -1276,7 +1283,7 @@ module Util =
12761283 if nonEmpty then Expression.unaryExpression( UnaryNot, expr, ?loc= range) else expr
12771284 | Fable.UnionCaseTest tag ->
12781285 let expected = ofInt tag
1279- let actual = com.TransformAsExpr ( ctx, expr ) |> getUnionExprTag None
1286+ let actual = getUnionExprTag com ctx None expr
12801287 Expression.binaryExpression( BinaryEqualStrict, actual, expected, ?loc= range)
12811288
12821289 let transformSwitch ( com : IBabelCompiler ) ctx useBlocks returnStrategy evalExpr cases defaultCase : Statement =
@@ -1541,8 +1548,8 @@ module Util =
15411548 | Fable.Operation( kind, _, range) ->
15421549 transformOperation com ctx range kind
15431550
1544- | Fable.Get( expr, getKind , typ, range) ->
1545- transformGet com ctx range typ expr getKind
1551+ | Fable.Get( expr, kind , typ, range) ->
1552+ transformGet com ctx range typ expr kind
15461553
15471554 | Fable.IfThenElse( TransformExpr com ctx guardExpr,
15481555 TransformExpr com ctx thenExpr,
@@ -1555,8 +1562,8 @@ module Util =
15551562 | Fable.DecisionTreeSuccess( idx, boundValues, _) ->
15561563 transformDecisionTreeSuccessAsExpr com ctx idx boundValues
15571564
1558- | Fable.Set( var , setKind , value, range) ->
1559- transformSet com ctx range var value setKind
1565+ | Fable.Set( expr , kind , value, range) ->
1566+ transformSet com ctx range expr value kind
15601567
15611568 | Fable.Let( ident, value, body) ->
15621569 if ctx.HoistVars [ ident] then
@@ -1632,8 +1639,8 @@ module Util =
16321639 | Fable.Operation( kind, t, range) ->
16331640 [| transformOperation com ctx range kind |> resolveExpr t returnStrategy|]
16341641
1635- | Fable.Get( expr, getKind , t, range) ->
1636- [| transformGet com ctx range t expr getKind |> resolveExpr t returnStrategy|]
1642+ | Fable.Get( expr, kind , t, range) ->
1643+ [| transformGet com ctx range t expr kind |> resolveExpr t returnStrategy|]
16371644
16381645 | Fable.Let( ident, value, body) ->
16391646 let binding = transformBindingAsStatements com ctx ident value
@@ -1643,13 +1650,8 @@ module Util =
16431650 let bindings = bindings |> Seq.collect ( fun ( i , v ) -> transformBindingAsStatements com ctx i v) |> Seq.toArray
16441651 Array.append bindings ( transformAsStatements com ctx returnStrategy body)
16451652
1646- | Fable.Set( TransformExpr com ctx expr, kind, value, _ range) ->
1647- let ret =
1648- match kind with
1649- | None -> Assign expr
1650- | Some( Fable.ExprKey( TransformExpr com ctx prop)) -> getExpr None expr prop |> Assign
1651- | Some( Fable.FieldKey fi) -> get None expr fi.Name |> Assign
1652- com.TransformAsStatements( ctx, Some ret, value)
1653+ | Fable.Set( expr, kind, value, range) ->
1654+ [| transformSet com ctx range expr value kind |> resolveExpr expr.Type returnStrategy|]
16531655
16541656 | Fable.IfThenElse( guardExpr, thenExpr, elseExpr, r) ->
16551657 let asStatement =
@@ -1812,7 +1814,7 @@ module Util =
18121814 |> Seq.toArray
18131815
18141816 let getEntityFieldsAsProps ( com : IBabelCompiler ) ctx ( ent : Fable.Entity ) =
1815- if ( ent.IsFSharpUnion) then
1817+ if ent.IsFSharpUnion then
18161818 getUnionFieldsAsIdents com ctx ent
18171819 |> Array.map ( fun id ->
18181820 let prop = identAsExpr id
0 commit comments