eolian: @since no longer needs to be its own paragraph in docs

However, it still terminates the doc.
This commit is contained in:
Daniel Kolesa 2015-08-06 16:53:41 +01:00
parent 79f2576a89
commit aa65c7ef5b
2 changed files with 58 additions and 50 deletions

View File

@ -258,12 +258,12 @@ enum Doc_Tokens {
};
static int
doc_lex(Eo_Lexer *ls, Eina_Bool *term)
doc_lex(Eo_Lexer *ls, Eina_Bool *term, Eina_Bool *since)
{
int tokret = -1;
Eina_Bool contdoc = EINA_FALSE;
eina_strbuf_reset(ls->buff);
for (;; contdoc = EINA_TRUE) switch (ls->current)
*since = EINA_FALSE;
for (;;) switch (ls->current)
{
/* error case */
case '\0':
@ -315,60 +315,36 @@ doc_lex(Eo_Lexer *ls, Eina_Bool *term)
}
eina_strbuf_append_char(ls->buff, ']');
continue;
/* @since case - only when starting a new paragraph */
/* references and @since */
case '@':
if ((size_t)(ls->stream_end - ls->stream) >= (sizeof("since")) &&
!memcmp(ls->stream, "since ", sizeof("since")))
{
next_char(ls);
*since = EINA_TRUE;
for (size_t i = 0; i < sizeof("since"); ++i)
next_char(ls);
skip_ws(ls);
tokret = DOC_TEXT;
goto exit_with_token;
}
eina_strbuf_append_char(ls->buff, '@');
next_char(ls);
if (contdoc)
/* in-class references */
if (ls->tmp.kls && ls->current == '.')
{
/* in-class references */
if (ls->tmp.kls && ls->current == '.')
{
next_char(ls);
if (isalpha(ls->current) || ls->current == '_')
eina_strbuf_append(ls->buff, ls->tmp.kls->full_name);
eina_strbuf_append_char(ls->buff, '.');
continue;
}
continue;
}
while (ls->current && isalpha(ls->current))
{
eina_strbuf_append_char(ls->buff, ls->current);
next_char(ls);
if (isalpha(ls->current) || ls->current == '_')
eina_strbuf_append(ls->buff, ls->tmp.kls->full_name);
eina_strbuf_append_char(ls->buff, '.');
}
if (!strcmp(eina_strbuf_string_get(ls->buff), "@since"))
{
/* since-token */
eina_strbuf_reset(ls->buff);
skip_ws(ls);
while (ls->current && (ls->current == '.' ||
ls->current == '_' ||
isalnum(ls->current)))
{
eina_strbuf_append_char(ls->buff, ls->current);
next_char(ls);
}
if (!eina_strbuf_length_get(ls->buff))
return DOC_UNFINISHED;
tokret = DOC_SINCE;
goto force_terminate;
}
continue;
/* default case - append character */
default:
eina_strbuf_append_char(ls->buff, ls->current);
next_char(ls);
continue;
}
force_terminate:
skip_ws(ls);
while (is_newline(ls->current))
next_line_ws(ls);
if (ls->current == ']')
next_char(ls);
if (ls->current != ']')
return DOC_MANGLED;
terminated:
next_char(ls);
*term = EINA_TRUE;
@ -377,6 +353,31 @@ exit_with_token:
return tokret;
}
static int
read_since(Eo_Lexer *ls)
{
eina_strbuf_reset(ls->buff);
while (ls->current && (ls->current == '.' ||
ls->current == '_' ||
isalnum(ls->current)))
{
eina_strbuf_append_char(ls->buff, ls->current);
next_char(ls);
}
if (!eina_strbuf_length_get(ls->buff))
return DOC_UNFINISHED;
skip_ws(ls);
while (is_newline(ls->current))
next_line_ws(ls);
if (ls->current != ']')
return DOC_MANGLED;
next_char(ls);
if (ls->current != ']')
return DOC_MANGLED;
next_char(ls);
return DOC_SINCE;
}
void doc_error(Eo_Lexer *ls, const char *msg, Eolian_Documentation *doc, Eina_Strbuf *buf)
{
eina_stringshare_del(doc->summary);
@ -396,10 +397,17 @@ read_doc(Eo_Lexer *ls, Eo_Token *tok, int line, int column)
Eina_Strbuf *rbuf = eina_strbuf_new();
Eina_Bool term = EINA_FALSE;
Eina_Bool term = EINA_FALSE, since = EINA_FALSE;
while (!term)
{
int read = doc_lex(ls, &term);
int read;
if (since)
{
read = read_since(ls);
term = EINA_TRUE;
}
else
read = doc_lex(ls, &term, &since);
switch (read)
{
case DOC_MANGLED:
@ -409,6 +417,8 @@ read_doc(Eo_Lexer *ls, Eo_Token *tok, int line, int column)
doc_error(ls, "unfinished documentation", doc, rbuf);
return;
case DOC_TEXT:
if (!eina_strbuf_length_get(ls->buff))
continue;
if (!doc->summary)
doc->summary = eina_stringshare_add(eina_strbuf_string_get(ls->buff));
else

View File

@ -23,9 +23,7 @@ enum Bar {
type Alias: Bar; [[Docs for typedef.
More docs for typedef.
See @Bar.
@since 2.0
See @Bar. @since 2.0
]]
var pants: int = 150; [[Docs for var.]]