Browse Source

Added support for typedefs to the code generator.

pull/1/head
triton 13 years ago
parent
commit
cd06bb0d2d
  1. 82
      src/Generator/Templates/CSharpModule.tt

82
src/Generator/Templates/CSharpModule.tt

@ -29,6 +29,23 @@ public void GenerateDeclarations()
WriteLine(""); WriteLine("");
} }
if (NeedsNewline)
WriteLine("");
NeedsNewline = false;
// Generate all the typedef declarations for the module.
for(int i = 0; i < Module.Typedefs.Count; ++i)
{
var T = Module.Typedefs[i];
if (T.Ignore) continue;
GenerateTypedef(T);
NeedsNewline = true;
if (i < Module.Typedefs.Count - 1)
WriteLine("");
}
if (NeedsNewline) if (NeedsNewline)
WriteLine(""); WriteLine("");
@ -73,7 +90,7 @@ public void GenerateDeclarations()
#> #>
<#+ <#+
public void GenerateTypeCommon(Declaration T) public void GenerateDeclarationCommon(Declaration T)
{ {
GenerateSummary(T.BriefComment); GenerateSummary(T.BriefComment);
GenerateDebug(T); GenerateDebug(T);
@ -84,46 +101,73 @@ public void GenerateTypeCommon(Declaration T)
public void GenerateClass(Class C) public void GenerateClass(Class C)
{ {
if(C.Ignore) return; if(C.Ignore) return;
GenerateTypeCommon(C); GenerateDeclarationCommon(C);
if (C.IsUnion)
WriteLine("[StructLayout(LayoutKind.Explicit)]");
Write("public unsafe "); Write("public unsafe ");
if (C.IsAbstract) if (C.IsAbstract)
Write("abstract "); Write("abstract ");
Write("class {0}", C.Name); Write("class {0}", SafeIdentifier(C.Name));
if (C.HasBase) if (C.HasBase)
Write(" : {0}", C.Bases[0].Class.Name); Write(" : {0}", SafeIdentifier(C.Bases[0].Class.Name));
WriteLine(String.Empty); WriteLine(String.Empty);
WriteLine("{"); WriteLine("{");
PushIndent(DefaultIndent); if (!C.IsOpaque)
foreach(var F in C.Fields) {
{ PushIndent(DefaultIndent);
GenerateTypeCommon(F); foreach(var F in C.Fields)
WriteLine("public {0} {1};", F.Type, SafeIdentifier(F.Name)); {
} GenerateDeclarationCommon(F);
PopIndent(); if (C.IsUnion)
WriteLine("[FieldOffset({0})]", F.Offset);
WriteLine("public {0} {1};", F.Type.ToCSharp(), SafeIdentifier(F.Name));
}
PopIndent();
}
WriteLine("}"); WriteLine("}");
} }
#> #>
<#+
public void GenerateTypedef(Typedef T)
{
if(T.Ignore) return;
GenerateDeclarationCommon(T);
FunctionType func;
if (T.Type.IsPointerToPrimitiveType(PrimitiveType.Void))
{
WriteLine("public class " + SafeIdentifier(T.Name) + @" { }");
WriteLine("");
}
else if(T.Type.IsPointerTo<FunctionType>(out func))
{
WriteLine("public {0};",
string.Format(func.ToDelegateString(), SafeIdentifier(T.Name)));
}
}
#>
<#+ <#+
public void GenerateFunction(Function F) public void GenerateFunction(Function F)
{ {
if(F.Ignore) return; if(F.Ignore) return;
GenerateTypeCommon(F); GenerateDeclarationCommon(F);
#> #>
[DllImport("<#= SafeIdentifier(Library.Name) #>.dll")] [DllImport("<#= SafeIdentifier(Library.Native) #>.dll")]
public unsafe static extern <#= F.ReturnType #> <#= SafeIdentifier(F.Name) #>(<#+ public unsafe static extern <#= F.ReturnType.ToCSharp() #> <#= SafeIdentifier(F.Name) #>(<#+
for(int i = 0; i < F.Parameters.Count; ++i) for(int i = 0; i < F.Parameters.Count; ++i)
{ {
var P = F.Parameters[i]; var P = F.Parameters[i];
Write("{0} {1}", P.Type, SafeIdentifier(P.Name)); Write("{0} {1}", P.Type.ToCSharp(), SafeIdentifier(P.Name));
if (i < F.Parameters.Count - 1) if (i < F.Parameters.Count - 1)
Write(", "); Write(", ");
} }
@ -134,10 +178,10 @@ WriteLine("");
#> #>
<#+ <#+
public void GenerateDebug(Declaration T) public void GenerateDebug(Declaration decl)
{ {
if(Options.OutputDebug && !String.IsNullOrWhiteSpace(T.DebugText)) if(Options.OutputDebug && !String.IsNullOrWhiteSpace(decl.DebugText))
WriteLine("// DEBUG: " + T.DebugText); WriteLine("// DEBUG: " + decl.DebugText);
} }
#> #>
@ -169,7 +213,7 @@ public void GenerateInlineSummary(string Comment)
public void GenerateEnum(Enumeration E) public void GenerateEnum(Enumeration E)
{ {
if(E.Ignore) return; if(E.Ignore) return;
GenerateTypeCommon(E); GenerateDeclarationCommon(E);
if(E.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags)) if(E.Modifiers.HasFlag(Enumeration.EnumModifiers.Flags))
WriteLine("[Flags]"); WriteLine("[Flags]");

Loading…
Cancel
Save