/// <summary> /// Function that should evaluate <see cref="Members"/> property. /// </summary> protected virtual IEnumerable <UserTypeMember> GetMembers() { // Prepare naming "deduplication" and error fixing HashSet <string> usedNames = new HashSet <string>(); Func <string, string> fixName = (string nameBase) => { string name = nameBase; for (int i = 0; usedNames.Contains(name); i++) { if (i > 0) { name = $"{nameBase}_{i}"; } else { name = $"{nameBase}_"; } } usedNames.Add(name); return(name); }; usedNames.Add(ConstructorName); foreach (UserType innerType in InnerTypes) { usedNames.Add(innerType.ConstructorName); } // Add constants and data fields foreach (var field in Symbol.Fields) { if (field.IsStatic && !field.IsValidStatic) { continue; } if (field.IsStatic && DontExportStaticFields) { continue; } if (!field.IsStatic && ExportOnlyStaticFields) { continue; } string fieldName = fixName(CodeNaming.FixUserNaming(field.Name)); if (field.LocationType == LocationType.Constant) { yield return new ConstantUserTypeMember() { AccessLevel = AccessLevel.Public, Name = fieldName, Type = Factory.GetSymbolTypeInstance(this, field.Type, field.BitSize), Symbol = field, UserType = this, } } ; else { yield return new DataFieldUserTypeMember() { AccessLevel = AccessLevel.Public, Name = fieldName, Type = Factory.GetSymbolTypeInstance(this, field.Type, field.BitSize), Symbol = field, UserType = this, } }; } // Hungarian notation fields if (!ExportOnlyStaticFields) { foreach (UserTypeMember member in GenerateHungarianNotationFields(fixName)) { yield return(member); } } // Base class properties if (!ExportOnlyStaticFields && (BaseClass is MultiClassInheritanceTypeInstance || BaseClass is SingleClassInheritanceWithInterfacesTypeInstance)) { Symbol[] baseClasses = Symbol.BaseClasses; Symbol[] baseClassesForProperties = BaseClass is SingleClassInheritanceWithInterfacesTypeInstance?baseClasses.Where(b => b.IsEmpty).ToArray() : baseClasses; List <Symbol> baseClassesSorted = baseClasses.OrderBy(s => s.Offset).ThenBy(s => s.Name).ToList(); foreach (Symbol baseClass in baseClassesForProperties) { // Generate simplified base class name TypeInstance type = Factory.GetSymbolTypeInstance(this, baseClass); string baseClassName = CodeNaming.FixUserNaming(type.GetTypeString(truncateNamespace: true)); StringBuilder sb = new StringBuilder(); int i = baseClassName[0] == '@' ? 1 : 0; for (; i < baseClassName.Length; i++) { switch (baseClassName[i]) { case '_': case '.': if (i > 0 && baseClassName[i - 1] != '_') { sb.Append('_'); } break; default: sb.Append(baseClassName[i]); break; } } while (sb.Length > 0 && sb[sb.Length - 1] == '_') { sb.Length--; } baseClassName = sb.ToString(); // Create property string propertyName = fixName(baseClassesForProperties.Length > 1 ? $"BaseClass_{baseClassName}" : "BaseClass"); yield return(new BaseClassPropertyUserTypeMember() { AccessLevel = AccessLevel.Public, Name = propertyName, Type = type, Symbol = baseClass, UserType = this, Index = baseClassesSorted.IndexOf(baseClass), }); } } }