Browse Source

Re-work handling of enum constants fixing signedness and formatting issues.

pull/13/merge
triton 12 years ago
parent
commit
acac3fc00d
  1. 18
      src/AST/Enumeration.cs
  2. 18
      src/AST/Type.cs
  3. 3
      src/Generator/Generators/CLI/CLIHeadersTemplate.cs
  4. 3
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  5. 4
      src/Generator/Library.cs
  6. 2
      src/Generator/Utils/Utils.cs
  7. 5
      src/Parser/Parser.cpp

18
src/AST/Enumeration.cs

@ -22,10 +22,18 @@ namespace CppSharp.AST
public class Item : INamedDecl public class Item : INamedDecl
{ {
public string Name { get; set; } public string Name { get; set; }
public long Value; public ulong Value;
public string Expression; public string Expression;
public string Comment; public string Comment;
public bool ExplicitValue = true; public bool ExplicitValue = true;
public bool IsHexadecimal
{
get
{
return Expression.Contains("0x") || Expression.Contains("0X");
}
}
} }
public Enumeration() public Enumeration()
@ -42,6 +50,14 @@ namespace CppSharp.AST
return this; return this;
} }
public string GetItemValueAsString(Item item)
{
var format = item.IsHexadecimal ? "x" : string.Empty;
var value = BuiltinType.IsUnsigned ? item.Value.ToString(format) :
((long)item.Value).ToString(format);
return item.IsHexadecimal ? "0x" + value : value;
}
public Enumeration SetFlags() public Enumeration SetFlags()
{ {
Modifiers |= EnumModifiers.Flags; Modifiers |= EnumModifiers.Flags;

18
src/AST/Type.cs

@ -534,6 +534,24 @@ namespace CppSharp.AST
Type = type; Type = type;
} }
public bool IsUnsigned
{
get
{
switch (Type)
{
case PrimitiveType.Bool:
case PrimitiveType.UInt8:
case PrimitiveType.UInt16:
case PrimitiveType.UInt32:
case PrimitiveType.UInt64:
return true;
}
return false;
}
}
// Primitive type of built-in type. // Primitive type of built-in type.
public PrimitiveType Type; public PrimitiveType Type;

3
src/Generator/Generators/CLI/CLIHeadersTemplate.cs

@ -608,7 +608,8 @@ namespace CppSharp.Generators.CLI
var item = @enum.Items[i]; var item = @enum.Items[i];
GenerateInlineSummary(item.Comment); GenerateInlineSummary(item.Comment);
if (item.ExplicitValue) if (item.ExplicitValue)
Write(String.Format("{0} = {1}", SafeIdentifier(item.Name), item.Value)); Write(String.Format("{0} = {1}", SafeIdentifier(item.Name),
@enum.GetItemValueAsString(item)));
else else
Write(String.Format("{0}", SafeIdentifier(item.Name))); Write(String.Format("{0}", SafeIdentifier(item.Name)));

3
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -1601,8 +1601,9 @@ namespace CppSharp.Generators.CSharp
var item = @enum.Items[i]; var item = @enum.Items[i];
GenerateInlineSummary(item.Comment); GenerateInlineSummary(item.Comment);
var value = @enum.GetItemValueAsString(item);
Write(item.ExplicitValue Write(item.ExplicitValue
? string.Format("{0} = {1}", SafeIdentifier(item.Name), item.Value) ? string.Format("{0} = {1}", SafeIdentifier(item.Name), value)
: string.Format("{0}", SafeIdentifier(item.Name))); : string.Format("{0}", SafeIdentifier(item.Name)));
if (i < @enum.Items.Count - 1) if (i < @enum.Items.Count - 1)

4
src/Generator/Library.cs

@ -114,12 +114,12 @@ namespace CppSharp
return long.TryParse(num, out val); return long.TryParse(num, out val);
} }
static long ParseMacroExpression(string expression) static ulong ParseMacroExpression(string expression)
{ {
// TODO: Handle string expressions // TODO: Handle string expressions
long val; long val;
return ParseToNumber(expression, out val) ? val : 0; return ParseToNumber(expression, out val) ? (ulong)val : 0;
} }
public static Enumeration GenerateEnumFromMacros(this Library library, string name, public static Enumeration GenerateEnumFromMacros(this Library library, string name,

2
src/Generator/Utils/Utils.cs

@ -9,7 +9,7 @@ namespace CppSharp
{ {
public static class IntHelpers public static class IntHelpers
{ {
public static bool IsPowerOfTwo(this long x) public static bool IsPowerOfTwo(this ulong x)
{ {
return (x != 0) && ((x & (x - 1)) == 0); return (x != 0) && ((x & (x - 1)) == 0);
} }

5
src/Parser/Parser.cpp

@ -1218,9 +1218,10 @@ CppSharp::AST::Enumeration^ Parser::WalkEnum(clang::EnumDecl* ED)
auto EnumItem = gcnew CppSharp::AST::Enumeration::Item(); auto EnumItem = gcnew CppSharp::AST::Enumeration::Item();
EnumItem->Name = marshalString<E_UTF8>(ECD->getNameAsString()); EnumItem->Name = marshalString<E_UTF8>(ECD->getNameAsString());
EnumItem->Value = (int) ECD->getInitVal().getLimitedValue(); auto Value = ECD->getInitVal();
EnumItem->Value = Value.isSigned() ? Value.getSExtValue()
: Value.getZExtValue();
EnumItem->Comment = marshalString<E_UTF8>(BriefText); EnumItem->Comment = marshalString<E_UTF8>(BriefText);
//EnumItem->ExplicitValue = ECD->getExplicitValue();
std::string Text; std::string Text;
if (GetDeclText(ECD->getSourceRange(), Text)) if (GetDeclText(ECD->getSourceRange(), Text))

Loading…
Cancel
Save