Skip to content

Commit 0661542

Browse files
authored
Merge pull request #14 from CognexVisionSoftware/feature/fix_partial_specialization
Fixed empty specialized template handling
2 parents dc0d821 + 306cc1d commit 0661542

File tree

4 files changed

+32
-13
lines changed

4 files changed

+32
-13
lines changed

changelog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## 0.8.0-alpha-016 (13 Dec 2023)
4+
- Fixed empty template parameter name specialization
5+
36
## 0.8.0-alpha-015 (13 Dec 2023)
47
- Fixed partial template specialization
58

src/CppAst.Tests/TestMisc.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class Vector3d : public VectorBase<T, 3>
112112
Assert.AreEqual(CppTemplateKind.PartialTemplateClass, compilation.Classes[1].TemplateKind);
113113
Assert.AreEqual(1, compilation.Classes[1].TemplateParameters.Count);
114114
Assert.AreEqual("T", compilation.Classes[1].TemplateParameters[0].FullName);
115+
Assert.IsNotNull(compilation.Classes[1].PrimaryTemplate);
115116
Assert.AreEqual(1, compilation.Classes[1].TemplateSpecializedArguments.Count);
116117
Assert.AreEqual(CppTemplateArgumentKind.AsInteger, compilation.Classes[1].TemplateSpecializedArguments[0].ArgKind);
117118
Assert.AreEqual(2, compilation.Classes[1].TemplateSpecializedArguments[0].ArgAsInteger);
@@ -135,6 +136,7 @@ class Vector3d : public VectorBase<T, 3>
135136
Assert.AreEqual(CppTemplateKind.PartialTemplateClass, compilation.Classes[4].TemplateKind);
136137
Assert.AreEqual(1, compilation.Classes[4].TemplateParameters.Count);
137138
Assert.AreEqual("T", compilation.Classes[4].TemplateParameters[0].FullName);
139+
Assert.IsNotNull(compilation.Classes[4].PrimaryTemplate);
138140
Assert.AreEqual(1, compilation.Classes[4].TemplateSpecializedArguments.Count);
139141
Assert.AreEqual(CppTemplateArgumentKind.AsInteger, compilation.Classes[4].TemplateSpecializedArguments[0].ArgKind);
140142
Assert.AreEqual(3, compilation.Classes[4].TemplateSpecializedArguments[0].ArgAsInteger);

src/CppAst/CppAst.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<TargetFrameworks>net6.0</TargetFrameworks>
44
<VersionPrefix>0.8.0</VersionPrefix>
55
<VersionSuffix>alpha</VersionSuffix>
6-
<BuildNumber>015</BuildNumber>
6+
<BuildNumber>016</BuildNumber>
77
<PackageId>CppAst.cgnx</PackageId>
88
<Description>CppAst is a .NET library providing a C/C++ parser for header files with access to the full AST, comments and macros</Description>
99
<Copyright>Alexandre Mutel</Copyright>
@@ -26,7 +26,7 @@
2626
<PublishRepositoryUrl>true</PublishRepositoryUrl>
2727
<IncludeSymbols>true</IncludeSymbols>
2828
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
29-
<Version>0.8.0-alpha-015</Version>
29+
<Version>0.8.0-alpha-016</Version>
3030
</PropertyGroup>
3131

3232
<ItemGroup>

src/CppAst/CppModelBuilder.cs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,16 @@ private void AddTemplateSpecializedArguments(List<CppTemplateArgument> sourceArg
118118
}
119119
else
120120
{
121-
/* This is quite impossible, just to make sure */
122-
if (existingParams.Count() > 1)
121+
/** Don't really know what to do with the case if we have the same template parameter multiple times */
122+
if (existingParams.Count() == 1)
123123
{
124-
throw new InvalidOperationException($"The same template parameter `{p.SourceParam.FullName}` exists more than one times");
125-
}
126-
var existingParam = existingParams[0];
127-
if (!existingParam.IsSpecializedArgument && p.IsSpecializedArgument)
128-
{
129-
/* We need to replace the already existing non-specialized parameter with the new specialized one */
130-
var index = destinationArguments.IndexOf(existingParam);
131-
destinationArguments[index] = p;
124+
var existingParam = existingParams[0];
125+
if (!existingParam.IsSpecializedArgument && p.IsSpecializedArgument)
126+
{
127+
/* We need to replace the already existing non-specialized parameter with the new specialized one */
128+
var index = destinationArguments.IndexOf(existingParam);
129+
destinationArguments[index] = p;
130+
}
132131
}
133132
}
134133
}
@@ -142,6 +141,22 @@ private void UpdateTemplateType(CppClass cppClass)
142141
if (cppClass.TemplateKind == CppTemplateKind.TemplateClass && cppClass.TemplateParameters.Count > 0 && cppClass.TemplateSpecializedArguments.Count > 0)
143142
{
144143
cppClass.TemplateKind = CppTemplateKind.PartialTemplateClass;
144+
/** We need to set the primary template */
145+
if (cppClass.PrimaryTemplate == null && cppClass.BaseTypes.Count > 0)
146+
{
147+
foreach (var b in cppClass.BaseTypes)
148+
{
149+
if (b.Type is CppClass)
150+
{
151+
var clz = b.Type as CppClass;
152+
if (clz.TemplateKind == CppTemplateKind.TemplateClass)
153+
{
154+
cppClass.PrimaryTemplate = clz;
155+
break;
156+
}
157+
}
158+
}
159+
}
145160
}
146161
}
147162

@@ -265,7 +280,6 @@ private CppContainerContext GetOrCreateDeclarationContainer(CXCursor cursor, voi
265280
Debug.Assert(cppClass.PrimaryTemplate.TemplateParameters.Count == tempArgsCount);
266281
}
267282

268-
269283
for (uint i = 0; i < tempArgsCount; i++)
270284
{
271285
var arg = cursor.GetTemplateArgument(i);

0 commit comments

Comments
 (0)