Browse Source

Refactor CLI handling of enums to be based on generic C generator.

pull/1302/head
João Matos 6 years ago committed by João Matos
parent
commit
7bad042715
  1. 69
      src/Generator/Generators/C/CCodeGenerator.cs
  2. 41
      src/Generator/Generators/CLI/CLIHeaders.cs

69
src/Generator/Generators/C/CCodeGenerator.cs

@ -47,6 +47,8 @@ namespace CppSharp.Generators.C
protected CppTypePrinter typePrinter = new CppTypePrinter(); protected CppTypePrinter typePrinter = new CppTypePrinter();
public virtual CppTypePrinter CTypePrinter => typePrinter; public virtual CppTypePrinter CTypePrinter => typePrinter;
public bool IsCLIGenerator => Context.Options.GeneratorKind == GeneratorKind.CLI;
public virtual void WriteHeaders() { } public virtual void WriteHeaders() { }
public virtual void WriteInclude(CInclude include) public virtual void WriteInclude(CInclude include)
@ -105,52 +107,50 @@ namespace CppSharp.Generators.C
if (!VisitDeclaration(@enum)) if (!VisitDeclaration(@enum))
return false; return false;
PushBlock(); PushBlock(BlockKind.Enum, @enum);
var useTypedefEnum = Options.GeneratorKind == GeneratorKind.C; GenerateDeclarationCommon(@enum);
var enumName = Options.GeneratorKind != GeneratorKind.CPlusPlus ?
QualifiedName(@enum) : @enum.Name; if (IsCLIGenerator)
{
if (@enum.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags))
WriteLine("[System::Flags]");
// A nested class cannot have an assembly access specifier as part
// of its declaration.
if (@enum.Namespace is Namespace)
Write("public ");
}
var enumKind = @enum.IsScoped ? "enum class" : "enum"; var enumKind = @enum.IsScoped || IsCLIGenerator ? "enum class" : "enum";
var enumName = Options.GeneratorKind == GeneratorKind.C ?
QualifiedName(@enum) : @enum.Name;
if (useTypedefEnum) var generateTypedef = Options.GeneratorKind == GeneratorKind.C;
if (generateTypedef)
Write($"typedef {enumKind} {enumName}"); Write($"typedef {enumKind} {enumName}");
else else
Write($"{enumKind} {enumName}"); Write($"{enumKind} {enumName}");
if (Options.GeneratorKind == GeneratorKind.CPlusPlus) if (Options.GeneratorKind == GeneratorKind.CPlusPlus ||
Options.GeneratorKind == GeneratorKind.CLI)
{ {
var typeName = CTypePrinter.VisitPrimitiveType( var typeName = CTypePrinter.VisitPrimitiveType(
@enum.BuiltinType.Type, new TypeQualifiers()); @enum.BuiltinType.Type, new TypeQualifiers());
if (@enum.BuiltinType.Type != PrimitiveType.Int) if (@enum.BuiltinType.Type != PrimitiveType.Int &&
@enum.BuiltinType.Type != PrimitiveType.Null)
Write($" : {typeName}"); Write($" : {typeName}");
} }
NewLine(); NewLine();
WriteOpenBraceAndIndent(); WriteOpenBraceAndIndent();
foreach (var item in @enum.Items) GenerateEnumItems(@enum);
{
if (!item.IsGenerated)
continue;
var enumItemName = Options.GeneratorKind != GeneratorKind.CPlusPlus ?
$"{@enum.QualifiedName}_{item.Name}" : item.Name;
Write(enumItemName);
if (item.ExplicitValue)
Write($" = {@enum.GetItemValueAsString(item)}");
if (item != @enum.Items.Last())
WriteLine(",");
}
NewLine();
Unindent(); Unindent();
if (!string.IsNullOrWhiteSpace(enumName) && useTypedefEnum) if (!string.IsNullOrWhiteSpace(enumName) && generateTypedef)
WriteLine($"}} {enumName};"); WriteLine($"}} {enumName};");
else else
WriteLine("};"); WriteLine("};");
@ -160,6 +160,23 @@ namespace CppSharp.Generators.C
return true; return true;
} }
public override bool VisitEnumItemDecl(Enumeration.Item item)
{
if (item.Comment != null)
GenerateInlineSummary(item.Comment);
var @enum = item.Namespace as Enumeration;
var enumItemName = Options.GeneratorKind == GeneratorKind.C ?
$"{@enum.QualifiedName}_{item.Name}" : item.Name;
Write(enumItemName);
if (item.ExplicitValue)
Write($" = {@enum.GetItemValueAsString(item)}");
return true;
}
public static string GetAccess(AccessSpecifier accessSpecifier) public static string GetAccess(AccessSpecifier accessSpecifier)
{ {
switch (accessSpecifier) switch (accessSpecifier)

41
src/Generator/Generators/CLI/CLIHeaders.cs

@ -154,9 +154,7 @@ namespace CppSharp.Generators.CLI
if (!@enum.IsGenerated || @enum.IsIncomplete) if (!@enum.IsGenerated || @enum.IsIncomplete)
continue; continue;
PushBlock(BlockKind.Enum, @enum); @enum.Visit(this);
GenerateEnum(@enum);
PopBlock(NewLineKind.BeforeNextBlock);
} }
// Generate all the typedef declarations for the module. // Generate all the typedef declarations for the module.
@ -805,42 +803,5 @@ namespace CppSharp.Generators.CLI
Class @class; Class @class;
return finalType.TryGetClass(out @class) && @class.IsIncomplete; return finalType.TryGetClass(out @class) && @class.IsIncomplete;
} }
public void GenerateEnum(Enumeration @enum)
{
if (!@enum.IsGenerated || @enum.IsIncomplete)
return;
PushBlock(BlockKind.Enum, @enum);
GenerateDeclarationCommon(@enum);
if (@enum.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags))
WriteLine("[System::Flags]");
// A nested class cannot have an assembly access specifier as part
// of its declaration.
if (@enum.Namespace is Namespace)
Write("public ");
Write("enum struct {0}", @enum.Name);
var typeName = CTypePrinter.VisitPrimitiveType(@enum.BuiltinType.Type,
new TypeQualifiers());
if (@enum.BuiltinType.Type != PrimitiveType.Int &&
@enum.BuiltinType.Type != PrimitiveType.Null)
Write(" : {0}", typeName);
NewLine();
WriteOpenBraceAndIndent();
GenerateEnumItems(@enum);
Unindent();
WriteLine("};");
PopBlock(NewLineKind.BeforeNextBlock);
}
} }
} }

Loading…
Cancel
Save