diff options
Diffstat (limited to 'src/Common/src/TypeSystem/IL/TypeSystemContext.GeneratedAssembly.cs')
-rw-r--r-- | src/Common/src/TypeSystem/IL/TypeSystemContext.GeneratedAssembly.cs | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/src/Common/src/TypeSystem/IL/TypeSystemContext.GeneratedAssembly.cs b/src/Common/src/TypeSystem/IL/TypeSystemContext.GeneratedAssembly.cs new file mode 100644 index 000000000..5b3e59616 --- /dev/null +++ b/src/Common/src/TypeSystem/IL/TypeSystemContext.GeneratedAssembly.cs @@ -0,0 +1,252 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; + +using TypeHashingAlgorithms = Internal.NativeFormat.TypeHashingAlgorithms; +using Interlocked = System.Threading.Interlocked; +using AssemblyName = System.Reflection.AssemblyName; +using Debug = System.Diagnostics.Debug; + +namespace Internal.TypeSystem +{ + partial class TypeSystemContext + { + private ModuleDesc _generatedAssembly; + + public ModuleDesc GeneratedAssembly + { + get + { + if (_generatedAssembly == null) + { + Interlocked.CompareExchange(ref _generatedAssembly, new CompilerGeneratedAssembly(this), null); + } + + return _generatedAssembly; + } + } + + private class CompilerGeneratedAssembly : ModuleDesc, IAssemblyDesc + { + private MetadataType _globalModuleType; + + public CompilerGeneratedAssembly(TypeSystemContext context) + : base(context) + { + _globalModuleType = new CompilerGeneratedType(this, "<Module>"); + } + + public override IEnumerable<MetadataType> GetAllTypes() + { + return Array.Empty<MetadataType>(); + } + + public override MetadataType GetGlobalModuleType() + { + return _globalModuleType; + } + + public AssemblyName GetName() + { + return new AssemblyName("System.Private.CompilerGenerated"); + } + + public override MetadataType GetType(string nameSpace, string name, bool throwIfNotFound = true) + { + Debug.Fail("Resolving a TypeRef in the compiler generated assembly?"); + + if (throwIfNotFound) + ThrowHelper.ThrowTypeLoadException(nameSpace, name, this); + + return null; + } + } + + /// <summary> + /// A pseudo-type that owns helper methods generated by the compiler. + /// This type should never be allocated (we should never see an EEType for it). + /// </summary> + internal sealed partial class CompilerGeneratedType : MetadataType + { + private int _hashcode; + + public CompilerGeneratedType(ModuleDesc module, string name) + { + Module = module; + Name = name; + } + + public override TypeSystemContext Context + { + get + { + return Module.Context; + } + } + + public override string Name + { + get; + } + + public override string Namespace + { + get + { + return "Internal.CompilerGenerated"; + } + } + + public override int GetHashCode() + { + if (_hashcode != 0) + return _hashcode; + return InitializeHashCode(); + } + + private int InitializeHashCode() + { + string ns = Namespace; + var hashCodeBuilder = new TypeHashingAlgorithms.HashCodeBuilder(ns); + if (ns.Length > 0) + hashCodeBuilder.Append("."); + hashCodeBuilder.Append(Name); + _hashcode = hashCodeBuilder.ToHashCode(); + + return _hashcode; + } + + public override bool IsCanonicalSubtype(CanonicalFormKind policy) + { + Debug.Assert(!HasInstantiation, "Why is this generic?"); + return false; + } + + protected override TypeFlags ComputeTypeFlags(TypeFlags mask) + { + return TypeFlags.Class | + TypeFlags.HasGenericVarianceComputed | + TypeFlags.HasStaticConstructorComputed | + TypeFlags.HasFinalizerComputed | + TypeFlags.AttributeCacheComputed; + } + + public override ClassLayoutMetadata GetClassLayout() + { + return new ClassLayoutMetadata + { + Offsets = null, + PackingSize = 0, + Size = 0, + }; + } + + public override bool HasCustomAttribute(string attributeNamespace, string attributeName) + { + return false; + } + + public override IEnumerable<MetadataType> GetNestedTypes() + { + return Array.Empty<MetadataType>(); + } + + public override MetadataType GetNestedType(string name) + { + return null; + } + + protected override MethodImplRecord[] ComputeVirtualMethodImplsForType() + { + return Array.Empty<MethodImplRecord>(); + } + + public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name) + { + return Array.Empty<MethodImplRecord>(); + } + + public override ModuleDesc Module + { + get; + } + + public override PInvokeStringFormat PInvokeStringFormat + { + get + { + return PInvokeStringFormat.AutoClass; + } + } + + public override bool IsExplicitLayout + { + get + { + return false; + } + } + + public override bool IsSequentialLayout + { + get + { + return false; + } + } + + public override bool IsBeforeFieldInit + { + get + { + return false; + } + } + + public override MetadataType MetadataBaseType + { + get + { + // Since this type should never be allocated and only serves the purpose of grouping things, + // it can act like a <Module> type and have no base type. + return null; + } + } + + public override bool IsSealed + { + get + { + return true; + } + } + + public override bool IsAbstract + { + get + { + return false; + } + } + + public override DefType ContainingType + { + get + { + return null; + } + } + + public override DefType[] ExplicitlyImplementedInterfaces + { + get + { + return Array.Empty<DefType>(); + } + } + } + } +} |