Skip to content

Commit af2a428

Browse files
Merge pull request #578 from MrJul/fix/template-argument-kind
Fix incorrect template argument kind
2 parents 4c866fb + 74b8873 commit af2a428

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

sources/libClangSharp/ClangSharp.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,38 @@ using namespace clang::cxstring;
2626
using namespace clang::cxtu;
2727
using namespace clang::cxtype;
2828

29+
CXTemplateArgumentKind ConvertTemplateArgumentKind(TemplateArgument::ArgKind kind) {
30+
switch (kind) {
31+
case TemplateArgument::Null:
32+
return CXTemplateArgumentKind_Null;
33+
case TemplateArgument::Type:
34+
return CXTemplateArgumentKind_Type;
35+
case TemplateArgument::Declaration:
36+
return CXTemplateArgumentKind_Declaration;
37+
case TemplateArgument::NullPtr:
38+
return CXTemplateArgumentKind_NullPtr;
39+
case TemplateArgument::Integral:
40+
return CXTemplateArgumentKind_Integral;
41+
case TemplateArgument::StructuralValue:
42+
// Does not exist in CXTemplateArgumentKind
43+
return CXTemplateArgumentKind_Invalid;
44+
case TemplateArgument::Template:
45+
return CXTemplateArgumentKind_Template;
46+
case TemplateArgument::TemplateExpansion:
47+
return CXTemplateArgumentKind_TemplateExpansion;
48+
case TemplateArgument::Expression:
49+
return CXTemplateArgumentKind_Expression;
50+
case TemplateArgument::Pack:
51+
return CXTemplateArgumentKind_Pack;
52+
default:
53+
return CXTemplateArgumentKind_Invalid;
54+
}
55+
}
56+
2957
CX_TemplateArgument MakeCXTemplateArgument(const TemplateArgument* TA, CXTranslationUnit TU, bool needsDispose = false) {
3058
if (TA) {
3159
assert(TU && "Invalid arguments!");
32-
return { static_cast<CXTemplateArgumentKind>(TA->getKind()), (needsDispose ? 1 : 0), TA, TU };
60+
return { ConvertTemplateArgumentKind(TA->getKind()), (needsDispose ? 1 : 0), TA, TU };
3361
}
3462

3563
return { };

tests/ClangSharp.UnitTests/CursorTests/DeclTest.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,27 @@ class MyClass<int, U>
7474
var templateParameter = classTemplatePartialSpecializationDecl.TemplateParameters.Single();
7575
Assert.That(templateParameter.Name, Is.EqualTo("U"));
7676
}
77+
78+
[Test]
79+
[Ignore("TODO: LibClangSharp needs to be recompiled first")]
80+
public void TemplateParameterPackTest()
81+
{
82+
var inputContents = $@"template<class... Types>
83+
class tuple;
84+
85+
tuple<int, long> SomeFunction();
86+
";
87+
88+
using var translationUnit = CreateTranslationUnit(inputContents);
89+
90+
var functionDecl = translationUnit.TranslationUnitDecl.Decls.OfType<FunctionDecl>().Single();
91+
var tupleDecl = functionDecl.ReturnType.AsCXXRecordDecl as ClassTemplateSpecializationDecl;
92+
Assert.That(tupleDecl, Is.Not.Null);
93+
Assert.That(tupleDecl!.TemplateArgs.Count, Is.EqualTo(1));
94+
95+
var packElements = tupleDecl.TemplateArgs[0].PackElements;
96+
Assert.That(packElements.Count, Is.EqualTo(2));
97+
Assert.That(packElements[0].AsType.AsString, Is.EqualTo("int"));
98+
Assert.That(packElements[1].AsType.AsString, Is.EqualTo("long"));
99+
}
77100
}

0 commit comments

Comments
 (0)