Browse Source

Rework C enum generation for more accurate handling.

pull/1581/head
Joao Matos 4 years ago committed by João Matos
parent
commit
57c9c48229
  1. 43
      src/Generator/Generators/C/CCodeGenerator.cs

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

@ -39,6 +39,8 @@ namespace CppSharp.Generators.C
public virtual string ClassCtorInstanceParamIdentifier => "instance"; public virtual string ClassCtorInstanceParamIdentifier => "instance";
public virtual bool GenerateSemicolonAsDeclarationTerminator => true;
public override void Process() public override void Process()
{ {
@ -125,6 +127,28 @@ namespace CppSharp.Generators.C
GenerateDeclarationCommon(@enum); GenerateDeclarationCommon(@enum);
var enumName = GenerateEnumSpecifier(@enum);
NewLine();
WriteOpenBraceAndIndent();
GenerateEnumItems(@enum);
Unindent();
var generateTypedef = Options.GeneratorKind == GeneratorKind.C;
if (!string.IsNullOrWhiteSpace(enumName) && generateTypedef)
WriteLine($"}} {enumName};");
else
WriteLine("}}{0}", GenerateSemicolonAsDeclarationTerminator ? ";" : "");
PopBlock(NewLineKind.BeforeNextBlock);
return true;
}
public virtual string GenerateEnumSpecifier(Enumeration @enum)
{
if (IsCLIGenerator) if (IsCLIGenerator)
{ {
if (@enum.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags)) if (@enum.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags))
@ -137,8 +161,7 @@ namespace CppSharp.Generators.C
} }
var enumKind = @enum.IsScoped || IsCLIGenerator ? "enum class" : "enum"; var enumKind = @enum.IsScoped || IsCLIGenerator ? "enum class" : "enum";
var enumName = Options.GeneratorKind == GeneratorKind.C ? var enumName = Options.GeneratorKind == GeneratorKind.C ? QualifiedName(@enum) : @enum.Name;
QualifiedName(@enum) : @enum.Name;
var generateTypedef = Options.GeneratorKind == GeneratorKind.C; var generateTypedef = Options.GeneratorKind == GeneratorKind.C;
if (generateTypedef) if (generateTypedef)
@ -157,21 +180,7 @@ namespace CppSharp.Generators.C
Write($" : {typeName}"); Write($" : {typeName}");
} }
NewLine(); return enumName;
WriteOpenBraceAndIndent();
GenerateEnumItems(@enum);
Unindent();
if (!string.IsNullOrWhiteSpace(enumName) && generateTypedef)
WriteLine($"}} {enumName};");
else
WriteLine("};");
PopBlock(NewLineKind.BeforeNextBlock);
return true;
} }
public override bool VisitEnumItemDecl(Enumeration.Item item) public override bool VisitEnumItemDecl(Enumeration.Item item)

Loading…
Cancel
Save