You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
4.5 KiB

/**
* @file mark_functor.cpp
*
* @author Guy Maurel
* @license GPL v2+
*/
#include "mark_functor.h"
#include "chunk.h"
/*
* tokenize the functor such as:
* desc->add_options() ( a ) (b)(c);
*/
void mark_functor()
{
LOG_FUNC_ENTRY();
bool found_functor = false;
Chunk *is_it_closing = Chunk::NullChunkPtr;
// Issue #3914
for (Chunk *pc = Chunk::GetHead(); pc->IsNotNullChunk(); pc = pc->GetNextNcNnl())
{
LOG_FMT(LCOMBINE, "%s(%d): orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
if (pc->Is(CT_SEMICOLON))
{
found_functor = false;
continue;
}
if (found_functor)
{
if ( pc->Is(CT_FPAREN_CLOSE)
|| pc->Is(CT_RPAREN_CLOSE))
{
LOG_FMT(LCOMBINE, "%s(%d): FOUND a Closing: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
// desc->add_options() ( a ) (
// ^
pc->SetType(CT_RPAREN_CLOSE);
}
else if ( pc->Is(CT_FPAREN_OPEN)
|| pc->Is(CT_RPAREN_OPEN))
{
LOG_FMT(LCOMBINE, "%s(%d): FOUND a Opening: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
// desc->add_options() ( a ) (
// ^
pc->SetType(CT_RPAREN_OPEN);
}
else // pc->Is(CT_FPAREN_CLOSE) || pc->Is(CT_RPAREN_CLOSE))
{
continue;
}
}
else // (found_functor)
{
if (pc->Is(CT_FPAREN_OPEN))
{
LOG_FMT(LCOMBINE, "%s(%d): FOUND 1 Opening: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, pc->GetOrigLine(), pc->GetOrigCol(), pc->GetLevel(), pc->Text());
is_it_closing = pc->GetPrevNcNnl();
LOG_FMT(LCOMBINE, "%s(%d): FOUND 2 Closing: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, is_it_closing->GetOrigLine(), is_it_closing->GetOrigCol(), is_it_closing->GetLevel(), is_it_closing->Text());
if (is_it_closing->Is(CT_FPAREN_CLOSE))
{
Chunk *opening = is_it_closing->GetOpeningParen();
LOG_FMT(LCOMBINE, "%s(%d): FOUND 3 Opening: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, opening->GetOrigLine(), opening->GetOrigCol(), opening->GetLevel(), opening->Text());
// look for member function
Chunk *is_it_func = opening->GetPrevNcNnl();
LOG_FMT(LCOMBINE, "%s(%d): FOUND 4 func: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, is_it_func->GetOrigLine(), is_it_func->GetOrigCol(), is_it_func->GetLevel(), is_it_func->Text());
Chunk *is_it_member = is_it_func->GetPrevNcNnl(); // CT_MEMBER
LOG_FMT(LCOMBINE, "%s(%d): FOUND 5 func: orig line is %zu, orig col is %zu, level is %zu, Text() '%s'\n",
__func__, __LINE__, is_it_member->GetOrigLine(), is_it_member->GetOrigCol(), is_it_member->GetLevel(), is_it_member->Text());
if (is_it_member->Is(CT_MEMBER))
{
// set parenthesis at the function
// desc->add_options() ( a ) (
// ^
is_it_closing->SetType(CT_RPAREN_CLOSE);
// desc->add_options() ( a ) (
// ^
opening->SetType(CT_RPAREN_OPEN);
// desc->add_options() ( a ) (
// ^
pc->SetType(CT_RPAREN_OPEN);
found_functor = true;
}
else
{
continue;
}
}
else
{
LOG_FMT(LCOMBINE, "%s(%d): NOT useable\n", __func__, __LINE__);
continue;
}
}
else // (pc->Is(CT_FPAREN_OPEN))
{
continue;
} // (pc->Is(CT_FPAREN_OPEN))
} // (found_functor)
}
} // mark_functor