Exemplo n.º 1
0
        public GenerateResult GenerateEnum(CppEnum cppEnum)
        {
            var csEnum = new EnumDeclarationSyntax
            {
                Modifiers  = Modifiers.Internal,
                Identifier = cppEnum.Name
            };

            foreach (var cppMember in cppEnum.Items)
            {
                csEnum.Members.Add(new EnumMemberDeclarationSyntax
                {
                    Identifier  = cppMember.Name,
                    EqualsValue = new EqualsValueClauseSyntax
                    {
                        Value = Syntax.LiteralExpression(cppMember.Value)
                    }
                });
            }

            return(new GenerateResult(cppEnum)
            {
                Type = csEnum
            });
        }
Exemplo n.º 2
0
        public static CSharpElement ConvertEnum(CSharpConverter converter, CppEnum cppEnum, CSharpElement context)
        {
            var enumName = converter.GetCSharpName(cppEnum, context);

            var csEnum = new CSharpEnum(enumName)
            {
                CppElement = cppEnum
            };

            if (cppEnum.IsAnonymous)
            {
                csEnum.Name += "AnonymousEnum";
            }

            var container = converter.GetCSharpContainer(cppEnum, context);

            container.Members.Add(csEnum);

            converter.ApplyDefaultVisibility(csEnum, container);

            csEnum.Comment = converter.GetCSharpComment(cppEnum, csEnum);
            csEnum.BaseTypes.Add(converter.GetCSharpType(cppEnum.IntegerType, csEnum));

            return(csEnum);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Parses a C++ enum declaration.
        /// </summary>
        private CppEnum ParseEnum(XElement xElement)
        {
            CppEnum cppEnum = new CppEnum();

            cppEnum.Name = xElement.Attribute("name") != null?xElement.Attribute("name").Value : String.Empty;

            // Anonymous enum
            if (cppEnum.Name.StartsWith("$") || string.IsNullOrEmpty(cppEnum.Name))
            {
                int    enumOffset;
                string includeFrom = GetIncludeIdFromFileId(xElement.Attribute("file").Value);

                if (!mapIncludeToAnonymousEnumCount.TryGetValue(includeFrom, out enumOffset))
                {
                    mapIncludeToAnonymousEnumCount.Add(includeFrom, enumOffset);
                }

                cppEnum.Name = includeFrom.ToUpper() + "_ENUM_" + enumOffset;
                mapIncludeToAnonymousEnumCount[includeFrom]++;
            }

            foreach (XElement xEnumItems in xElement.Elements())
            {
                string enumItemName = xEnumItems.Attribute("name") != null?xEnumItems.Attribute("name").Value : String.Empty;

                string enumItemInit = xEnumItems.Attribute("init") != null?xEnumItems.Attribute("init").Value : String.Empty;

                cppEnum.Add(new CppEnumItem(enumItemName, enumItemInit));
            }

            return(cppEnum);
        }
Exemplo n.º 4
0
        public void ContextRuleLimitsWhereMappingRuleExecutes()
        {
            var config = new ConfigFile
            {
                Id        = nameof(ContextRuleLimitsWhereMappingRuleExecutes),
                Namespace = nameof(ContextRuleLimitsWhereMappingRuleExecutes),
                Includes  =
                {
                    new IncludeRule
                    {
                        Attach    = true,
                        File      = "cppEnum.h",
                        Namespace = nameof(ContextRuleLimitsWhereMappingRuleExecutes)
                    },
                    new IncludeRule
                    {
                        Attach    = true,
                        File      = "secondFile.h",
                        Namespace = nameof(ContextRuleLimitsWhereMappingRuleExecutes)
                    }
                },
                Mappings =
                {
                    new Config.ContextRule("cppEnum"),
                    new MappingRule
                    {
                        Enum             = "AnotherEnum",
                        MappingNameFinal = "NewEnum"
                    },
                    new ClearContextRule()
                }
            };

            var cppModel = new CppModule("SharpGenTestModule");

            var cppInclude = new CppInclude("cppEnum");

            var cppEnum = new CppEnum("TestEnum");

            var secondInclude = new CppInclude("secondFile");

            var cppEnum2 = new CppEnum("AnotherEnum");

            cppEnum.AddEnumItem("Element1", "0");
            cppEnum.AddEnumItem("Element2", "1");
            cppInclude.Add(cppEnum);
            cppModel.Add(cppInclude);


            var(solution, _) = MapModel(cppModel, config);

            Assert.Empty(solution.EnumerateDescendants().OfType <CsEnum>().Where(csEnum => csEnum.Name == "AnotherEnum"));
        }
Exemplo n.º 5
0
        public void Enum()
        {
            var config = new Config.ConfigFile
            {
                Id        = nameof(Enum),
                Assembly  = nameof(Enum),
                Namespace = nameof(Enum),
                Includes  =
                {
                    new Config.IncludeRule
                    {
                        Attach    = true,
                        File      = "cppEnum.h",
                        Namespace = nameof(Enum)
                    }
                },
                Mappings =
                {
                    new Config.RemoveRule
                    {
                        Enum = @".*ToRemove\d+"
                    }
                }
            };

            var cppModel = new CppModule();

            var cppInclude = new CppInclude
            {
                Name = "cppEnum"
            };

            var cppEnum = new CppEnum
            {
                Name = "TestEnum"
            };

            cppInclude.Add(cppEnum);
            cppInclude.Add(new CppEnum
            {
                Name = "EnumToRemove1"
            });
            cppModel.Add(cppInclude);

            var(solution, _) = MapModel(cppModel, config);

            var members = solution.EnumerateDescendants();

            Assert.Single(members.OfType <CsEnum>());
        }
Exemplo n.º 6
0
        public void ExplicitValues()
        {
            var config = new Config.ConfigFile
            {
                Id        = nameof(ExplicitValues),
                Assembly  = nameof(ExplicitValues),
                Namespace = nameof(ExplicitValues),
                Includes  =
                {
                    new Config.IncludeRule
                    {
                        Attach    = true,
                        File      = "cppEnum.h",
                        Namespace = nameof(ExplicitValues)
                    }
                }
            };

            var cppModel = new CppModule();

            var cppInclude = new CppInclude
            {
                Name = "cppEnum"
            };

            var cppEnum = new CppEnum
            {
                Name = "TestEnum"
            };

            cppEnum.AddEnumItem("Element1", "10");
            cppEnum.AddEnumItem("Element2", "15");
            cppEnum.AddEnumItem("Element3", "10");
            cppInclude.Add(cppEnum);
            cppModel.Add(cppInclude);

            var(solution, _) = MapModel(cppModel, config);

            var members = solution.EnumerateDescendants();

            Assert.Single(members.OfType <CsEnum>());

            var csEnum = members.OfType <CsEnum>().First();

            Assert.Single(csEnum.EnumItems.Where(item => item.Name == "Element1" && item.Value == "10"));
            Assert.Single(csEnum.EnumItems.Where(item => item.Name == "Element2" && item.Value == "15"));
            Assert.Single(csEnum.EnumItems.Where(item => item.Name == "Element3" && item.Value == "10"));
            Assert.Equal(typeof(int), csEnum.UnderlyingType.Type);
        }
Exemplo n.º 7
0
        public void ExplicitUnderlyingType(Type underlyingType, string underlyingTypeShortName)
        {
            var config = new Config.ConfigFile
            {
                Id        = nameof(ExplicitUnderlyingType),
                Assembly  = nameof(ExplicitUnderlyingType),
                Namespace = nameof(ExplicitUnderlyingType),
                Includes  =
                {
                    new Config.IncludeRule
                    {
                        Attach    = true,
                        File      = "cppEnum.h",
                        Namespace = nameof(ExplicitUnderlyingType)
                    }
                }
            };

            var cppModel = new CppModule();

            var cppInclude = new CppInclude
            {
                Name = "cppEnum"
            };

            var cppEnum = new CppEnum
            {
                Name           = "TestEnum",
                UnderlyingType = underlyingTypeShortName
            };

            cppInclude.Add(cppEnum);
            cppModel.Add(cppInclude);

            var(solution, _) = MapModel(cppModel, config);

            var members = solution.EnumerateDescendants();

            Assert.Single(members.OfType <CsEnum>());

            var csEnum = members.OfType <CsEnum>().First();

            Assert.Equal(underlyingType, csEnum.UnderlyingType.Type);
        }
Exemplo n.º 8
0
    ///////////////////////////////////////////

    static void BuildEnum(StringBuilder enumText, CppEnum e, int indentPrefix)
    {
        bool flags = false;

        foreach (var i in e.Items)
        {
            if (i.ValueExpression != null && i.ValueExpression.ToString().Contains("<<"))
            {
                flags = true;
                break;
            }
        }

        string prefix = new string('\t', indentPrefix);

        if (e.Comment != null)
        {
            enumText.AppendLine(BuildCommentSummary(e.Comment, indentPrefix));
        }
        if (flags)
        {
            enumText.AppendLine($"{prefix}[Flags]");
        }
        enumText.AppendLine($"{prefix}public enum {SnakeToCamel(e.Name, true, 0)} {{");
        foreach (var i in e.Items)
        {
            if (i.Comment != null)
            {
                enumText.AppendLine(BuildCommentSummary(i.Comment, indentPrefix + 1));
            }
            if (i.ValueExpression == null)
            {
                enumText.AppendLine($"{prefix}	{SnakeToCamel(i.Name, true, e.Name.Length)},");
            }
            else
            {
                enumText.AppendLine($"{prefix}	{SnakeToCamel(i.Name, true, e.Name.Length),-12} = {BuildExpression(i.ValueExpression, e.Name)},");
            }
        }
        enumText.AppendLine($"{prefix}}}");
    }
Exemplo n.º 9
0
        public CsEnum(CppEnum cppEnum, string name, CsFundamentalType underlyingType) : base(cppEnum, name)
        {
            UnderlyingType = underlyingType ?? throw new ArgumentNullException(nameof(underlyingType));

            if (cppEnum == null)
            {
                return;
            }

            // If C++ enum name is ending with FLAG OR FLAGS, then tag this enum as flags
            var cppEnumName = cppEnum.Name;

            if (cppEnumName.EndsWith("FLAG") || cppEnumName.EndsWith("FLAGS"))
            {
                IsFlag = true;
            }

            var tag = cppEnum.Rule;

            IsFlag = tag.EnumHasFlags ?? IsFlag;
        }
Exemplo n.º 10
0
        public void Basic()
        {
            var config = new ConfigFile
            {
                Id        = nameof(Basic),
                Namespace = nameof(Basic),
                Includes  =
                {
                    new IncludeRule
                    {
                        Attach    = true,
                        File      = "cppEnum.h",
                        Namespace = nameof(Basic)
                    }
                }
            };

            var cppModel = new CppModule("SharpGenTestModule");

            var cppInclude = new CppInclude("cppEnum");

            var cppEnum = new CppEnum("TestEnum");

            cppEnum.AddEnumItem("Element1", "0");
            cppEnum.AddEnumItem("Element2", "1");
            cppInclude.Add(cppEnum);
            cppModel.Add(cppInclude);

            var(solution, _) = MapModel(cppModel, config);

            var members = solution.EnumerateDescendants();

            Assert.Single(members.OfType <CsEnum>());

            var csEnum = members.OfType <CsEnum>().First();

            Assert.Single(csEnum.EnumItems.Where(item => item.Name == "Element1" && item.Value == "0"));
            Assert.Single(csEnum.EnumItems.Where(item => item.Name == "Element2" && item.Value == "1"));
            Assert.Equal(TypeRegistry.Int32, csEnum.UnderlyingType);
        }
Exemplo n.º 11
0
        public void ExplicitUnderlyingType(string underlyingType)
        {
            var config = new ConfigFile
            {
                Id        = nameof(ExplicitUnderlyingType),
                Namespace = nameof(ExplicitUnderlyingType),
                Includes  =
                {
                    new IncludeRule
                    {
                        Attach    = true,
                        File      = "cppEnum.h",
                        Namespace = nameof(ExplicitUnderlyingType)
                    }
                }
            };

            var cppModel = new CppModule("SharpGenTestModule");

            var cppInclude = new CppInclude("cppEnum");

            var cppEnum = new CppEnum("TestEnum")
            {
                UnderlyingType = underlyingType
            };

            cppInclude.Add(cppEnum);
            cppModel.Add(cppInclude);

            var(solution, _) = MapModel(cppModel, config);

            Assert.Single(solution.EnumerateDescendants().OfType <CsEnum>());

            var csEnum = solution.EnumerateDescendants().OfType <CsEnum>().First();

            Assert.Equal(TypeRegistry.ImportPrimitiveType(underlyingType), csEnum.UnderlyingType);
        }
Exemplo n.º 12
0
        static void WriteEnum(StreamWriter writer, CppEnum e, Config config)
        {
            var hasValue = e.Items.Where(i => i.ValueExpression != null && !string.IsNullOrEmpty(i.ValueExpression.ToString())).Any();

            var enumItemNames = e.Items.Select(i => i.Name).ToArray();

            if (config.StripEnumItemCommonPrefix && e.Items.Count > 1)
            {
                string CommonPrefix(string str, params string[] more)
                {
                    var prefixLength = str
                                       .TakeWhile((c, i) => more.All(s => i < s.Length && s[i] == c))
                                       .Count();

                    return(str.Substring(0, prefixLength));
                }

                var prefix = CommonPrefix(e.Items[0].Name, e.Items.Select(i => i.Name).Skip(1).ToArray());
                enumItemNames = enumItemNames.Select(n => n.Replace(prefix, "")).ToArray();
            }

            writer.WriteLine($"pub enum {V.GetVEnumName(config.StripFunctionPrefix(e.Name))} {{");
            for (var i = 0; i < e.Items.Count; i++)
            {
                var item = e.Items[i];
                writer.Write($"\t{V.GetVEnumItemName(enumItemNames[i])}");

                if (hasValue)
                {
                    writer.Write($" = {item.Value}");
                }
                writer.WriteLine();
            }

            writer.WriteLine("}");
            writer.WriteLine();
        }
        private static string GetEnumItemName(CppEnum @enum, string cppEnumItemName, string enumNamePrefix)
        {
            string enumItemName;

            if (@enum.Name == "VkFormat")
            {
                enumItemName = cppEnumItemName.Substring(enumNamePrefix.Length + 1);
                var splits = enumItemName.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries);
                if (splits.Length <= 1)
                {
                    enumItemName = char.ToUpperInvariant(enumItemName[0]) + enumItemName.Substring(1).ToLowerInvariant();
                }
                else
                {
                    var sb = new StringBuilder();
                    foreach (var part in splits)
                    {
                        if (part.Equals("UNORM", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("UNorm");
                        }
                        else if (part.Equals("SNORM", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("SNorm");
                        }
                        else if (part.Equals("UINT", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("UInt");
                        }
                        else if (part.Equals("SINT", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("SInt");
                        }
                        else if (part.Equals("PACK8", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("Pack8");
                        }
                        else if (part.Equals("PACK16", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("Pack16");
                        }
                        else if (part.Equals("PACK32", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("Pack32");
                        }
                        else if (part.Equals("USCALED", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("UScaled");
                        }
                        else if (part.Equals("SSCALED", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("SScaled");
                        }
                        else if (part.Equals("UFLOAT", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("UFloat");
                        }
                        else if (part.Equals("SFLOAT", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("SFloat");
                        }
                        else if (part.Equals("SRGB", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("SRgb");
                        }
                        else if (part.Equals("BLOCK", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("Block");
                        }
                        else if (part.Equals("IMG", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("Img");
                        }
                        else if (part.Equals("2PACK16", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("2Pack16");
                        }
                        else if (part.Equals("3PACK16", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("3Pack16");
                        }
                        else if (part.Equals("4PACK16", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("4Pack16");
                        }
                        else if (part.Equals("2PLANE", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("2Plane");
                        }
                        else if (part.Equals("3PLANE", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("3Plane");
                        }
                        else if (part.Equals("4PLANE", StringComparison.OrdinalIgnoreCase))
                        {
                            sb.Append("4Plane");
                        }
                        else
                        {
                            sb.Append(part);
                        }
                    }

                    enumItemName = sb.ToString();
                }
            }
            else
            {
                enumItemName = GetPrettyEnumName(cppEnumItemName, enumNamePrefix);
            }

            return(enumItemName);
        }
Exemplo n.º 14
0
        protected override void BuildEnum(CodeNamespace ns, CppEnum @enum)
        {
            var decl = new CodeEnum(GetClassName(@enum.Name));

            decl.Type = @enum.IntegerType.GetDisplayName();
            if (decl.Type != "int" && decl.Type != "unsigned int")
            {
                Console.WriteLine(decl.Type);
                throw new NotImplementedException();
            }
            decl.Attributes = CodeAttributes.Public;
            decl.Comments.AddVSDocComment(@enum.Comment, "summary");

            //bool first = true;
            //string pattern = @enum.Items.FirstOrDefault()?.Name ?? string.Empty;
            //foreach (CppEnumItem item in @enum.Items)
            //{
            //	while (!item.Name.StartsWith(pattern) && pattern.Length > 0)
            //	{
            //		pattern = pattern.Remove(pattern.Length - 1);
            //	}
            //	if (!first && char.IsDigit(item.Name[pattern.Length]))
            //	{
            //		pattern = null;
            //		break;
            //	}
            //	first = false;
            //}

            bool   first   = true;
            string pattern = @enum.Items.FirstOrDefault()?.Name ?? string.Empty;

            foreach (CppEnumItem item in @enum.Items)
            {
                while (pattern != null && !item.Name.StartsWith(pattern) && pattern.Length > 0)
                {
                    //pattern = pattern.Remove(pattern.Length - 1);
                    int split = pattern.TrimEnd('_').LastIndexOf('_') + 1;
                    if (split == 0)
                    {
                        pattern = null;
                        break;
                    }
                    pattern = pattern.Remove(split);
                }
                if (pattern != null && !first && char.IsDigit(item.Name[pattern.Length]))
                {
                    pattern = null;
                    break;
                }
                first = false;
            }

            foreach (CppEnumItem item in @enum.Items)
            {
                string name = pattern != null?item.Name.Substring(pattern.Length).ToLowerInvariant().ToUpperCamel() : item.Name;

                string value = item.ValueExpression?.ToString();
                value = (string.IsNullOrEmpty(value) || value.StartsWith("(")) ? item.Value.ToString() : value;
                if (pattern != null)
                {
                    string[] combined = value.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                    if (combined.Length > 1)
                    {
                        for (int i = 0; i < combined.Length; i++)
                        {
                            string subVal = combined[i];
                            if (subVal.StartsWith(pattern))
                            {
                                combined[i] = subVal.Substring(pattern.Length).ToLowerInvariant().ToUpperCamel();
                            }
                        }
                        value = string.Join(' ', combined);
                    }
                    else if (value.StartsWith(pattern))
                    {
                        value = value.Substring(pattern.Length).ToLowerInvariant().ToUpperCamel();
                    }
                }
                if (Regex.IsMatch(value, @"\d<<\d"))
                {
                    value = value.Replace("<<", " << ");
                }
                var itemDecl = new CodeEnumItem(name, value);
                itemDecl.Comments.AddVSDocComment(item.Comment, "summary");
                decl.Members.Add(itemDecl);
            }
            ns.Types.Add(decl);
        }
Exemplo n.º 15
0
 private async Task ProcessAsync(CppEnum item)
 {
     await _enumBuilder.BuildAsync(new [] { item });
 }
Exemplo n.º 16
0
        private static string GetEnumItemName(CppEnum @enum, string cppEnumItemName, string enumNamePrefix)
        {
            string enumItemName = GetPrettyEnumName(cppEnumItemName, enumNamePrefix);

            return(enumItemName);
        }
Exemplo n.º 17
0
 protected abstract void BuildEnum(CodeNamespace ns, CppEnum @enum);
Exemplo n.º 18
0
        public override bool VisitCppEnum(CppEnum cppEnum)
        {
            Enumeration @enum = new Enumeration();

            return(base.VisitCppEnum(cppEnum));
        }