Skip to content

Commit

Permalink
Explicit struct tuples for msbuild mono
Browse files Browse the repository at this point in the history
  • Loading branch information
TimLariviere committed Oct 1, 2020
1 parent 172ce2a commit 5084420
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 182 deletions.
36 changes: 18 additions & 18 deletions Fabulous.CodeGen/src/Fabulous.CodeGen/Generator/CodeGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -128,23 +128,23 @@ module CodeGenerator =
if ap.ModelType = "ViewElement" && not hasApply then
w.printfn " match struct (prev%sOpt, curr%sOpt) with" ap.UniqueName ap.UniqueName
w.printfn " // For structured objects, dependsOn on reference equality"
w.printfn " | ValueSome prevValue, ValueSome newValue when identical prevValue newValue -> ()"
w.printfn " | ValueSome prevValue, ValueSome newValue when canReuseView prevValue newValue ->"
w.printfn " | struct (ValueSome prevValue, ValueSome newValue) when identical prevValue newValue -> ()"
w.printfn " | struct (ValueSome prevValue, ValueSome newValue) when canReuseView prevValue newValue ->"
w.printfn " newValue.UpdateIncremental(prevValue, (%s.Get%s(target)))" data.FullName ap.Name
w.printfn " | _, ValueSome newValue ->"
w.printfn " | struct (_, ValueSome newValue) ->"
w.printfn " %s.Set%s(target, (newValue.Create() :?> %s))" data.FullName ap.Name ap.OriginalType
w.printfn " | ValueSome _, ValueNone ->"
w.printfn " | struct (ValueSome _, ValueNone) ->"
w.printfn " %s.Set%s(target, null)" data.FullName ap.Name
w.printfn " | ValueNone, ValueNone -> ()"
w.printfn " | struct (ValueNone, ValueNone) -> ()"

elif not (System.String.IsNullOrWhiteSpace(ap.UpdateCode)) then
w.printfn " %s prev%sOpt curr%sOpt targetChild" ap.UniqueName ap.UniqueName ap.UpdateCode

else
w.printfn " match struct (prev%sOpt, curr%sOpt) with" ap.UniqueName ap.UniqueName
w.printfn " | ValueSome prevValue, ValueSome currValue when prevValue = currValue -> ()"
w.printfn " | _, ValueSome currValue -> target.SetValue(%s.%sProperty, %s currValue)" data.FullName ap.Name ap.ConvertModelToValue
w.printfn " | ValueSome _, ValueNone -> target.ClearValue(%s.%sProperty)" data.FullName ap.Name
w.printfn " | struct (ValueSome prevValue, ValueSome currValue) when prevValue = currValue -> ()"
w.printfn " | struct (_, ValueSome currValue) -> target.SetValue(%s.%sProperty, %s currValue)" data.FullName ap.Name ap.ConvertModelToValue
w.printfn " | struct (ValueSome _, ValueNone) -> target.ClearValue(%s.%sProperty)" data.FullName ap.Name
w.printfn " | _ -> ()"

printUpdateBaseIfNeeded " " false
Expand Down Expand Up @@ -180,28 +180,28 @@ module CodeGenerator =
if p.ModelType = "ViewElement" && not hasApply then
w.printfn " match struct (prev%sOpt, curr%sOpt) with" p.UniqueName p.UniqueName
w.printfn " // For structured objects, dependsOn on reference equality"
w.printfn " | ValueSome prevValue, ValueSome newValue when identical prevValue newValue -> ()"
w.printfn " | ValueSome prevValue, ValueSome newValue when canReuseView prevValue newValue ->"
w.printfn " | struct (ValueSome prevValue, ValueSome newValue) when identical prevValue newValue -> ()"
w.printfn " | struct (ValueSome prevValue, ValueSome newValue) when canReuseView prevValue newValue ->"
w.printfn " newValue.UpdateIncremental(prevValue, target.%s)" p.Name
w.printfn " | _, ValueSome newValue ->"
w.printfn " | struct (_, ValueSome newValue) ->"
w.printfn " target.%s <- (newValue.Create() :?> %s)" p.Name p.OriginalType
w.printfn " | ValueSome _, ValueNone ->"
w.printfn " | struct (ValueSome _, ValueNone) ->"
w.printfn " target.%s <- null" p.Name
w.printfn " | ValueNone, ValueNone -> ()"
w.printfn " | struct (ValueNone, ValueNone) -> ()"

// Explicit update code
elif not (System.String.IsNullOrWhiteSpace(p.UpdateCode)) then
w.printfn " %s prev%sOpt curr%sOpt target" p.UpdateCode p.UniqueName p.UniqueName

else
w.printfn " match struct (prev%sOpt, curr%sOpt) with" p.UniqueName p.UniqueName
w.printfn " | ValueSome prevValue, ValueSome currValue when prevValue = currValue -> ()"
w.printfn " | _, ValueSome currValue -> target.%s <- %s currValue" p.Name p.ConvertModelToValue
w.printfn " | struct (ValueSome prevValue, ValueSome currValue) when prevValue = currValue -> ()"
w.printfn " | struct (_, ValueSome currValue) -> target.%s <- %s currValue" p.Name p.ConvertModelToValue
if p.DefaultValue = "" then
w.printfn " | ValueSome _, ValueNone -> target.ClearValue %s.%sProperty" data.FullName p.Name
w.printfn " | struct (ValueSome _, ValueNone) -> target.ClearValue %s.%sProperty" data.FullName p.Name
else
w.printfn " | ValueSome _, ValueNone -> target.%s <- %s" p.Name p.DefaultValue
w.printfn " | ValueNone, ValueNone -> ()"
w.printfn " | struct (ValueSome _, ValueNone) -> target.%s <- %s" p.Name p.DefaultValue
w.printfn " | struct (ValueNone, ValueNone) -> ()"

w.printfn " static member Update%s (prevOpt: ViewElement voption, curr: ViewElement, target: %s) = " data.Name data.FullName

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ module ViewHelpers =

let identicalVOption (x: 'T voption) (y: 'T voption) =
match struct (x, y) with
| ValueNone, ValueNone -> true
| ValueSome x1, ValueSome y1 when identical x1 y1 -> true
| struct (ValueNone, ValueNone) -> true
| struct (ValueSome x1, ValueSome y1) when identical x1 y1 -> true
| _ -> false

/// Checks whether an underlying control can be reused given the previous and new view elements
Expand Down
Loading

0 comments on commit 5084420

Please sign in to comment.