MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System;5using System.Globalization;6using System.Management.Automation;7using System.Reflection;8using System.Reflection.Emit;9 10using Microsoft.PowerShell.Cmdletization.Xml;11 12namespace Microsoft.PowerShell.Cmdletization13{14 internal static class EnumWriter15 {16 private const string namespacePrefix = "Microsoft.PowerShell.Cmdletization.GeneratedTypes";17 18 private static ModuleBuilder CreateModuleBuilder()19 {20 AssemblyName aName = new(namespacePrefix);21 AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);22 ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);23 return mb;24 }25 26 private static readonly Lazy<ModuleBuilder> s_moduleBuilder = new(CreateModuleBuilder, isThreadSafe: true);27 private static readonly object s_moduleBuilderUsageLock = new();28 29 internal static string GetEnumFullName(EnumMetadataEnum enumMetadata)30 {31 return namespacePrefix + "." + enumMetadata.EnumName;32 }33 34 internal static void Compile(EnumMetadataEnum enumMetadata)35 {36 string fullEnumName = GetEnumFullName(enumMetadata);37 38 Type underlyingType;39 if (enumMetadata.UnderlyingType != null)40 {41 underlyingType = (Type)LanguagePrimitives.ConvertTo(enumMetadata.UnderlyingType, typeof(Type), CultureInfo.InvariantCulture);42 }43 else44 {45 underlyingType = typeof(int);46 }47 48 ModuleBuilder mb = s_moduleBuilder.Value;49 EnumBuilder eb;50 lock (s_moduleBuilderUsageLock)51 {52 eb = mb.DefineEnum(fullEnumName, TypeAttributes.Public, underlyingType);53 }54 55 if (enumMetadata.BitwiseFlagsSpecified && enumMetadata.BitwiseFlags)56 {57 var cab = new CustomAttributeBuilder(typeof(FlagsAttribute).GetConstructor(Type.EmptyTypes), Array.Empty<object>());58 eb.SetCustomAttribute(cab);59 }60 61 foreach (var value in enumMetadata.Value)62 {63 string name = value.Name;64 object integerValue = LanguagePrimitives.ConvertTo(value.Value, underlyingType, CultureInfo.InvariantCulture);65 eb.DefineLiteral(name, integerValue);66 }67 68 eb.CreateTypeInfo();69 }70 }71}72 