Browse Source

Merge pull request #345 from ddobrev/master

Fixes for default arguments
pull/346/head
João Matos 11 years ago
parent
commit
e789eee792
  1. 29
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  2. 11
      src/Generator/Passes/HandleDefaultParamValuesPass.cs
  3. 1
      tests/CSharpTemp/CSharpTemp.Tests.cs
  4. 8
      tests/CSharpTemp/CSharpTemp.cpp
  5. 2
      tests/CSharpTemp/CSharpTemp.h

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

@ -2072,6 +2072,16 @@ namespace CppSharp.Generators.CSharp @@ -2072,6 +2072,16 @@ namespace CppSharp.Generators.CSharp
Write(")");
if (method.SynthKind == FunctionSynthKind.DefaultValueOverload && method.IsConstructor &&
!(Driver.Options.GenerateAbstractImpls && method.IsPure))
{
Write(" : this({0})",
string.Join(", ",
method.Parameters.Where(
p => p.Kind == ParameterKind.Regular).Select(
p => p.GenerationKind == GenerationKind.None ? p.DefaultArgument.String : p.Name)));
}
if (Driver.Options.GenerateAbstractImpls && method.IsPure)
{
Write(";");
@ -2090,14 +2100,17 @@ namespace CppSharp.Generators.CSharp @@ -2090,14 +2100,17 @@ namespace CppSharp.Generators.CSharp
if (method.SynthKind == FunctionSynthKind.DefaultValueOverload)
{
Type type = method.OriginalReturnType.Type;
WriteLine("{0}{1}({2});",
type.IsPrimitiveType(PrimitiveType.Void) ? string.Empty : "return ",
method.Name,
string.Join(", ",
method.Parameters.Where(
p => p.Kind == ParameterKind.Regular).Select(
p => p.GenerationKind == GenerationKind.None ? p.DefaultArgument.String : p.Name)));
if (!method.IsConstructor)
{
Type type = method.OriginalReturnType.Type;
this.WriteLine("{0}{1}({2});",
type.IsPrimitiveType(PrimitiveType.Void) ? string.Empty : "return ",
method.Name,
string.Join(", ",
method.Parameters.Where(
p => p.Kind == ParameterKind.Regular).Select(
p => p.GenerationKind == GenerationKind.None ? p.DefaultArgument.String : p.Name)));
}
goto SkipImpl;
}

11
src/Generator/Passes/HandleDefaultParamValuesPass.cs

@ -44,6 +44,8 @@ namespace CppSharp.Passes @@ -44,6 +44,8 @@ namespace CppSharp.Passes
continue;
CheckForULongValue(parameter, desugared);
CheckForDefaultEmptyChar(parameter, desugared);
}
GenerateOverloads(function, overloadIndices);
@ -146,6 +148,15 @@ namespace CppSharp.Passes @@ -146,6 +148,15 @@ namespace CppSharp.Passes
parameter.DefaultArgument.String = value.ToString(CultureInfo.InvariantCulture);
}
private void CheckForDefaultEmptyChar(Parameter parameter, Type desugared)
{
if (parameter.DefaultArgument.String == "0" && Driver.Options.MarshalCharAsManagedChar &&
desugared.IsPrimitiveType(PrimitiveType.Char))
{
parameter.DefaultArgument.String = "'\\0'";
}
}
private static void GenerateOverloads(Function function, List<int> overloadIndices)
{
foreach (var overloadIndex in overloadIndices)

1
tests/CSharpTemp/CSharpTemp.Tests.cs

@ -131,6 +131,7 @@ public class CSharpTempTests : GeneratorTestFixture @@ -131,6 +131,7 @@ public class CSharpTempTests : GeneratorTestFixture
{
var methodsWithDefaultValues = new MethodsWithDefaultValues();
methodsWithDefaultValues.DefaultChar();
methodsWithDefaultValues.DefaultEmptyChar();
methodsWithDefaultValues.DefaultPointer();
methodsWithDefaultValues.DefaultRefTypeAfterOthers();
methodsWithDefaultValues.DefaultRefTypeBeforeAndAfterOthers(5, new Foo());

8
tests/CSharpTemp/CSharpTemp.cpp

@ -237,6 +237,10 @@ QGenericArgument::QGenericArgument(const char *name) @@ -237,6 +237,10 @@ QGenericArgument::QGenericArgument(const char *name)
_name = name;
}
MethodsWithDefaultValues::MethodsWithDefaultValues(Foo foo)
{
}
void MethodsWithDefaultValues::defaultPointer(Foo *ptr)
{
}
@ -249,6 +253,10 @@ void MethodsWithDefaultValues::defaultChar(char c) @@ -249,6 +253,10 @@ void MethodsWithDefaultValues::defaultChar(char c)
{
}
void MethodsWithDefaultValues::defaultEmptyChar(char c)
{
}
void MethodsWithDefaultValues::defaultRefTypeBeforeOthers(Foo foo, int i, Bar::Items item)
{
}

2
tests/CSharpTemp/CSharpTemp.h

@ -216,9 +216,11 @@ private: @@ -216,9 +216,11 @@ private:
class DLL_API MethodsWithDefaultValues
{
public:
MethodsWithDefaultValues(Foo foo = Foo());
void defaultPointer(Foo* ptr = 0);
void defaultValueType(ValueType bar = ValueType());
void defaultChar(char c = 'a');
void defaultEmptyChar(char c = 0);
void defaultRefTypeBeforeOthers(Foo foo = Foo(), int i = 5, Bar::Items item = Bar::Item2);
void defaultRefTypeAfterOthers(int i = 5, Bar::Items item = Bar::Item2, Foo foo = Foo());
void defaultRefTypeBeforeAndAfterOthers(int i = 5, Foo foo = Foo(), Bar::Items item = Bar::Item2, Baz baz = Baz());

Loading…
Cancel
Save