Browse Source

Generate valid C# for overloads with types nested in templates

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1206/head
Dimitar Dobrev 6 years ago
parent
commit
380d064ca0
  1. 22
      src/Generator/Passes/CheckDuplicatedNamesPass.cs
  2. 4
      tests/CSharp/CSharpTemplates.cpp
  3. 18
      tests/CSharp/CSharpTemplates.h

22
src/Generator/Passes/CheckDuplicatedNamesPass.cs

@ -113,6 +113,9 @@ namespace CppSharp.Passes
if (left.Equals(right)) if (left.Equals(right))
return true; return true;
if (CheckForSpecializations(left, right))
return true;
// TODO: some target languages might make a difference between values and pointers // TODO: some target languages might make a difference between values and pointers
Type leftPointee = left.GetPointee(); Type leftPointee = left.GetPointee();
Type rightPointee = right.GetPointee(); Type rightPointee = right.GetPointee();
@ -131,14 +134,23 @@ namespace CppSharp.Passes
private static bool CheckForSpecializations(Type leftPointee, Type rightPointee) private static bool CheckForSpecializations(Type leftPointee, Type rightPointee)
{ {
ClassTemplateSpecialization leftSpecialization; Class leftClass;
ClassTemplateSpecialization rightSpecialization; Class rightClass;
return leftPointee.TryGetDeclaration(out leftSpecialization) && if (!leftPointee.TryGetDeclaration(out leftClass) ||
rightPointee.TryGetDeclaration(out rightSpecialization) && !rightPointee.TryGetDeclaration(out rightClass))
return false;
var leftSpecialization = leftClass as ClassTemplateSpecialization ??
leftClass.Namespace as ClassTemplateSpecialization;
var rightSpecialization = rightClass as ClassTemplateSpecialization ??
rightClass.Namespace as ClassTemplateSpecialization;
return leftSpecialization != null && rightSpecialization != null &&
leftSpecialization.TemplatedDecl.TemplatedDecl.Equals( leftSpecialization.TemplatedDecl.TemplatedDecl.Equals(
rightSpecialization.TemplatedDecl.TemplatedDecl) && rightSpecialization.TemplatedDecl.TemplatedDecl) &&
leftSpecialization.Arguments.SequenceEqual( leftSpecialization.Arguments.SequenceEqual(
rightSpecialization.Arguments, TemplateArgumentComparer.Instance); rightSpecialization.Arguments, TemplateArgumentComparer.Instance) &&
leftClass.OriginalName == rightClass.OriginalName;
} }
public int GetHashCode(Parameter obj) public int GetHashCode(Parameter obj)

4
tests/CSharp/CSharpTemplates.cpp

@ -122,7 +122,9 @@ void TemplateSpecializer::completeSpecializationInParameter(TwoTemplateArgs<int
TwoTemplateArgs<int *, int> p2, TwoTemplateArgs<int *, int> p2,
TwoTemplateArgs<int *, float> p3, TwoTemplateArgs<int *, float> p3,
TwoTemplateArgs<const char *, int> p4, TwoTemplateArgs<const char *, int> p4,
TwoTemplateArgs<QString, int> p5) TwoTemplateArgs<QString, int> p5,
TwoTemplateArgs<const char *, int>::iterator p6,
TwoTemplateArgs<QString, int>::iterator p7)
{ {
} }

18
tests/CSharp/CSharpTemplates.h

@ -273,12 +273,24 @@ template <typename K, typename V>
class TwoTemplateArgs class TwoTemplateArgs
{ {
public: public:
class iterator
{
public:
iterator() {}
~iterator() {}
};
void takeDependentPtrToFirstTemplateArg(iterator i, const K& k);
void takeDependentPtrToSecondTemplateArg(const V& v); void takeDependentPtrToSecondTemplateArg(const V& v);
private: private:
K key; K key;
V value; V value;
}; };
template <typename K, typename V>
void TwoTemplateArgs<K, V>::takeDependentPtrToFirstTemplateArg(iterator i, const K& k)
{
}
template <typename K, typename V> template <typename K, typename V>
void TwoTemplateArgs<K, V>::takeDependentPtrToSecondTemplateArg(const V& v) void TwoTemplateArgs<K, V>::takeDependentPtrToSecondTemplateArg(const V& v)
{ {
@ -547,7 +559,9 @@ public:
TwoTemplateArgs<int*, int> p2, TwoTemplateArgs<int*, int> p2,
TwoTemplateArgs<int*, float> p3, TwoTemplateArgs<int*, float> p3,
TwoTemplateArgs<const char*, int> p4, TwoTemplateArgs<const char*, int> p4,
TwoTemplateArgs<QString, int> p5); TwoTemplateArgs<QString, int> p5,
TwoTemplateArgs<const char*, int>::iterator p6,
TwoTemplateArgs<QString, int>::iterator p7);
VirtualTemplate<void> returnSpecializedWithVoid(); VirtualTemplate<void> returnSpecializedWithVoid();
private: private:
IndependentFields<int> independentFields; IndependentFields<int> independentFields;
@ -754,6 +768,8 @@ template class DLL_API TemplateWithIndexer<float>;
template class DLL_API TemplateWithIndexer<const char*>; template class DLL_API TemplateWithIndexer<const char*>;
template class DLL_API TemplateDerivedFromRegularDynamic<RegularDynamic>; template class DLL_API TemplateDerivedFromRegularDynamic<RegularDynamic>;
template class DLL_API HasCtorWithMappedToEnum<TestFlag>; template class DLL_API HasCtorWithMappedToEnum<TestFlag>;
template class DLL_API TwoTemplateArgs<const char*, int>;
template class DLL_API TwoTemplateArgs<QString, int>;
class TestForwardedClassInAnotherUnit; class TestForwardedClassInAnotherUnit;

Loading…
Cancel
Save