📄 asformatter.cpp
字号:
/**
* get the next character, increasing the current placement in the process.
* the new character is inserted into the variable currentChar.
*
* @return whether succeded to recieve the new character.
*/
bool ASFormatter::getNextChar()
{
isInLineBreak = false;
bool isAfterFormattedWhiteSpace = false;
if (shouldPadOperators && !isInComment && !isInLineComment
&& !isInQuote && !doesLineStartComment && !isInPreprocessor
&& !isBeforeComment())
{
int len = formattedLine.length();
if (len > 0 && isWhiteSpace(formattedLine[len-1]))
isAfterFormattedWhiteSpace = true;
}
previousChar = currentChar;
if (!isWhiteSpace(currentChar))
{
previousNonWSChar = currentChar;
if (!isInComment && !isInLineComment && !isInQuote
&& !isSequenceReached(AS_OPEN_COMMENT)
&& !isSequenceReached(AS_OPEN_LINE_COMMENT) )
previousCommandChar = previousNonWSChar;
}
int currentLineLength = currentLine.length();
if (charNum+1 < currentLineLength
&& (!isWhiteSpace(peekNextChar()) || isInComment || isInLineComment))
{
currentChar = currentLine[++charNum];
if (isAfterFormattedWhiteSpace)
while (isWhiteSpace(currentChar) && charNum+1 < currentLineLength)
currentChar = currentLine[++charNum];
if (shouldConvertTabs && currentChar == '\t')
currentChar = ' ';
return true;
}
else
{
if (sourceIterator->hasMoreLines())
{
currentLine = sourceIterator->nextLine();
if (currentLine.length() == 0)
{
/*think*/ currentLine = string(" ");
}
// unless reading in the first line of the file,
// break a new line.
if (!isVirgin)
isInLineBreak = true;
else
isVirgin = false;
if (isInLineComment)
isImmediatelyPostLineComment = true;
isInLineComment = false;
trimNewLine();
currentChar = currentLine[charNum];
// check if is in preprocessor right after the line break and line trimming
if (previousNonWSChar != '\\')
isInPreprocessor = false;
if (shouldConvertTabs && currentChar == '\t')
currentChar = ' ';
return true;
}
else
{
endOfCodeReached = true;
return false;
}
}
}
/**
* jump over the leading white space in the current line,
* IF the line does not begin a comment or is in a preprocessor definition.
*/
void ASFormatter::trimNewLine()
{
int len = currentLine.length();
charNum = 0;
if (isInComment || isInPreprocessor)
return;
while (isWhiteSpace(currentLine[charNum]) && charNum+1 < len)
++charNum;
doesLineStartComment = false;
if (isSequenceReached(string("/*")))
{
charNum = 0;
doesLineStartComment = true;
}
}
/**
* append a character to the current formatted line.
* Unless disabled (via canBreakLine == false), first check if a
* line-break has been registered, and if so break the
* formatted line, and only then append the character into
* the next formatted line.
*
* @param ch the character to append.
* @param canBreakLine if true, a registered line-break
*/
void ASFormatter::appendChar(char ch, bool canBreakLine)
{
if (canBreakLine && isInLineBreak)
breakLine();
formattedLine.append(1, ch);
}
/**
* append the CURRENT character (curentChar)to the current
* formatted line. Unless disabled (via canBreakLine == false),
* first check if a line-break has been registered, and if so
* break the formatted line, and only then append the character
* into the next formatted line.
*
* @param canBreakLine if true, a registered line-break
*/
void ASFormatter::appendCurrentChar(bool canBreakLine)
{
appendChar(currentChar, canBreakLine);
}
/**
* append a string sequence to the current formatted line.
* Unless disabled (via canBreakLine == false), first check if a
* line-break has been registered, and if so break the
* formatted line, and only then append the sequence into
* the next formatted line.
*
* @param sequence the sequence to append.
* @param canBreakLine if true, a registered line-break
*/
void ASFormatter::appendSequence(const string &sequence, bool canBreakLine)
{
if (canBreakLine && isInLineBreak)
breakLine();
formattedLine.append(sequence);
}
/**
* append a space to the current formattedline, UNLESS the
* last character is already a white-space character.
*/
void ASFormatter::appendSpacePad()
{
int len = formattedLine.length();
if (len == 0 || !isWhiteSpace(formattedLine[len-1]))
formattedLine.append(1, ' ');
}
/**
* register a line break for the formatted line.
*/
void ASFormatter::breakLine()
{
isLineReady = true;
isInLineBreak = false;
// queue an empty line prepend request if one exists
prependEmptyLine = isPrependPostBlockEmptyLineRequested;
readyFormattedLine = formattedLine;
if (isAppendPostBlockEmptyLineRequested)
{
isAppendPostBlockEmptyLineRequested = false;
isPrependPostBlockEmptyLineRequested = true;
}
else
{
isPrependPostBlockEmptyLineRequested = false;
}
formattedLine = "";
}
/**
* check if the currently reached open-bracket (i.e. '{')
* opens a:
* - a definition type block (such as a class or namespace),
* - a command block (such as a method block)
* - a static array
* this method takes for granted that the current character
* is an opening bracket.
*
* @return the type of the opened block.
*/
BracketType ASFormatter::getBracketType() const
{
BracketType returnVal;
if (foundPreDefinitionHeader)
returnVal = DEFINITION_TYPE;
else
{
bool isCommandType;
isCommandType = ( foundPreCommandHeader
|| ( currentHeader != NULL && isNonParenHeader )
|| ( previousCommandChar == ')' )
|| ( previousCommandChar == ':' && !foundQuestionMark )
|| ( previousCommandChar == ';' )
|| ( ( previousCommandChar == '{' || previousCommandChar == '}')
&& isPreviousBracketBlockRelated ) );
returnVal = (isCommandType ? COMMAND_TYPE : ARRAY_TYPE);
}
if (isOneLineBlockReached())
returnVal = (BracketType) (returnVal | SINGLE_LINE_TYPE);
return returnVal;
}
/**
* check if the currently reached '*' or '&' character is
* a pointer-or-reference symbol, or another operator.
* this method takes for granted that the current character
* is either a '*' or '&'.
*
* @return whether current character is a reference-or-pointer
*/
bool ASFormatter::isPointerOrReference() const
{
bool isPR;
isPR = ( !isInPotentialCalculation
|| IS_A(bracketTypeStack->back(), DEFINITION_TYPE)
|| (!isLegalNameChar(previousNonWSChar)
&& previousNonWSChar != ')'
&& previousNonWSChar != ']')
);
if (!isPR)
{
char nextChar = peekNextChar();
isPR |= (!isWhiteSpace(nextChar)
&& nextChar != '-'
&& nextChar != '('
&& nextChar != '['
&& !isLegalNameChar(nextChar));
}
return isPR;
}
/**
* check if the currently reached '-' character is
* a urinary minus
* this method takes for granted that the current character
* is a '-'.
*
* @return whether the current '-' is a urinary minus.
*/
bool ASFormatter::isUrinaryMinus() const
{
return ( (previousOperator == &AS_RETURN || !isalnum(previousCommandChar))
&& previousCommandChar != '.'
&& previousCommandChar != ')'
&& previousCommandChar != ']' );
}
/**
* check if the currently reached '-' or '+' character is
* part of an exponent, i.e. 0.2E-5.
* this method takes for granted that the current character
* is a '-' or '+'.
*
* @return whether the current '-' is in an exponent.
*/
bool ASFormatter::isInExponent() const
{
int formattedLineLength = formattedLine.length();
if (formattedLineLength >= 2)
{
char prevPrevFormattedChar = formattedLine[formattedLineLength - 2];
char prevFormattedChar = formattedLine[formattedLineLength - 1];
return ( (prevFormattedChar == 'e' || prevFormattedChar == 'E')
&& (prevPrevFormattedChar == '.' || isdigit(prevPrevFormattedChar)) );
}
else
return false;
}
/**
* check if a one-line bracket has been reached,
* i.e. if the currently reached '{' character is closed
* with a complimentry '}' elsewhere on the current line,
*.
* @return has a one-line bracket been reached?
*/
bool ASFormatter::isOneLineBlockReached() const
{
bool isInComment = false;
bool isInQuote = false;
int bracketCount = 1;
int currentLineLength = currentLine.length();
int i = 0;
char ch = ' ';
char quoteChar = ' ';
for (i = charNum + 1; i < currentLineLength; ++i)
{
ch = currentLine[i];
if (isInComment)
{
if (currentLine.COMPARE(i, 2, "*/") == 0)
{
isInComment = false;
++i;
}
continue;
}
if (ch == '\\')
{
++i;
continue;
}
if (isInQuote)
{
if (ch == quoteChar)
isInQuote = false;
continue;
}
if (ch == '"' || ch == '\'')
{
isInQuote = true;
quoteChar = ch;
continue;
}
if (currentLine.COMPARE(i, 2, "//") == 0)
break;
if (currentLine.COMPARE(i, 2, "/*") == 0)
{
isInComment = true;
++i;
continue;
}
if (ch == '{')
++bracketCount;
else if (ch == '}')
--bracketCount;
if(bracketCount == 0)
return true;
}
return false;
}
/**
* check if one of a set of headers has been reached in the
* current position of the current line.
*
* @return a pointer to the found header. Or a NULL if no header has been reached.
* @param headers a vector of headers
* @param checkBoundry
*/
const string *ASFormatter::findHeader(const vector<const string*> &headers, bool checkBoundry)
{
return ASBeautifier::findHeader(currentLine, charNum, headers, checkBoundry);
}
#ifdef USES_NAMESPACE
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -