diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 871549d1..ff524435 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -436,7 +436,13 @@ namespace Cxxi.Generators.CLI { var type = field.Type.Visit(Type.TypePrinter, field.QualifiedType.Qualifiers); - WriteLine("property {0} {1};", type, field.Name); + WriteLine("property {0} {1}", type, field.Name); + WriteStartBraceIndent(); + + WriteLine("{0} get();", type); + WriteLine("void set({0});", type); + + WriteCloseBraceIndent(); } public void GenerateMethod(Method method) diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 7aca18d8..93ee1cac 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -136,6 +136,17 @@ namespace Cxxi.Generators.CLI NewLine(); } + if (@class.IsRefType) + { + foreach (var field in @class.Fields) + { + if (CheckIgnoreField(@class, field)) + continue; + + GenerateFieldProperty(field); + } + } + foreach (var @event in @class.Events) { GenerateDeclarationCommon(@event); @@ -149,6 +160,75 @@ namespace Cxxi.Generators.CLI } } + private void GenerateFieldProperty(Field field) + { + var @class = field.Class; + + GenerateFieldPropertyGetter(field, @class); + GenerateFieldPropertySetter(field, @class); + } + + private void GenerateFieldPropertySetter(Field field, Class @class) + { + WriteLine("void {0}::{1}::set({2} value)", QualifiedIdentifier(@class), + field.Name, field.Type); + WriteStartBraceIndent(); + + var param = new Parameter + { + Name = "value", + QualifiedType = field.QualifiedType + }; + + var ctx = new MarshalContext(Driver) + { + Parameter = param, + ArgName = param.Name, + }; + + var marshal = new CLIMarshalManagedToNativePrinter(Driver.TypeDatabase, + ctx); + param.Visit(marshal); + + var variable = string.Format("((::{0}*)NativePtr)->{1}", + @class.QualifiedOriginalName, field.OriginalName); + + if (!string.IsNullOrWhiteSpace(marshal.SupportBefore)) + WriteLine(marshal.SupportBefore); + + WriteLine("{0} = {1};", variable, marshal.Return); + + if (!string.IsNullOrWhiteSpace(marshal.SupportAfter)) + WriteLine(marshal.SupportAfter); + + WriteCloseBraceIndent(); + NewLine(); + } + + private void GenerateFieldPropertyGetter(Field field, Class @class) + { + WriteLine("{0} {1}::{2}::get()", field.Type, QualifiedIdentifier(@class), + field.Name); + WriteStartBraceIndent(); + + var variable = string.Format("((::{0}*)NativePtr)->{1}", + @class.QualifiedOriginalName, field.OriginalName); + + var ctx = new MarshalContext(Driver) + { + ReturnVarName = variable, + ReturnType = field.Type + }; + + var marshal = new CLIMarshalNativeToManagedPrinter(Driver, ctx); + field.Visit(marshal); + + WriteLine("return {0};", marshal.Return); + + WriteCloseBraceIndent(); + NewLine(); + } + private void GenerateEvent(Event @event, Class @class) { GenerateEventAdd(@event, @class);