@@ -85,58 +85,68 @@ module FableJS =
8585 getPropertyValue o propName
8686
8787 [<Emit( " Object.getOwnPropertyDescriptor($0, $1)" ) >]
88- let getPropertyDescriptor ( o : obj ) ( propName : string ) =
88+ let tryGetPropertyDescriptor ( o : obj ) ( propName : string ) : obj option =
8989 jsNative
9090
91- let getStaticPropertyDescriptor ( o : obj ) ( propName : string ) =
92- getPropertyDescriptor ( getPrototype o) propName
93-
91+ let tryGetStaticPropertyDescriptor ( o : obj ) ( propName : string ) : obj option =
92+ tryGetPropertyDescriptor ( getPrototype o) propName
93+
94+ let tryStaticPropertyHelperFromDescriptor ( pd : obj ) ( name : string ) : PropertyHelper option =
95+ let isWritable = PropertyDescriptor.isWritable pd
96+ if PropertyDescriptor.isFunction pd then
97+ None
98+ else
99+ {
100+ Name = name
101+ IsStatic = true
102+ IsDynamic = false
103+ IsMutable = isWritable
104+ IsImmutable = not isWritable
105+ GetValue = createGetter name
106+ SetValue = createSetter name
107+ RemoveValue = createRemover name true
108+ }
109+ |> Some
110+
111+ let tryGetStaticPropertyHelper ( o : obj ) ( propName : string ) : PropertyHelper option =
112+ tryGetStaticPropertyDescriptor o propName
113+ |> Option.bind ( fun pd -> tryStaticPropertyHelperFromDescriptor pd propName)
114+
94115 let getStaticPropertyHelpers ( o : obj ) : PropertyHelper [] =
95116 getStaticPropertyNames o
96- |> Array.choose ( fun n ->
97- let pd = getStaticPropertyDescriptor o n
98- if PropertyDescriptor.isFunction pd then
99- None
100- else
101- let isWritable = PropertyDescriptor.isWritable pd
102- {
103- Name = n
104- IsStatic = true
105- IsDynamic = false
106- IsMutable = isWritable
107- IsImmutable = not isWritable
108- GetValue = createGetter n
109- SetValue = createSetter n
110- RemoveValue = createRemover n true
111- }
112- |> Some
113- )
117+ |> Array.choose ( tryGetStaticPropertyHelper o)
118+
119+ let tryGetDynamicPropertyDescriptor ( o : obj ) ( propName : string ) : obj option =
120+ tryGetPropertyDescriptor o propName
114121
115122 let transpiledPropertyRegex = " ^[a-zA-Z]+@[0-9]+$"
116123
117124 let isTranspiledPropertyHelper ( propertyName : string ) =
118125 System.Text.RegularExpressions.Regex.IsMatch( propertyName, transpiledPropertyRegex)
119126
127+ let tryDynamicPropertyHelperFromDescriptor ( pd : obj ) ( name : string ) : PropertyHelper option =
128+ if PropertyDescriptor.isFunction pd || isTranspiledPropertyHelper name then
129+ None
130+ else
131+ {
132+ Name = name
133+ IsStatic = false
134+ IsDynamic = true
135+ IsMutable = true
136+ IsImmutable = false
137+ GetValue = createGetter name
138+ SetValue = createSetter name
139+ RemoveValue = createRemover name false
140+ }
141+ |> Some
142+
143+ let tryGetDynamicPropertyHelper ( o : obj ) ( propName : string ) : PropertyHelper option =
144+ tryGetDynamicPropertyDescriptor o propName
145+ |> Option.bind ( fun pd -> tryDynamicPropertyHelperFromDescriptor pd propName)
146+
120147 let getDynamicPropertyHelpers ( o : obj ) : PropertyHelper [] =
121148 getOwnPropertyNames o
122- |> Array.choose ( fun n ->
123- let pd = getPropertyDescriptor o n
124- if PropertyDescriptor.isFunction pd || isTranspiledPropertyHelper n then
125- None
126- else
127- let isWritable = PropertyDescriptor.isWritable pd
128- {
129- Name = n
130- IsStatic = false
131- IsDynamic = true
132- IsMutable = isWritable
133- IsImmutable = not isWritable
134- GetValue = createGetter n
135- SetValue = createSetter n
136- RemoveValue = createRemover n false
137- }
138- |> Some
139- )
149+ |> Array.choose ( tryGetDynamicPropertyHelper o)
140150
141151 let getPropertyHelpers ( o : obj ) =
142152 getDynamicPropertyHelpers o
0 commit comments