1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using Internal.TypeSystem;
6 
7 namespace ILCompiler
8 {
9     public abstract class LazyGenericsPolicy
10     {
UsesLazyGenerics(MethodDesc method)11         public abstract bool UsesLazyGenerics(MethodDesc method);
UsesLazyGenerics(TypeDesc type)12         public abstract bool UsesLazyGenerics(TypeDesc type);
UsesLazyGenerics(MetadataType type)13         public abstract bool UsesLazyGenerics(MetadataType type);
14     }
15 
16     public sealed class AttributeDrivenLazyGenericsPolicy : LazyGenericsPolicy
17     {
UsesLazyGenerics(MethodDesc method)18         public sealed override bool UsesLazyGenerics(MethodDesc method)
19         {
20             if (UsesLazyGenerics(method.OwningType))
21                 return true;
22 
23             if (method.HasInstantiation)
24                 return method.IsVirtual || method.HasCustomAttribute("System.Runtime.CompilerServices", "ForceLazyDictionaryAttribute");
25 
26             return false;
27         }
28 
UsesLazyGenerics(TypeDesc type)29         public sealed override bool UsesLazyGenerics(TypeDesc type)
30         {
31             if (type is MetadataType)
32                 return UsesLazyGenerics(type as MetadataType);
33             else
34                 return false;
35         }
36 
UsesLazyGenerics(MetadataType type)37         public sealed override bool UsesLazyGenerics(MetadataType type)
38         {
39             return type.HasCustomAttribute("System.Runtime.CompilerServices", "ForceLazyDictionaryAttribute");
40         }
41     }
42 
43     public sealed class LazyGenericsDisabledPolicy : LazyGenericsPolicy
44     {
45         public sealed override bool UsesLazyGenerics(MethodDesc method) => false;
46         public sealed override bool UsesLazyGenerics(TypeDesc type) => false;
47         public sealed override bool UsesLazyGenerics(MetadataType type) => false;
48     }
49 }
50