From f47dc5bb076b2d724962a01837b8ad752a4aba6c Mon Sep 17 00:00:00 2001 From: triton Date: Thu, 18 Jul 2013 16:08:31 +0100 Subject: [PATCH] Convert the C# backend to the new blocks system. --- .../Generators/CSharp/CSharpTextTemplate.cs | 159 +++++++++++------- 1 file changed, 94 insertions(+), 65 deletions(-) diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index b7db10c1..46ae6de0 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -4,7 +4,6 @@ using System.Globalization; using System.IO; using System.Linq; using CppSharp.AST; -using CppSharp.Passes; namespace CppSharp.Generators.CSharp { @@ -65,7 +64,20 @@ namespace CppSharp.Generators.CSharp public class CSharpBlockKind { - + public const int Usings = BlockKind.LAST + 1; + public const int Namespace = BlockKind.LAST + 2; + public const int Enum = BlockKind.LAST + 3; + public const int Typedef = BlockKind.LAST + 4; + public const int Class = BlockKind.LAST + 5; + public const int InternalsClass = BlockKind.LAST + 6; + public const int InternalsClassMethod = BlockKind.LAST + 7; + public const int Functions = BlockKind.LAST + 8; + public const int Function = BlockKind.LAST + 9; + public const int Method = BlockKind.LAST + 10; + public const int Event = BlockKind.LAST + 11; + public const int Variable = BlockKind.LAST + 12; + public const int Property = BlockKind.LAST + 13; + public const int Field = BlockKind.LAST + 14; } public class CSharpTextTemplate : Template @@ -121,13 +133,15 @@ namespace CppSharp.Generators.CSharp { GenerateHeader(); + PushBlock(CSharpBlockKind.Usings); WriteLine("using System;"); WriteLine("using System.Runtime.InteropServices;"); WriteLine("using System.Security;"); - NewLine(); + PopBlock(NewLineKind.BeforeNextBlock); if (Options.GenerateLibraryNamespace) { + PushBlock(CSharpBlockKind.Namespace); WriteLine("namespace {0}", SafeIdentifier(Driver.Options.OutputNamespace)); WriteStartBraceIndent(); } @@ -135,15 +149,20 @@ namespace CppSharp.Generators.CSharp GenerateDeclContext(TranslationUnit); if (Options.GenerateLibraryNamespace) + { WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); + } } public void GenerateHeader() { + PushBlock(BlockKind.Header); WriteLine("//----------------------------------------------------------------------------"); WriteLine("// This is autogenerated code by CppSharp."); WriteLine("// Do not edit this file or all your changes will be lost after re-generation."); WriteLine("//----------------------------------------------------------------------------"); + PopBlock(); } private void GenerateDeclContext(DeclarationContext context) @@ -155,6 +174,7 @@ namespace CppSharp.Generators.CSharp if (shouldGenerateNamespace) { + PushBlock(CSharpBlockKind.Namespace); WriteLine("namespace {0}", context.Name); WriteStartBraceIndent(); } @@ -165,9 +185,7 @@ namespace CppSharp.Generators.CSharp if (@enum.Ignore || @enum.IsIncomplete) continue; - NewLineIfNeeded(); GenerateEnum(@enum); - NeedNewLine(); } // Generate all the typedef declarations. @@ -175,12 +193,7 @@ namespace CppSharp.Generators.CSharp { if (typedef.Ignore) continue; - NewLineIfNeeded(); - - if (!GenerateTypedef(typedef)) - continue; - - NeedNewLine(); + GenerateTypedef(typedef); } // Generate all the struct/class declarations. @@ -192,18 +205,17 @@ namespace CppSharp.Generators.CSharp if (@class.IsDependent) continue; - NewLineIfNeeded(); GenerateClass(@class); - NeedNewLine(); } if (context.HasFunctions) { - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Functions); WriteLine("public partial class {0}{1}", SafeIdentifier(Options.OutputNamespace), TranslationUnit.FileNameWithoutExtension); WriteStartBraceIndent(); + PushBlock(CSharpBlockKind.InternalsClass); GenerateClassInternalHead(); WriteStartBraceIndent(); @@ -212,39 +224,38 @@ namespace CppSharp.Generators.CSharp { if (function.Ignore) continue; - NewLineIfNeeded(); GenerateInternalFunction(function); - NeedNewLine(); } WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); foreach (var function in context.Functions) { if (function.Ignore) continue; - NewLineIfNeeded(); GenerateFunction(function); - NeedNewLine(); } WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } foreach (var @event in context.Events) { if (@event.Ignore) continue; - NewLineIfNeeded(); GenerateEvent(@event); - NeedNewLine(); } foreach(var childNamespace in context.Namespaces) GenerateDeclContext(childNamespace); if (shouldGenerateNamespace) + { WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); + } } public void GenerateDeclarationCommon(Declaration decl) @@ -288,6 +299,7 @@ namespace CppSharp.Generators.CSharp if (@class.Ignore || @class.IsIncomplete) return; + PushBlock(CSharpBlockKind.Class); GenerateDeclarationCommon(@class); if (@class.IsUnion) @@ -309,10 +321,10 @@ namespace CppSharp.Generators.CSharp if (ShouldGenerateClassNativeField(@class)) { - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Field); WriteLine("public System.IntPtr {0} {{ get; protected set; }}", Helpers.InstanceIdentifier); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } GenerateClassConstructors(@class); @@ -323,23 +335,38 @@ namespace CppSharp.Generators.CSharp } WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } public void GenerateClassInternals(Class @class) { + PushBlock(CSharpBlockKind.InternalsClass); WriteLine("[StructLayout(LayoutKind.Explicit, Size = {0})]", @class.Layout.Size); GenerateClassInternalHead(@class); WriteStartBraceIndent(); - ResetNewLine(); - var typePrinter = TypePrinter as CSharpTypePrinter; typePrinter.PushContext(CSharpTypePrinterContextKind.Native); GenerateClassFields(@class, isInternal: true); + var functions = GatherClassInternalFunctions(@class); + + foreach (var function in functions) + { + GenerateInternalFunction(function); + } + + typePrinter.PopContext(); + + WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); + } + + private static HashSet GatherClassInternalFunctions(Class @class) + { var functions = new HashSet(); foreach (var ctor in @class.Constructors) @@ -378,17 +405,7 @@ namespace CppSharp.Generators.CSharp if (prop.SetMethod != null) functions.Add(prop.SetMethod); } - - foreach (var function in functions) - { - NewLineIfNeeded(); - GenerateInternalFunction(function); - } - - typePrinter.PopContext(); - - WriteCloseBraceIndent(); - NeedNewLine(); + return functions; } private void GenerateClassInternalHead(Class @class = null) @@ -565,7 +582,7 @@ namespace CppSharp.Generators.CSharp { if (ASTUtils.CheckIgnoreField(@class, field)) continue; - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Field); if (isInternal) { @@ -592,7 +609,7 @@ namespace CppSharp.Generators.CSharp WriteLine("public {0} {1};", field.Type, SafeIdentifier(field.Name)); } - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } } @@ -602,16 +619,17 @@ namespace CppSharp.Generators.CSharp { var @class = field.Class; + PushBlock(CSharpBlockKind.Property); GenerateDeclarationCommon(field); WriteLine("public {0} {1}", field.Type, SafeIdentifier(field.Name)); WriteStartBraceIndent(); GeneratePropertyGetter(field, @class); - NewLine(); GeneratePropertySetter(field, @class); WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } private Tuple GetDeclarationLibrarySymbol(IMangledDecl decl) @@ -638,6 +656,7 @@ namespace CppSharp.Generators.CSharp private void GeneratePropertySetter(T decl, Class @class) where T : Declaration, ITypedDecl { + PushBlock(CSharpBlockKind.Method); WriteLine("set"); WriteStartBraceIndent(); @@ -685,11 +704,13 @@ namespace CppSharp.Generators.CSharp } WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } private void GeneratePropertyGetter(T decl, Class @class) where T : Declaration, ITypedDecl { + PushBlock(CSharpBlockKind.Method); WriteLine("get"); WriteStartBraceIndent(); @@ -758,6 +779,7 @@ namespace CppSharp.Generators.CSharp } WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } public void GenerateClassMethods(Class @class) @@ -777,16 +799,12 @@ namespace CppSharp.Generators.CSharp continue; } - NewLineIfNeeded(); GenerateMethod(method, @class); - NeedNewLine(); } foreach (var method in staticMethods) { - NewLineIfNeeded(); GenerateMethod(method, @class); - NeedNewLine(); } } @@ -801,9 +819,7 @@ namespace CppSharp.Generators.CSharp var type = variable.Type; - NewLineIfNeeded(); GenerateVariable(@class, type, variable); - NeedNewLine(); } } @@ -813,26 +829,25 @@ namespace CppSharp.Generators.CSharp { if (prop.Ignore) continue; - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Property); WriteLine("public {0} {1}", prop.Type, prop.Name); WriteStartBraceIndent(); GeneratePropertyGetter(prop.GetMethod, @class); - NeedNewLine(); if (prop.SetMethod != null) { - NewLineIfNeeded(); GeneratePropertySetter(prop.SetMethod, @class); } WriteCloseBraceIndent(); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } } private void GenerateVariable(Class @class, AST.Type type, Variable variable) { + PushBlock(CSharpBlockKind.Variable); WriteLine("public static {0} {1}", type, variable.Name); WriteStartBraceIndent(); @@ -842,6 +857,7 @@ namespace CppSharp.Generators.CSharp GeneratePropertySetter(variable, @class); WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } #region Events @@ -852,6 +868,7 @@ namespace CppSharp.Generators.CSharp private void GenerateEvent(Event @event) { + PushBlock(CSharpBlockKind.Event); TypePrinter.PushContext(CSharpTypePrinterContextKind.Native); var args = TypePrinter.VisitParameters(@event.Parameters, hasNames: true); TypePrinter.PopContext(); @@ -878,7 +895,7 @@ namespace CppSharp.Generators.CSharp NewLine(); GenerateEventRaiseWrapper(@event); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } private void GenerateEventAdd(Event @event) @@ -956,8 +973,6 @@ namespace CppSharp.Generators.CSharp public void GenerateClassConstructors(Class @class) { - NewLineIfNeeded(); - // Output a default constructor that takes the native pointer. GenerateNativeConstructor(@class); @@ -966,9 +981,7 @@ namespace CppSharp.Generators.CSharp if (ASTUtils.CheckIgnoreMethod(@class, ctor)) continue; - NewLineIfNeeded(); GenerateMethod(ctor, @class); - NeedNewLine(); } if (@class.IsRefType) @@ -982,7 +995,7 @@ namespace CppSharp.Generators.CSharp // Generate the IDispose Dispose() method. if (!hasBaseClass) { - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Method); WriteLine("public void Dispose()"); WriteStartBraceIndent(); @@ -990,11 +1003,11 @@ namespace CppSharp.Generators.CSharp WriteLine("GC.SuppressFinalize(this);"); WriteCloseBraceIndent(); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } // Generate Dispose(bool) method - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Method); Write("protected "); Write(hasBaseClass ? "override " : "virtual "); @@ -1009,25 +1022,28 @@ namespace CppSharp.Generators.CSharp WriteLine("base.Dispose(disposing);"); WriteCloseBraceIndent(); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } private void GenerateNativeConstructor(Class @class) { + PushBlock(CSharpBlockKind.Method); WriteLine("internal {0}({1}.Internal* native)", SafeIdentifier(@class.Name), @class.Name); WriteLineIndent(": this(new System.IntPtr(native))"); WriteStartBraceIndent(); WriteCloseBraceIndent(); - NewLine(); + PopBlock(NewLineKind.BeforeNextBlock); + PushBlock(CSharpBlockKind.Method); WriteLine("internal {0}({1}.Internal native)", SafeIdentifier(@class.Name), @class.Name); WriteLineIndent(": this(&native)"); WriteStartBraceIndent(); WriteCloseBraceIndent(); - NewLine(); + PopBlock(NewLineKind.BeforeNextBlock); + PushBlock(CSharpBlockKind.Method); WriteLine("internal {0}(System.IntPtr native)", SafeIdentifier(@class.Name)); var hasBaseClass = @class.HasBaseClass && @class.BaseClass.IsRefType; @@ -1049,23 +1065,24 @@ namespace CppSharp.Generators.CSharp } WriteCloseBraceIndent(); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); if (@class.IsValueType) { - NewLineIfNeeded(); + PushBlock(CSharpBlockKind.Method); WriteLine("internal Internal ToInternal()"); WriteStartBraceIndent(); GenerateStructInternalMarshaling(@class); WriteCloseBraceIndent(); - NewLine(); + PopBlock(NewLineKind.BeforeNextBlock); + PushBlock(CSharpBlockKind.Method); WriteLine("internal void FromInternal(Internal* native)"); WriteStartBraceIndent(); WriteLine("var {0} = {1};", Helpers.GeneratedIdentifier("ptr"), "native"); GenerateStructMarshalingFields(@class); WriteCloseBraceIndent(); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } } @@ -1099,6 +1116,7 @@ namespace CppSharp.Generators.CSharp public void GenerateFunction(Function function) { + PushBlock(CSharpBlockKind.Function); GenerateDeclarationCommon(function); var functionName = GetFunctionIdentifier(function); @@ -1110,10 +1128,12 @@ namespace CppSharp.Generators.CSharp GenerateInternalFunctionCall(function); WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } public void GenerateMethod(Method method, Class @class) { + PushBlock(CSharpBlockKind.Method); GenerateDeclarationCommon(method); Write("public "); @@ -1173,6 +1193,7 @@ namespace CppSharp.Generators.CSharp } WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); } private static string GetOperatorOverloadPair(CXXOperatorKind kind) @@ -1528,14 +1549,17 @@ namespace CppSharp.Generators.CSharp if (typedef.Type.IsPointerToPrimitiveType(PrimitiveType.Void) || typedef.Type.IsPointerTo(out tag)) { + PushBlock(CSharpBlockKind.Typedef); WriteLine("public class " + SafeIdentifier(typedef.Name) + @" { }"); + PopBlock(NewLineKind.BeforeNextBlock); } else if (typedef.Type.IsPointerTo(out function)) { + PushBlock(CSharpBlockKind.Typedef); WriteLine("public {0};", string.Format(TypePrinter.VisitDelegate(function).Type, SafeIdentifier(typedef.Name))); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); } else if (typedef.Type.IsEnumType()) { @@ -1554,6 +1578,8 @@ namespace CppSharp.Generators.CSharp public void GenerateEnum(Enumeration @enum) { if (@enum.Ignore) return; + + PushBlock(CSharpBlockKind.Enum); GenerateDeclarationCommon(@enum); if (@enum.IsFlags) @@ -1585,6 +1611,8 @@ namespace CppSharp.Generators.CSharp NewLine(); } WriteCloseBraceIndent(); + + PopBlock(NewLineKind.BeforeNextBlock); } public static string GetOperatorIdentifier(CXXOperatorKind kind, @@ -1732,6 +1760,7 @@ namespace CppSharp.Generators.CSharp if (!function.IsProcessed || function.ExplicityIgnored) return; + PushBlock(CSharpBlockKind.InternalsClassMethod); GenerateDeclarationCommon(function); WriteLine("[SuppressUnmanagedCodeSecurity]"); @@ -1800,7 +1829,7 @@ namespace CppSharp.Generators.CSharp WriteLine("public static extern {0} {1}({2});", retType, GetFunctionIdentifier(function), string.Join(", ", @params)); - NeedNewLine(); + PopBlock(NewLineKind.BeforeNextBlock); typePrinter.PopContext(); }