Support templates in function arguments
This commit is contained in:
parent
f2cbbc3a8c
commit
2f750ecc52
@ -644,6 +644,19 @@ void CPPTokeniser_SkipToIndentLevel(CPPTokeniser *tokeniser, int indent_level)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CPPTokeniser_AcceptTokenIfType(CPPTokeniser *tokeniser, CPPTokenType type, CPPToken *token)
|
||||||
|
{
|
||||||
|
CPPToken check = CPPTokeniser_PeekToken(tokeniser);
|
||||||
|
bool result = (check.type == type);
|
||||||
|
if (result && token)
|
||||||
|
{
|
||||||
|
CPPTokeniser_NextToken(tokeniser);
|
||||||
|
*token = check;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// CPP Parsing Helpers
|
// CPP Parsing Helpers
|
||||||
//
|
//
|
||||||
@ -991,7 +1004,7 @@ b32 ParseCPPVariableType(CPPTokeniser *tokeniser, StringLiteral *type)
|
|||||||
if (template_depth == 0)
|
if (template_depth == 0)
|
||||||
{
|
{
|
||||||
char *expr_start = peek_token.str + 1;
|
char *expr_start = peek_token.str + 1;
|
||||||
char *expr_end = token.str - 1;
|
char *expr_end = token.str;
|
||||||
int expr_len = static_cast<int>(expr_end - expr_start);
|
int expr_len = static_cast<int>(expr_end - expr_start);
|
||||||
|
|
||||||
template_expr.str = expr_start;
|
template_expr.str = expr_start;
|
||||||
@ -1041,11 +1054,10 @@ CPPDeclLinkedList<CPPVariableDecl> *ParseCPPTypeAndVariableDecl(CPPTokeniser *to
|
|||||||
CPPToken variable_type = token;
|
CPPToken variable_type = token;
|
||||||
for (int total_asterisks_count = 0;;)
|
for (int total_asterisks_count = 0;;)
|
||||||
{
|
{
|
||||||
CPPToken peek_token = CPPTokeniser_PeekToken(tokeniser);
|
CPPToken peek_token = {};
|
||||||
StringLiteral variable_template_expr = {};
|
StringLiteral variable_template_expr = {};
|
||||||
if (peek_token.type == CPPTokenType::LessThan)
|
if (CPPTokeniser_AcceptTokenIfType(tokeniser, CPPTokenType::LessThan, &peek_token))
|
||||||
{
|
{
|
||||||
token = CPPTokeniser_NextToken(tokeniser);
|
|
||||||
int template_depth = 1;
|
int template_depth = 1;
|
||||||
while (template_depth != 0 && token.type != CPPTokenType::EndOfStream)
|
while (template_depth != 0 && token.type != CPPTokenType::EndOfStream)
|
||||||
{
|
{
|
||||||
@ -1059,7 +1071,7 @@ CPPDeclLinkedList<CPPVariableDecl> *ParseCPPTypeAndVariableDecl(CPPTokeniser *to
|
|||||||
if (template_depth == 0)
|
if (template_depth == 0)
|
||||||
{
|
{
|
||||||
char *expr_start = peek_token.str + 1;
|
char *expr_start = peek_token.str + 1;
|
||||||
char *expr_end = token.str - 1;
|
char *expr_end = token.str;
|
||||||
int expr_len = static_cast<int>(expr_end - expr_start);
|
int expr_len = static_cast<int>(expr_end - expr_start);
|
||||||
|
|
||||||
variable_template_expr.str = expr_start;
|
variable_template_expr.str = expr_start;
|
||||||
@ -1440,13 +1452,19 @@ void ParseCPPInspectPrototype(CPPTokeniser *tokeniser)
|
|||||||
// TODO(doyle): HACK. We should parse ptrs into the CPPVariableDecl, fixed size arrays into the name and const-ness into the type
|
// TODO(doyle): HACK. We should parse ptrs into the CPPVariableDecl, fixed size arrays into the name and const-ness into the type
|
||||||
CPPVariableDecl *decl = ¶m_link->value;
|
CPPVariableDecl *decl = ¶m_link->value;
|
||||||
StringLiteral *type = &decl->type;
|
StringLiteral *type = &decl->type;
|
||||||
StringLiteral *name = &decl->name;
|
char *type_end = (decl->template_expr.len > 0) ? decl->template_expr.str + decl->template_expr.len + 1 // +1 for the ending ">" on the template
|
||||||
|
: type->str + type->len;
|
||||||
|
|
||||||
char *name_start = type->str + (type->len + 1);
|
StringLiteral *name = &decl->name;
|
||||||
|
char *name_start = type_end + 1;
|
||||||
char *name_end = name->str + name->len;
|
char *name_end = name->str + name->len;
|
||||||
auto hack_decl_name = StringLiteral(name_start, static_cast<int>(name_end - name_start));
|
auto hack_decl_name = StringLiteral(name_start, static_cast<int>(name_end - name_start));
|
||||||
|
|
||||||
CPPTokeniser_SprintfToFileNoIndenting(tokeniser, "%.*s %.*s", decl->type.len, decl->type.str, hack_decl_name.len, hack_decl_name.str);
|
CPPTokeniser_SprintfToFileNoIndenting(tokeniser, "%.*s", type->len, type->str);
|
||||||
|
if (decl->template_expr.len > 0)
|
||||||
|
CPPTokeniser_SprintfToFileNoIndenting(tokeniser, "<%.*s>", decl->template_expr.len, decl->template_expr.str);
|
||||||
|
CPPTokeniser_SprintfToFileNoIndenting(tokeniser, " %.*s", hack_decl_name.len, hack_decl_name.str);
|
||||||
|
|
||||||
if (decl->default_value.len > 0)
|
if (decl->default_value.len > 0)
|
||||||
CPPTokeniser_SprintfToFileNoIndenting(tokeniser, " = %.*s", decl->default_value.len, decl->default_value.str);
|
CPPTokeniser_SprintfToFileNoIndenting(tokeniser, " = %.*s", decl->default_value.len, decl->default_value.str);
|
||||||
|
|
||||||
|
@ -40,4 +40,4 @@ DQN_INSPECT_GENERATE_PROTOTYPE()
|
|||||||
void *Function2() { }
|
void *Function2() { }
|
||||||
|
|
||||||
DQN_INSPECT_GENERATE_PROTOTYPE()
|
DQN_INSPECT_GENERATE_PROTOTYPE()
|
||||||
Array<int const *, 3> const *const Function3() { }
|
Array<int const *, 3> const *const Function3(Array<int, 32> const *foobar) { }
|
||||||
|
@ -60,13 +60,13 @@ DqnInspect_StructMember const DqnInspect_SampleStruct_StructMembers[] =
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
STR_AND_LEN("Array"), STR_AND_LEN("lights"),
|
STR_AND_LEN("Array"), STR_AND_LEN("lights"),
|
||||||
STR_AND_LEN("V3, 3"), // template_expr
|
STR_AND_LEN("V3, 32"), // template_expr
|
||||||
nullptr, 0, // metadata and metadata_len
|
nullptr, 0, // metadata and metadata_len
|
||||||
0 // array_dimensions
|
0 // array_dimensions
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
STR_AND_LEN("Array"), STR_AND_LEN("camera_matrixes"),
|
STR_AND_LEN("Array"), STR_AND_LEN("camera_matrixes"),
|
||||||
STR_AND_LEN("V4, 3"), // template_expr
|
STR_AND_LEN("V4, 32"), // template_expr
|
||||||
nullptr, 0, // metadata and metadata_len
|
nullptr, 0, // metadata and metadata_len
|
||||||
0 // array_dimensions
|
0 // array_dimensions
|
||||||
},
|
},
|
||||||
@ -226,7 +226,7 @@ DqnInspect_Struct const *DqnInspect_GetStruct(SampleStruct const *val)
|
|||||||
|
|
||||||
void Function1(int a, float b = {}, char const *c = nullptr, bool e = false, int f = 1, char *g = "Hello world");
|
void Function1(int a, float b = {}, char const *c = nullptr, bool e = false, int f = 1, char *g = "Hello world");
|
||||||
void *Function2();
|
void *Function2();
|
||||||
Array<int const *, 3> const *const Function3();
|
Array<int const *, 3> const *const Function3(Array<int, 32> const *foobar);
|
||||||
|
|
||||||
#endif // DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
#endif // DQN_INSPECT_DQNINSPECT_TESTDATA_H
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user