@@ -249,12 +249,53 @@ let private IsILMethInfoAccessible g amap m adType ad ilminfo =
249249let GetILAccessOfILPropInfo ( ILPropInfo ( tinfo , pdef )) =
250250 let tdef = tinfo.RawMetadata
251251 let ilAccess =
252- match pdef.GetMethod with
253- | Some mref -> ( resolveILMethodRef tdef mref) .Access
254- | None ->
255- match pdef.SetMethod with
256- | None -> ILMemberAccess.Public
257- | Some mref -> ( resolveILMethodRef tdef mref) .Access
252+ match pdef.GetMethod, pdef.SetMethod with
253+ | Some mref, None
254+ | None, Some mref -> ( resolveILMethodRef tdef mref) .Access
255+
256+ | Some mrefGet, Some mrefSet ->
257+ //
258+ // Dotnet properties have a getter and a setter method, each of which can have a separate visibility public, protected, private etc ...
259+ // This code computes the visibility for the property by choosing the most visible method. This approximation is usefull for cases
260+ // where the compiler needs to know the visibility of the property.
261+ // The specific ordering for choosing the most visible is:
262+ // ILMemberAccess.Public,
263+ // ILMemberAccess.FamilyOrAssembly
264+ // ILMemberAccess.Assembly
265+ // ILMemberAccess.Family
266+ // ILMemberAccess.FamilyAndAssembly
267+ // ILMemberAccess.Private
268+ // ILMemberAccess.CompilerControlled
269+ //
270+ let getA = ( resolveILMethodRef tdef mrefGet) .Access
271+ let setA = ( resolveILMethodRef tdef mrefSet) .Access
272+
273+ // Use the accessors to determine the visibility of the property.
274+ // N.B. It is critical to keep the ordering in decreasing visibility order in the following match expression
275+ match getA, setA with
276+ | ILMemberAccess.Public, _
277+ | _, ILMemberAccess.Public -> ILMemberAccess.Public
278+
279+ | ILMemberAccess.FamilyOrAssembly, _
280+ | _, ILMemberAccess.FamilyOrAssembly -> ILMemberAccess.FamilyOrAssembly
281+
282+ | ILMemberAccess.Assembly, _
283+ | _, ILMemberAccess.Assembly -> ILMemberAccess.Assembly
284+
285+ | ILMemberAccess.Family, _
286+ | _, ILMemberAccess.Family -> ILMemberAccess.Family
287+
288+ | ILMemberAccess.FamilyAndAssembly, _
289+ | _, ILMemberAccess.FamilyAndAssembly -> ILMemberAccess.FamilyAndAssembly
290+
291+ | ILMemberAccess.Private, _
292+ | _, ILMemberAccess.Private -> ILMemberAccess.Private
293+
294+ | ILMemberAccess.CompilerControlled, _
295+ | _, ILMemberAccess.CompilerControlled -> ILMemberAccess.CompilerControlled
296+
297+ | None, None -> ILMemberAccess.Public
298+
258299 ilAccess
259300
260301let IsILPropInfoAccessible g amap m ad pinfo =
@@ -323,8 +364,11 @@ let IsMethInfoAccessible amap m ad minfo = IsTypeAndMethInfoAccessible amap m ad
323364
324365let IsPropInfoAccessible g amap m ad = function
325366 | ILProp ilpinfo -> IsILPropInfoAccessible g amap m ad ilpinfo
326- | FSProp (_, _, Some vref, _)
327- | FSProp (_, _, _, Some vref) -> IsValAccessible ad vref
367+ | FSProp (_, _, Some vref, None)
368+ | FSProp (_, _, None, Some vref) -> IsValAccessible ad vref
369+ | FSProp (_, _, Some vrefGet, Some vrefSet) ->
370+ // pick most accessible
371+ IsValAccessible ad vrefGet || IsValAccessible ad vrefSet
328372#if ! NO_ EXTENSIONTYPING
329373 | ProvidedProp ( amap, tppi, m) as pp->
330374 let access =
@@ -343,4 +387,3 @@ let IsPropInfoAccessible g amap m ad = function
343387
344388let IsFieldInfoAccessible ad ( rfref : RecdFieldInfo ) =
345389 IsAccessible ad rfref.RecdField.Accessibility
346-
0 commit comments