Browse Source

Handled base "setters" overridden in derived types with a getter.

pull/742/head
Dimitar Dobrev 9 years ago
parent
commit
5899f0e0c4
  1. 6
      src/Generator/Passes/GetterSetterToPropertyPass.cs
  2. 11
      tests/CSharp/CSharp.Tests.cs
  3. 30
      tests/CSharp/CSharp.cpp
  4. 19
      tests/CSharp/CSharp.h

6
src/Generator/Passes/GetterSetterToPropertyPass.cs

@ -152,10 +152,6 @@ namespace CppSharp.Passes
if (getter.IsOverride || (setter != null && setter.IsOverride)) if (getter.IsOverride || (setter != null && setter.IsOverride))
{ {
var baseVirtualProperty = type.GetBaseProperty(property, getTopmost: true); var baseVirtualProperty = type.GetBaseProperty(property, getTopmost: true);
if (baseVirtualProperty == null && type.GetBaseMethod(getter, getTopmost: true).IsGenerated)
throw new Exception(string.Format(
"Property {0} has a base property null but its getter has a generated base method.",
getter.QualifiedOriginalName));
if (baseVirtualProperty != null && !baseVirtualProperty.IsVirtual) if (baseVirtualProperty != null && !baseVirtualProperty.IsVirtual)
{ {
// the only way the above can happen is if we are generating properties in abstract implementations // the only way the above can happen is if we are generating properties in abstract implementations
@ -166,7 +162,7 @@ namespace CppSharp.Passes
"Base of property {0} is not virtual while the getter is.", "Base of property {0} is not virtual while the getter is.",
getter.QualifiedOriginalName)); getter.QualifiedOriginalName));
} }
if (baseVirtualProperty != null && baseVirtualProperty.SetMethod == null) if (baseVirtualProperty == null || baseVirtualProperty.SetMethod == null)
setter = null; setter = null;
} }
property.GetMethod = getter; property.GetMethod = getter;

11
tests/CSharp/CSharp.Tests.cs

@ -667,6 +667,17 @@ public unsafe class CSharpTests : GeneratorTestFixture
} }
} }
[Test]
public void TestOverriddenSetterOnly()
{
using (var hasGetterAndOverriddenSetter = new HasGetterAndOverriddenSetter())
{
const int value = 5;
hasGetterAndOverriddenSetter.SetBaseSetter(value);
Assert.That(hasGetterAndOverriddenSetter.BaseSetter, Is.EqualTo(value));
}
}
private class OverrideVirtualWithString : HasVirtualTakesReturnsProblematicTypes private class OverrideVirtualWithString : HasVirtualTakesReturnsProblematicTypes
{ {
public override string VirtualTakesAndReturnsString(string c) public override string VirtualTakesAndReturnsString(string c)

30
tests/CSharp/CSharp.cpp

@ -1266,3 +1266,33 @@ int ImplementsAbstractsFromPrimaryAndSecondary::abstractReturnsFieldInSecondaryB
{ {
return field + 2; return field + 2;
} }
HasBaseSetter::HasBaseSetter()
{
}
HasBaseSetter::~HasBaseSetter()
{
}
void HasBaseSetter::setBaseSetter(int value)
{
}
HasGetterAndOverriddenSetter::HasGetterAndOverriddenSetter()
{
}
HasGetterAndOverriddenSetter::~HasGetterAndOverriddenSetter()
{
}
int HasGetterAndOverriddenSetter::baseSetter()
{
return field;
}
void HasGetterAndOverriddenSetter::setBaseSetter(int value)
{
field = value;
}

19
tests/CSharp/CSharp.h

@ -1123,3 +1123,22 @@ public:
private: private:
int field; int field;
}; };
class DLL_API HasBaseSetter
{
public:
HasBaseSetter();
~HasBaseSetter();
virtual void setBaseSetter(int value);
};
class DLL_API HasGetterAndOverriddenSetter : public HasBaseSetter
{
public:
HasGetterAndOverriddenSetter();
~HasGetterAndOverriddenSetter();
void setBaseSetter(int value);
int baseSetter();
protected:
int field;
};

Loading…
Cancel
Save