Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
EnumWriter.cs72 linesDownload Raw Back to cmdletization
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