mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-08 16:48:15 +00:00
pre- and post- comment parsing for nodes
This commit is contained in:
@@ -351,6 +351,10 @@ struct MD_Node
|
|||||||
MD_String8 whole_string;
|
MD_String8 whole_string;
|
||||||
MD_u64 string_hash;
|
MD_u64 string_hash;
|
||||||
|
|
||||||
|
// Comments.
|
||||||
|
MD_String8 comment_before;
|
||||||
|
MD_String8 comment_after;
|
||||||
|
|
||||||
// Source code location information.
|
// Source code location information.
|
||||||
MD_String8 filename;
|
MD_String8 filename;
|
||||||
MD_u8 *file_contents;
|
MD_u8 *file_contents;
|
||||||
|
|||||||
+90
-8
@@ -1087,7 +1087,8 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
if (first < one_past_last)
|
if (first < one_past_last)
|
||||||
{
|
{
|
||||||
MD_u8 *at = first;
|
MD_u8 *at = first;
|
||||||
MD_u32 skip_chop_n = 0;
|
MD_u32 skip_n = 0;
|
||||||
|
MD_u32 chop_n = 0;
|
||||||
|
|
||||||
#define MD_TokenizerScan(cond) for (; at < one_past_last && (cond); at += 1)
|
#define MD_TokenizerScan(cond) for (; at < one_past_last && (cond); at += 1)
|
||||||
|
|
||||||
@@ -1114,6 +1115,23 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
{
|
{
|
||||||
if (at[1] == '/')
|
if (at[1] == '/')
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// NOTE(rjf): Trim off the first //, and a space after it if one is there.
|
||||||
|
{
|
||||||
|
if(at+2 < one_past_last &&
|
||||||
|
at[2] == ' ')
|
||||||
|
{
|
||||||
|
skip_n = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
skip_n = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(rjf): Trim off newline always.
|
||||||
|
chop_n = 1;
|
||||||
|
|
||||||
at += 2;
|
at += 2;
|
||||||
token.kind = MD_TokenKind_Comment;
|
token.kind = MD_TokenKind_Comment;
|
||||||
MD_TokenizerScan(*at != '\n');
|
MD_TokenizerScan(*at != '\n');
|
||||||
@@ -1122,6 +1140,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
{
|
{
|
||||||
at += 2;
|
at += 2;
|
||||||
token.kind = MD_TokenKind_Comment;
|
token.kind = MD_TokenKind_Comment;
|
||||||
|
skip_n = chop_n = 2;
|
||||||
int counter = 1;
|
int counter = 1;
|
||||||
for (;at < one_past_last && counter > 0; at += 1)
|
for (;at < one_past_last && counter > 0; at += 1)
|
||||||
{
|
{
|
||||||
@@ -1153,7 +1172,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
token.kind = MD_TokenKind_StringLiteral;
|
token.kind = MD_TokenKind_StringLiteral;
|
||||||
if (at + 2 < one_past_last && at[1] == '`' && at[2] == '`')
|
if (at + 2 < one_past_last && at[1] == '`' && at[2] == '`')
|
||||||
{
|
{
|
||||||
skip_chop_n = 3;
|
skip_n = chop_n = 3;
|
||||||
at += 3;
|
at += 3;
|
||||||
MD_TokenizerScan(!(at + 2 < one_past_last && at[0] == '`' && at[1] == '`' && at[2] == '`'));
|
MD_TokenizerScan(!(at + 2 < one_past_last && at[0] == '`' && at[1] == '`' && at[2] == '`'));
|
||||||
at += 3;
|
at += 3;
|
||||||
@@ -1161,7 +1180,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO(allen): escape sequences?
|
// TODO(allen): escape sequences?
|
||||||
skip_chop_n = 1;
|
skip_n = chop_n = 1;
|
||||||
at += 1;
|
at += 1;
|
||||||
MD_TokenizerScan(*at != '\n' && *at != '`');
|
MD_TokenizerScan(*at != '\n' && *at != '`');
|
||||||
if (*at == '`') at += 1;
|
if (*at == '`') at += 1;
|
||||||
@@ -1174,7 +1193,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
token.kind = MD_TokenKind_StringLiteral;
|
token.kind = MD_TokenKind_StringLiteral;
|
||||||
if (at + 2 < one_past_last && at[1] == '"' && at[2] == '"')
|
if (at + 2 < one_past_last && at[1] == '"' && at[2] == '"')
|
||||||
{
|
{
|
||||||
skip_chop_n = 3;
|
skip_n = chop_n = 3;
|
||||||
at += 3;
|
at += 3;
|
||||||
MD_TokenizerScan(!(at + 2 < one_past_last && at[0] == '"' && at[1] == '"' && at[2] == '"'));
|
MD_TokenizerScan(!(at + 2 < one_past_last && at[0] == '"' && at[1] == '"' && at[2] == '"'));
|
||||||
at += 3;
|
at += 3;
|
||||||
@@ -1182,7 +1201,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// TODO(allen): escape sequences?
|
// TODO(allen): escape sequences?
|
||||||
skip_chop_n = 1;
|
skip_n = chop_n = 1;
|
||||||
at += 1;
|
at += 1;
|
||||||
MD_TokenizerScan(*at != '\n' && *at != '"');
|
MD_TokenizerScan(*at != '\n' && *at != '"');
|
||||||
if (*at == '"') at += 1;
|
if (*at == '"') at += 1;
|
||||||
@@ -1194,7 +1213,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
if (at + 2 < one_past_last && at[1] == '\'' && at[2] == '\'')
|
if (at + 2 < one_past_last && at[1] == '\'' && at[2] == '\'')
|
||||||
{
|
{
|
||||||
token.kind = MD_TokenKind_StringLiteral;
|
token.kind = MD_TokenKind_StringLiteral;
|
||||||
skip_chop_n = 3;
|
skip_n = chop_n = 3;
|
||||||
at += 3;
|
at += 3;
|
||||||
MD_TokenizerScan(!(at + 2 < one_past_last && at[0] == '\'' && at[1] == '\'' && at[2] == '\''));
|
MD_TokenizerScan(!(at + 2 < one_past_last && at[0] == '\'' && at[1] == '\'' && at[2] == '\''));
|
||||||
at += 3;
|
at += 3;
|
||||||
@@ -1203,7 +1222,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
{
|
{
|
||||||
token.kind = MD_TokenKind_CharLiteral;
|
token.kind = MD_TokenKind_CharLiteral;
|
||||||
// TODO(allen): escape sequences?
|
// TODO(allen): escape sequences?
|
||||||
skip_chop_n = 1;
|
skip_n = chop_n = 1;
|
||||||
at += 1;
|
at += 1;
|
||||||
MD_TokenizerScan(*at != '\n' && *at != '\'');
|
MD_TokenizerScan(*at != '\n' && *at != '\'');
|
||||||
if (*at == '\'') at += 1;
|
if (*at == '\'') at += 1;
|
||||||
@@ -1238,7 +1257,7 @@ MD_Parse_LexNext(MD_ParseCtx *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
token.outer_string = MD_S8Range(first, at);
|
token.outer_string = MD_S8Range(first, at);
|
||||||
token.string = MD_StringSubstring(token.outer_string, skip_chop_n, token.outer_string.size - skip_chop_n);
|
token.string = MD_StringSubstring(token.outer_string, skip_n, token.outer_string.size - chop_n);
|
||||||
|
|
||||||
ctx->at = at;
|
ctx->at = at;
|
||||||
}
|
}
|
||||||
@@ -1421,6 +1440,38 @@ _MD_ParseOneNode(MD_ParseCtx *ctx)
|
|||||||
MD_Node *last_tag = 0;
|
MD_Node *last_tag = 0;
|
||||||
_MD_ParseTagList(ctx, &first_tag, &last_tag);
|
_MD_ParseTagList(ctx, &first_tag, &last_tag);
|
||||||
|
|
||||||
|
// NOTE(rjf): Parse the comment preceding this node.
|
||||||
|
MD_String8 comment_before = {0};
|
||||||
|
{
|
||||||
|
MD_Token comment_token = {0};
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
MD_Token token = MD_Parse_PeekSkipSome(ctx, 0);
|
||||||
|
if(token.kind == MD_TokenKind_Comment)
|
||||||
|
{
|
||||||
|
comment_token = token;
|
||||||
|
MD_Parse_Bump(ctx, token);
|
||||||
|
}
|
||||||
|
else if(token.kind == MD_TokenKind_Newline)
|
||||||
|
{
|
||||||
|
MD_Parse_Bump(ctx, token);
|
||||||
|
if(MD_Parse_RequireKind(ctx, MD_TokenKind_Newline, 0))
|
||||||
|
{
|
||||||
|
_MD_MemoryZero(&comment_token, sizeof(comment_token));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(MD_TokenKindIsWhitespace(token.kind))
|
||||||
|
{
|
||||||
|
MD_Parse_Bump(ctx, token);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
comment_before = comment_token.string;
|
||||||
|
}
|
||||||
|
|
||||||
MD_TokenGroups skip_groups = MD_TokenGroup_Whitespace|MD_TokenGroup_Comment;
|
MD_TokenGroups skip_groups = MD_TokenGroup_Whitespace|MD_TokenGroup_Comment;
|
||||||
MD_Token next_token = MD_Parse_PeekSkipSome(ctx, skip_groups);
|
MD_Token next_token = MD_Parse_PeekSkipSome(ctx, skip_groups);
|
||||||
|
|
||||||
@@ -1496,6 +1547,35 @@ _MD_ParseOneNode(MD_ParseCtx *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
end_parse:;
|
end_parse:;
|
||||||
|
|
||||||
|
// NOTE(rjf): Parse comments after nodes.
|
||||||
|
MD_String8 comment_after = {0};
|
||||||
|
{
|
||||||
|
MD_Token comment_token = {0};
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
MD_Token token = MD_Parse_PeekSkipSome(ctx, 0);
|
||||||
|
if(token.kind == MD_TokenKind_Comment)
|
||||||
|
{
|
||||||
|
comment_token = token;
|
||||||
|
MD_Parse_Bump(ctx, token);
|
||||||
|
}
|
||||||
|
else if(token.kind == MD_TokenKind_Newline)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(MD_TokenKindIsWhitespace(token.kind))
|
||||||
|
{
|
||||||
|
MD_Parse_Bump(ctx, token);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
comment_after = comment_token.string;
|
||||||
|
}
|
||||||
|
|
||||||
if(!MD_NodeIsNil(result.node))
|
if(!MD_NodeIsNil(result.node))
|
||||||
{
|
{
|
||||||
result.bytes_parsed = (MD_u64)(ctx->at - at_first);
|
result.bytes_parsed = (MD_u64)(ctx->at - at_first);
|
||||||
@@ -1505,6 +1585,8 @@ _MD_ParseOneNode(MD_ParseCtx *ctx)
|
|||||||
{
|
{
|
||||||
tag->parent = result.node;
|
tag->parent = result.node;
|
||||||
}
|
}
|
||||||
|
result.node->comment_before = comment_before;
|
||||||
|
result.node->comment_after = comment_after;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -399,5 +399,13 @@ int main(void)
|
|||||||
TestResult(match);
|
TestResult(match);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Test("Node Comments")
|
||||||
|
{
|
||||||
|
MD_ParseResult parse = MD_ParseOneNode(MD_S8Lit(""), MD_S8Lit("/*foobar*/ (a b c)"));
|
||||||
|
fprintf(stderr, "\n\"%.*s\"\n", MD_StringExpand(parse.node->comment_before));
|
||||||
|
TestResult(parse.node->kind == MD_NodeKind_Label &&
|
||||||
|
MD_StringMatch(parse.node->comment_before, MD_S8Lit("foobar"), 0));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user