📄 asformatter.cpp
字号:
|| currentHeader == &AS_CATCH
|| currentHeader == &AS_FINALLY
|| foundClosingHeader)
{
isPrependPostBlockEmptyLineRequested = false;
}
if (shouldBreakClosingHeaderBlocks
&& isCharImmediatelyPostCloseBlock)
{
isPrependPostBlockEmptyLineRequested = true;
}
}
continue;
}
else if ( (newHeader = findHeader(preDefinitionHeaders)) != NULL)
{
foundPreDefinitionHeader = true;
appendSequence(*newHeader);
goForward(newHeader->length() - 1);
if (shouldBreakBlocks)
isPrependPostBlockEmptyLineRequested = true;
continue;
}
else if ( (newHeader = findHeader(preCommandHeaders)) != NULL)
{
foundPreCommandHeader = true;
appendSequence(*newHeader);
goForward(newHeader->length() - 1);
continue;
}
}
if (previousNonWSChar == '}' || currentChar == ';')
{
if (shouldBreakOneLineStatements && currentChar == ';'
&& (shouldBreakOneLineBlocks || !IS_A(bracketTypeStack->back(), SINGLE_LINE_TYPE)))
{
passedSemicolon = true;
}
if (shouldBreakBlocks && currentHeader != NULL && parenStack->back() == 0)
{
isAppendPostBlockEmptyLineRequested = true;
}
if (currentChar != ';')
currentHeader = NULL; //DEVEL: is this ok?
foundQuestionMark = false;
foundPreDefinitionHeader = false;
foundPreCommandHeader = false;
isInPotentialCalculation = false;
}
if (currentChar == ':'
&& shouldBreakOneLineStatements
&& !foundQuestionMark // not in a ... ? ... : ... sequence
&& !foundPreDefinitionHeader // not in a definition block (e.g. class foo : public bar
&& previousCommandChar != ')' // not immediately after closing paren of a method header, e.g. ASFormatter::ASFormatter(...) : ASBeautifier(...)
&& previousChar != ':' // not part of '::'
&& peekNextChar() != ':') // not part of '::'
{
passedColon = true;
if (shouldBreakBlocks)
isPrependPostBlockEmptyLineRequested = true;
}
if (currentChar == '?')
foundQuestionMark = true;
if (shouldPadOperators)
{
if ((newHeader = findHeader(operators)) != NULL)
{
bool shouldPad = (newHeader != &AS_COLON_COLON
&& newHeader != &AS_PAREN_PAREN
&& newHeader != &AS_BLPAREN_BLPAREN
&& newHeader != &AS_PLUS_PLUS
&& newHeader != &AS_MINUS_MINUS
&& newHeader != &AS_NOT
&& newHeader != &AS_BIT_NOT
&& newHeader != &AS_ARROW
&& newHeader != &AS_OPERATOR
&& !(newHeader == &AS_MINUS && isInExponent())
&& !(newHeader == &AS_PLUS && isInExponent())
&& previousOperator != &AS_OPERATOR
&& !((newHeader == &AS_MULT || newHeader == &AS_BIT_AND)
&& isPointerOrReference())
&& !( (isInTemplate || isCharImmediatelyPostTemplate)
&& (newHeader == &AS_LS || newHeader == &AS_GR))
);
if (!isInPotentialCalculation)
if (find(assignmentOperators.begin(), assignmentOperators.end(), newHeader)
!= assignmentOperators.end())
isInPotentialCalculation = true;
// pad before operator
if (shouldPad
&& !(newHeader == &AS_COLON && !foundQuestionMark)
&& newHeader != &AS_SEMICOLON
&& newHeader != &AS_COMMA)
appendSpacePad();
appendSequence(*newHeader);
goForward(newHeader->length() - 1);
// since this block handles '()' and '[]',
// the parenStack must be updated here accordingly!
if (newHeader == &AS_PAREN_PAREN
|| newHeader == &AS_BLPAREN_BLPAREN)
parenStack->back()--;
currentChar = (*newHeader)[newHeader->length() - 1];
// pad after operator
// but do not pad after a '-' that is a urinary-minus.
if ( shouldPad && !(newHeader == &AS_MINUS && isUrinaryMinus()) )
appendSpacePad();
previousOperator = newHeader;
continue;
}
}
if (shouldPadParenthesies)
{
if (currentChar == '(' || currentChar == '[' )
{
char peekedChar = peekNextChar();
isInPotentialCalculation = true;
appendCurrentChar();
if (!(currentChar == '(' && peekedChar == ')')
&& !(currentChar == '[' && peekedChar == ']'))
appendSpacePad();
continue;
}
else if (currentChar == ')' || currentChar == ']')
{
char peekedChar = peekNextChar();
if (!(previousChar == '(' && currentChar == ')')
&& !(previousChar == '[' && currentChar == ']'))
appendSpacePad();
appendCurrentChar();
if (peekedChar != ';' && peekedChar != ',' && peekedChar != '.'
&& !(currentChar == ']' && peekedChar == '['))
appendSpacePad();
continue;
}
}
appendCurrentChar();
}
// return a beautified (i.e. correctly indented) line.
string beautifiedLine;
int readyFormattedLineLength = trim(readyFormattedLine).length();
if (prependEmptyLine
&& readyFormattedLineLength > 0
&& previousReadyFormattedLineLength > 0)
{
isLineReady = true; // signal that a readyFormattedLine is still waiting
beautifiedLine = beautify("");
}
else
{
isLineReady = false;
beautifiedLine = beautify(readyFormattedLine);
}
prependEmptyLine = false;
previousReadyFormattedLineLength = readyFormattedLineLength;
return beautifiedLine;
}
/**
* check if there are any indented lines ready to be read by nextLine()
*
* @return are there any indented lines ready?
*/
bool ASFormatter::hasMoreLines() const
{
if (!isFormattingEnabled())
return ASBeautifier::hasMoreLines();
else
return !endOfCodeReached;
}
/**
* check if formatting options are enabled, in addition to indentation.
*
* @return are formatting options enabled?
*/
bool ASFormatter::isFormattingEnabled() const
{
return (bracketFormatMode != NONE_MODE
|| shouldPadOperators
|| shouldConvertTabs);
}
/**
* set the bracket formatting mode.
* options:
* astyle::NONE_MODE no formatting of brackets.
* astyle::ATTACH_MODE Java, K&R style bracket placement.
* astyle::BREAK_MODE ANSI C/C++ style bracket placement.
*
* @param mode the bracket formatting mode.
*/
void ASFormatter::setBracketFormatMode(BracketMode mode)
{
bracketFormatMode = mode;
}
/**
* set closing header bracket breaking mode
* options:
* true brackets just before closing headers (e.g. 'else', 'catch')
* will be broken, even if standard brackets are attached.
* false closing header brackets will be treated as standard brackets.
*
* @param mode the closing header bracket breaking mode.
*/
void ASFormatter::setBreakClosingHeaderBracketsMode(bool state)
{
shouldBreakClosingHeaderBrackets = state;
}
/**
* set 'else if()' breaking mode
* options:
* true 'else' headers will be broken from their succeeding 'if' headers.
* false 'else' headers will be attached to their succeeding 'if' headers.
*
* @param mode the 'else if()' breaking mode.
*/
void ASFormatter::setBreakElseIfsMode(bool state)
{
shouldBreakElseIfs = state;
}
/**
* set operator padding mode.
* options:
* true statement operators will be padded with spaces around them.
* false statement operators will not be padded.
*
* @param mode the padding mode.
*/
void ASFormatter::setOperatorPaddingMode(bool state)
{
shouldPadOperators = state;
}
/**
* set parentheies padding mode.
* options:
* true statement parenthesies will be padded with spaces around them.
* false statement parenthesies will not be padded.
*
* @param mode the padding mode.
*/
void ASFormatter::setParenthesisPaddingMode(bool state)
{
shouldPadParenthesies = state;
}
/**
* set option to break/not break one-line blocks
*
* @param state true = break, false = don't break.
*/
void ASFormatter::setBreakOneLineBlocksMode(bool state)
{
shouldBreakOneLineBlocks = state;
}
/**
* set option to break/not break lines consisting of multiple statements.
*
* @param state true = break, false = don't break.
*/
void ASFormatter::setSingleStatementsMode(bool state)
{
shouldBreakOneLineStatements = state;
}
/**
* set option to convert tabs to spaces.
*
* @param state true = convert, false = don't convert.
*/
void ASFormatter::setTabSpaceConversionMode(bool state)
{
shouldConvertTabs = state;
}
/**
* set option to break unrelated blocks of code with empty lines.
*
* @param state true = convert, false = don't convert.
*/
void ASFormatter::setBreakBlocksMode(bool state)
{
shouldBreakBlocks = state;
}
/**
* set option to break closing header blocks of code (such as 'else', 'catch', ...) with empty lines.
*
* @param state true = convert, false = don't convert.
*/
void ASFormatter::setBreakClosingHeaderBlocksMode(bool state)
{
shouldBreakClosingHeaderBlocks = state;
}
/**
* check if a specific sequence exists in the current placement of the current line
*
* @return whether sequence has been reached.
* @param sequence the sequence to be checked
*/
bool ASFormatter::isSequenceReached(const string &sequence) const
{
return currentLine.COMPARE(charNum, sequence.length(), sequence) == 0;
}
/**
* jump over several characters.
*
* @param i the number of characters to jump over.
*/
void ASFormatter::goForward(int i)
{
while (--i >= 0)
getNextChar();
}
/**
* peek at the next unread character.
*
* @return the next unread character.
*/
char ASFormatter::peekNextChar() const
{
int peekNum = charNum + 1;
int len = currentLine.length();
char ch = ' ';
while (peekNum < len)
{
ch = currentLine[peekNum++];
if (!isWhiteSpace(ch))
return ch;
}
if (shouldConvertTabs && ch == '\t')
ch = ' ';
return ch;
}
/**
* check if current placement is before a comment or line-comment
*
* @return is before a comment or line-comment.
*/
bool ASFormatter::isBeforeComment() const
{
int peekNum = charNum + 1;
int len = currentLine.length();
// char ch = ' ';
bool foundComment = false;
for (peekNum = charNum + 1;
peekNum < len && isWhiteSpace(currentLine[peekNum]);
++peekNum)
;
if (peekNum < len)
foundComment = ( currentLine.COMPARE(peekNum, 2, AS_OPEN_COMMENT) == 0
|| currentLine.COMPARE(peekNum, 2, AS_OPEN_LINE_COMMENT) == 0 );
return foundComment;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -