Browse Source

Properly handled enumeration items in default values of parameters.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/681/head
Dimitar Dobrev 9 years ago
parent
commit
32122a1bba
  1. 4
      src/AST/ASTVisitor.cs
  2. 1
      src/AST/Declaration.cs
  3. 2
      src/AST/Enumeration.cs
  4. 5
      src/Generator.Tests/AST/TestAST.cs
  5. 6
      src/Generator/Generators/CLI/CLITypePrinter.cs
  6. 39
      src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs
  7. 6
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  8. 7
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  9. 5
      src/Generator/Passes/CheckVirtualOverrideReturnCovariance.cs
  10. 4
      src/Generator/Passes/CleanInvalidDeclNamesPass.cs
  11. 13
      src/Generator/Passes/HandleDefaultParamValuesPass.cs
  12. 2
      src/Generator/Passes/RenamePass.cs
  13. 5
      src/Generator/Types/CppTypePrinter.cs
  14. 4
      tests/CSharp/CSharp.cpp
  15. 10
      tests/CSharp/CSharp.h

4
src/AST/ASTVisitor.cs

@ -400,7 +400,7 @@ namespace CppSharp.AST
return false; return false;
foreach (var item in @enum.Items) foreach (var item in @enum.Items)
VisitEnumItem(item); VisitEnumItemDecl(item);
return true; return true;
} }
@ -413,7 +413,7 @@ namespace CppSharp.AST
return variable.Type.Visit(this, variable.QualifiedType.Qualifiers); return variable.Type.Visit(this, variable.QualifiedType.Qualifiers);
} }
public virtual bool VisitEnumItem(Enumeration.Item item) public virtual bool VisitEnumItemDecl(Enumeration.Item item)
{ {
return true; return true;
} }

1
src/AST/Declaration.cs

@ -409,6 +409,7 @@ namespace CppSharp.AST
T VisitTypedefDecl(TypedefDecl typedef); T VisitTypedefDecl(TypedefDecl typedef);
T VisitTypeAliasDecl(TypeAlias typeAlias); T VisitTypeAliasDecl(TypeAlias typeAlias);
T VisitEnumDecl(Enumeration @enum); T VisitEnumDecl(Enumeration @enum);
T VisitEnumItemDecl(Enumeration.Item item);
T VisitVariableDecl(Variable variable); T VisitVariableDecl(Variable variable);
T VisitClassTemplateDecl(ClassTemplate template); T VisitClassTemplateDecl(ClassTemplate template);
T VisitFunctionTemplateDecl(FunctionTemplate template); T VisitFunctionTemplateDecl(FunctionTemplate template);

2
src/AST/Enumeration.cs

@ -39,7 +39,7 @@ namespace CppSharp.AST
public override T Visit<T>(IDeclVisitor<T> visitor) public override T Visit<T>(IDeclVisitor<T> visitor)
{ {
throw new NotImplementedException(); return visitor.VisitEnumItemDecl(this);
} }
} }

5
src/Generator.Tests/AST/TestAST.cs

@ -126,6 +126,11 @@ namespace CppSharp.Generator.Tests.AST
throw new System.NotImplementedException(); throw new System.NotImplementedException();
} }
public bool VisitEnumItemDecl(Enumeration.Item item)
{
throw new NotImplementedException();
}
public bool VisitVariableDecl(Variable variable) public bool VisitVariableDecl(Variable variable)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();

6
src/Generator/Generators/CLI/CLITypePrinter.cs

@ -404,6 +404,12 @@ namespace CppSharp.Generators.CLI
return @enum.Name; 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) public string VisitVariableDecl(Variable variable)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

39
src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs

@ -5,33 +5,22 @@ using Type = CppSharp.AST.Type;
namespace CppSharp.Generators.CSharp namespace CppSharp.Generators.CSharp
{ {
public class CSharpExpressionPrinterResult
{
public string Value;
public override string ToString()
{
return Value;
}
}
public static class CSharpExpressionPrinterExtensions 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); return value.Visit(printer);
} }
} }
public class CSharpExpressionPrinter : IExpressionPrinter<CSharpExpressionPrinterResult> public class CSharpExpressionPrinter : IExpressionPrinter<string>
{ {
public CSharpExpressionPrinter(CSharpTypePrinter typePrinter) public CSharpExpressionPrinter(CSharpTypePrinter typePrinter)
{ {
this.typePrinter = typePrinter; this.typePrinter = typePrinter;
} }
public CSharpExpressionPrinterResult VisitExpression(Expression expr) public string VisitExpression(Expression expr)
{ {
switch (expr.Class) switch (expr.Class)
{ {
@ -40,32 +29,26 @@ namespace CppSharp.Generators.CSharp
switch (callExpr.Declaration.GenerationKind) switch (callExpr.Declaration.GenerationKind)
{ {
case GenerationKind.Generate: case GenerationKind.Generate:
return new CSharpExpressionPrinterResult return string.Format("{0}.{1}({2})",
{
Value = string.Format("{0}.{1}({2})",
typePrinter.VisitDeclaration(callExpr.Declaration.Namespace), typePrinter.VisitDeclaration(callExpr.Declaration.Namespace),
callExpr.Declaration.Name, callExpr.Declaration.Name,
string.Join(", ", callExpr.Arguments.Select(VisitExpression))) string.Join(", ", callExpr.Arguments.Select(VisitExpression)));
};
case GenerationKind.Internal: case GenerationKind.Internal:
// a non-ctor can only be internal if it's been converted to a property // a non-ctor can only be internal if it's been converted to a property
var property = ((Class) callExpr.Declaration.Namespace).Properties.First( var property = ((Class) callExpr.Declaration.Namespace).Properties.First(
p => p.GetMethod == callExpr.Declaration); p => p.GetMethod == callExpr.Declaration);
return new CSharpExpressionPrinterResult return string.Format("{0}.{1}",
{
Value = string.Format("{0}.{1}",
typePrinter.VisitDeclaration(callExpr.Declaration.Namespace), typePrinter.VisitDeclaration(callExpr.Declaration.Namespace),
property.Name) property.Name);
};
default: default:
return new CSharpExpressionPrinterResult { Value = expr.String }; return expr.String;
} }
case StatementClass.DeclarationReference: case StatementClass.DeclarationReference:
if (expr.Declaration is Variable) if (expr.Declaration is Variable || expr.Declaration is Enumeration.Item)
return new CSharpExpressionPrinterResult { Value = expr.Declaration.Name }; return expr.Declaration.Visit(typePrinter).Type;
goto default; goto default;
default: default:
return new CSharpExpressionPrinterResult { Value = expr.String }; return expr.String;
} }
} }

6
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -2242,7 +2242,7 @@ namespace CppSharp.Generators.CSharp
string.Join(", ", string.Join(", ",
method.Parameters.Where( method.Parameters.Where(
p => p.Kind == ParameterKind.Regular).Select( 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) if (method.IsPure)
@ -2328,7 +2328,7 @@ namespace CppSharp.Generators.CSharp
return p.Type.IsPointerToPrimitiveType() && p.Usage == ParameterUsage.InOut && p.HasDefaultValue return p.Type.IsPointerToPrimitiveType() && p.Usage == ParameterUsage.InOut && p.HasDefaultValue
? "ref param" + index++ ? "ref param" + index++
: (( p.Type.TryGetClass(out @class) && @class.IsInterface) ? "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) private void GenerateOverloadCall(Function function)
@ -2351,7 +2351,7 @@ namespace CppSharp.Generators.CSharp
parameter.HasDefaultValue) parameter.HasDefaultValue)
{ {
WriteLine("var param{0} = ({1}) {2};", j++, @class.OriginalClass.OriginalName, WriteLine("var param{0} = ({1}) {2};", j++, @class.OriginalClass.OriginalName,
ExpressionPrinter.VisitExpression(parameter.DefaultArgument).Value); ExpressionPrinter.VisitExpression(parameter.DefaultArgument));
} }
} }

7
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -642,6 +642,11 @@ namespace CppSharp.Generators.CSharp
return GetNestedQualifiedName(@enum); return GetNestedQualifiedName(@enum);
} }
public CSharpTypePrinterResult VisitEnumItemDecl(Enumeration.Item item)
{
return VisitDeclaration(item);
}
public string GetNestedQualifiedName(Declaration decl) public string GetNestedQualifiedName(Declaration decl)
{ {
var names = new List<string>(); var names = new List<string>();
@ -688,7 +693,7 @@ namespace CppSharp.Generators.CSharp
public CSharpTypePrinterResult VisitVariableDecl(Variable variable) public CSharpTypePrinterResult VisitVariableDecl(Variable variable)
{ {
throw new NotImplementedException(); return variable.Name;
} }
public CSharpTypePrinterResult VisitClassTemplateDecl(ClassTemplate template) public CSharpTypePrinterResult VisitClassTemplateDecl(ClassTemplate template)

5
src/Generator/Passes/CheckVirtualOverrideReturnCovariance.cs

@ -218,6 +218,11 @@ namespace CppSharp.Passes
return false; return false;
} }
public bool VisitEnumItemDecl(Enumeration.Item item)
{
return false;
}
public bool VisitVariableDecl(Variable variable) public bool VisitVariableDecl(Variable variable)
{ {
return false; return false;

4
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

@ -150,9 +150,9 @@ namespace CppSharp.Passes
return true; 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; return false;
item.Name = CheckName(item.Name); item.Name = CheckName(item.Name);

13
src/Generator/Passes/HandleDefaultParamValuesPass.cs

@ -245,10 +245,19 @@ namespace CppSharp.Passes
var enumItem = statement.Declaration as Enumeration.Item; var enumItem = statement.Declaration as Enumeration.Item;
if (enumItem != null) if (enumItem != null)
{ {
result = string.Format("{0}{1}.{2}", if (desugared.IsPrimitiveType())
desugared.IsPrimitiveType() ? "(int) " : string.Empty, {
statement.Declaration = null;
result = string.Format("(int) {0}.{1}",
new CSharpTypePrinter(Driver).VisitEnumDecl( new CSharpTypePrinter(Driver).VisitEnumDecl(
(Enumeration) enumItem.Namespace), enumItem.Name); (Enumeration) enumItem.Namespace), enumItem.Name);
}
else
{
result = string.Format("{0}.{1}",
new CSharpTypePrinter(Driver).VisitEnumDecl(
(Enumeration) enumItem.Namespace), enumItem.Name);
}
return true; return true;
} }

2
src/Generator/Passes/RenamePass.cs

@ -158,7 +158,7 @@ namespace CppSharp.Passes
f => !f.Ignore && f.Parameters.SequenceEqual(function.Parameters, new ParameterComparer())); 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)) if (!Targets.HasFlag(RenameTargets.EnumItem))
return false; return false;

5
src/Generator/Types/CppTypePrinter.cs

@ -321,6 +321,11 @@ namespace CppSharp.Types
return VisitDeclaration(@enum); return VisitDeclaration(@enum);
} }
public string VisitEnumItemDecl(Enumeration.Item item)
{
return VisitDeclaration(item);
}
public string VisitVariableDecl(Variable variable) public string VisitVariableDecl(Variable variable)
{ {
return VisitDeclaration(variable); return VisitDeclaration(variable);

4
tests/CSharp/CSharp.cpp

@ -579,6 +579,10 @@ void MethodsWithDefaultValues::defaultWithDirectIntConstant(int arg)
{ {
} }
void MethodsWithDefaultValues::defaultWithEnumInLowerCasedNameSpace(lowerCaseNameSpace::Enum e)
{
}
int MethodsWithDefaultValues::getA() int MethodsWithDefaultValues::getA()
{ {
return m_foo.A; return m_foo.A;

10
tests/CSharp/CSharp.h

@ -345,6 +345,15 @@ public:
QRect(QPoint p, QSize s); QRect(QPoint p, QSize s);
}; };
namespace lowerCaseNameSpace
{
enum class Enum
{
Item1,
Item2
};
}
class DLL_API MethodsWithDefaultValues : public Quux class DLL_API MethodsWithDefaultValues : public Quux
{ {
public: public:
@ -401,6 +410,7 @@ public:
void defaultWithGetPropertyCall(int f = Foo::getGetPropertyCall()); void defaultWithGetPropertyCall(int f = Foo::getGetPropertyCall());
void defaultWithIndirectStringConstant(const Foo& arg = Foo(stringConstant)); void defaultWithIndirectStringConstant(const Foo& arg = Foo(stringConstant));
void defaultWithDirectIntConstant(int arg = intConstant); void defaultWithDirectIntConstant(int arg = intConstant);
void defaultWithEnumInLowerCasedNameSpace(lowerCaseNameSpace::Enum e = lowerCaseNameSpace::Enum::Item2);
int getA(); int getA();
private: private:
Foo m_foo; Foo m_foo;

Loading…
Cancel
Save