in formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java [184:964]
private String parseTokens(List<IASToken> tokens) throws Exception {
indent = 0;
inCaseOrDefaultClause = false;
inControlFlowStatement = false;
inVarOrConstDeclaration = false;
inFunctionDeclaration = false;
inPackageDeclaration = false;
inClassDeclaration = false;
inInterfaceDeclaration = false;
blockOpenPending = false;
indentedStatement = false;
caseOrDefaultBlockOpenPending = false;
skipFormatting = false;
varOrConstChainLevel = -1;
blockStack = new ArrayList<BlockStackItem>();
controlFlowParenStack = 0;
ternaryStack = 0;
numRequiredNewLines = 0;
requiredSpace = false;
prevTokenNotComment = null;
prevToken = null;
prevTokenOrExtra = null;
token = null;
nextToken = null;
nextTokenOrExtra = null;
nextTokenNotComment = null;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < tokens.size(); i++) {
token = tokens.get(i);
if (token.getType() == TOKEN_TYPE_EXTRA) {
if (skipFormatting) {
builder.append(token.getText());
} else {
if (i == (tokens.size() - 1)) {
// if the last token is whitespace, include at most one
// new line, but strip the rest
numRequiredNewLines = Math.min(1, Math.max(0, countNewLinesInExtra(token)));
appendNewLines(builder, numRequiredNewLines);
break;
}
if (!blockOpenPending) {
int newLinesInExtra = countNewLinesInExtra(token);
if (prevToken != null && prevToken.getType() == ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT) {
newLinesInExtra++;
}
boolean oneLineBlock = prevToken != null && prevToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN
&& nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
if (oneLineBlock && settings.collapseEmptyBlocks) {
newLinesInExtra = 0;
}
numRequiredNewLines = Math.max(numRequiredNewLines, newLinesInExtra);
if (!indentedStatement && numRequiredNewLines > 0 && prevTokenNotComment != null
&& prevTokenNotComment.getType() != ASTokenTypes.TOKEN_SEMICOLON
&& prevTokenNotComment.getType() != ASTokenTypes.TOKEN_BLOCK_CLOSE
&& !(caseOrDefaultBlockOpenPending
&& prevTokenNotComment.getType() == ASTokenTypes.TOKEN_COLON)
&& !(prevTokenNotComment instanceof MetaDataPayloadToken)) {
boolean needsIndent = prevTokenNotComment.getType() != ASTokenTypes.TOKEN_BLOCK_OPEN
|| (!blockStack.isEmpty() && blockStack
.get(blockStack.size() - 1) instanceof ObjectLiteralBlockStackItem);
if (needsIndent) {
startIndentedStatement();
}
}
}
}
prevTokenOrExtra = token;
continue;
}
nextTokenOrExtra = ((i + 1) < tokens.size()) ? tokens.get(i + 1) : null;
nextToken = getNextTokenSkipExtra(tokens, i + 1);
nextTokenNotComment = getNextTokenSkipExtraAndComments(tokens, i + 1);
boolean skipWhitespaceBeforeSemicolon = nextToken == null
|| nextToken.getType() == ASTokenTypes.TOKEN_SEMICOLON;
// characters that must appear before the token
if (token instanceof MetaDataPayloadToken) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
} else {
switch (token.getType()) {
case ASTokenTypes.TOKEN_BLOCK_OPEN: {
if (!blockOpenPending) {
// detect some cases of blocks that may have been
// missed earlier (these will be standalone blocks,
// without a control flow statement or definition).
// this should not detect object literals, though!
blockOpenPending = prevTokenNotComment == null
|| prevTokenNotComment.getType() == ASTokenTypes.TOKEN_SEMICOLON
|| prevTokenNotComment.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN
|| prevTokenNotComment.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
if (!blockOpenPending && prevTokenNotComment.getType() == ASTokenTypes.TOKEN_COLON
&& !blockStack.isEmpty()) {
IASToken blockToken = blockStack.get(blockStack.size() - 1).token;
blockOpenPending = blockToken.getType() == ASTokenTypes.TOKEN_KEYWORD_DEFAULT
|| blockToken.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE;
}
if (blockOpenPending) {
blockStack.add(new BlockStackItem(token));
}
}
if (blockOpenPending) {
boolean oneLineBlock = nextToken != null
&& nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
boolean needsNewLine = settings.placeOpenBraceOnNewLine
&& (!settings.collapseEmptyBlocks || !oneLineBlock);
if (needsNewLine) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
} else {
if (oneLineBlock && settings.collapseEmptyBlocks) {
numRequiredNewLines = 0;
}
requiredSpace = true;
}
} else {
// probably an object literal
blockStack.add(new ObjectLiteralBlockStackItem(token));
// we will indent, but after appending the token
}
requiredSpace = true;
break;
}
case ASTokenTypes.TOKEN_BLOCK_CLOSE: {
boolean skipSwitchDecrease = false;
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
if (stackItem.blockDepth <= 1) {
boolean oneLineBlock = prevToken != null
&& prevToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN;
if (!settings.collapseEmptyBlocks || !oneLineBlock) {
indent = decreaseIndent(indent);
}
if (stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE
|| stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_DEFAULT) {
blockStack.remove(blockStack.size() - 1);
indent = decreaseIndent(indent);
skipSwitchDecrease = true;
}
}
}
if (!skipSwitchDecrease && !blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
if (stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_SWITCH) {
SwitchBlockStackItem switchStackItem = (SwitchBlockStackItem) stackItem;
if (switchStackItem.clauseCount > 0
&& (prevToken == null
|| prevToken.getType() != ASTokenTypes.TOKEN_BLOCK_CLOSE)) {
indent = decreaseIndent(indent);
}
}
}
break;
}
case ASTokenTypes.TOKEN_SQUARE_CLOSE: {
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
if (stackItem.token.getType() == ASTokenTypes.TOKEN_SQUARE_OPEN) {
indent = decreaseIndent(indent);
blockStack.remove(blockStack.size() - 1);
}
}
break;
}
case ASTokenTypes.TOKEN_PAREN_CLOSE: {
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
if (stackItem.token.getType() == ASTokenTypes.TOKEN_PAREN_OPEN) {
indent = decreaseIndent(indent);
blockStack.remove(blockStack.size() - 1);
}
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_AS:
case ASTokenTypes.TOKEN_KEYWORD_IS:
case ASTokenTypes.TOKEN_KEYWORD_IN:
case ASTokenTypes.TOKEN_RESERVED_WORD_EACH:
case ASTokenTypes.TOKEN_RESERVED_WORD_EXTENDS:
case ASTokenTypes.TOKEN_RESERVED_WORD_IMPLEMENTS:
case ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT:
case ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT: {
// needs an extra space before the token
requiredSpace = true;
break;
}
case ASTokenTypes.TOKEN_OPERATOR_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_NOT_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_STRICT_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_STRICT_NOT_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_LESS_THAN:
case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN:
case ASTokenTypes.TOKEN_OPERATOR_LESS_THAN_EQUALS:
case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN_EQUALS:
case ASTokenTypes.TOKEN_OPERATOR_DIVISION:
case ASTokenTypes.TOKEN_OPERATOR_MODULO:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_AND:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_LEFT_SHIFT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_OR:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_RIGHT_SHIFT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_UNSIGNED_RIGHT_SHIFT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_XOR:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_AND:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_OR:
case ASTokenTypes.TOKEN_OPERATOR_NULLISH_COALESCING:
case ASTokenTypes.TOKEN_OPERATOR_PLUS_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_MINUS_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_MULTIPLICATION_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_DIVISION_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_MODULO_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_AND_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_LEFT_SHIFT_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_OR_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_RIGHT_SHIFT_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_UNSIGNED_RIGHT_SHIFT_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_XOR_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_AND_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_OR_ASSIGNMENT: {
if (settings.insertSpaceBeforeAndAfterBinaryOperators) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_STAR: {
boolean isAnyType = checkTokenBeforeAnyType(prevTokenNotComment);
boolean isAnyVectorType = checkTokensForAnyVectorType(prevTokenNotComment, nextTokenNotComment);
if (!isAnyType && !isAnyVectorType && settings.insertSpaceBeforeAndAfterBinaryOperators
&& !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_PLUS:
case ASTokenTypes.TOKEN_OPERATOR_MINUS: {
boolean isUnary = checkTokenBeforeUnaryOperator(prevTokenNotComment);
if (!isUnary && settings.insertSpaceBeforeAndAfterBinaryOperators) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_ASSIGNMENT: {
inVarOrConstDeclaration = false;
if (settings.insertSpaceBeforeAndAfterBinaryOperators) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_TERNARY: {
ternaryStack++;
if (settings.insertSpaceBeforeAndAfterBinaryOperators) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_ELLIPSIS: {
boolean isFirstArg = prevToken == null || prevToken.getType() == ASTokenTypes.TOKEN_PAREN_OPEN;
if (!isFirstArg) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_DEFAULT:
case ASTokenTypes.TOKEN_KEYWORD_CASE: {
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
switch (stackItem.token.getType()) {
case ASTokenTypes.TOKEN_KEYWORD_DEFAULT:
case ASTokenTypes.TOKEN_KEYWORD_CASE: {
blockStack.remove(blockStack.size() - 1);
indent = decreaseIndent(indent);
break;
}
}
}
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
if (stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_SWITCH) {
SwitchBlockStackItem switchStackItem = (SwitchBlockStackItem) stackItem;
switchStackItem.clauseCount++;
inCaseOrDefaultClause = true;
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
blockStack.add(new BlockStackItem(token));
}
}
break;
}
case ASTokenTypes.TOKEN_COLON: {
if (ternaryStack > 0) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_SEMICOLON: {
endIndentedStatement();
inVarOrConstDeclaration = false;
varOrConstChainLevel = -1;
break;
}
case ASTokenTypes.TOKEN_ASDOC_COMMENT: {
if (prevToken != null && prevToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
} else {
// add an extra line before an asdoc comment
numRequiredNewLines = Math.max(numRequiredNewLines, 2);
}
break;
}
}
}
if (!skipFormatting && prevToken != null) {
if (numRequiredNewLines > 0) {
appendNewLines(builder, numRequiredNewLines);
appendIndent(builder, indent);
} else if (requiredSpace) {
builder.append(' ');
}
}
switch (token.getType()) {
case ASTokenTypes.TOKEN_BLOCK_OPEN: {
if (blockOpenPending) {
boolean oneLineBlock = nextToken != null
&& nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
if (settings.placeOpenBraceOnNewLine && (!settings.collapseEmptyBlocks || !oneLineBlock)) {
indent = increaseIndent(indent);
}
}
break;
}
}
// include the token's own text
builder.append(getTokenText(token, indent, skipFormatting));
// characters that must appear after the token
if (token.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& token.getType() != ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT
&& token.getType() != ASTokenTypes.TOKEN_ASDOC_COMMENT
&& token.getType() != ASTokenTypes.TOKEN_BLOCK_OPEN) {
blockOpenPending = false;
}
if (token.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& token.getType() != ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT
&& token.getType() != ASTokenTypes.TOKEN_ASDOC_COMMENT) {
caseOrDefaultBlockOpenPending = false;
}
requiredSpace = false;
numRequiredNewLines = 0;
if (token instanceof MetaDataPayloadToken) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
} else {
switch (token.getType()) {
case ASTokenTypes.TOKEN_SEMICOLON: {
if (inControlFlowStatement && isInForStatement(blockStack)) {
if (settings.insertSpaceAfterSemicolonInForStatements) {
requiredSpace = true;
}
// else no space
} else {
boolean checkNext = true;
while (!blockStack.isEmpty() && checkNext) {
checkNext = false;
BlockStackItem prevStackItem = blockStack.get(blockStack.size() - 1);
if (prevStackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_CASE
&& prevStackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_DEFAULT
&& prevStackItem.blockDepth <= 0) {
blockStack.remove(blockStack.size() - 1);
if (prevStackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_CLASS
&& prevStackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_INTERFACE
&& prevStackItem.token.getType() != ASTokenTypes.TOKEN_KEYWORD_FUNCTION) {
checkNext = !prevStackItem.braces;
indent = decreaseIndent(indent);
}
}
}
}
if (!inControlFlowStatement) {
if (nextToken != null
&& (nextToken.getType() == ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
|| nextToken.getType() == ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT)) {
requiredSpace = true;
} else {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
}
break;
}
case ASTokenTypes.TOKEN_BLOCK_OPEN: {
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
if (stackItem instanceof ObjectLiteralBlockStackItem) {
indent = increaseIndent(indent);
}
}
if (blockOpenPending) {
blockOpenPending = false;
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
stackItem.blockDepth++;
}
boolean oneLineBlock = nextToken != null
&& nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
if (!settings.collapseEmptyBlocks || !oneLineBlock) {
if (!settings.placeOpenBraceOnNewLine) {
indent = increaseIndent(indent);
}
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
}
break;
}
case ASTokenTypes.TOKEN_BLOCK_CLOSE: {
if (!blockStack.isEmpty()) {
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
stackItem.blockDepth--;
if (stackItem.blockDepth <= 0) {
blockStack.remove(blockStack.size() - 1);
}
if (!(stackItem instanceof ObjectLiteralBlockStackItem)
&& (nextToken == null || (nextToken.getType() != ASTokenTypes.TOKEN_SEMICOLON
&& nextToken.getType() != ASTokenTypes.TOKEN_PAREN_CLOSE
&& nextToken.getType() != ASTokenTypes.TOKEN_COMMA
&& nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT))) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
}
break;
}
case ASTokenTypes.TOKEN_SQUARE_OPEN: {
blockStack.add(new BlockStackItem(token));
indent = increaseIndent(indent);
break;
}
case ASTokenTypes.TOKEN_PAREN_OPEN: {
blockStack.add(new BlockStackItem(token));
indent = increaseIndent(indent);
if (inControlFlowStatement) {
controlFlowParenStack++;
}
break;
}
case ASTokenTypes.TOKEN_PAREN_CLOSE: {
if (inControlFlowStatement) {
controlFlowParenStack--;
if (controlFlowParenStack <= 0) {
endIndentedStatement();
inControlFlowStatement = false;
controlFlowParenStack = 0;
blockOpenPending = true;
if (nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_SEMICOLON) {
blockStack.remove(blockStack.size() - 1);
if (!skipWhitespaceBeforeSemicolon) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
} else if (nextToken != null && nextToken.getType() != ASTokenTypes.TOKEN_BLOCK_OPEN
&& nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& !skipWhitespaceBeforeSemicolon) {
indent = increaseIndent(indent);
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
stackItem.braces = false;
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
}
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_INCREMENT:
case ASTokenTypes.TOKEN_OPERATOR_DECREMENT: {
if (!inControlFlowStatement && prevToken != null
&& prevToken.getType() != ASTokenTypes.TOKEN_SEMICOLON && nextToken != null
&& nextToken.getType() != ASTokenTypes.TOKEN_SEMICOLON) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_CONTINUE:
case ASTokenTypes.TOKEN_KEYWORD_BREAK:
case ASTokenTypes.TOKEN_KEYWORD_RETURN: {
if (!skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_PACKAGE: {
blockStack.add(new BlockStackItem(token));
requiredSpace = true;
inPackageDeclaration = true;
break;
}
case ASTokenTypes.TOKEN_KEYWORD_CLASS: {
blockStack.add(new BlockStackItem(token));
requiredSpace = true;
inClassDeclaration = true;
break;
}
case ASTokenTypes.TOKEN_KEYWORD_INTERFACE: {
blockStack.add(new BlockStackItem(token));
requiredSpace = true;
inInterfaceDeclaration = true;
break;
}
case ASTokenTypes.TOKEN_KEYWORD_FUNCTION: {
blockStack.add(new BlockStackItem(token));
inFunctionDeclaration = true;
boolean skipSpace = !settings.insertSpaceAfterFunctionKeywordForAnonymousFunctions
&& (nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_PAREN_OPEN);
if (!skipSpace) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_VAR:
case ASTokenTypes.TOKEN_KEYWORD_CONST: {
inVarOrConstDeclaration = true;
requiredSpace = true;
varOrConstChainLevel = blockStack.size();
break;
}
case ASTokenTypes.TOKEN_KEYWORD_CATCH:
case ASTokenTypes.TOKEN_KEYWORD_FOR:
case ASTokenTypes.TOKEN_KEYWORD_IF:
case ASTokenTypes.TOKEN_KEYWORD_WHILE:
case ASTokenTypes.TOKEN_KEYWORD_WITH: {
inControlFlowStatement = true;
BlockStackItem stackItem = new BlockStackItem(token);
stackItem.controlFlow = true;
blockStack.add(stackItem);
if (settings.insertSpaceAfterKeywordsInControlFlowStatements
&& !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_SWITCH: {
inControlFlowStatement = true;
blockStack.add(new SwitchBlockStackItem(token));
if (settings.insertSpaceAfterKeywordsInControlFlowStatements
&& !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_TRY:
case ASTokenTypes.TOKEN_KEYWORD_FINALLY: {
blockStack.add(new BlockStackItem(token));
if (!skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
blockOpenPending = true;
break;
}
case ASTokenTypes.TOKEN_KEYWORD_ELSE: {
if (nextTokenNotComment != null
&& nextTokenNotComment.getType() == ASTokenTypes.TOKEN_KEYWORD_IF) {
requiredSpace = true;
} else {
blockStack.add(new BlockStackItem(token));
blockOpenPending = true;
if (nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_SEMICOLON) {
blockStack.remove(blockStack.size() - 1);
if (!skipWhitespaceBeforeSemicolon) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
} else if (nextToken != null && nextToken.getType() != ASTokenTypes.TOKEN_BLOCK_OPEN
&& nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& !skipWhitespaceBeforeSemicolon) {
indent = increaseIndent(indent);
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_DO: {
blockStack.add(new BlockStackItem(token));
blockOpenPending = true;
if (nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_SEMICOLON) {
blockStack.remove(blockStack.size() - 1);
if (!skipWhitespaceBeforeSemicolon) {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
} else if (nextToken != null && nextToken.getType() != ASTokenTypes.TOKEN_BLOCK_OPEN
&& nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& !skipWhitespaceBeforeSemicolon) {
indent = increaseIndent(indent);
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
break;
}
case ASTokenTypes.TOKEN_COLON: {
if (ternaryStack > 0) {
ternaryStack--;
requiredSpace = true;
} else if (!inControlFlowStatement && !inVarOrConstDeclaration && !inFunctionDeclaration) {
if (inCaseOrDefaultClause) {
inCaseOrDefaultClause = false;
caseOrDefaultBlockOpenPending = true;
boolean nextIsBlock = nextTokenNotComment != null
&& nextTokenNotComment.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN;
if (nextIsBlock) {
IASToken afterBlockClose = findTokenAfterBlock(nextTokenNotComment, tokens);
if (afterBlockClose != null) {
if (afterBlockClose.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE
|| afterBlockClose.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE
|| afterBlockClose.getType() == ASTokenTypes.TOKEN_KEYWORD_DEFAULT) {
blockOpenPending = true;
requiredSpace = true;
blockStack.remove(blockStack.size() - 1);
}
}
}
if (!nextIsBlock || !blockOpenPending) {
indent = increaseIndent(indent);
if (nextToken != null && (nextToken
.getType() == ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
|| nextToken.getType() == ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT)) {
requiredSpace = true;
} else {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
}
}
} else {
requiredSpace = true;
}
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_CASE: {
if (!skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_DEFAULT: {
if (!inCaseOrDefaultClause && !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_KEYWORD_AS:
case ASTokenTypes.TOKEN_KEYWORD_DELETE:
case ASTokenTypes.TOKEN_KEYWORD_IMPORT:
case ASTokenTypes.TOKEN_KEYWORD_IN:
case ASTokenTypes.TOKEN_KEYWORD_INCLUDE:
case ASTokenTypes.TOKEN_KEYWORD_INSTANCEOF:
case ASTokenTypes.TOKEN_KEYWORD_IS:
case ASTokenTypes.TOKEN_KEYWORD_NEW:
case ASTokenTypes.TOKEN_KEYWORD_THROW:
case ASTokenTypes.TOKEN_KEYWORD_TYPEOF:
case ASTokenTypes.TOKEN_KEYWORD_USE:
case ASTokenTypes.TOKEN_RESERVED_WORD_CONFIG:
case ASTokenTypes.TOKEN_RESERVED_WORD_EXTENDS:
case ASTokenTypes.TOKEN_RESERVED_WORD_GET:
case ASTokenTypes.TOKEN_RESERVED_WORD_GOTO:
case ASTokenTypes.TOKEN_RESERVED_WORD_IMPLEMENTS:
case ASTokenTypes.TOKEN_RESERVED_WORD_NAMESPACE:
case ASTokenTypes.TOKEN_RESERVED_WORD_SET:
case ASTokenTypes.TOKEN_MODIFIER_ABSTRACT:
case ASTokenTypes.TOKEN_MODIFIER_DYNAMIC:
case ASTokenTypes.TOKEN_MODIFIER_FINAL:
case ASTokenTypes.TOKEN_MODIFIER_NATIVE:
case ASTokenTypes.TOKEN_MODIFIER_OVERRIDE:
case ASTokenTypes.TOKEN_MODIFIER_STATIC:
case ASTokenTypes.TOKEN_MODIFIER_VIRTUAL:
case ASTokenTypes.TOKEN_NAMESPACE_ANNOTATION: {
if (!skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_NOT_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_STRICT_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_STRICT_NOT_EQUAL:
case ASTokenTypes.TOKEN_OPERATOR_LESS_THAN:
case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN:
case ASTokenTypes.TOKEN_OPERATOR_LESS_THAN_EQUALS:
case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN_EQUALS:
case ASTokenTypes.TOKEN_OPERATOR_DIVISION:
case ASTokenTypes.TOKEN_OPERATOR_MODULO:
case ASTokenTypes.TOKEN_OPERATOR_TERNARY:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_AND:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_LEFT_SHIFT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_OR:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_RIGHT_SHIFT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_UNSIGNED_RIGHT_SHIFT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_XOR:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_AND:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_OR:
case ASTokenTypes.TOKEN_OPERATOR_NULLISH_COALESCING:
case ASTokenTypes.TOKEN_OPERATOR_PLUS_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_MINUS_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_MULTIPLICATION_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_DIVISION_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_MODULO_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_AND_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_LEFT_SHIFT_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_OR_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_RIGHT_SHIFT_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_UNSIGNED_RIGHT_SHIFT_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_BITWISE_XOR_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_AND_ASSIGNMENT:
case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_OR_ASSIGNMENT: {
if (settings.insertSpaceBeforeAndAfterBinaryOperators && !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_STAR: {
boolean isAnyType = checkTokenBeforeAnyType(prevTokenNotComment);
boolean isAnyVectorType = checkTokensForAnyVectorType(prevTokenNotComment, nextTokenNotComment);
if (!isAnyType && !isAnyVectorType && settings.insertSpaceBeforeAndAfterBinaryOperators
&& !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_OPERATOR_PLUS:
case ASTokenTypes.TOKEN_OPERATOR_MINUS: {
boolean isUnary = checkTokenBeforeUnaryOperator(prevTokenNotComment);
if (!isUnary && settings.insertSpaceBeforeAndAfterBinaryOperators
&& !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.TOKEN_COMMA: {
if (varOrConstChainLevel == blockStack.size()) {
inVarOrConstDeclaration = true;
}
if (settings.insertSpaceAfterCommaDelimiter && !skipWhitespaceBeforeSemicolon) {
requiredSpace = true;
}
break;
}
case ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT: {
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
String trimmed = token.getText().substring(2).trim();
if (!skipFormatting && FORMATTER_TAG_OFF.equals(trimmed)) {
skipFormatting = true;
appendNewLines(builder, 1);
} else if (skipFormatting && FORMATTER_TAG_ON.equals(trimmed)) {
skipFormatting = false;
numRequiredNewLines = 0;
}
break;
}
case ASTokenTypes.TOKEN_ASDOC_COMMENT:
case ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT: {
if (!skipWhitespaceBeforeSemicolon) {
if (nextTokenOrExtra != null && nextTokenOrExtra.getType() == TOKEN_TYPE_EXTRA) {
requiredSpace = true;
}
}
break;
}
}
}
if ((inPackageDeclaration || inClassDeclaration || inInterfaceDeclaration || inFunctionDeclaration)
&& nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN) {
blockOpenPending = true;
endIndentedStatement();
inPackageDeclaration = false;
inClassDeclaration = false;
inInterfaceDeclaration = false;
inFunctionDeclaration = false;
}
prevToken = token;
prevTokenOrExtra = prevToken;
if (prevToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
&& prevToken.getType() != ASTokenTypes.HIDDEN_TOKEN_MULTI_LINE_COMMENT
&& prevToken.getType() != ASTokenTypes.TOKEN_ASDOC_COMMENT) {
prevTokenNotComment = prevToken;
}
}
if (blockStack.size() > 0) {
throw new Exception("Block stack size too large");
}
return builder.toString();
}