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.
206 lines
6.3 KiB
206 lines
6.3 KiB
/**
|
|
* @file align_init_brace.cpp
|
|
*
|
|
* @author Guy Maurel
|
|
* split from align.cpp
|
|
* @author Ben Gardner
|
|
* @license GPL v2+
|
|
*/
|
|
|
|
#include "align_init_brace.h"
|
|
|
|
#include "align_log_al.h"
|
|
#include "align_tab_column.h"
|
|
#include "align_tools.h"
|
|
#include "indent.h"
|
|
#include "log_rules.h"
|
|
|
|
constexpr static auto LCURRENT = LALBR;
|
|
|
|
using namespace uncrustify;
|
|
|
|
|
|
void align_init_brace(Chunk *start)
|
|
{
|
|
LOG_FUNC_ENTRY();
|
|
|
|
Chunk *num_token = Chunk::NullChunkPtr;
|
|
|
|
cpd.al_cnt = 0;
|
|
cpd.al_c99_array = false;
|
|
|
|
LOG_FMT(LALBR, "%s(%d): start @ orig line is %zu, orig col is %zu\n",
|
|
__func__, __LINE__, start->GetOrigLine(), start->GetOrigCol());
|
|
|
|
Chunk *pc = start->GetNextNcNnl();
|
|
Chunk *pcSingle = scan_ib_line(pc);
|
|
|
|
if ( pcSingle->IsNullChunk()
|
|
|| ( pcSingle->Is(CT_BRACE_CLOSE)
|
|
&& pcSingle->GetParentType() == CT_ASSIGN))
|
|
{
|
|
// single line - nothing to do
|
|
LOG_FMT(LALBR, "%s(%d): single line - nothing to do\n", __func__, __LINE__);
|
|
return;
|
|
}
|
|
LOG_FMT(LALBR, "%s(%d): is not a single line\n", __func__, __LINE__);
|
|
|
|
do
|
|
{
|
|
pc = scan_ib_line(pc);
|
|
|
|
// debug dump the current frame
|
|
LOG_FMT(LALBR, "%s(%d): debug dump after, orig line is %zu\n",
|
|
__func__, __LINE__, pc->GetOrigLine());
|
|
align_log_al(LALBR, pc->GetOrigLine());
|
|
|
|
while (pc->IsNewline())
|
|
{
|
|
pc = pc->GetNext();
|
|
}
|
|
} while ( pc->IsNotNullChunk()
|
|
&& pc->GetLevel() > start->GetLevel());
|
|
|
|
// debug dump the current frame
|
|
align_log_al(LALBR, start->GetOrigLine());
|
|
|
|
log_rule_B("align_on_tabstop");
|
|
|
|
if ( options::align_on_tabstop()
|
|
&& cpd.al_cnt >= 1
|
|
&& (cpd.al[0].type == CT_ASSIGN))
|
|
{
|
|
cpd.al[0].col = align_tab_column(cpd.al[0].col);
|
|
}
|
|
pc = start->GetNext();
|
|
size_t idx = 0;
|
|
|
|
do
|
|
{
|
|
Chunk *tmp;
|
|
|
|
if ( idx == 0
|
|
&& ((tmp = skip_c99_array(pc))->IsNotNullChunk()))
|
|
{
|
|
pc = tmp;
|
|
|
|
LOG_FMT(LALBR, " -%zu- skipped '[] =' to %s\n",
|
|
pc->GetOrigLine(), get_token_name(pc->GetType()));
|
|
continue;
|
|
}
|
|
Chunk *next = pc;
|
|
|
|
if (idx < cpd.al_cnt)
|
|
{
|
|
LOG_FMT(LALBR, "%s(%d): (%zu) check %s vs %s -- ??\n",
|
|
__func__, __LINE__, idx, get_token_name(pc->GetType()), get_token_name(cpd.al[idx].type));
|
|
|
|
if (pc->Is(cpd.al[idx].type))
|
|
{
|
|
if ( idx == 0
|
|
&& cpd.al_c99_array)
|
|
{
|
|
Chunk *prev = pc->GetPrev();
|
|
|
|
if (prev->IsNewline())
|
|
{
|
|
pc->SetFlagBits(PCF_DONT_INDENT);
|
|
}
|
|
}
|
|
LOG_FMT(LALBR, "%s(%d): cpd.al[%zu].col is %zu\n",
|
|
__func__, __LINE__, idx, cpd.al[idx].col);
|
|
LOG_FMT(LALBR, "%s(%d): (idx is %zu) check %s vs %s -- [%s] to col %zu\n",
|
|
__func__, __LINE__,
|
|
idx, get_token_name(pc->GetType()), get_token_name(cpd.al[idx].type), pc->Text(), cpd.al[idx].col);
|
|
|
|
if (num_token->IsNotNullChunk())
|
|
{
|
|
int col_diff = pc->GetColumn() - num_token->GetColumn();
|
|
|
|
reindent_line(num_token, cpd.al[idx].col - col_diff);
|
|
//LOG_FMT(LSYS, "-= %zu =- NUM indent [%s] col=%d diff=%d\n",
|
|
// num_token->GetOrigLine(),
|
|
// num_token->Text(), cpd.al[idx - 1].col, col_diff);
|
|
|
|
num_token->SetFlagBits(PCF_WAS_ALIGNED);
|
|
num_token = Chunk::NullChunkPtr;
|
|
}
|
|
|
|
// Comma's need to 'fall back' to the previous token
|
|
if (pc->Is(CT_COMMA))
|
|
{
|
|
next = pc->GetNext();
|
|
|
|
if (!next->IsNewline())
|
|
{
|
|
//LOG_FMT(LSYS, "-= %zu =- indent [%s] col=%d len=%d\n",
|
|
// next->GetOrigLine(),
|
|
// next->Text(), cpd.al[idx].col, cpd.al[idx].len);
|
|
|
|
log_rule_B("align_number_right");
|
|
|
|
if ( (idx < (cpd.al_cnt - 1))
|
|
&& options::align_number_right()
|
|
&& ( next->Is(CT_NUMBER_FP)
|
|
|| next->Is(CT_NUMBER)
|
|
|| next->Is(CT_POS)
|
|
|| next->Is(CT_NEG)))
|
|
{
|
|
// Need to wait until the next match to indent numbers
|
|
num_token = next;
|
|
}
|
|
else if (idx < (cpd.al_cnt - 1))
|
|
{
|
|
LOG_FMT(LALBR, "%s(%d): idx is %zu, al_cnt is %zu, cpd.al[%zu].col is %zu, cpd.al[%zu].len is %zu\n",
|
|
__func__, __LINE__, idx, cpd.al_cnt, idx, cpd.al[idx].col, idx, cpd.al[idx].len);
|
|
reindent_line(next, cpd.al[idx].col + cpd.al[idx].len);
|
|
next->SetFlagBits(PCF_WAS_ALIGNED);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// first item on the line
|
|
LOG_FMT(LALBR, "%s(%d): idx is %zu, cpd.al[%zu].col is %zu\n",
|
|
__func__, __LINE__, idx, idx, cpd.al[idx].col);
|
|
reindent_line(pc, cpd.al[idx].col);
|
|
pc->SetFlagBits(PCF_WAS_ALIGNED);
|
|
|
|
// see if we need to right-align a number
|
|
log_rule_B("align_number_right");
|
|
|
|
if ( (idx < (cpd.al_cnt - 1))
|
|
&& options::align_number_right())
|
|
{
|
|
next = pc->GetNext();
|
|
|
|
if ( !next->IsNewline()
|
|
&& ( next->Is(CT_NUMBER_FP)
|
|
|| next->Is(CT_NUMBER)
|
|
|| next->Is(CT_POS)
|
|
|| next->Is(CT_NEG)))
|
|
{
|
|
// Need to wait until the next match to indent numbers
|
|
num_token = next;
|
|
}
|
|
}
|
|
}
|
|
idx++;
|
|
}
|
|
else
|
|
{
|
|
LOG_FMT(LALBR, "%s(%d): (%zu) check %s vs %s -- no match\n",
|
|
__func__, __LINE__, idx, get_token_name(pc->GetType()), get_token_name(cpd.al[idx].type));
|
|
}
|
|
}
|
|
|
|
if ( pc->IsNewline()
|
|
|| next->IsNewline())
|
|
{
|
|
idx = 0;
|
|
}
|
|
pc = pc->GetNext();
|
|
} while ( pc->IsNotNullChunk()
|
|
&& pc->GetLevel() > start->GetLevel());
|
|
} // align_init_brace
|