diff --git a/src/Bridge/ASTVisitor.cs b/src/Bridge/ASTVisitor.cs index 9d257a24..dc813a66 100644 --- a/src/Bridge/ASTVisitor.cs +++ b/src/Bridge/ASTVisitor.cs @@ -157,6 +157,9 @@ namespace Cxxi foreach (var @event in @class.Events) VisitEvent(@event); + foreach (var variable in @class.Variables) + VisitVariableDecl(variable); + return true; } diff --git a/src/Bridge/Variable.cs b/src/Bridge/Variable.cs index 96095521..ef5bc3c3 100644 --- a/src/Bridge/Variable.cs +++ b/src/Bridge/Variable.cs @@ -8,6 +8,8 @@ namespace Cxxi return visitor.VisitVariableDecl(this); } + public AccessSpecifier Access { get; set; } + public Type Type { get { return QualifiedType.Type; } } public QualifiedType QualifiedType { get; set; } } diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 6524a4d6..fa2f474c 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -426,8 +426,21 @@ namespace Cxxi.Generators.CLI { if (variable.Ignore) continue; - WriteLine("static property {0} {1};", variable.Type, - variable.Name); + if (variable.Access != AccessSpecifier.Public) + continue; + + var type = variable.Type; + + WriteLine("static property {0} {1}", type, variable.Name); + + WriteStartBraceIndent(); + + WriteLine("{0} get();", type); + + if (!variable.QualifiedType.Qualifiers.IsConst) + WriteLine("void set({0});", type); + + WriteCloseBraceIndent(); } PopIndent(); diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index c22c9a53..a79ffa37 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -268,7 +268,7 @@ namespace Cxxi.Generators.CLI public override bool VisitVariableDecl(Variable variable) { - throw new NotImplementedException(); + return variable.Type.Visit(this, variable.QualifiedType.Qualifiers); } private string ToCLITypeName(Declaration decl) diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 7a090b7a..604ba376 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -173,6 +173,9 @@ namespace Cxxi.Generators.CLI if (variable.Ignore) continue; + if (variable.Access != AccessSpecifier.Public) + continue; + GenerateDeclarationCommon(variable); GenerateVariable(variable, @class); } @@ -218,20 +221,20 @@ namespace Cxxi.Generators.CLI { var @class = field.Class; - GenerateFieldPropertyGetter(field, @class); - GenerateFieldPropertySetter(field, @class); + GeneratePropertyGetter(field, @class); + GeneratePropertySetter(field, @class); } - private void GenerateFieldPropertySetter(Field field, Class @class) + private void GeneratePropertySetter(T decl, Class @class) where T : Declaration, ITypedDecl { WriteLine("void {0}::{1}::set({2} value)", QualifiedIdentifier(@class), - field.Name, field.Type); + decl.Name, decl.Type); WriteStartBraceIndent(); var param = new Parameter { Name = "value", - QualifiedType = field.QualifiedType + QualifiedType = decl.QualifiedType }; var ctx = new MarshalContext(Driver) @@ -243,8 +246,13 @@ namespace Cxxi.Generators.CLI var marshal = new CLIMarshalManagedToNativePrinter(ctx); param.Visit(marshal); - var variable = string.Format("((::{0}*)NativePtr)->{1}", - @class.QualifiedOriginalName, field.OriginalName); + string variable; + if (decl is Variable) + variable = string.Format("::{0}::{1}", + @class.QualifiedOriginalName, decl.OriginalName); + else + variable = string.Format("((::{0}*)NativePtr)->{1}", + @class.QualifiedOriginalName, decl.OriginalName); if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) Write(marshal.Context.SupportBefore); @@ -255,24 +263,29 @@ namespace Cxxi.Generators.CLI NewLine(); } - private void GenerateFieldPropertyGetter(Field field, Class @class) + private void GeneratePropertyGetter(T decl, Class @class) where T : Declaration, ITypedDecl { - WriteLine("{0} {1}::{2}::get()", field.Type, QualifiedIdentifier(@class), - field.Name); + WriteLine("{0} {1}::{2}::get()", decl.Type, QualifiedIdentifier(@class), + decl.Name); WriteStartBraceIndent(); - var variable = string.Format("((::{0}*)NativePtr)->{1}", - @class.QualifiedOriginalName, field.OriginalName); + string variable; + if (decl is Variable) + variable = string.Format("::{0}::{1}", + @class.QualifiedOriginalName, decl.OriginalName); + else + variable = string.Format("((::{0}*)NativePtr)->{1}", + @class.QualifiedOriginalName, decl.OriginalName); var ctx = new MarshalContext(Driver) { - ArgName = field.Name, + ArgName = decl.Name, ReturnVarName = variable, - ReturnType = field.Type + ReturnType = decl.Type }; var marshal = new CLIMarshalNativeToManagedPrinter(ctx); - field.Visit(marshal); + decl.Visit(marshal); if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) Write(marshal.Context.SupportBefore); @@ -397,7 +410,10 @@ namespace Cxxi.Generators.CLI private void GenerateVariable(Variable variable, Class @class) { + GeneratePropertyGetter(variable, @class); + if (!variable.QualifiedType.Qualifiers.IsConst) + GeneratePropertySetter(variable, @class); } private void GenerateClassConstructor(Class @class, bool isIntPtr) @@ -671,7 +687,7 @@ namespace Cxxi.Generators.CLI foreach(var paramInfo in @params) { var param = paramInfo.Param; - if(param.Usage != ParameterUsage.Out && param.Usage != ParameterUsage.Ref) + if(param.Usage != ParameterUsage.Out && param.Usage != ParameterUsage.InOut) continue; var nativeVarName = paramInfo.Name; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 4750811d..332f4528 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1319,6 +1319,7 @@ Cxxi::Variable^ Parser::WalkVariable(clang::VarDecl *VD) auto Var = gcnew Cxxi::Variable(); Var->Name = marshalString(VD->getName()); + Var->Access = ConvertToAccess(VD->getAccess()); auto TL = VD->getTypeSourceInfo()->getTypeLoc(); Var->QualifiedType = GetQualifiedType(VD->getType(), WalkType(VD->getType(), &TL));