Browse Source

Fixed the generated C# for subclasses of specialisations used as secondary bases.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1033/head
Dimitar Dobrev 8 years ago
parent
commit
a119bdb3f0
  1. 2
      src/Generator/Generators/CSharp/CSharpSources.cs
  2. 26
      src/Generator/Passes/MultipleInheritancePass.cs
  3. 8
      tests/CSharp/CSharpTemplates.cpp
  4. 10
      tests/CSharp/CSharpTemplates.h

2
src/Generator/Generators/CSharp/CSharpSources.cs

@ -1979,7 +1979,7 @@ namespace CppSharp.Generators.CSharp @@ -1979,7 +1979,7 @@ namespace CppSharp.Generators.CSharp
{
var @base = @class.GetNonIgnoredRootBase();
// Use interfaces if any - derived types with a this class as a seconary base, must be compatible with the map
// Use interfaces if any - derived types with a this class as a secondary base, must be compatible with the map
var @interface = @base.Namespace.Classes.FirstOrDefault(
c => c.IsInterface && c.OriginalClass == @base);

26
src/Generator/Passes/MultipleInheritancePass.cs

@ -30,7 +30,7 @@ namespace CppSharp.Passes @@ -30,7 +30,7 @@ namespace CppSharp.Passes
public override bool VisitTranslationUnit(TranslationUnit unit)
{
bool result = base.VisitTranslationUnit(unit);
foreach (var @interface in interfaces)
foreach (var @interface in interfaces.Where(i => !(i.Key is ClassTemplateSpecialization)))
@interface.Key.Namespace.Classes.Add(@interface.Value);
interfaces.Clear();
return result;
@ -79,11 +79,9 @@ namespace CppSharp.Passes @@ -79,11 +79,9 @@ namespace CppSharp.Passes
else
{
Class template = specialization.TemplatedDecl.TemplatedClass;
Class templatedInterface;
if (templatedInterfaces.ContainsKey(template))
templatedInterface = templatedInterfaces[template];
else
templatedInterfaces[template] = templatedInterface = GetInterface(template);
Class templatedInterface = GetInterface(template);
if (interfaces.ContainsKey(specialization))
return interfaces[specialization];
var specializedInterface = new ClassTemplateSpecialization();
specializedInterface.Arguments.AddRange(specialization.Arguments);
specializedInterface.TemplatedDecl = new ClassTemplate { TemplatedDecl = templatedInterface };
@ -94,11 +92,6 @@ namespace CppSharp.Passes @@ -94,11 +92,6 @@ namespace CppSharp.Passes
@interface.Access = @base.Access;
@interface.Type = ClassType.Interface;
@interface.OriginalClass = @base;
if (@base.IsTemplate)
{
@interface.IsDependent = true;
@interface.TemplateParameters.AddRange(@base.TemplateParameters);
}
@interface.Bases.AddRange(
from b in @base.Bases
@ -157,8 +150,15 @@ namespace CppSharp.Passes @@ -157,8 +150,15 @@ namespace CppSharp.Passes
@base.Bases.Add(new BaseClassSpecifier { Type = new TagType(@interface) });
if (specialization == null)
interfaces.Add(@base, @interface);
interfaces.Add(@base, @interface);
if (@base.IsTemplate)
{
@interface.IsDependent = true;
@interface.TemplateParameters.AddRange(@base.TemplateParameters);
templatedInterfaces[@base] = @interface;
foreach (var spec in @base.Specializations)
GetNewInterface(name, spec);
}
return @interface;
}

8
tests/CSharp/CSharpTemplates.cpp

@ -87,6 +87,14 @@ int HasVirtualTemplate::function() @@ -87,6 +87,14 @@ int HasVirtualTemplate::function()
return v->function();
}
SpecializedInterfaceForMap::SpecializedInterfaceForMap()
{
}
SpecializedInterfaceForMap::~SpecializedInterfaceForMap()
{
}
HasSpecializationForSecondaryBase::HasSpecializationForSecondaryBase()
{
}

10
tests/CSharp/CSharpTemplates.h

@ -432,7 +432,14 @@ private: @@ -432,7 +432,14 @@ private:
HasDefaultTemplateArgument<bool, bool> explicitSpecialization;
};
class DLL_API HasSpecializationForSecondaryBase : T1, DependentValueFields<int>, IndependentFields<int>
class DLL_API SpecializedInterfaceForMap : InternalWithExtension<char>
{
public:
SpecializedInterfaceForMap();
~SpecializedInterfaceForMap();
};
class DLL_API HasSpecializationForSecondaryBase : T1, DependentValueFields<int>, IndependentFields<int>, InternalWithExtension<float>
{
public:
HasSpecializationForSecondaryBase();
@ -593,6 +600,7 @@ template class DLL_API TemplateWithIndexer<int>; @@ -593,6 +600,7 @@ template class DLL_API TemplateWithIndexer<int>;
template class DLL_API TemplateWithIndexer<UsedInTemplatedIndexer>;
template class DLL_API TemplateWithIndexer<T1>;
template class DLL_API TemplateWithIndexer<T2*>;
template class DLL_API TemplateWithIndexer<float>;
template class DLL_API TemplateDerivedFromRegularDynamic<RegularDynamic>;
class TestForwardedClassInAnotherUnit;

Loading…
Cancel
Save