Skip to content

Commit 6c26224

Browse files
authored
Merge pull request #52 from assumenothing/master
Add support for variadic function arguments.
2 parents d311fce + a05984b commit 6c26224

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

src/CppAst.Tests/TestFunctions.cs

+40
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,46 @@ public void TestFunctionExport()
215215
);
216216
}
217217

218+
[Test]
219+
public void TestFunctionVariadic()
220+
{
221+
ParseAssert(@"
222+
void function0();
223+
void function1(...);
224+
void function2(int, ...);
225+
",
226+
compilation =>
227+
{
228+
Assert.False(compilation.HasErrors);
229+
230+
Assert.AreEqual(3, compilation.Functions.Count);
231+
232+
{
233+
var cppFunction = compilation.Functions[0];
234+
Assert.AreEqual(0, cppFunction.Parameters.Count);
235+
Assert.AreEqual("void", cppFunction.ReturnType.ToString());
236+
Assert.AreEqual(CppFunctionFlags.None, cppFunction.Flags & CppFunctionFlags.Variadic);
237+
}
238+
239+
{
240+
var cppFunction = compilation.Functions[1];
241+
Assert.AreEqual(0, cppFunction.Parameters.Count);
242+
Assert.AreEqual("void", cppFunction.ReturnType.ToString());
243+
Assert.AreEqual(CppFunctionFlags.Variadic, cppFunction.Flags & CppFunctionFlags.Variadic);
244+
}
245+
246+
{
247+
var cppFunction = compilation.Functions[2];
248+
Assert.AreEqual(1, cppFunction.Parameters.Count);
249+
Assert.AreEqual(string.Empty, cppFunction.Parameters[0].Name);
250+
Assert.AreEqual(CppTypeKind.Primitive, cppFunction.Parameters[0].Type.TypeKind);
251+
Assert.AreEqual(CppPrimitiveKind.Int, ((CppPrimitiveType)cppFunction.Parameters[0].Type).Kind);
252+
Assert.AreEqual("void", cppFunction.ReturnType.ToString());
253+
Assert.AreEqual(CppFunctionFlags.Variadic, cppFunction.Flags & CppFunctionFlags.Variadic);
254+
}
255+
}
256+
);
257+
}
218258

219259
}
220260
}

src/CppAst/CppFunction.cs

+5
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ public override string ToString()
117117
builder.Append(param);
118118
}
119119

120+
if ((Flags & CppFunctionFlags.Variadic) != 0)
121+
{
122+
builder.Append(", ...");
123+
}
124+
120125
builder.Append(")");
121126

122127
if ((Flags & CppFunctionFlags.Const) != 0)

src/CppAst/CppFunctionFlags.cs

+5
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,10 @@ public enum CppFunctionFlags
5656
/// This is a C++ destructor
5757
/// </summary>
5858
Destructor = 1 << 7,
59+
60+
/// <summary>
61+
/// This is a variadic function (has `...` parameter)
62+
/// </summary>
63+
Variadic = 1 << 8,
5964
}
6065
}

src/CppAst/CppModelBuilder.cs

+5
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,11 @@ private CppFunction VisitFunctionDecl(CXCursor cursor, CXCursor parent, void* da
11081108
cppFunction.Flags |= CppFunctionFlags.Inline;
11091109
}
11101110

1111+
if (cursor.IsVariadic)
1112+
{
1113+
cppFunction.Flags |= CppFunctionFlags.Variadic;
1114+
}
1115+
11111116
if (cursor.CXXMethod_IsConst)
11121117
{
11131118
cppFunction.Flags |= CppFunctionFlags.Const;

0 commit comments

Comments
 (0)