@@ -2562,34 +2562,48 @@ let typeEncodingOfFlags flags =
25622562 elif f = 0x00010000 then ILDefaultPInvokeEncoding.Unicode
25632563 else ILDefaultPInvokeEncoding.Ansi
25642564
2565- [<RequireQualifiedAccess>]
2566- type ILTypeDefKind =
2567- | Class
2568- | ValueType
2569- | Interface
2570- | Enum
2571- | Delegate
2565+ [<Flags>]
2566+ type ILTypeDefAdditionalFlags =
2567+ | Class = 1
2568+ | ValueType = 2
2569+ | Interface = 4
2570+ | Enum = 8
2571+ | Delegate = 16
2572+ | IsKnownToBeAttribute = 32
2573+ /// The type can contain extension methods,
2574+ /// or this information may not be available at the time the ILTypeDef is created
2575+ | CanContainExtensionMethods = 1024
2576+
2577+ let internal typeKindFlags =
2578+ ILTypeDefAdditionalFlags.Class |||
2579+ ILTypeDefAdditionalFlags.ValueType |||
2580+ ILTypeDefAdditionalFlags.Interface |||
2581+ ILTypeDefAdditionalFlags.Enum |||
2582+ ILTypeDefAdditionalFlags.Delegate
2583+
2584+ let inline internal resetTypeKind flags =
2585+ flags &&& ~~~ typeKindFlags
2586+
2587+ let (| HasFlag | _ |) ( flag : ILTypeDefAdditionalFlags ) flags =
2588+ flags &&& flag = flag
2589+
2590+ let inline typeKindByNames extendsName typeName =
2591+ match extendsName with
2592+ | " System.Enum" -> ILTypeDefAdditionalFlags.Enum
2593+ | " System.Delegate" when typeName <> " System.MulticastDelegate" -> ILTypeDefAdditionalFlags.Delegate
2594+ | " System.MulticastDelegate" -> ILTypeDefAdditionalFlags.Delegate
2595+ | " System.ValueType" when typeName <> " System.Enum" -> ILTypeDefAdditionalFlags.ValueType
2596+ | _ -> ILTypeDefAdditionalFlags.Class
25722597
25732598let typeKindOfFlags nm ( super : ILType option ) flags =
25742599 if ( flags &&& 0x00000020 ) <> 0x0 then
2575- ILTypeDefKind .Interface
2600+ ILTypeDefAdditionalFlags .Interface
25762601 else
25772602 match super with
2578- | None -> ILTypeDefKind .Class
2603+ | None -> ILTypeDefAdditionalFlags .Class
25792604 | Some ty ->
25802605 let name = ty.TypeSpec.Name
2581-
2582- if name = " System.Enum" then
2583- ILTypeDefKind.Enum
2584- elif
2585- ( name = " System.Delegate" && nm <> " System.MulticastDelegate" )
2586- || name = " System.MulticastDelegate"
2587- then
2588- ILTypeDefKind.Delegate
2589- elif name = " System.ValueType" && nm <> " System.Enum" then
2590- ILTypeDefKind.ValueType
2591- else
2592- ILTypeDefKind.Class
2606+ typeKindByNames name nm
25932607
25942608let convertTypeAccessFlags access =
25952609 match access with
@@ -2605,11 +2619,8 @@ let convertTypeAccessFlags access =
26052619
26062620let convertTypeKind kind =
26072621 match kind with
2608- | ILTypeDefKind.Class -> TypeAttributes.Class
2609- | ILTypeDefKind.ValueType -> TypeAttributes.Class
2610- | ILTypeDefKind.Interface -> TypeAttributes.Abstract ||| TypeAttributes.Interface
2611- | ILTypeDefKind.Enum -> TypeAttributes.Class
2612- | ILTypeDefKind.Delegate -> TypeAttributes.Class
2622+ | HasFlag ILTypeDefAdditionalFlags.Interface -> TypeAttributes.Abstract ||| TypeAttributes.Interface
2623+ | _ -> TypeAttributes.Class
26132624
26142625let convertLayout layout =
26152626 match layout with
@@ -2638,13 +2649,7 @@ let convertInitSemantics (init: ILTypeInit) =
26382649 | ILTypeInit.BeforeField -> TypeAttributes.BeforeFieldInit
26392650 | ILTypeInit.OnAny -> enum 0
26402651
2641- [<Flags>]
2642- type ILTypeDefAdditionalFlags =
2643- | None = 0
2644- | IsKnownToBeAttribute = 1
2645- /// The type can contain extension methods,
2646- /// or this information may not be available at the time the ILTypeDef is created
2647- | CanContainExtensionMethods = 2
2652+ let emptyILExtends = notlazy< ILType option> None
26482653
26492654[<NoComparison; NoEquality; StructuredFormatDisplay( " {DebugText}" ) >]
26502655type ILTypeDef
@@ -2654,7 +2659,7 @@ type ILTypeDef
26542659 layout: ILTypeDefLayout,
26552660 implements: InterruptibleLazy< InterfaceImpl list>,
26562661 genericParams: ILGenericParameterDefs,
2657- extends: ILType option,
2662+ extends: InterruptibleLazy < ILType option> ,
26582663 methods: ILMethodDefs,
26592664 nestedTypes: ILTypeDefs,
26602665 fields: ILFieldDefs,
@@ -2705,6 +2710,42 @@ type ILTypeDef
27052710 NoMetadataIdx
27062711 )
27072712
2713+ new ( name,
2714+ attributes,
2715+ layout,
2716+ implements,
2717+ genericParams,
2718+ extends,
2719+ methods,
2720+ nestedTypes,
2721+ fields,
2722+ methodImpls,
2723+ events,
2724+ properties,
2725+ securityDecls,
2726+ customAttrs) =
2727+ let additionalFlags =
2728+ ILTypeDefAdditionalFlags.CanContainExtensionMethods |||
2729+ typeKindOfFlags name extends ( int attributes)
2730+ ILTypeDef(
2731+ name,
2732+ attributes,
2733+ layout,
2734+ InterruptibleLazy.FromValue( implements),
2735+ genericParams,
2736+ InterruptibleLazy.FromValue( extends),
2737+ methods,
2738+ nestedTypes,
2739+ fields,
2740+ methodImpls,
2741+ events,
2742+ properties,
2743+ additionalFlags,
2744+ storeILSecurityDecls securityDecls,
2745+ customAttrs,
2746+ NoMetadataIdx
2747+ )
2748+
27082749 member _.Name = name
27092750
27102751 member _.Attributes = attributes
@@ -2786,20 +2827,15 @@ type ILTypeDef
27862827
27872828 member x.SecurityDecls = x.SecurityDeclsStored.GetSecurityDecls x.MetadataIndex
27882829
2789- member x.IsClass =
2790- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Class
2830+ member x.IsClass = hasFlag ILTypeDefAdditionalFlags.Class
27912831
2792- member x.IsStruct =
2793- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.ValueType
2832+ member x.IsStruct = hasFlag ILTypeDefAdditionalFlags.ValueType
27942833
2795- member x.IsInterface =
2796- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Interface
2834+ member x.IsInterface = hasFlag ILTypeDefAdditionalFlags.Interface
27972835
2798- member x.IsEnum =
2799- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Enum
2836+ member x.IsEnum = hasFlag ILTypeDefAdditionalFlags.Enum
28002837
2801- member x.IsDelegate =
2802- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Delegate
2838+ member x.IsDelegate = hasFlag ILTypeDefAdditionalFlags.Delegate
28032839
28042840 member x.Access = typeAccessOfFlags ( int x.Attributes)
28052841 member x.IsAbstract = x.Attributes &&& TypeAttributes.Abstract <> enum 0
@@ -2850,9 +2886,10 @@ type ILTypeDef
28502886 member x.WithKind ( kind ) =
28512887 x.With(
28522888 attributes = ( x.Attributes ||| convertTypeKind kind),
2889+ newAdditionalFlags = ( resetTypeKind additionalFlags ||| kind),
28532890 extends =
28542891 match kind with
2855- | ILTypeDefKind .Interface -> None
2892+ | HasFlag ILTypeDefAdditionalFlags .Interface -> emptyILExtends
28562893 | _ -> x.Extends
28572894 )
28582895
@@ -2865,6 +2902,9 @@ type ILTypeDef
28652902 member x.WithInitSemantics ( init ) =
28662903 x.With( attributes = ( x.Attributes ||| convertInitSemantics init))
28672904
2905+ member x.WithIsKnownToBeAttribute () =
2906+ x.With( newAdditionalFlags = ( additionalFlags ||| ILTypeDefAdditionalFlags.IsKnownToBeAttribute))
2907+
28682908 [<DebuggerBrowsable( DebuggerBrowsableState.Never) >]
28692909 member x.DebugText = x.ToString()
28702910
@@ -4259,7 +4299,7 @@ let mkILGenericClass (nm, access, genparams, extends, impls, methods, fields, ne
42594299 name = nm,
42604300 attributes = attributes,
42614301 genericParams = genparams,
4262- implements = InterruptibleLazy.FromValue ( impls) ,
4302+ implements = impls,
42634303 layout = ILTypeDefLayout.Auto,
42644304 extends = Some extends,
42654305 methods = methods,
@@ -4269,7 +4309,6 @@ let mkILGenericClass (nm, access, genparams, extends, impls, methods, fields, ne
42694309 methodImpls = emptyILMethodImpls,
42704310 properties = props,
42714311 events = events,
4272- additionalFlags = ILTypeDefAdditionalFlags.None,
42734312 securityDecls = emptyILSecurityDecls
42744313 )
42754314
@@ -4283,7 +4322,7 @@ let mkRawDataValueTypeDef (iltyp_ValueType: ILType) (nm, size, pack) =
42834322 ||| TypeAttributes.ExplicitLayout
42844323 ||| TypeAttributes.BeforeFieldInit
42854324 ||| TypeAttributes.AnsiClass),
4286- implements = emptyILInterfaceImpls ,
4325+ implements = [] ,
42874326 extends = Some iltyp_ ValueType,
42884327 layout = ILTypeDefLayout.Explicit { Size = Some size; Pack = Some pack },
42894328 methods = emptyILMethods,
@@ -4293,7 +4332,6 @@ let mkRawDataValueTypeDef (iltyp_ValueType: ILType) (nm, size, pack) =
42934332 methodImpls = emptyILMethodImpls,
42944333 properties = emptyILProperties,
42954334 events = emptyILEvents,
4296- additionalFlags = ILTypeDefAdditionalFlags.None,
42974335 securityDecls = emptyILSecurityDecls
42984336 )
42994337
@@ -5590,7 +5628,7 @@ and refsOfILTypeDef s (td: ILTypeDef) =
55905628 refsOfILTypeDefs s td.NestedTypes
55915629 refsOfILGenericParams s td.GenericParams
55925630 refsOfILTypes s ( td.Implements.Value |> List.map _. Type)
5593- Option.iter ( refsOfILType s) td.Extends
5631+ Option.iter ( refsOfILType s) td.Extends.Value
55945632 refsOfILMethodDefs s td.Methods
55955633 refsOfILFieldDefs s ( td.Fields.AsList())
55965634 refsOfILMethodImpls s ( td.MethodImpls.AsList())
0 commit comments