Пример #1
0
        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()
            });
        }