Skip to content

Commit

Permalink
Add function annotations support
Browse files Browse the repository at this point in the history
  • Loading branch information
skozlovf committed Oct 8, 2018
1 parent 36eefaf commit 72c5c25
Showing 1 changed file with 131 additions and 28 deletions.
159 changes: 131 additions & 28 deletions src/pyscanner.l
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ static bool g_start_init = FALSE;
static int g_search_count = 0;

static QCString g_argType = "";
static bool g_funcParamsEnd;
//-----------------------------------------------------------------------------


Expand Down Expand Up @@ -514,6 +515,8 @@ STARTDOCSYMS "##"
%x FunctionDec
%x FunctionParams
%x FunctionBody
%x FunctionAnnotation
%x FunctionTypeAnnotation
%x FunctionParamDefVal
/* Class states */
Expand Down Expand Up @@ -933,7 +936,6 @@ STARTDOCSYMS "##"
}
<FunctionDec>{
{IDENTIFIER} {
//found function name
if (current->type.isEmpty())
Expand All @@ -944,16 +946,26 @@ STARTDOCSYMS "##"
current->name = current->name.stripWhiteSpace();
newFunction();
}
{B}":" { // function without arguments
{B}":"{B} { // function without arguments
g_specialBlock = TRUE; // expecting a docstring
bodyEntry = current;
current->bodyLine = yyLineNr;
BEGIN( FunctionBody );
BEGIN(FunctionBody);
}
"->" {
g_defVal.resize(0);
g_braceCount = 0;
BEGIN(FunctionTypeAnnotation);
}
{B}"(" {
BEGIN( FunctionParams );
g_funcParamsEnd = FALSE;
BEGIN(FunctionParams);
}
")" { // end of parameter list
current->args = argListToString(current->argList);
g_funcParamsEnd = TRUE;
}
}
<FunctionParams>{
Expand All @@ -975,52 +987,143 @@ STARTDOCSYMS "##"
// TODO: this rule is too simple, need to be able to
// match things like =")" as well!
g_defVal.resize(0);
g_braceCount=0;
g_braceCount = 0;
BEGIN(FunctionParamDefVal);
}
")" { // end of parameter list
current->args = argListToString(current->argList);
")" {
unput(*yytext);
BEGIN(FunctionDec);
}
":"{B} {
g_specialBlock = TRUE; // expecting a docstring
bodyEntry = current;
current->bodyLine = yyLineNr;
BEGIN( FunctionBody );
}
g_defVal.resize(0);
g_braceCount = 0;
BEGIN(FunctionAnnotation);
}
{POUNDCOMMENT} { // a comment
}
{PARAMNONEMPTY} { // Default rule inside arguments.
}
}
<FunctionTypeAnnotation>{
"[" |
"(" {
++g_braceCount;
g_defVal+=*yytext;
}
"]" |
")" {
--g_braceCount;
g_defVal+=*yytext;
}
":" {
if (g_braceCount == 0)
{
current->type = g_defVal.data();
unput(*yytext);
BEGIN(FunctionDec);
}
else
g_defVal+=*yytext;
}
"'" {
g_defVal+=*yytext;
g_copyString=&g_defVal;
g_stringContext=FunctionTypeAnnotation;
BEGIN(SingleQuoteString);
}
"\"" {
g_defVal+=*yytext;
g_copyString=&g_defVal;
g_stringContext=FunctionTypeAnnotation;
BEGIN(DoubleQuoteString);
}
\n {
g_defVal+=*yytext;
incLineNr();
}
. {
g_defVal+=*yytext;
}
}

<FunctionAnnotation>{
"[" |
"(" {
++g_braceCount;
g_defVal+=*yytext;
}
"]" {
--g_braceCount;
g_defVal+=*yytext;
}
")" |
"," {
if (g_braceCount == 0)
{
if (current->argList->getLast())
current->argList->getLast()->type += g_defVal.data();
if (*yytext == ')')
unput(*yytext);
BEGIN(FunctionParams);
}
else
{
if (*yytext == ')')
--g_braceCount;
g_defVal += *yytext;
}
}
"'" {
g_defVal+=*yytext;
g_copyString=&g_defVal;
g_stringContext=FunctionAnnotation;
BEGIN(SingleQuoteString);
}
"\"" {
g_defVal+=*yytext;
g_copyString=&g_defVal;
g_stringContext=FunctionAnnotation;
BEGIN(DoubleQuoteString);
}
\n {
g_defVal+=*yytext;
incLineNr();
}
. {
g_defVal+=*yytext;
}
}

<FunctionParamDefVal>{
"[" |
"(" { // internal opening brace, assumption is that we have correct code so braces do match
g_braceCount++;
++g_braceCount;
g_defVal+=*yytext;
}
"," |
"]" |
")" {
if (g_braceCount==0) // end of default argument
"]" {
--g_braceCount;
g_defVal+=*yytext;
}
")" |
"," {
if (g_braceCount == 0)
{
if (current->argList->getLast())
{
current->argList->getLast()->defval=QCString(g_defVal.data()).stripWhiteSpace();
}
if (*yytext != ',')
current->args = argListToString(current->argList);
if (*yytext == ')')
unput(*yytext);
BEGIN(FunctionParams);
}
else // continue
{
if (*yytext != ',')g_braceCount--;
g_defVal+=*yytext;
}
else
{
if (*yytext == ')')
--g_braceCount;
g_defVal += *yytext;
}
}

"'" {
g_defVal+=*yytext;
g_copyString=&g_defVal;
Expand Down

0 comments on commit 72c5c25

Please sign in to comment.