1 using System.Collections.Generic;
4 namespace Entitas.CodeGenerator {
12 var generatorName = GetType().FullName;
14 .Select(poolName => poolName.PoolPrefix() +
CodeGenerator.DEFAULT_COMPONENT_LOOKUP_TAG)
17 generateIndicesLookup(lookupTag, emptyInfos),
25 var orderedComponentInfos = componentInfos.OrderBy(info => info.typeName).ToArray();
26 var lookupTagToComponentInfosMap = getLookupTagToComponentInfosMap(orderedComponentInfos);
27 var generatorName = GetType().FullName;
28 return lookupTagToComponentInfosMap
31 generateIndicesLookup(kv.Key, kv.Value.ToArray()),
36 static Dictionary<string, ComponentInfo[]> getLookupTagToComponentInfosMap(
ComponentInfo[] componentInfos) {
40 var orderedComponentInfoToLookupTagsMap = componentInfos
41 .Where(info => info.generateIndex)
42 .ToDictionary(info => info, info => info.ComponentLookupTags())
43 .OrderByDescending(kv => kv.Value.Length);
45 var lookupTagToComponentInfosMap = orderedComponentInfoToLookupTagsMap
46 .Aggregate(
new Dictionary<
string,
ComponentInfo[]>(), (map, kv) => {
48 var lookupTags = kv.Value;
49 var componentIsAssignedToMultiplePools = lookupTags.Length > 1;
50 var incrementIndex =
false;
51 foreach(var lookupTag
in lookupTags) {
52 if(!map.ContainsKey(lookupTag)) {
56 var infos = map[lookupTag];
57 if(componentIsAssignedToMultiplePools) {
59 infos[currentIndex] = info;
60 incrementIndex =
true;
63 for(
int i = 0; i < infos.Length; i++) {
64 if(infos[i] == null) {
79 foreach(var key
in lookupTagToComponentInfosMap.Keys.ToArray()) {
80 var infoList = lookupTagToComponentInfosMap[key].ToList();
81 while(infoList.Count != 0) {
82 var last = infoList.Count - 1;
83 if(infoList[last] == null) {
84 infoList.RemoveAt(last);
89 lookupTagToComponentInfosMap[key] = infoList.ToArray();
92 return lookupTagToComponentInfosMap;
95 static string generateIndicesLookup(
string lookupTag,
ComponentInfo[] componentInfos) {
96 return addClassHeader(lookupTag)
97 + addIndices(componentInfos)
98 + addComponentNames(componentInfos)
99 + addComponentTypes(componentInfos)
103 static string addClassHeader(
string lookupTag) {
104 return string.Format(
"public static class {0} {{\n", lookupTag);
108 const string fieldFormat =
" public const int {0} = {1};\n";
109 const string totalFormat =
" public const int TotalComponents = {0};";
110 var code =
string.Empty;
111 for(
int i = 0; i < componentInfos.Length; i++) {
112 var info = componentInfos[i];
114 code +=
string.Format(fieldFormat, info.typeName.RemoveComponentSuffix(), i);
118 if(code.Length != 0) {
122 var totalComponents =
string.Format(totalFormat, componentInfos.Length);
123 return code +
"\n" + totalComponents;
126 static string addComponentNames(
ComponentInfo[] componentInfos) {
127 const string format =
" \"{1}\",\n";
128 const string nullFormat =
" null,\n";
129 var code =
string.Empty;
130 for(
int i = 0; i < componentInfos.Length; i++) {
131 var info = componentInfos[i];
133 code +=
string.Format(format, i, info.typeName.RemoveComponentSuffix());
138 if(code.EndsWith(
",\n",
System.StringComparison.Ordinal)) {
139 code = code.Remove(code.Length - 2) +
"\n";
142 return string.Format(
@" 144 public static readonly string[] componentNames = {{ 148 static string addComponentTypes(
ComponentInfo[] componentInfos) {
149 const string format =
" typeof({1}),\n";
150 const string nullFormat =
" null,\n";
151 var code =
string.Empty;
152 for(
int i = 0; i < componentInfos.Length; i++) {
153 var info = componentInfos[i];
155 code +=
string.Format(format, i, info.fullTypeName);
160 if(code.EndsWith(
",\n",
System.StringComparison.Ordinal)) {
161 code = code.Remove(code.Length - 2) +
"\n";
164 return string.Format(
@" 166 public static readonly System.Type[] componentTypes = {{ 170 static string addCloseClass() {