diff --git a/src/AST/ASTVisitor.cs b/src/AST/ASTVisitor.cs index 858216ac..5aebf3f6 100644 --- a/src/AST/ASTVisitor.cs +++ b/src/AST/ASTVisitor.cs @@ -400,7 +400,7 @@ namespace CppSharp.AST return false; foreach (var item in @enum.Items) - VisitEnumItem(item); + VisitEnumItemDecl(item); return true; } @@ -413,7 +413,7 @@ namespace CppSharp.AST return variable.Type.Visit(this, variable.QualifiedType.Qualifiers); } - public virtual bool VisitEnumItem(Enumeration.Item item) + public virtual bool VisitEnumItemDecl(Enumeration.Item item) { return true; } diff --git a/src/AST/Declaration.cs b/src/AST/Declaration.cs index 374194bb..951736e4 100644 --- a/src/AST/Declaration.cs +++ b/src/AST/Declaration.cs @@ -409,6 +409,7 @@ namespace CppSharp.AST T VisitTypedefDecl(TypedefDecl typedef); T VisitTypeAliasDecl(TypeAlias typeAlias); T VisitEnumDecl(Enumeration @enum); + T VisitEnumItemDecl(Enumeration.Item item); T VisitVariableDecl(Variable variable); T VisitClassTemplateDecl(ClassTemplate template); T VisitFunctionTemplateDecl(FunctionTemplate template); diff --git a/src/AST/Enumeration.cs b/src/AST/Enumeration.cs index d2418f62..df62e165 100644 --- a/src/AST/Enumeration.cs +++ b/src/AST/Enumeration.cs @@ -39,7 +39,7 @@ namespace CppSharp.AST public override T Visit(IDeclVisitor visitor) { - throw new NotImplementedException(); + return visitor.VisitEnumItemDecl(this); } } diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index 3a8eff2c..57b5af5b 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -126,6 +126,11 @@ namespace CppSharp.Generator.Tests.AST throw new System.NotImplementedException(); } + public bool VisitEnumItemDecl(Enumeration.Item item) + { + throw new NotImplementedException(); + } + public bool VisitVariableDecl(Variable variable) { throw new System.NotImplementedException(); diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 3a80ea14..c93bdcdf 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -404,6 +404,12 @@ namespace CppSharp.Generators.CLI return @enum.Name; } + public string VisitEnumItemDecl(Enumeration.Item item) + { + return string.Format("{0}::{1}", + VisitEnumDecl((Enumeration) item.Namespace), VisitDeclaration(item)); + } + public string VisitVariableDecl(Variable variable) { throw new NotImplementedException(); diff --git a/src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs b/src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs index 3800c909..5a428799 100644 --- a/src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs @@ -5,33 +5,22 @@ using Type = CppSharp.AST.Type; namespace CppSharp.Generators.CSharp { - public class CSharpExpressionPrinterResult - { - public string Value; - - public override string ToString() - { - return Value; - } - } - public static class CSharpExpressionPrinterExtensions { - public static CSharpExpressionPrinterResult CSharpValue(this Expression value, CSharpExpressionPrinter printer) + public static string CSharpValue(this Expression value, CSharpExpressionPrinter printer) { return value.Visit(printer); } - } - public class CSharpExpressionPrinter : IExpressionPrinter + public class CSharpExpressionPrinter : IExpressionPrinter { public CSharpExpressionPrinter(CSharpTypePrinter typePrinter) { this.typePrinter = typePrinter; } - public CSharpExpressionPrinterResult VisitExpression(Expression expr) + public string VisitExpression(Expression expr) { switch (expr.Class) { @@ -40,32 +29,26 @@ namespace CppSharp.Generators.CSharp switch (callExpr.Declaration.GenerationKind) { case GenerationKind.Generate: - return new CSharpExpressionPrinterResult - { - Value = string.Format("{0}.{1}({2})", - typePrinter.VisitDeclaration(callExpr.Declaration.Namespace), - callExpr.Declaration.Name, - string.Join(", ", callExpr.Arguments.Select(VisitExpression))) - }; + return string.Format("{0}.{1}({2})", + typePrinter.VisitDeclaration(callExpr.Declaration.Namespace), + callExpr.Declaration.Name, + string.Join(", ", callExpr.Arguments.Select(VisitExpression))); case GenerationKind.Internal: // a non-ctor can only be internal if it's been converted to a property var property = ((Class) callExpr.Declaration.Namespace).Properties.First( p => p.GetMethod == callExpr.Declaration); - return new CSharpExpressionPrinterResult - { - Value = string.Format("{0}.{1}", - typePrinter.VisitDeclaration(callExpr.Declaration.Namespace), - property.Name) - }; + return string.Format("{0}.{1}", + typePrinter.VisitDeclaration(callExpr.Declaration.Namespace), + property.Name); default: - return new CSharpExpressionPrinterResult { Value = expr.String }; + return expr.String; } case StatementClass.DeclarationReference: - if (expr.Declaration is Variable) - return new CSharpExpressionPrinterResult { Value = expr.Declaration.Name }; + if (expr.Declaration is Variable || expr.Declaration is Enumeration.Item) + return expr.Declaration.Visit(typePrinter).Type; goto default; default: - return new CSharpExpressionPrinterResult { Value = expr.String }; + return expr.String; } } diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 428b7a03..560c2463 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -2242,7 +2242,7 @@ namespace CppSharp.Generators.CSharp string.Join(", ", method.Parameters.Where( p => p.Kind == ParameterKind.Regular).Select( - p => p.Ignore ? ExpressionPrinter.VisitExpression(p.DefaultArgument).Value : p.Name))); + p => p.Ignore ? ExpressionPrinter.VisitExpression(p.DefaultArgument) : p.Name))); } if (method.IsPure) @@ -2328,7 +2328,7 @@ namespace CppSharp.Generators.CSharp return p.Type.IsPointerToPrimitiveType() && p.Usage == ParameterUsage.InOut && p.HasDefaultValue ? "ref param" + index++ : (( p.Type.TryGetClass(out @class) && @class.IsInterface) ? "param" + index++ - : ExpressionPrinter.VisitExpression(p.DefaultArgument).Value); + : ExpressionPrinter.VisitExpression(p.DefaultArgument)); } private void GenerateOverloadCall(Function function) @@ -2351,7 +2351,7 @@ namespace CppSharp.Generators.CSharp parameter.HasDefaultValue) { WriteLine("var param{0} = ({1}) {2};", j++, @class.OriginalClass.OriginalName, - ExpressionPrinter.VisitExpression(parameter.DefaultArgument).Value); + ExpressionPrinter.VisitExpression(parameter.DefaultArgument)); } } diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index dcf88132..fc737e5f 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -642,6 +642,11 @@ namespace CppSharp.Generators.CSharp return GetNestedQualifiedName(@enum); } + public CSharpTypePrinterResult VisitEnumItemDecl(Enumeration.Item item) + { + return VisitDeclaration(item); + } + public string GetNestedQualifiedName(Declaration decl) { var names = new List(); @@ -688,7 +693,7 @@ namespace CppSharp.Generators.CSharp public CSharpTypePrinterResult VisitVariableDecl(Variable variable) { - throw new NotImplementedException(); + return variable.Name; } public CSharpTypePrinterResult VisitClassTemplateDecl(ClassTemplate template) diff --git a/src/Generator/Passes/CheckVirtualOverrideReturnCovariance.cs b/src/Generator/Passes/CheckVirtualOverrideReturnCovariance.cs index 23fa80ca..ed901f58 100644 --- a/src/Generator/Passes/CheckVirtualOverrideReturnCovariance.cs +++ b/src/Generator/Passes/CheckVirtualOverrideReturnCovariance.cs @@ -218,6 +218,11 @@ namespace CppSharp.Passes return false; } + public bool VisitEnumItemDecl(Enumeration.Item item) + { + return false; + } + public bool VisitVariableDecl(Variable variable) { return false; diff --git a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs index bd86a7f6..c714e5e8 100644 --- a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs +++ b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs @@ -150,9 +150,9 @@ namespace CppSharp.Passes return true; } - public override bool VisitEnumItem(Enumeration.Item item) + public override bool VisitEnumItemDecl(Enumeration.Item item) { - if (!base.VisitEnumItem(item)) + if (!base.VisitEnumItemDecl(item)) return false; item.Name = CheckName(item.Name); diff --git a/src/Generator/Passes/HandleDefaultParamValuesPass.cs b/src/Generator/Passes/HandleDefaultParamValuesPass.cs index b904e29f..77d54026 100644 --- a/src/Generator/Passes/HandleDefaultParamValuesPass.cs +++ b/src/Generator/Passes/HandleDefaultParamValuesPass.cs @@ -245,10 +245,19 @@ namespace CppSharp.Passes var enumItem = statement.Declaration as Enumeration.Item; if (enumItem != null) { - result = string.Format("{0}{1}.{2}", - desugared.IsPrimitiveType() ? "(int) " : string.Empty, - new CSharpTypePrinter(Driver).VisitEnumDecl( - (Enumeration) enumItem.Namespace), enumItem.Name); + if (desugared.IsPrimitiveType()) + { + statement.Declaration = null; + result = string.Format("(int) {0}.{1}", + new CSharpTypePrinter(Driver).VisitEnumDecl( + (Enumeration) enumItem.Namespace), enumItem.Name); + } + else + { + result = string.Format("{0}.{1}", + new CSharpTypePrinter(Driver).VisitEnumDecl( + (Enumeration) enumItem.Namespace), enumItem.Name); + } return true; } diff --git a/src/Generator/Passes/RenamePass.cs b/src/Generator/Passes/RenamePass.cs index 6e1004b5..1ec5d1ad 100644 --- a/src/Generator/Passes/RenamePass.cs +++ b/src/Generator/Passes/RenamePass.cs @@ -158,7 +158,7 @@ namespace CppSharp.Passes f => !f.Ignore && f.Parameters.SequenceEqual(function.Parameters, new ParameterComparer())); } - public override bool VisitEnumItem(Enumeration.Item item) + public override bool VisitEnumItemDecl(Enumeration.Item item) { if (!Targets.HasFlag(RenameTargets.EnumItem)) return false; diff --git a/src/Generator/Types/CppTypePrinter.cs b/src/Generator/Types/CppTypePrinter.cs index fc44f250..a7ec3f60 100644 --- a/src/Generator/Types/CppTypePrinter.cs +++ b/src/Generator/Types/CppTypePrinter.cs @@ -321,6 +321,11 @@ namespace CppSharp.Types return VisitDeclaration(@enum); } + public string VisitEnumItemDecl(Enumeration.Item item) + { + return VisitDeclaration(item); + } + public string VisitVariableDecl(Variable variable) { return VisitDeclaration(variable); diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 2a2e451a..e875f887 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -579,6 +579,10 @@ void MethodsWithDefaultValues::defaultWithDirectIntConstant(int arg) { } +void MethodsWithDefaultValues::defaultWithEnumInLowerCasedNameSpace(lowerCaseNameSpace::Enum e) +{ +} + int MethodsWithDefaultValues::getA() { return m_foo.A; diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 5a260083..cd4d11d9 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -345,6 +345,15 @@ public: QRect(QPoint p, QSize s); }; +namespace lowerCaseNameSpace +{ + enum class Enum + { + Item1, + Item2 + }; +} + class DLL_API MethodsWithDefaultValues : public Quux { public: @@ -401,6 +410,7 @@ public: void defaultWithGetPropertyCall(int f = Foo::getGetPropertyCall()); void defaultWithIndirectStringConstant(const Foo& arg = Foo(stringConstant)); void defaultWithDirectIntConstant(int arg = intConstant); + void defaultWithEnumInLowerCasedNameSpace(lowerCaseNameSpace::Enum e = lowerCaseNameSpace::Enum::Item2); int getA(); private: Foo m_foo;