Browse Source

Fixed the generated C# for specialisations only used as type arguments.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1015/head
Dimitar Dobrev 8 years ago
parent
commit
853e82f095
  1. 11
      src/CppParser/Parser.cpp
  2. 5
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 3
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  4. 2
      src/Generator/Passes/TrimSpecializationsPass.cs
  5. 5
      src/Generator/Types/TypeIgnoreChecker.cs
  6. 3
      tests/CSharp/CSharpTemplates.cpp
  7. 8
      tests/CSharp/CSharpTemplates.h

11
src/CppParser/Parser.cpp

@ -1437,15 +1437,14 @@ Parser::WalkTemplateArgument(const clang::TemplateArgument& TA, clang::TemplateA
case clang::TemplateArgument::Type: case clang::TemplateArgument::Type:
{ {
Arg.kind = CppSharp::CppParser::TemplateArgument::ArgumentKind::Type; Arg.kind = CppSharp::CppParser::TemplateArgument::ArgumentKind::Type;
clang::TypeLoc ArgTL;
if (ArgLoc && ArgLoc->getTypeSourceInfo()) if (ArgLoc && ArgLoc->getTypeSourceInfo())
{ {
auto ArgTL = ArgLoc->getTypeSourceInfo()->getTypeLoc(); ArgTL = ArgLoc->getTypeSourceInfo()->getTypeLoc();
Arg.type = GetQualifiedType(TA.getAsType(), &ArgTL);
}
else
{
Arg.type = GetQualifiedType(TA.getAsType());
} }
auto Type = TA.getAsType();
CompleteIfSpecializationType(Type);
Arg.type = GetQualifiedType(Type, &ArgTL);
break; break;
} }
case clang::TemplateArgument::Declaration: case clang::TemplateArgument::Declaration:

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

@ -295,9 +295,8 @@ namespace CppSharp.Generators.CSharp
private IEnumerable<ClassTemplateSpecialization> GetGenerated( private IEnumerable<ClassTemplateSpecialization> GetGenerated(
IList<ClassTemplateSpecialization> specializations) IList<ClassTemplateSpecialization> specializations)
{ {
var specialization = specializations.FirstOrDefault(s => !s.Ignore); var specialization = specializations.FirstOrDefault(s => s.IsGenerated) ??
if (specialization == null) specializations[0];
specialization = specializations[0];
Class classTemplate = specialization.TemplatedDecl.TemplatedClass; Class classTemplate = specialization.TemplatedDecl.TemplatedClass;
if (classTemplate.HasDependentValueFieldInLayout()) if (classTemplate.HasDependentValueFieldInLayout())

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

@ -179,6 +179,9 @@ namespace CppSharp.Generators.CSharp
public static bool IsConstCharString(PointerType pointer) public static bool IsConstCharString(PointerType pointer)
{ {
if (pointer.IsReference)
return false;
var pointee = pointer.Pointee.Desugar(); var pointee = pointer.Pointee.Desugar();
return (pointee.IsPrimitiveType(PrimitiveType.Char) || return (pointee.IsPrimitiveType(PrimitiveType.Char) ||

2
src/Generator/Passes/TrimSpecializationsPass.cs

@ -66,7 +66,6 @@ namespace CppSharp.Passes
Action<ClassTemplateSpecialization> add = Action<ClassTemplateSpecialization> add =
s => s =>
{ {
if (internalSpecializations.Contains(s))
internalSpecializations.Remove(s); internalSpecializations.Remove(s);
specializations.Add(s); specializations.Add(s);
}; };
@ -189,6 +188,7 @@ namespace CppSharp.Passes
var specialization = @base.Class as ClassTemplateSpecialization; var specialization = @base.Class as ClassTemplateSpecialization;
if (specialization != null) if (specialization != null)
{ {
internalSpecializations.Remove(specialization);
specializations.Add(specialization); specializations.Add(specialization);
foreach (var field in specialization.Fields) foreach (var field in specialization.Fields)
field.Visit(this); field.Visit(this);

5
src/Generator/Types/TypeIgnoreChecker.cs

@ -126,10 +126,7 @@ namespace CppSharp
return false; return false;
} }
var result = base.VisitTemplateSpecializationType(template, quals); return IsIgnored = !base.VisitTemplateSpecializationType(template, quals);
if (!result)
Ignore();
return result;
} }
public override bool VisitArrayType(ArrayType array, TypeQualifiers quals) public override bool VisitArrayType(ArrayType array, TypeQualifiers quals)

3
tests/CSharp/CSharpTemplates.cpp

@ -126,7 +126,8 @@ void forceUseSpecializations(IndependentFields<int> _1, IndependentFields<bool>
VirtualTemplate<int> _6, VirtualTemplate<bool> _7, VirtualTemplate<int> _6, VirtualTemplate<bool> _7,
HasDefaultTemplateArgument<int, int> _8, DerivedChangesTypeName<T1> _9, HasDefaultTemplateArgument<int, int> _8, DerivedChangesTypeName<T1> _9,
TemplateWithIndexer<int> _10, TemplateWithIndexer<T1> _11, TemplateWithIndexer<int> _10, TemplateWithIndexer<T1> _11,
TemplateWithIndexer<T2*> _12, TemplateDerivedFromRegularDynamic<RegularDynamic> _13, std::string s) TemplateWithIndexer<T2*> _12, TemplateDerivedFromRegularDynamic<RegularDynamic> _13,
IndependentFields<OnlySpecialisedInTypeArg<double> > _14, std::string s)
{ {
} }

8
tests/CSharp/CSharpTemplates.h

@ -492,6 +492,11 @@ TemplateDerivedFromRegularDynamic<T>::~TemplateDerivedFromRegularDynamic()
{ {
} }
template <typename T>
class OnlySpecialisedInTypeArg
{
};
// we optimise specialisations so that only actually used ones are wrapped // we optimise specialisations so that only actually used ones are wrapped
void forceUseSpecializations(IndependentFields<int> _1, IndependentFields<bool> _2, void forceUseSpecializations(IndependentFields<int> _1, IndependentFields<bool> _2,
IndependentFields<T1> _3, IndependentFields<std::string> _4, IndependentFields<T1> _3, IndependentFields<std::string> _4,
@ -499,7 +504,8 @@ void forceUseSpecializations(IndependentFields<int> _1, IndependentFields<bool>
VirtualTemplate<int> _6, VirtualTemplate<bool> _7, VirtualTemplate<int> _6, VirtualTemplate<bool> _7,
HasDefaultTemplateArgument<int, int> _8, DerivedChangesTypeName<T1> _9, HasDefaultTemplateArgument<int, int> _8, DerivedChangesTypeName<T1> _9,
TemplateWithIndexer<int> _10, TemplateWithIndexer<T1> _11, TemplateWithIndexer<int> _10, TemplateWithIndexer<T1> _11,
TemplateWithIndexer<T2*> _12, TemplateDerivedFromRegularDynamic<RegularDynamic> _13, std::string s); TemplateWithIndexer<T2*> _12, TemplateDerivedFromRegularDynamic<RegularDynamic> _13,
IndependentFields<OnlySpecialisedInTypeArg<double>> _14, std::string s);
DLL_API DependentValueFields<double> specialiseReturnOnly(); DLL_API DependentValueFields<double> specialiseReturnOnly();

Loading…
Cancel
Save