@@ -2562,34 +2562,48 @@ let typeEncodingOfFlags flags =
2562
2562
elif f = 0x00010000 then ILDefaultPInvokeEncoding.Unicode
2563
2563
else ILDefaultPInvokeEncoding.Ansi
2564
2564
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
2572
2597
2573
2598
let typeKindOfFlags nm ( super : ILType option ) flags =
2574
2599
if ( flags &&& 0x00000020 ) <> 0x0 then
2575
- ILTypeDefKind .Interface
2600
+ ILTypeDefAdditionalFlags .Interface
2576
2601
else
2577
2602
match super with
2578
- | None -> ILTypeDefKind .Class
2603
+ | None -> ILTypeDefAdditionalFlags .Class
2579
2604
| Some ty ->
2580
2605
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
2593
2607
2594
2608
let convertTypeAccessFlags access =
2595
2609
match access with
@@ -2605,11 +2619,8 @@ let convertTypeAccessFlags access =
2605
2619
2606
2620
let convertTypeKind kind =
2607
2621
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
2613
2624
2614
2625
let convertLayout layout =
2615
2626
match layout with
@@ -2638,13 +2649,7 @@ let convertInitSemantics (init: ILTypeInit) =
2638
2649
| ILTypeInit.BeforeField -> TypeAttributes.BeforeFieldInit
2639
2650
| ILTypeInit.OnAny -> enum 0
2640
2651
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
2648
2653
2649
2654
[<NoComparison; NoEquality; StructuredFormatDisplay( " {DebugText}" ) >]
2650
2655
type ILTypeDef
@@ -2654,7 +2659,7 @@ type ILTypeDef
2654
2659
layout: ILTypeDefLayout,
2655
2660
implements: InterruptibleLazy< InterfaceImpl list>,
2656
2661
genericParams: ILGenericParameterDefs,
2657
- extends: ILType option,
2662
+ extends: InterruptibleLazy < ILType option> ,
2658
2663
methods: ILMethodDefs,
2659
2664
nestedTypes: ILTypeDefs,
2660
2665
fields: ILFieldDefs,
@@ -2705,6 +2710,42 @@ type ILTypeDef
2705
2710
NoMetadataIdx
2706
2711
)
2707
2712
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
+
2708
2749
member _.Name = name
2709
2750
2710
2751
member _.Attributes = attributes
@@ -2786,20 +2827,15 @@ type ILTypeDef
2786
2827
2787
2828
member x.SecurityDecls = x.SecurityDeclsStored.GetSecurityDecls x.MetadataIndex
2788
2829
2789
- member x.IsClass =
2790
- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Class
2830
+ member x.IsClass = hasFlag ILTypeDefAdditionalFlags.Class
2791
2831
2792
- member x.IsStruct =
2793
- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.ValueType
2832
+ member x.IsStruct = hasFlag ILTypeDefAdditionalFlags.ValueType
2794
2833
2795
- member x.IsInterface =
2796
- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Interface
2834
+ member x.IsInterface = hasFlag ILTypeDefAdditionalFlags.Interface
2797
2835
2798
- member x.IsEnum =
2799
- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Enum
2836
+ member x.IsEnum = hasFlag ILTypeDefAdditionalFlags.Enum
2800
2837
2801
- member x.IsDelegate =
2802
- ( typeKindOfFlags x.Name x.Extends ( int x.Attributes)) = ILTypeDefKind.Delegate
2838
+ member x.IsDelegate = hasFlag ILTypeDefAdditionalFlags.Delegate
2803
2839
2804
2840
member x.Access = typeAccessOfFlags ( int x.Attributes)
2805
2841
member x.IsAbstract = x.Attributes &&& TypeAttributes.Abstract <> enum 0
@@ -2850,9 +2886,10 @@ type ILTypeDef
2850
2886
member x.WithKind ( kind ) =
2851
2887
x.With(
2852
2888
attributes = ( x.Attributes ||| convertTypeKind kind),
2889
+ newAdditionalFlags = ( resetTypeKind additionalFlags ||| kind),
2853
2890
extends =
2854
2891
match kind with
2855
- | ILTypeDefKind .Interface -> None
2892
+ | HasFlag ILTypeDefAdditionalFlags .Interface -> emptyILExtends
2856
2893
| _ -> x.Extends
2857
2894
)
2858
2895
@@ -2865,6 +2902,9 @@ type ILTypeDef
2865
2902
member x.WithInitSemantics ( init ) =
2866
2903
x.With( attributes = ( x.Attributes ||| convertInitSemantics init))
2867
2904
2905
+ member x.WithIsKnownToBeAttribute () =
2906
+ x.With( newAdditionalFlags = ( additionalFlags ||| ILTypeDefAdditionalFlags.IsKnownToBeAttribute))
2907
+
2868
2908
[<DebuggerBrowsable( DebuggerBrowsableState.Never) >]
2869
2909
member x.DebugText = x.ToString()
2870
2910
@@ -4259,7 +4299,7 @@ let mkILGenericClass (nm, access, genparams, extends, impls, methods, fields, ne
4259
4299
name = nm,
4260
4300
attributes = attributes,
4261
4301
genericParams = genparams,
4262
- implements = InterruptibleLazy.FromValue ( impls) ,
4302
+ implements = impls,
4263
4303
layout = ILTypeDefLayout.Auto,
4264
4304
extends = Some extends,
4265
4305
methods = methods,
@@ -4269,7 +4309,6 @@ let mkILGenericClass (nm, access, genparams, extends, impls, methods, fields, ne
4269
4309
methodImpls = emptyILMethodImpls,
4270
4310
properties = props,
4271
4311
events = events,
4272
- additionalFlags = ILTypeDefAdditionalFlags.None,
4273
4312
securityDecls = emptyILSecurityDecls
4274
4313
)
4275
4314
@@ -4283,7 +4322,7 @@ let mkRawDataValueTypeDef (iltyp_ValueType: ILType) (nm, size, pack) =
4283
4322
||| TypeAttributes.ExplicitLayout
4284
4323
||| TypeAttributes.BeforeFieldInit
4285
4324
||| TypeAttributes.AnsiClass),
4286
- implements = emptyILInterfaceImpls ,
4325
+ implements = [] ,
4287
4326
extends = Some iltyp_ ValueType,
4288
4327
layout = ILTypeDefLayout.Explicit { Size = Some size; Pack = Some pack },
4289
4328
methods = emptyILMethods,
@@ -4293,7 +4332,6 @@ let mkRawDataValueTypeDef (iltyp_ValueType: ILType) (nm, size, pack) =
4293
4332
methodImpls = emptyILMethodImpls,
4294
4333
properties = emptyILProperties,
4295
4334
events = emptyILEvents,
4296
- additionalFlags = ILTypeDefAdditionalFlags.None,
4297
4335
securityDecls = emptyILSecurityDecls
4298
4336
)
4299
4337
@@ -5590,7 +5628,7 @@ and refsOfILTypeDef s (td: ILTypeDef) =
5590
5628
refsOfILTypeDefs s td.NestedTypes
5591
5629
refsOfILGenericParams s td.GenericParams
5592
5630
refsOfILTypes s ( td.Implements.Value |> List.map _. Type)
5593
- Option.iter ( refsOfILType s) td.Extends
5631
+ Option.iter ( refsOfILType s) td.Extends.Value
5594
5632
refsOfILMethodDefs s td.Methods
5595
5633
refsOfILFieldDefs s ( td.Fields.AsList())
5596
5634
refsOfILMethodImpls s ( td.MethodImpls.AsList())
0 commit comments