Browse Source

Fixed ambiguous code when a nested type and a property-like method with overloads have the same name

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1185/head
Dimitar Dobrev 6 years ago
parent
commit
86a1fbe4da
  1. 5
      src/Generator/Passes/GetterSetterToPropertyPass.cs
  2. 2
      tests/CSharp/CSharp.Tests.cs
  3. 35
      tests/Common/Common.Tests.cs
  4. 10
      tests/Common/Common.cpp
  5. 9
      tests/Common/Common.h

5
src/Generator/Passes/GetterSetterToPropertyPass.cs

@ -38,7 +38,10 @@ namespace CppSharp.Passes
foreach (Method getter in foreach (Method getter in
from getter in getters from getter in getters
where getter.IsGenerated && where getter.IsGenerated &&
getter.SynthKind != FunctionSynthKind.ComplementOperator getter.SynthKind != FunctionSynthKind.ComplementOperator &&
((Class) getter.Namespace).Methods.All(
m => m == getter || !m.IsGenerated || m.Name != getter.Name ||
m.Parameters.Count(p => p.Kind == ParameterKind.Regular) == 0)
select getter) select getter)
{ {
// Make it a read-only property // Make it a read-only property

2
tests/CSharp/CSharp.Tests.cs

@ -1265,6 +1265,6 @@ public unsafe class CSharpTests : GeneratorTestFixture
private class OverrideVirtualTemplate : VirtualTemplate<int> private class OverrideVirtualTemplate : VirtualTemplate<int>
{ {
public override int Function => 10; public override int Function() => 10;
} }
} }

35
tests/Common/Common.Tests.cs

@ -480,25 +480,30 @@ public class CommonTests : GeneratorTestFixture
public void TestProperties() public void TestProperties()
{ {
// Test field property // Test field property
var prop = new TestProperties(); using (var prop = new TestProperties())
Assert.That(prop.Field, Is.EqualTo(0)); {
prop.Field = 10; Assert.That(prop.Field, Is.EqualTo(0));
Assert.That(prop.Field, Is.EqualTo(10)); prop.Field = 10;
Assert.That(prop.Field, Is.EqualTo(10));
// Test getter/setter property
prop.Field = 20;
Assert.That(prop.FieldValue, Is.EqualTo(20));
prop.FieldValue = 10;
Assert.That(prop.FieldValue, Is.EqualTo(10));
// Test getter/setter property prop.GetterAndSetterWithTheSameName = 25;
prop.Field = 20; Assert.That(prop.GetterAndSetterWithTheSameName, Is.EqualTo(25));
Assert.That(prop.FieldValue, Is.EqualTo(20));
prop.FieldValue = 10;
Assert.That(prop.FieldValue, Is.EqualTo(10));
prop.GetterAndSetterWithTheSameName = 25; prop.SetterReturnsBoolean = 35;
Assert.That(prop.GetterAndSetterWithTheSameName, Is.EqualTo(25)); Assert.That(prop.SetterReturnsBoolean, Is.EqualTo(35));
prop.SetterReturnsBoolean = 35; prop.VirtualSetterReturnsBoolean = 45;
Assert.That(prop.SetterReturnsBoolean, Is.EqualTo(35)); Assert.That(prop.VirtualSetterReturnsBoolean, Is.EqualTo(45));
prop.VirtualSetterReturnsBoolean = 45; Assert.That(prop.nestedEnum(), Is.EqualTo(5));
Assert.That(prop.VirtualSetterReturnsBoolean, Is.EqualTo(45)); Assert.That(prop.nestedEnum(55), Is.EqualTo(55));
}
} }
[Test] [Test]

10
tests/Common/Common.cpp

@ -586,6 +586,16 @@ bool TestProperties::setVirtualSetterReturnsBoolean(int value)
return changed; return changed;
} }
int TestProperties::nestedEnum()
{
return 5;
}
int TestProperties::nestedEnum(int i)
{
return i;
}
HasOverridenSetter::HasOverridenSetter() HasOverridenSetter::HasOverridenSetter()
{ {
} }

9
tests/Common/Common.h

@ -578,6 +578,12 @@ DLL_API int Function()
struct DLL_API TestProperties struct DLL_API TestProperties
{ {
public: public:
enum class NestedEnum
{
Value1,
Value2
};
TestProperties(); TestProperties();
int Field; int Field;
@ -600,6 +606,9 @@ public:
virtual int virtualSetterReturnsBoolean(); virtual int virtualSetterReturnsBoolean();
virtual bool setVirtualSetterReturnsBoolean(int value); virtual bool setVirtualSetterReturnsBoolean(int value);
int nestedEnum();
int nestedEnum(int i);
private: private:
int FieldValue; int FieldValue;
double _refToPrimitiveInSetter; double _refToPrimitiveInSetter;

Loading…
Cancel
Save