private GenerateResult GenerateClass(CppClass cppClass) { if (cppClass.Name == "Node") { return(CreateNodeInterface(cppClass)); } var isValue = cppClass.Name == "Value"; var usingDirectives = new List <UsingDirectiveSyntax>(); var csClass = new ClassDeclarationSyntax { Modifiers = Modifiers.Internal, Identifier = CreateMemberName(cppClass) }; if (_config.NodeTypes.Contains(cppClass.Name)) { if (!isValue) { AddPgNodeAttribute(usingDirectives, csClass); } // .. : IPg10Node csClass.BaseList = new BaseListSyntax { Types = { Syntax.ParseName(nodeInterfaceName) } }; // IPg10Node::Type AddPgNodeTypeProperty(csClass, Modifiers.Virtual); } var nestedClasses = new List <GenerateResult>(); foreach (var field in cppClass.Fields) { string fieldName = field.Name; string typeName; if (cppClass.Equals(field.Type.Parent)) { var nestedClass = GenerateClass((CppClass)field.Type); nestedClasses.Add(nestedClass); typeName = nestedClass.Type.Identifier; } else { typeName = ConvertToCSharpType(field.Type); } // IPg10Node::Type if (typeName == "int?" && fieldName == "location" || typeName == nodeTypeName && fieldName == "type") { continue; } if (SyntaxFacts.GetKeywordKind(fieldName) != SyntaxKind.None) { fieldName = $"@{fieldName}"; } csClass.Members.Add(new PropertyDeclarationSyntax { Modifiers = Modifiers.Public, AccessorList = Syntax.AccessorList( Syntax.AccessorDeclaration(AccessorDeclarationKind.Get, null), Syntax.AccessorDeclaration(AccessorDeclarationKind.Set, null)), Identifier = fieldName, Type = Syntax.ParseName(typeName) }); } foreach (var nestedClass in nestedClasses) { foreach (var usingDirective in nestedClass.UsingDirectives ?? Array.Empty <UsingDirectiveSyntax>()) { if (usingDirectives.Any(d => d.Name.AreEquals(usingDirective.Name))) { continue; } usingDirectives.Add(usingDirective); } csClass.Members.Add(nestedClass.Type); } if (isValue) { var valueUnion = (ClassDeclarationSyntax)nestedClasses[0].Type; var typeProperty = (PropertyDeclarationSyntax)csClass.Members[0]; PropertyDeclarationSyntax[] members = valueUnion.Members.OfType <PropertyDeclarationSyntax>().ToArray(); valueUnion.Members.Clear(); csClass.Members.Clear(); csClass.Members.Add(typeProperty); foreach (var m in members) { csClass.Members.Add(m); } } return(new GenerateResult(cppClass) { Type = csClass, UsingDirectives = usingDirectives.ToArray() }); }