Browse Source

Generate valid C# with explicit external specializations

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1635/head
Dimitar Dobrev 4 years ago
parent
commit
f5bed3223d
  1. 6
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  2. 2
      tests/NamespacesBase/NamespacesBase.h
  3. 2
      tests/NamespacesDerived/NamespacesDerived.Tests.cs
  4. 5
      tests/NamespacesDerived/NamespacesDerived.cpp
  5. 6
      tests/NamespacesDerived/NamespacesDerived.h

6
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -537,11 +537,11 @@ namespace CppSharp.Generators.CSharp
var names = new Stack<string>(); var names = new Stack<string>();
Declaration ctx; Declaration ctx;
var specialization = decl as ClassTemplateSpecialization; if (decl is ClassTemplateSpecialization specialization)
if (specialization != null && ContextKind == TypePrinterContextKind.Native)
{ {
ctx = specialization.TemplatedDecl.TemplatedClass.Namespace; ctx = specialization.TemplatedDecl.TemplatedClass.Namespace;
if (specialization.OriginalNamespace is Class && if (ContextKind == TypePrinterContextKind.Native &&
specialization.OriginalNamespace is Class &&
!(specialization.OriginalNamespace is ClassTemplateSpecialization)) !(specialization.OriginalNamespace is ClassTemplateSpecialization))
{ {
names.Push(string.Format("{0}_{1}", decl.OriginalNamespace.Name, decl.Name)); names.Push(string.Format("{0}_{1}", decl.OriginalNamespace.Name, decl.Name));

2
tests/NamespacesBase/NamespacesBase.h

@ -76,7 +76,7 @@ void TemplateClass<T>::setField(const T& value)
} }
template <typename T> template <typename T>
class DLL_API TemplateWithIndependentFields class TemplateWithIndependentFields
{ {
public: public:
void useDependentPointer(const T* t); void useDependentPointer(const T* t);

2
tests/NamespacesDerived/NamespacesDerived.Tests.cs

@ -13,6 +13,8 @@ public class NamespaceDerivedTests
public void TestCodeGeneration() public void TestCodeGeneration()
{ {
using (new DerivedFromSecondaryBaseInDependency()) { } using (new DerivedFromSecondaryBaseInDependency()) { }
using (var der2 = new Derived2())
using (der2.ExplicitExternalSpecialization) { }
} }
[Test] [Test]

5
tests/NamespacesDerived/NamespacesDerived.cpp

@ -70,6 +70,11 @@ TemplateClass<int> Derived2::getTemplate()
return t; return t;
} }
TemplateWithIndependentFields<int> Derived2::getExplicitExternalSpecialization()
{
return TemplateWithIndependentFields<int>();
}
Abstract* Derived2::getAbstract() Abstract* Derived2::getAbstract()
{ {
return 0; return 0;

6
tests/NamespacesDerived/NamespacesDerived.h

@ -45,6 +45,11 @@ class Base3
template <typename T> class TemplateClass; template <typename T> class TemplateClass;
template<>
class DLL_API TemplateWithIndependentFields<int>
{
};
class DLL_API Derived2 : public Base3 class DLL_API Derived2 : public Base3
{ {
public: public:
@ -60,6 +65,7 @@ public:
void defaultEnumValueFromDependency(OverlappingNamespace::ColorsEnum c = OverlappingNamespace::ColorsEnum::black); void defaultEnumValueFromDependency(OverlappingNamespace::ColorsEnum c = OverlappingNamespace::ColorsEnum::black);
TemplateClass<int> getTemplate(); TemplateClass<int> getTemplate();
TemplateWithIndependentFields<int> getExplicitExternalSpecialization();
Abstract* getAbstract(); Abstract* getAbstract();
private: private:
TemplateClass<int> t; TemplateClass<int> t;

Loading…
Cancel
Save