formatter: like square and curly brackets, parentheses are on the block stack
diff --git a/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java b/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java
index 857c6fc..775be8a 100644
--- a/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java
+++ b/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java
@@ -980,8 +980,7 @@
} else {
switch (token.getType()) {
case ASTokenTypes.TOKEN_SEMICOLON: {
- if (inControlFlowStatement && !blockStack.isEmpty() && blockStack.get(blockStack.size() - 1).token
- .getType() == ASTokenTypes.TOKEN_KEYWORD_FOR) {
+ if (inControlFlowStatement && isInForStatement(blockStack)) {
if (insertSpaceAfterSemicolonInForStatements) {
requiredSpace = true;
}
@@ -1185,15 +1184,19 @@
break;
}
case ASTokenTypes.TOKEN_PAREN_OPEN: {
+ blockStack.add(new BlockStackItem(token));
if (inControlFlowStatement) {
controlFlowParenStack++;
}
- else {
- blockStack.add(new BlockStackItem(token));
- }
break;
}
case ASTokenTypes.TOKEN_PAREN_CLOSE: {
+ if (!blockStack.isEmpty()) {
+ BlockStackItem item = blockStack.get(blockStack.size() - 1);
+ if (item.token.getType() == ASTokenTypes.TOKEN_PAREN_OPEN) {
+ blockStack.remove(item);
+ }
+ }
if (inControlFlowStatement) {
controlFlowParenStack--;
if (controlFlowParenStack <= 0) {
@@ -1215,14 +1218,6 @@
}
}
}
- else {
- if (!blockStack.isEmpty()) {
- BlockStackItem item = blockStack.get(blockStack.size() - 1);
- if (item.token.getType() == ASTokenTypes.TOKEN_PAREN_OPEN) {
- blockStack.remove(item);
- }
- }
- }
break;
}
case ASTokenTypes.TOKEN_KEYWORD_CASE: {
@@ -1435,6 +1430,27 @@
return builder.toString();
}
+ private boolean isInForStatement(List<BlockStackItem> blockStack) {
+ for (int i = blockStack.size() - 1; i >= 0; i--) {
+ BlockStackItem item = blockStack.get(i);
+ switch (item.token.getType()) {
+ case ASTokenTypes.TOKEN_BLOCK_OPEN:
+ case ASTokenTypes.TOKEN_SQUARE_OPEN:
+ case ASTokenTypes.TOKEN_PAREN_OPEN: {
+ // these tokens are fine, keep searching
+ break;
+ }
+ case ASTokenTypes.TOKEN_KEYWORD_FOR: {
+ return true;
+ }
+ default: {
+ return false;
+ }
+ }
+ }
+ return false;
+ }
+
private boolean isInListing(String lineText, boolean alreadyInListing) {
int searchIndex = 0;
boolean inListing = alreadyInListing;