This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new b495634ef formatter: fixed issues where nested blocks/functions could 
mess up the indentation of multi-line statements
b495634ef is described below

commit b495634efff9c9d862e7205295abdceb8f3e69cf
Author: Josh Tynjala <joshtynj...@apache.org>
AuthorDate: Wed Aug 10 14:12:27 2022 -0700

    formatter: fixed issues where nested blocks/functions could mess up the 
indentation of multi-line statements
---
 .../apache/royale/formatter/ASTokenFormatter.java  | 203 +++++++++++++++++----
 .../apache/royale/formatter/TestArrayLiteral.java  |  91 +++++++++
 .../royale/formatter/TestClassDeclaration.java     | 116 ++++++++++++
 .../royale/formatter/TestFunctionDeclaration.java  |  31 ++++
 .../royale/formatter/TestInterfaceDeclaration.java |  68 +++++++
 5 files changed, 474 insertions(+), 35 deletions(-)

diff --git 
a/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java 
b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java
index b3848c28c..56e3be77d 100644
--- a/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java
+++ b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java
@@ -243,8 +243,7 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                                        || 
(!blockStack.isEmpty() && blockStack
                                                                                
        .get(blockStack.size() - 1) instanceof ObjectLiteralBlockStackItem);
                                                        if (needsIndent) {
-                                                               
indentedStatement = true;
-                                                               indent = 
increaseIndent(indent);
+                                                               
startIndentedStatement();
                                                        }
                                                }
                                        }
@@ -285,13 +284,10 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                        }
                                                }
                                                if (blockOpenPending) {
-                                                       if (indentedStatement) {
-                                                               
indentedStatement = false;
-                                                               indent = 
decreaseIndent(indent);
-                                                       }
                                                        boolean oneLineBlock = 
nextToken != null
                                                                        && 
nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
-                                                       boolean needsNewLine = 
settings.placeOpenBraceOnNewLine && (!settings.collapseEmptyBlocks || 
!oneLineBlock);
+                                                       boolean needsNewLine = 
settings.placeOpenBraceOnNewLine
+                                                                       && 
(!settings.collapseEmptyBlocks || !oneLineBlock);
                                                        if (needsNewLine) {
                                                                
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
                                                        } else {
@@ -303,7 +299,7 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                } else {
                                                        // probably an object 
literal
                                                        blockStack.add(new 
ObjectLiteralBlockStackItem(token));
-                                                       indent = 
increaseIndent(indent);
+                                                       // we will indent, but 
after appending the token
                                                }
                                                requiredSpace = true;
                                                break;
@@ -341,20 +337,20 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                        }
                                        case ASTokenTypes.TOKEN_SQUARE_CLOSE: {
                                                if (!blockStack.isEmpty()) {
-                                                       BlockStackItem item = 
blockStack.get(blockStack.size() - 1);
-                                                       if 
(item.token.getType() == ASTokenTypes.TOKEN_SQUARE_OPEN) {
+                                                       BlockStackItem 
stackItem = blockStack.get(blockStack.size() - 1);
+                                                       if 
(stackItem.token.getType() == ASTokenTypes.TOKEN_SQUARE_OPEN) {
                                                                indent = 
decreaseIndent(indent);
-                                                               
blockStack.remove(item);
+                                                               
blockStack.remove(blockStack.size() - 1);
                                                        }
                                                }
                                                break;
                                        }
                                        case ASTokenTypes.TOKEN_PAREN_CLOSE: {
                                                if (!blockStack.isEmpty()) {
-                                                       BlockStackItem item = 
blockStack.get(blockStack.size() - 1);
-                                                       if 
(item.token.getType() == ASTokenTypes.TOKEN_PAREN_OPEN) {
+                                                       BlockStackItem 
stackItem = blockStack.get(blockStack.size() - 1);
+                                                       if 
(stackItem.token.getType() == ASTokenTypes.TOKEN_PAREN_OPEN) {
                                                                indent = 
decreaseIndent(indent);
-                                                               
blockStack.remove(item);
+                                                               
blockStack.remove(blockStack.size() - 1);
                                                        }
                                                }
                                                break;
@@ -477,10 +473,7 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                break;
                                        }
                                        case ASTokenTypes.TOKEN_SEMICOLON: {
-                                               if (indentedStatement) {
-                                                       indentedStatement = 
false;
-                                                       indent = 
decreaseIndent(indent);
-                                               }
+                                               endIndentedStatement();
                                                inVarOrConstDeclaration = false;
                                                varOrConstChainLevel = -1;
                                                break;
@@ -574,11 +567,17 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                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 
item = blockStack.get(blockStack.size() - 1);
-                                                               
item.blockDepth++;
+                                                               BlockStackItem 
stackItem = blockStack.get(blockStack.size() - 1);
+                                                               
stackItem.blockDepth++;
                                                        }
                                                        boolean oneLineBlock = 
nextToken != null
                                                                        && 
nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
@@ -593,12 +592,12 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                        }
                                        case ASTokenTypes.TOKEN_BLOCK_CLOSE: {
                                                if (!blockStack.isEmpty()) {
-                                                       BlockStackItem item = 
blockStack.get(blockStack.size() - 1);
-                                                       item.blockDepth--;
-                                                       if (item.blockDepth <= 
0) {
+                                                       BlockStackItem 
stackItem = blockStack.get(blockStack.size() - 1);
+                                                       stackItem.blockDepth--;
+                                                       if 
(stackItem.blockDepth <= 0) {
                                                                
blockStack.remove(blockStack.size() - 1);
                                                        }
-                                                       if (!(item instanceof 
ObjectLiteralBlockStackItem)
+                                                       if (!(stackItem 
instanceof ObjectLiteralBlockStackItem)
                                                                        && 
(nextToken == null || (nextToken.getType() != ASTokenTypes.TOKEN_SEMICOLON
                                                                                
        && nextToken.getType() != ASTokenTypes.TOKEN_PAREN_CLOSE
                                                                                
        && nextToken.getType() != ASTokenTypes.TOKEN_COMMA
@@ -609,13 +608,14 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                }
                                                break;
                                        }
-                                       case ASTokenTypes.TOKEN_SQUARE_OPEN:
-                                               indent = increaseIndent(indent);
+                                       case ASTokenTypes.TOKEN_SQUARE_OPEN: {
                                                blockStack.add(new 
BlockStackItem(token));
+                                               indent = increaseIndent(indent);
                                                break;
+                                       }
                                        case ASTokenTypes.TOKEN_PAREN_OPEN: {
-                                               indent = increaseIndent(indent);
                                                blockStack.add(new 
BlockStackItem(token));
+                                               indent = increaseIndent(indent);
                                                if (inControlFlowStatement) {
                                                        controlFlowParenStack++;
                                                }
@@ -625,6 +625,7 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                if (inControlFlowStatement) {
                                                        controlFlowParenStack--;
                                                        if 
(controlFlowParenStack <= 0) {
+                                                               
endIndentedStatement();
                                                                
inControlFlowStatement = false;
                                                                
controlFlowParenStack = 0;
                                                                
blockOpenPending = true;
@@ -637,8 +638,8 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                                                                
&& nextToken.getType() != ASTokenTypes.HIDDEN_TOKEN_SINGLE_LINE_COMMENT
                                                                                
&& !skipWhitespaceBeforeSemicolon) {
                                                                        indent 
= increaseIndent(indent);
-                                                                       
BlockStackItem item = blockStack.get(blockStack.size() - 1);
-                                                                       
item.braces = false;
+                                                                       
BlockStackItem stackItem = blockStack.get(blockStack.size() - 1);
+                                                                       
stackItem.braces = false;
                                                                        
numRequiredNewLines = Math.max(numRequiredNewLines, 1);
                                                                }
                                                        }
@@ -703,8 +704,11 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                        case ASTokenTypes.TOKEN_KEYWORD_WHILE:
                                        case ASTokenTypes.TOKEN_KEYWORD_WITH: {
                                                inControlFlowStatement = true;
-                                               blockStack.add(new 
BlockStackItem(token));
-                                               if 
(settings.insertSpaceAfterKeywordsInControlFlowStatements && 
!skipWhitespaceBeforeSemicolon) {
+                                               BlockStackItem stackItem = new 
BlockStackItem(token);
+                                               stackItem.controlFlow = true;
+                                               blockStack.add(stackItem);
+                                               if 
(settings.insertSpaceAfterKeywordsInControlFlowStatements
+                                                               && 
!skipWhitespaceBeforeSemicolon) {
                                                        requiredSpace = true;
                                                }
                                                break;
@@ -712,7 +716,8 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                        case ASTokenTypes.TOKEN_KEYWORD_SWITCH: 
{
                                                inControlFlowStatement = true;
                                                blockStack.add(new 
SwitchBlockStackItem(token));
-                                               if 
(settings.insertSpaceAfterKeywordsInControlFlowStatements && 
!skipWhitespaceBeforeSemicolon) {
+                                               if 
(settings.insertSpaceAfterKeywordsInControlFlowStatements
+                                                               && 
!skipWhitespaceBeforeSemicolon) {
                                                        requiredSpace = true;
                                                }
                                                break;
@@ -893,7 +898,8 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                                        case ASTokenTypes.TOKEN_OPERATOR_PLUS:
                                        case ASTokenTypes.TOKEN_OPERATOR_MINUS: 
{
                                                boolean isUnary = 
checkTokenBeforeUnaryOperator(prevTokenNotComment);
-                                               if (!isUnary && 
settings.insertSpaceBeforeAndAfterBinaryOperators && 
!skipWhitespaceBeforeSemicolon) {
+                                               if (!isUnary && 
settings.insertSpaceBeforeAndAfterBinaryOperators
+                                                               && 
!skipWhitespaceBeforeSemicolon) {
                                                        requiredSpace = true;
                                                }
                                                break;
@@ -934,6 +940,7 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                        if ((inPackageDeclaration || inClassDeclaration || 
inInterfaceDeclaration || inFunctionDeclaration)
                                        && nextToken != null && 
nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN) {
                                blockOpenPending = true;
+                               endIndentedStatement();
                                inPackageDeclaration = false;
                                inClassDeclaration = false;
                                inInterfaceDeclaration = false;
@@ -975,6 +982,129 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                return null;
        }
 
+       private void startIndentedStatement() {
+               for (int i = blockStack.size() - 1; i >= 0; i--) {
+                       BlockStackItem stackItem = blockStack.get(i);
+                       if (inPackageDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_PACKAGE) {
+                                       if (!stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
true;
+                                               indent = increaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inClassDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_CLASS) {
+                                       if (!stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
true;
+                                               indent = increaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inInterfaceDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_INTERFACE) {
+                                       if (!stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
true;
+                                               indent = increaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inFunctionDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_FUNCTION) {
+                                       if (!stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
true;
+                                               indent = increaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inControlFlowStatement) {
+                               if (stackItem.controlFlow) {
+                                       if (!stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
true;
+                                               indent = increaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_FUNCTION) {
+                               if (!stackItem.indentedStatement) {
+                                       stackItem.indentedStatement = true;
+                                       indent = increaseIndent(indent);
+                               }
+                               return;
+                       }
+               }
+               if (inPackageDeclaration || inClassDeclaration || 
inInterfaceDeclaration || inFunctionDeclaration
+                               || inControlFlowStatement) {
+                       // this shouldn't happen
+                       return;
+               }
+               if (!indentedStatement) {
+                       indentedStatement = true;
+                       indent = increaseIndent(indent);
+               }
+       }
+
+       private void endIndentedStatement() {
+               for (int i = blockStack.size() - 1; i >= 0; i--) {
+                       BlockStackItem stackItem = blockStack.get(i);
+                       if (inPackageDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_PACKAGE) {
+                                       if (stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
false;
+                                               indent = decreaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inClassDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_CLASS) {
+                                       if (stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
false;
+                                               indent = decreaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inInterfaceDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_INTERFACE) {
+                                       if (stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
false;
+                                               indent = decreaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inFunctionDeclaration) {
+                               if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_FUNCTION) {
+                                       if (stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
false;
+                                               indent = decreaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (inControlFlowStatement) {
+                               if (stackItem.controlFlow) {
+                                       if (stackItem.indentedStatement) {
+                                               stackItem.indentedStatement = 
false;
+                                               indent = decreaseIndent(indent);
+                                       }
+                                       return;
+                               }
+                       } else if (stackItem.token.getType() == 
ASTokenTypes.TOKEN_KEYWORD_FUNCTION) {
+                               if (stackItem.indentedStatement) {
+                                       stackItem.indentedStatement = false;
+                                       indent = decreaseIndent(indent);
+                               }
+                               return;
+                       }
+               }
+               if (inClassDeclaration || inInterfaceDeclaration || 
inFunctionDeclaration || inControlFlowStatement) {
+                       // this shouldn't happen
+                       return;
+               }
+               if (indentedStatement) {
+                       indentedStatement = false;
+                       indent = decreaseIndent(indent);
+               }
+       }
+
        private String getTokenText(IASToken token, int indent, boolean 
skipFormatting) {
                if (token instanceof MetaDataPayloadToken) {
                        MetaDataPayloadToken metaPlayloadToken = 
(MetaDataPayloadToken) token;
@@ -1211,8 +1341,8 @@ public class ASTokenFormatter extends BaseTokenFormatter {
 
        private boolean isInForStatement(List<BlockStackItem> blockStack) {
                for (int i = blockStack.size() - 1; i >= 0; i--) {
-                       BlockStackItem item = blockStack.get(i);
-                       switch (item.token.getType()) {
+                       BlockStackItem stackItem = blockStack.get(i);
+                       switch (stackItem.token.getType()) {
                                case ASTokenTypes.TOKEN_BLOCK_OPEN:
                                case ASTokenTypes.TOKEN_SQUARE_OPEN:
                                case ASTokenTypes.TOKEN_PAREN_OPEN: {
@@ -1310,6 +1440,8 @@ public class ASTokenFormatter extends BaseTokenFormatter {
                public IASToken token;
                public int blockDepth = 0;
                public boolean braces = true;
+               public boolean indentedStatement = false;
+               public boolean controlFlow = false;
        }
 
        private static class ObjectLiteralBlockStackItem extends BlockStackItem 
{
@@ -1321,6 +1453,7 @@ public class ASTokenFormatter extends BaseTokenFormatter {
        private static class SwitchBlockStackItem extends BlockStackItem {
                public SwitchBlockStackItem(IASToken token) {
                        super(token);
+                       controlFlow = true;
                }
 
                public int clauseCount = 0;
diff --git 
a/formatter/src/test/java/org/apache/royale/formatter/TestArrayLiteral.java 
b/formatter/src/test/java/org/apache/royale/formatter/TestArrayLiteral.java
index 841803eba..7197e9f51 100644
--- a/formatter/src/test/java/org/apache/royale/formatter/TestArrayLiteral.java
+++ b/formatter/src/test/java/org/apache/royale/formatter/TestArrayLiteral.java
@@ -141,4 +141,95 @@ public class TestArrayLiteral extends BaseFormatterTests {
                                // @formatter:on
                                result);
        }
+
+       @Test
+       public void testFunction() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceBeforeAndAfterBinaryOperators = true;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "var array:Array = [\n" +
+                       "\tfunction():void {\n" + 
+                       "\t\tif (condition1\n" +
+                       "\t\t\t&& condition2) {\n" + 
+                       "\t\t\tstatement;\n" +
+                       "\t\t}\n" +
+                       "\t}\n" +
+                       "];",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "var array:Array = [\n" +
+                               "\t\tfunction():void\n" + 
+                               "\t\t{\n" +
+                               "\t\t\tif (condition1\n" +
+                               "\t\t\t\t&& condition2)\n" +
+                               "\t\t\t{\n" + 
+                               "\t\t\t\tstatement;\n" +
+                               "\t\t\t}\n" +
+                               "\t\t}\n" +
+                               "\t];",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testObjectLiteral() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceBeforeAndAfterBinaryOperators = true;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "var array:Array = [\n" +
+                       "\t{\n" + 
+                       "\t\tvalue: 123.4\n" +
+                       "\t}\n" +
+                       "];",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "var array:Array = [\n" +
+                               "\t\t{\n" + 
+                               "\t\t\tvalue: 123.4\n" +
+                               "\t\t}\n" +
+                               "\t];",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testNested() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceBeforeAndAfterBinaryOperators = true;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "var array:Array = [\n" +
+                       "\t[1, 2, 3],\n" +
+                       "\t['one',\n" +
+                       "\t\t'two', 'three'],\n" +
+                       "\t[\n" +
+                       "\t\t123.4,\n" +
+                       "\t\t567.8\n" +
+                       "\t]\n" +
+                       "];",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "var array:Array = [\n" +
+                               "\t\t[1, 2, 3],\n" +
+                               "\t\t['one',\n" +
+                               "\t\t\t'two', 'three'],\n" +
+                               "\t\t[\n" +
+                               "\t\t\t123.4,\n" +
+                               "\t\t\t567.8\n" +
+                               "\t\t]\n" +
+                               "\t];",
+                               // @formatter:on
+                               result);
+       }
 }
\ No newline at end of file
diff --git 
a/formatter/src/test/java/org/apache/royale/formatter/TestClassDeclaration.java 
b/formatter/src/test/java/org/apache/royale/formatter/TestClassDeclaration.java
index c30db9f49..8aa914e7e 100644
--- 
a/formatter/src/test/java/org/apache/royale/formatter/TestClassDeclaration.java
+++ 
b/formatter/src/test/java/org/apache/royale/formatter/TestClassDeclaration.java
@@ -134,4 +134,120 @@ public class TestClassDeclaration extends 
BaseFormatterTests {
                                // @formatter:on
                                result);
        }
+
+       @Test
+       public void testExtends() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "class MyClass extends MyOtherClass {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "class MyClass extends MyOtherClass\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testExtendsOnNewLine() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "class MyClass\n" +
+                       "\textends MyOtherClass {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "class MyClass\n" +
+                               "\textends MyOtherClass\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testImplements() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "class MyClass implements MyInterface {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "class MyClass implements MyInterface\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testImplementsMultiple() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "class MyClass implements MyInterface, MyOtherInterface 
{\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "class MyClass implements MyInterface, 
MyOtherInterface\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testExtendsAndImplementsOnMultipleLines() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "class MyClass\n" +
+                       "\textends MyOtherClass\n" +
+                       "\timplements MyInterface {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "class MyClass\n" +
+                               "\textends MyOtherClass\n" +
+                               "\timplements MyInterface\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
 }
diff --git 
a/formatter/src/test/java/org/apache/royale/formatter/TestFunctionDeclaration.java
 
b/formatter/src/test/java/org/apache/royale/formatter/TestFunctionDeclaration.java
index b473097a4..4090bff06 100644
--- 
a/formatter/src/test/java/org/apache/royale/formatter/TestFunctionDeclaration.java
+++ 
b/formatter/src/test/java/org/apache/royale/formatter/TestFunctionDeclaration.java
@@ -340,4 +340,35 @@ public class TestFunctionDeclaration extends 
BaseFormatterTests {
                                // @formatter:on
                                result);
        }
+
+       @Test
+       public void testNested() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "function myFunction(param:String):void\n" +
+                       "{\n" +
+                       "\tfunction myOtherFunction(param:Number):void\n" +
+                       "\t{\n" +
+                       "\t\tstatement;\n" +
+                       "\t}\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "function myFunction(param:String):void\n" +
+                               "{\n" +
+                               "\tfunction 
myOtherFunction(param:Number):void\n" +
+                               "\t{\n" +
+                               "\t\tstatement;\n" +
+                               "\t}\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
 }
diff --git 
a/formatter/src/test/java/org/apache/royale/formatter/TestInterfaceDeclaration.java
 
b/formatter/src/test/java/org/apache/royale/formatter/TestInterfaceDeclaration.java
index 7526b4140..a25965dda 100644
--- 
a/formatter/src/test/java/org/apache/royale/formatter/TestInterfaceDeclaration.java
+++ 
b/formatter/src/test/java/org/apache/royale/formatter/TestInterfaceDeclaration.java
@@ -187,4 +187,72 @@ public class TestInterfaceDeclaration extends 
BaseFormatterTests {
                                // @formatter:on
                                result);
        }
+
+       @Test
+       public void testExtends() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "interface MyInterface extends MyOtherInterface {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "interface MyInterface extends 
MyOtherInterface\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testExtendsOnNewLine() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "interface MyInterface\n" +
+                       "\textends MyOtherInterface {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "interface MyInterface\n" +
+                               "\textends MyOtherInterface\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
+
+       @Test
+       public void testExtendsMultiple() {
+               FORMATTER formatter = new FORMATTER();
+               formatter.insertSpaceAfterKeywordsInControlFlowStatements = 
true;
+               formatter.placeOpenBraceOnNewLine = true;
+               formatter.insertSpaces = false;
+               String result = formatter.formatActionScriptText(
+               // @formatter:off
+                       "interface MyInterface extends MyOtherInterface, 
MyOtherInterface2 {\n" +
+                       "}",
+                       // @formatter:on
+                       problems
+               );
+               assertEquals(
+               // @formatter:off
+                               "interface MyInterface extends 
MyOtherInterface, MyOtherInterface2\n" +
+                               "{\n" +
+                               "}",
+                               // @formatter:on
+                               result);
+       }
 }

Reply via email to