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

11
src/Generator/Passes/HandleDefaultParamValuesPass.cs

@ -44,6 +44,8 @@ namespace CppSharp.Passes
continue; continue;
CheckForULongValue(parameter, desugared); CheckForULongValue(parameter, desugared);
CheckForDefaultEmptyChar(parameter, desugared);
} }
GenerateOverloads(function, overloadIndices); GenerateOverloads(function, overloadIndices);
@ -146,6 +148,15 @@ namespace CppSharp.Passes
parameter.DefaultArgument.String = value.ToString(CultureInfo.InvariantCulture); 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) private static void GenerateOverloads(Function function, List<int> overloadIndices)
{ {
foreach (var overloadIndex in overloadIndices) foreach (var overloadIndex in overloadIndices)

1
tests/CSharpTemp/CSharpTemp.Tests.cs

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

8
tests/CSharpTemp/CSharpTemp.cpp

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

2
tests/CSharpTemp/CSharpTemp.h

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

Loading…
Cancel
Save