Exemplo n.º 1
0
        private static void AddEnumToOutput(string[] parts, CsNamespace ns, CsEnum en)
        {
            if (!parts.Any())
            {
                ns.AddEnum(en);
                return;
            }

            CsClass cl = null;

            foreach (var ii in parts)
            {
                CsClass newClass;
                if (cl is null)
                {
                    newClass = ns.GetOrCreateClass(ii);
                }
                else
                {
                    newClass = cl.GetOrCreateNested(ii);
                }

                cl = newClass;
            }

            throw new NotSupportedException("Need nested enum which is not supported by isukces.code yet");
        }
Exemplo n.º 2
0
 public EnumFlagsBuilder(CsEnum target, string none = "None")
 {
     _target = target;
     if (!string.IsNullOrEmpty(none))
     {
         _target.Items.Add(new CsEnumItem(none)
         {
             EncodedValue = "0"
         });
     }
 }
Exemplo n.º 3
0
 protected virtual TsEnum Rewrite(CsEnum csEnum)
 {
     return(new TsEnum
     {
         CsType = csEnum.CsType,
         Name = csEnum.Name,
         ExportKind = TsExportKind.Named,
         Values = csEnum.Values
                  .Select(Rewrite)
                  .ToArray()
     });
 }
        public void MakeEnumIfNecessary()
        {
            if (EnumOptions is null)
            {
                return;
            }
            var en = new CsEnum(ShortTypeName);

            foreach (var i in EnumOptions.Items)
            {
                en.Items.Add(new CsEnumItem(i.CsValue));
            }
            TargetNamespace.AddEnum(en);
        }
        /// <summary>
        /// Extension method that will lookup the value of an enumeration by the enumeration type name.
        /// </summary>
        /// <param name="source">The target <see cref="IDotNetEnum"/> model to get the enumeration value from.</param>
        /// <param name="enumName">The target numerical named item to use to lookup the enumeration value.</param>
        /// <returns>The target enumeration value or null if it could not be found.</returns>
        public static string CSharpFormatEnumValue(this CsEnum source, string enumName)
        {
            if (source == null)
            {
                return(null);
            }
            if (string.IsNullOrEmpty(enumName))
            {
                return(null);
            }
            if (!source.Values.Any())
            {
                return(null);
            }

            var enumValue = source.Values.Where(v => string.Equals(v.Name, enumName)).Select(v => v.Value).FirstOrDefault();

            return(enumValue);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Prepares the specified C++ element to a C# element.
        /// </summary>
        /// <param name="cppElement">The C++ element.</param>
        /// <returns>The C# element created and registered to the <see cref="TransformManager"/></returns>
        public override CsBase Prepare(CppElement cppElement)
        {
            var cppEnum = (CppEnum)cppElement;

            // Create C# enum
            var newEnum = new CsEnum
            {
                Name       = NamingRules.Rename(cppEnum),
                CppElement = cppEnum
            };

            // Get the namespace for this particular include and enum
            var nameSpace = Manager.ResolveNamespace(cppEnum);

            nameSpace.Add(newEnum);

            // Bind C++ enum to C# enum
            Manager.BindType(cppEnum.Name, newEnum);

            return(newEnum);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Maps a C++ Enum to a C# enum.
        /// </summary>
        /// <param name="newEnum">the C# enum.</param>
        private void Process(CsEnum newEnum)
        {
            var cppEnum = (CppEnum)newEnum.CppElement;

            // Get tag from C++ enum
            var tag = cppEnum.GetTagOrDefault <MappingRule>();

            // Determine enum type. Default is int
            string typeName = cppEnum.GetTypeNameWithMapping();

            switch (typeName)
            {
            case "byte":
                newEnum.Type   = typeof(byte);
                newEnum.SizeOf = 1;
                break;

            case "short":
                newEnum.Type   = typeof(short);
                newEnum.SizeOf = 1;
                break;

            case "int":
                newEnum.Type   = typeof(int);
                newEnum.SizeOf = 4;
                break;

            default:
                Logger.Error("Invalid type [{0}] for enum [{1}]. Types supported are : int, byte, short", typeName, cppEnum);
                break;
            }

            // Find Root Name of this enum
            // All enum items should start with the same root name and the root name should be at least 4 chars
            string rootName        = cppEnum.Name;
            string rootNameFound   = null;
            bool   isRootNameFound = false;

            for (int i = rootName.Length; i >= 4 && !isRootNameFound; i--)
            {
                rootNameFound = rootName.Substring(0, i);

                isRootNameFound = true;
                foreach (var cppEnumItem in cppEnum.EnumItems)
                {
                    if (!cppEnumItem.Name.StartsWith(rootNameFound))
                    {
                        isRootNameFound = false;
                        break;
                    }
                }
            }
            if (isRootNameFound)
            {
                rootName = rootNameFound;
            }

            // Create enum items for enum
            foreach (var cppEnumItem in cppEnum.EnumItems)
            {
                string enumName  = NamingRules.Rename(cppEnumItem, rootName);
                string enumValue = cppEnumItem.Value;

                var csharpEnumItem = new CsEnumItem(enumName, enumValue)
                {
                    CppElement = cppEnumItem
                };

                newEnum.Add(csharpEnumItem);

                if (cppEnumItem.Name != "None")
                {
                    Manager.BindType(cppEnumItem.Name, csharpEnumItem);
                }
            }

            bool tryToAddNone = tag.EnumHasNone.HasValue ? tag.EnumHasNone.Value : false;

            // If C++ enum name is ending with FLAG OR FLAGS
            // Then tag this enum as flags and add None if necessary
            if (cppEnum.Name.EndsWith("FLAG") || cppEnum.Name.EndsWith("FLAGS"))
            {
                newEnum.IsFlag = true;

                if (!tag.EnumHasNone.HasValue)
                {
                    tryToAddNone = !newEnum.Items.Cast <CsEnumItem>().Any(item => item.Name == "None");
                }
            }

            // Add None value
            if (tryToAddNone)
            {
                var csharpEnumItem = new CsEnumItem("None", "0");
                csharpEnumItem.CppElement = new CppElement {
                    Description = "None."
                };
                newEnum.Add(csharpEnumItem);
            }
        }
Exemplo n.º 8
0
        private void ProcessDefines(ConfigFile file)
        {
            foreach (var defineRule in file.Extension.OfType <DefineExtensionRule>())
            {
                CsTypeBase defineType = null;

                if (defineRule.Enum != null)
                {
                    var newEnum = new CsEnum
                    {
                        Name           = defineRule.Enum,
                        UnderlyingType = !string.IsNullOrWhiteSpace(defineRule.UnderlyingType)
                            ? (CsFundamentalType)typeRegistry.ImportType(defineRule.UnderlyingType)
                            : null
                    };
                    defineType = newEnum;

                    if (defineRule.SizeOf.HasValue && newEnum.UnderlyingType == null)
                    {
                        var size = defineRule.SizeOf.Value;

                        switch (size)
                        {
                        case 1:
                            newEnum.UnderlyingType = typeRegistry.ImportType(typeof(byte));
                            break;

                        case 2:
                            newEnum.UnderlyingType = typeRegistry.ImportType(typeof(short));
                            break;

                        case 4:
                            newEnum.UnderlyingType = typeRegistry.ImportType(typeof(int));
                            break;

                        default:
                            break;
                        }
                    }
                }
                else if (defineRule.Struct != null)
                {
                    var newStruct = new CsStruct {
                        Name = defineRule.Struct
                    };
                    defineType = newStruct;
                    if (defineRule.HasCustomMarshal.HasValue)
                    {
                        newStruct.HasMarshalType = defineRule.HasCustomMarshal.Value;
                    }

                    if (defineRule.IsStaticMarshal.HasValue)
                    {
                        newStruct.IsStaticMarshal = defineRule.IsStaticMarshal.Value;
                    }

                    if (defineRule.HasCustomNew.HasValue)
                    {
                        newStruct.HasCustomNew = defineRule.HasCustomNew.Value;
                    }

                    if (defineRule.SizeOf.HasValue)
                    {
                        newStruct.SetSize(defineRule.SizeOf.Value);
                    }

                    if (defineRule.Align.HasValue)
                    {
                        newStruct.Align = defineRule.Align.Value;
                    }
                }
                else if (defineRule.Interface != null)
                {
                    var iface = new CsInterface
                    {
                        Name       = defineRule.Interface,
                        ShadowName = defineRule.ShadowName,
                        VtblName   = defineRule.VtblName
                    };
                    if (defineRule.NativeImplementation != null)
                    {
                        iface.NativeImplementation = new CsInterface {
                            Name = defineRule.NativeImplementation, IsDualCallback = true
                        };
                        iface.IsCallback     = true;
                        iface.IsDualCallback = true;
                        typeRegistry.DefineType(iface.NativeImplementation);
                    }
                    defineType = iface;
                }
                else
                {
                    Logger.Error(LoggingCodes.MissingElementInRule, "Invalid rule [{0}]. Requires one of enum, struct, or interface", defineRule);
                    continue;
                }

                // Define this type
                typeRegistry.DefineType(defineType);
            }
        }
Exemplo n.º 9
0
        private static string GetMask(CsEnum csEnum, params string[] enumItem)
        {
            var q = enumItem.Distinct().Select(enumName => $"{csEnum.Name}.{enumName}");

            return(string.Join(" | ", q));
        }
Exemplo n.º 10
0
 private static string GetMask(CsEnum csEnum, params CsEnumItem[] enumItem)
 {
     return(GetMask(csEnum, enumItem.Select(a => a.EnumName).ToArray()));
 }
Exemplo n.º 11
0
        private static string GetEnumCondition(string variableName, CsEnum csEnum, CsEnumItem enumItem)
        {
            var mask = GetMask(csEnum, enumItem);

            return($"({variableName} & {mask}) != 0");
        }