Browse Source

CLI generator will use the pointee type for indexed properties which have a setter.

pull/225/head
Elias Holzer 12 years ago
parent
commit
f091c6662a
  1. 13
      src/Generator/Passes/CheckOperatorsOverloads.cs
  2. 4
      tests/Basic/Basic.Tests.cs
  3. 4
      tests/Basic/Basic.h

13
src/Generator/Passes/CheckOperatorsOverloads.cs

@ -100,9 +100,18 @@ namespace CppSharp.Passes
if (!@operator.ReturnType.Qualifiers.IsConst && @operator.ReturnType.Type.IsAddress()) if (!@operator.ReturnType.Qualifiers.IsConst && @operator.ReturnType.Type.IsAddress())
property.SetMethod = @operator; property.SetMethod = @operator;
// C++/CLI uses "default" as the indexer property name.
if (Driver.Options.IsCLIGenerator) if (Driver.Options.IsCLIGenerator)
property.Name = "default"; {
// If we've a setter use the pointee as the type of the property.
var pointerType = property.Type as PointerType;
if (pointerType != null && property.HasSetter)
{
property.QualifiedType = new QualifiedType(pointerType.Pointee, property.QualifiedType.Qualifiers);
property.GetMethod.ReturnType = property.QualifiedType;
}
// C++/CLI uses "default" as the indexer property name.
property.Name = "default";
}
property.Parameters.AddRange(@operator.Parameters); property.Parameters.AddRange(@operator.Parameters);

4
tests/Basic/Basic.Tests.cs

@ -234,7 +234,9 @@ public class BasicTests : GeneratorTestFixture
{ {
var someStruct = new SomeStruct(); var someStruct = new SomeStruct();
Assert.That(someStruct[0], Is.EqualTo(1)); Assert.That(someStruct[0], Is.EqualTo(1));
Assert.That(someStruct["foo"], Is.EqualTo(1)); Assert.That(someStruct["foo"], Is.EqualTo(1));
someStruct[0] = 2;
Assert.That(someStruct[0], Is.EqualTo(2));
} }
[Test] [Test]

4
tests/Basic/Basic.h

@ -315,8 +315,8 @@ typedef unsigned long foo_t;
typedef struct DLL_API SomeStruct typedef struct DLL_API SomeStruct
{ {
SomeStruct() : p(1) {} SomeStruct() : p(1) {}
const foo_t& operator[](int i) const { return p; } foo_t& operator[](int i) { return p; }
foo_t operator[](int i) { return p; } // CSharp backend can't deal with a setter here
foo_t operator[](const char* name) { return p; } foo_t operator[](const char* name) { return p; }
foo_t p; foo_t p;
} }

Loading…
Cancel
Save