Skip to content

Commit b75fde6

Browse files
authored
Improve enum export code (#100)
***UPDATE_DEPENDENTS***
1 parent 21288a1 commit b75fde6

File tree

4 files changed

+53
-26
lines changed

4 files changed

+53
-26
lines changed

source/MetadataProcessor.Core/Extensions/TypeDefinitionExtensions.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,40 @@ public static EnumDeclaration ToEnumDeclaration(this TypeDefinition source)
4646
throw new ArgumentException("Can clone only TypeDefinition that are Enums.");
4747
}
4848

49+
// build enum name
50+
string enumName = "";
51+
52+
53+
// if there is a namespace remove it (as there can't be two enums with the same name)
54+
if(!string.IsNullOrEmpty(source.Namespace))
55+
{
56+
enumName = source.FullName.Replace(source.Namespace, "");
57+
58+
// remove trailing dot
59+
enumName = enumName.Replace(".", "");
60+
}
61+
else
62+
{
63+
if(!string.IsNullOrEmpty(source.DeclaringType.Namespace))
64+
{
65+
enumName = source.FullName.Replace(source.DeclaringType.Namespace, "");
66+
// remove trailing dot
67+
enumName = enumName.Replace(".", "");
68+
69+
// replace '/' separator
70+
enumName = enumName.Replace("/", "_");
71+
}
72+
else
73+
{
74+
// something very wrong here...
75+
throw new ArgumentException($"Can't process enum type {source.FullName}.");
76+
}
77+
}
78+
4979
EnumDeclaration myEnum = new EnumDeclaration()
5080
{
51-
EnumName = source.Name
81+
EnumName = enumName,
82+
FullName = source.FullName
5283
};
5384

5485
foreach (var f in source.Fields)
@@ -64,7 +95,7 @@ public static EnumDeclaration ToEnumDeclaration(this TypeDefinition source)
6495
// pattern: nnnn_yyyyy
6596
var emunItem = new EnumItem()
6697
{
67-
Name = $"{source.Name}_{f.Name}",
98+
Name = $"{enumName}_{f.Name}",
6899
};
69100

70101
emunItem.Value = f.Constant.ToString();

source/MetadataProcessor.Core/SkeletonGenerator/AssemblyClass.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public class AssemblyDeclaration
1616
public bool IsCoreLib = false;
1717

1818
public List<Class> Classes = new List<Class>();
19+
20+
public List<EnumDeclaration> Enums = new List<EnumDeclaration>();
1921
}
2022

2123
public class Class
@@ -27,8 +29,6 @@ public class Class
2729
public List<StaticField> StaticFields = new List<StaticField>();
2830
public List<InstanceField> InstanceFields = new List<InstanceField>();
2931
public List<MethodStub> Methods = new List<MethodStub>();
30-
public List<EnumDeclaration> Enums = new List<EnumDeclaration>();
31-
3232
}
3333

3434
public class StaticField
@@ -75,6 +75,7 @@ public class ClassWithStubs
7575
public class EnumDeclaration
7676
{
7777
public string EnumName;
78+
public string FullName;
7879

7980
public List<EnumItem> Items = new List<EnumItem>();
8081
}

source/MetadataProcessor.Core/SkeletonGenerator/SkeletonTemplates.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,24 @@ internal partial class SkeletonTemplates
3838
3939
#include <nanoCLR_Interop.h>{{#newline}}
4040
#include <nanoCLR_Runtime.h>{{#newline}}
41+
#include <nanoPackStruct.h>{{#newline}}
4142
{{#if IsCoreLib}}
4243
#include <corlib_native.h>{{#newline}}
4344
{{#else}}
4445
{{/if}}
4546
{{#newline}}
4647
47-
{{#each Classes}}
4848
{{#each Enums}}
49-
enum {{EnumName}}{{#newline}}
49+
typedef enum __nfpack {{EnumName}}{{#newline}}
5050
{
5151
{{#newline}}
5252
{{#each Items}}
5353
{{Name}} = {{Value}},{{#newline}}
5454
{{/each}}
5555
56-
};{{#newline}}
56+
} {{EnumName}};{{#newline}}
5757
{{#newline}}
5858
{{/each}}
59-
{{/each}}
6059
6160
{{#each Classes}}
6261
struct Library_{{AssemblyName}}_{{Name}}{{#newline}}

source/MetadataProcessor.Core/nanoSkeletonGenerator.cs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -519,34 +519,30 @@ private void GenerateAssemblyHeader()
519519
});
520520
}
521521
}
522-
523-
}
524-
525-
// enums
526-
foreach (var t in c.NestedTypes.Where(nt => nt.IsEnum))
527-
{
528-
if(t.IsToExclude())
529-
{
530-
continue;
531-
}
532-
533-
// get enum from backup
534-
var enumDeclaration = _tablesContext.TypeDefinitionTable.EnumDeclarations.FirstOrDefault(td => td.EnumName == t.Name);
535-
536-
classData.Enums.Add(enumDeclaration);
537522
}
538523

539524
// anything to add to the header?
540-
if ( classData.StaticFields.Count > 0 ||
525+
if (classData.StaticFields.Count > 0 ||
541526
classData.InstanceFields.Count > 0 ||
542-
classData.Methods.Count > 0 ||
543-
classData.Enums.Count > 0)
527+
classData.Methods.Count > 0)
544528
{
545529
assemblyData.Classes.Add(classData);
546530
}
547531
}
548532
}
549533

534+
// enums have to be processed separatly
535+
foreach (var e in _tablesContext.TypeDefinitionTable.EnumDeclarations)
536+
{
537+
// check if enum is to exclude
538+
if(nanoTablesContext.ClassNamesToExclude.Contains(e.FullName))
539+
{
540+
continue;
541+
}
542+
543+
assemblyData.Enums.Add(e);
544+
}
545+
550546
FormatCompiler compiler = new FormatCompiler();
551547
Generator generator = compiler.Compile(SkeletonTemplates.AssemblyHeaderTemplate);
552548

0 commit comments

Comments
 (0)