Browse Source

Generate valid C# when std::string is only used for variables

Fixes https://github.com/mono/CppSharp/issues/1209.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1214/head
Dimitar Dobrev 6 years ago
parent
commit
6e7a23883a
  1. 16
      src/Generator/Passes/TrimSpecializationsPass.cs
  2. 10
      tests/Encodings/Encodings.Tests.cs
  3. 12
      tests/Encodings/Encodings.cpp
  4. 6
      tests/Encodings/Encodings.h

16
src/Generator/Passes/TrimSpecializationsPass.cs

@ -21,7 +21,6 @@ namespace CppSharp.Passes @@ -21,7 +21,6 @@ namespace CppSharp.Passes
VisitOptions.VisitNamespaceEvents = false;
VisitOptions.VisitNamespaceTemplates = false;
VisitOptions.VisitNamespaceTypedefs = false;
VisitOptions.VisitNamespaceVariables = false;
VisitOptions.VisitTemplateArguments = false;
}
@ -92,6 +91,21 @@ namespace CppSharp.Passes @@ -92,6 +91,21 @@ namespace CppSharp.Passes
return true;
}
public override bool VisitVariableDecl(Variable variable)
{
if (!base.VisitVariableDecl(variable))
return false;
if (variable.Access == AccessSpecifier.Public)
{
ASTUtils.CheckTypeForSpecialization(variable.Type,
variable, AddSpecialization, Context.TypeMaps);
return true;
}
return true;
}
private void AddSpecialization(ClassTemplateSpecialization specialization)
{
if (specializations.Contains(specialization))

10
tests/Encodings/Encodings.Tests.cs

@ -7,12 +7,14 @@ public class EncodingsTests : GeneratorTestFixture @@ -7,12 +7,14 @@ public class EncodingsTests : GeneratorTestFixture
[Test]
public void TestFoo()
{
var foo = new Foo();
const string georgia = "საქართველო";
foo.Unicode = georgia;
Assert.That(foo.Unicode, Is.EqualTo(georgia));
Foo.Unicode = georgia;
Assert.That(Foo.Unicode, Is.EqualTo(georgia));
// TODO: move this, it has nothing to do with Unicode, it's here only not to break the CLI branch
Assert.That(foo[0], Is.EqualTo(5));
using (var foo = new Foo())
{
Assert.That(foo[0], Is.EqualTo(5));
}
}
}

12
tests/Encodings/Encodings.cpp

@ -1,5 +1,15 @@ @@ -1,5 +1,15 @@
#include "Encodings.h"
std::string Foo::Unicode = "";
Foo::Foo()
{
}
Foo::~Foo()
{
}
// TODO: move this, it has nothing to do with Unicode, it's here only not to break the CLI branch
int Foo::operator[](int i) const
{
@ -9,4 +19,4 @@ int Foo::operator[](int i) const @@ -9,4 +19,4 @@ int Foo::operator[](int i) const
int Foo::operator[](int i)
{
return 5;
}
}

6
tests/Encodings/Encodings.h

@ -1,9 +1,13 @@ @@ -1,9 +1,13 @@
#include "../Tests.h"
#include <string>
class DLL_API Foo
{
public:
const char* Unicode;
Foo();
~Foo();
static std::string Unicode;
// TODO: VC++ does not support char16
// char16 chr16;

Loading…
Cancel
Save