Browse Source

Generated properties from setters returning Booleans.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/917/head
Dimitar Dobrev 8 years ago
parent
commit
973fdafdfe
  1. 3
      src/Generator/Generators/CLI/CLISources.cs
  2. 49
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 5
      src/Generator/Passes/GetterSetterToPropertyPass.cs
  4. 6
      tests/Common/Common.Tests.cs
  5. 37
      tests/Common/Common.cpp
  6. 11
      tests/Common/Common.h

3
src/Generator/Generators/CLI/CLISources.cs

@ -372,7 +372,8 @@ namespace CppSharp.Generators.CLI
if (decl is Function && !isIndexer) if (decl is Function && !isIndexer)
{ {
var func = decl as Function; var func = decl as Function;
GenerateFunctionCall(func, @class); var @void = new BuiltinType(PrimitiveType.Void);
GenerateFunctionCall(func, @class, @void);
} }
else else
{ {

49
src/Generator/Generators/CSharp/CSharpSources.cs

@ -817,15 +817,17 @@ namespace CppSharp.Generators.CSharp
param.Name = "&" + param.Name; param.Name = "&" + param.Name;
var parameters = new List<Parameter> { param }; var parameters = new List<Parameter> { param };
var @void = new QualifiedType(new BuiltinType(PrimitiveType.Void));
if (property.SetMethod.SynthKind == FunctionSynthKind.AbstractImplCall) if (property.SetMethod.SynthKind == FunctionSynthKind.AbstractImplCall)
GenerateVirtualPropertyCall(property.SetMethod, @class.BaseClass, GenerateVirtualPropertyCall(property.SetMethod, @class.BaseClass,
property, parameters); property, parameters, @void);
else if (property.SetMethod.IsVirtual) else if (property.SetMethod.IsVirtual)
GenerateVirtualPropertyCall(property.SetMethod, @class, property, parameters); GenerateVirtualPropertyCall(property.SetMethod, @class,
property, parameters, @void);
else if (property.SetMethod.OperatorKind == CXXOperatorKind.Subscript) else if (property.SetMethod.OperatorKind == CXXOperatorKind.Subscript)
GenerateIndexerSetter(property.SetMethod); GenerateIndexerSetter(property.SetMethod);
else else
GenerateInternalFunctionCall(property.SetMethod, parameters); GenerateInternalFunctionCall(property.SetMethod, parameters, @void);
} }
private void GenerateFieldSetter(Field field, Class @class) private void GenerateFieldSetter(Field field, Class @class)
@ -1597,20 +1599,29 @@ namespace CppSharp.Generators.CSharp
} }
} }
var hasReturn = !method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void); bool isVoid = method.OriginalReturnType.Type.Desugar().IsPrimitiveType(
PrimitiveType.Void);
var property = ((Class) method.Namespace).Properties.Find(
p => p.GetMethod == method || p.SetMethod == method);
bool isSetter = property != null && property.SetMethod == method;
var hasReturn = !isVoid && !isSetter;
if (hasReturn) if (hasReturn)
Write("var {0} = ", Helpers.ReturnIdentifier); Write($"var {Helpers.ReturnIdentifier} = ");
if (method.IsGenerated) Write($"{Helpers.TargetIdentifier}.");
string marshalsCode = string.Join(", ", marshals);
if (property == null)
{ {
WriteLine("{0}.{1}({2});", Helpers.TargetIdentifier, Write($"{method.Name}({marshalsCode})");
method.Name, string.Join(", ", marshals));
} }
else else
{ {
InvokeProperty(method, marshals); Write($"{property.Name}");
if (isSetter)
Write($" = {marshalsCode}");
} }
WriteLine(";");
if (hasReturn) if (hasReturn)
{ {
@ -1649,27 +1660,13 @@ namespace CppSharp.Generators.CSharp
} }
} }
if (!isVoid && isSetter)
WriteLine("return false;");
for (var i = 0; i < numBlocks; ++i) for (var i = 0; i < numBlocks; ++i)
WriteCloseBraceIndent(); WriteCloseBraceIndent();
} }
private void InvokeProperty(Declaration method, IEnumerable<string> marshals)
{
var property = ((Class) method.Namespace).Properties.FirstOrDefault(
p => p.GetMethod == method);
if (property == null)
{
property = ((Class) method.Namespace).Properties.First(
p => p.SetMethod == method);
WriteLine("{0}.{1} = {2};", Helpers.TargetIdentifier, property.Name,
string.Join(", ", marshals));
}
else
{
WriteLine("{0}.{1};", Helpers.TargetIdentifier, property.Name);
}
}
private void GenerateVTableMethodDelegates(Class @class, Method method) private void GenerateVTableMethodDelegates(Class @class, Method method)
{ {
PushBlock(BlockKind.VTableDelegate); PushBlock(BlockKind.VTableDelegate);

5
src/Generator/Passes/GetterSetterToPropertyPass.cs

@ -247,7 +247,10 @@ namespace CppSharp.Passes
private void DistributeMethod(Method method) private void DistributeMethod(Method method)
{ {
if (method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void)) Type returnType = method.OriginalReturnType.Type.Desugar();
if ((returnType.IsPrimitiveType(PrimitiveType.Void) ||
returnType.IsPrimitiveType(PrimitiveType.Bool)) &&
method.Parameters.Any(p => p.Kind == ParameterKind.Regular))
{ {
if (method.Parameters.Count == 1) if (method.Parameters.Count == 1)
setters.Add(method); setters.Add(method);

6
tests/Common/Common.Tests.cs

@ -473,6 +473,12 @@ public class CommonTests : GeneratorTestFixture
prop.GetterAndSetterWithTheSameName = 25; prop.GetterAndSetterWithTheSameName = 25;
Assert.That(prop.GetterAndSetterWithTheSameName, Is.EqualTo(25)); Assert.That(prop.GetterAndSetterWithTheSameName, Is.EqualTo(25));
prop.SetterReturnsBoolean = 35;
Assert.That(prop.SetterReturnsBoolean, Is.EqualTo(35));
prop.VirtualSetterReturnsBoolean = 45;
Assert.That(prop.VirtualSetterReturnsBoolean, Is.EqualTo(45));
} }
[Test] [Test]

37
tests/Common/Common.cpp

@ -489,7 +489,8 @@ std::string& HasStdString::getStdString()
return s; return s;
} }
TestProperties::TestProperties() : Field(0), _refToPrimitiveInSetter(0), _getterAndSetterWithTheSameName(0) TestProperties::TestProperties() : Field(0), _refToPrimitiveInSetter(0),
_getterAndSetterWithTheSameName(0), _setterReturnsBoolean(0), _virtualSetterReturnsBoolean(0)
{ {
} }
@ -536,6 +537,30 @@ void TestProperties::set(int value)
{ {
} }
int TestProperties::setterReturnsBoolean()
{
return _setterReturnsBoolean;
}
bool TestProperties::setterReturnsBoolean(int value)
{
bool changed = _setterReturnsBoolean != value;
_setterReturnsBoolean = value;
return changed;
}
int TestProperties::virtualSetterReturnsBoolean()
{
return _virtualSetterReturnsBoolean;
}
bool TestProperties::setVirtualSetterReturnsBoolean(int value)
{
bool changed = _virtualSetterReturnsBoolean != value;
_virtualSetterReturnsBoolean = value;
return changed;
}
HasOverridenSetter::HasOverridenSetter() HasOverridenSetter::HasOverridenSetter()
{ {
} }
@ -544,6 +569,16 @@ void HasOverridenSetter::setVirtual(bool value)
{ {
} }
int HasOverridenSetter::virtualSetterReturnsBoolean()
{
return TestProperties::virtualSetterReturnsBoolean();
}
bool HasOverridenSetter::setVirtualSetterReturnsBoolean(int value)
{
return TestProperties::setVirtualSetterReturnsBoolean(value);
}
TypeMappedIndex::TypeMappedIndex() TypeMappedIndex::TypeMappedIndex()
{ {
} }

11
tests/Common/Common.h

@ -590,10 +590,18 @@ public:
void getterAndSetterWithTheSameName(int value); void getterAndSetterWithTheSameName(int value);
void set(int value); void set(int value);
int setterReturnsBoolean();
bool setterReturnsBoolean(int value);
virtual int virtualSetterReturnsBoolean();
virtual bool setVirtualSetterReturnsBoolean(int value);
private: private:
int FieldValue; int FieldValue;
double _refToPrimitiveInSetter; double _refToPrimitiveInSetter;
int _getterAndSetterWithTheSameName; int _getterAndSetterWithTheSameName;
int _setterReturnsBoolean;
int _virtualSetterReturnsBoolean;
}; };
class DLL_API HasOverridenSetter : public TestProperties class DLL_API HasOverridenSetter : public TestProperties
@ -601,6 +609,9 @@ class DLL_API HasOverridenSetter : public TestProperties
public: public:
HasOverridenSetter(); HasOverridenSetter();
void setVirtual(bool value); void setVirtual(bool value);
int virtualSetterReturnsBoolean() override;
bool setVirtualSetterReturnsBoolean(int value) override;
}; };
class DLL_API TypeMappedIndex class DLL_API TypeMappedIndex

Loading…
Cancel
Save