forked from PowerShell/PowerShell
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEnumWriter.cs
More file actions
71 lines (60 loc) · 2.62 KB
/
Copy pathEnumWriter.cs
File metadata and controls
71 lines (60 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/********************************************************************++
Copyright (c) Microsoft Corporation. All rights reserved.
--********************************************************************/
using System;
using System.Globalization;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.PowerShell.Cmdletization.Xml;
using System.Management.Automation;
namespace Microsoft.PowerShell.Cmdletization
{
internal static class EnumWriter
{
private const string namespacePrefix = "Microsoft.PowerShell.Cmdletization.GeneratedTypes";
private static ModuleBuilder CreateModuleBuilder()
{
AssemblyName aName = new AssemblyName(namespacePrefix);
AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
return mb;
}
private static Lazy<ModuleBuilder> s_moduleBuilder = new Lazy<ModuleBuilder>(CreateModuleBuilder, isThreadSafe: true);
private static object s_moduleBuilderUsageLock = new object();
internal static string GetEnumFullName(EnumMetadataEnum enumMetadata)
{
return namespacePrefix + "." + enumMetadata.EnumName;
}
internal static void Compile(EnumMetadataEnum enumMetadata)
{
string fullEnumName = GetEnumFullName(enumMetadata);
Type underlyingType;
if (enumMetadata.UnderlyingType != null)
{
underlyingType = (Type)LanguagePrimitives.ConvertTo(enumMetadata.UnderlyingType, typeof(Type), CultureInfo.InvariantCulture);
}
else
{
underlyingType = typeof(Int32);
}
ModuleBuilder mb = s_moduleBuilder.Value;
EnumBuilder eb;
lock (s_moduleBuilderUsageLock)
{
eb = mb.DefineEnum(fullEnumName, TypeAttributes.Public, underlyingType);
}
if (enumMetadata.BitwiseFlagsSpecified && enumMetadata.BitwiseFlags)
{
var cab = new CustomAttributeBuilder(typeof(FlagsAttribute).GetConstructor(PSTypeExtensions.EmptyTypes), new object[0]);
eb.SetCustomAttribute(cab);
}
foreach (var value in enumMetadata.Value)
{
string name = value.Name;
object integerValue = LanguagePrimitives.ConvertTo(value.Value, underlyingType, CultureInfo.InvariantCulture);
eb.DefineLiteral(name, integerValue);
}
ClrFacade.CreateEnumType(eb);
}
}
}