From 6e7a23883a6e4950d39010d1bf596ad4f564a6a8 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Thu, 2 May 2019 00:27:53 +0300 Subject: [PATCH] Generate valid C# when std::string is only used for variables Fixes https://github.com/mono/CppSharp/issues/1209. Signed-off-by: Dimitar Dobrev --- src/Generator/Passes/TrimSpecializationsPass.cs | 16 +++++++++++++++- tests/Encodings/Encodings.Tests.cs | 10 ++++++---- tests/Encodings/Encodings.cpp | 12 +++++++++++- tests/Encodings/Encodings.h | 6 +++++- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/Generator/Passes/TrimSpecializationsPass.cs b/src/Generator/Passes/TrimSpecializationsPass.cs index e27b7a8c..94bac030 100644 --- a/src/Generator/Passes/TrimSpecializationsPass.cs +++ b/src/Generator/Passes/TrimSpecializationsPass.cs @@ -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 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)) diff --git a/tests/Encodings/Encodings.Tests.cs b/tests/Encodings/Encodings.Tests.cs index c4a7b375..3fd35267 100644 --- a/tests/Encodings/Encodings.Tests.cs +++ b/tests/Encodings/Encodings.Tests.cs @@ -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)); + } } } diff --git a/tests/Encodings/Encodings.cpp b/tests/Encodings/Encodings.cpp index c814716a..f1c0fbe2 100644 --- a/tests/Encodings/Encodings.cpp +++ b/tests/Encodings/Encodings.cpp @@ -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 int Foo::operator[](int i) { return 5; -} \ No newline at end of file +} diff --git a/tests/Encodings/Encodings.h b/tests/Encodings/Encodings.h index a7c1391e..3770adca 100644 --- a/tests/Encodings/Encodings.h +++ b/tests/Encodings/Encodings.h @@ -1,9 +1,13 @@ #include "../Tests.h" +#include class DLL_API Foo { public: - const char* Unicode; + Foo(); + ~Foo(); + + static std::string Unicode; // TODO: VC++ does not support char16 // char16 chr16;