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
commit d2358fd70a762a123385a9b32bae681eb19a390d Author: Josh Tynjala <[email protected]> AuthorDate: Thu Sep 9 14:47:05 2021 -0700 formatter: detect when + and - are used as unary operators instead of binary --- .../org/apache/royale/formatter/FORMATTER.java | 27 ++- .../apache/royale/formatter/TestIdentifier.java | 218 +++++++++++++++++++++ .../apache/royale/formatter/TestNumberLiteral.java | 77 ++++++++ 3 files changed, 318 insertions(+), 4 deletions(-) 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 73463fc..ae80ce7 100644 --- a/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java +++ b/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java @@ -566,8 +566,6 @@ class FORMATTER { case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN: case ASTokenTypes.TOKEN_OPERATOR_LESS_THAN_EQUALS: case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN_EQUALS: - case ASTokenTypes.TOKEN_OPERATOR_PLUS: - case ASTokenTypes.TOKEN_OPERATOR_MINUS: case ASTokenTypes.TOKEN_OPERATOR_STAR: case ASTokenTypes.TOKEN_OPERATOR_DIVISION: case ASTokenTypes.TOKEN_OPERATOR_MODULO: @@ -597,6 +595,14 @@ class FORMATTER { } break; } + case ASTokenTypes.TOKEN_OPERATOR_PLUS: + case ASTokenTypes.TOKEN_OPERATOR_MINUS: { + boolean isUnary = checkTokenBeforeUnaryOperator(prevTokenNotComment); + if (!isUnary && insertSpaceBeforeAndAfterBinaryOperators) { + requiredSpace = true; + } + break; + } case ASTokenTypes.TOKEN_OPERATOR_ASSIGNMENT: { inVarOrConstDeclaration = false; if (insertSpaceBeforeAndAfterBinaryOperators) { @@ -986,8 +992,6 @@ class FORMATTER { case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN: case ASTokenTypes.TOKEN_OPERATOR_LESS_THAN_EQUALS: case ASTokenTypes.TOKEN_OPERATOR_GREATER_THAN_EQUALS: - case ASTokenTypes.TOKEN_OPERATOR_PLUS: - case ASTokenTypes.TOKEN_OPERATOR_MINUS: case ASTokenTypes.TOKEN_OPERATOR_STAR: case ASTokenTypes.TOKEN_OPERATOR_DIVISION: case ASTokenTypes.TOKEN_OPERATOR_MODULO: @@ -1018,6 +1022,14 @@ class FORMATTER { } break; } + case ASTokenTypes.TOKEN_OPERATOR_PLUS: + case ASTokenTypes.TOKEN_OPERATOR_MINUS: { + boolean isUnary = checkTokenBeforeUnaryOperator(prevTokenNotComment); + if (!isUnary && insertSpaceBeforeAndAfterBinaryOperators && !skipWhitespaceBeforeSemicolon) { + requiredSpace = true; + } + break; + } case ASTokenTypes.TOKEN_COMMA: { if (insertSpaceAfterCommaDelimiter && !skipWhitespaceBeforeSemicolon) { requiredSpace = true; @@ -1216,6 +1228,13 @@ class FORMATTER { return builder.toString(); } + private boolean checkTokenBeforeUnaryOperator(IASToken token) { + return (token instanceof ASToken) ? ((ASToken) token).isOperator() + || token.getType() == ASTokenTypes.TOKEN_SQUARE_OPEN || token.getType() == ASTokenTypes.TOKEN_PAREN_OPEN + || token.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN || token.getType() == ASTokenTypes.TOKEN_SEMICOLON + : (token == null); + } + private int increaseIndent(int indent) { return indent + 1; } diff --git a/formatter/src/test/java/org/apache/royale/formatter/TestIdentifier.java b/formatter/src/test/java/org/apache/royale/formatter/TestIdentifier.java new file mode 100644 index 0000000..2f00d8a --- /dev/null +++ b/formatter/src/test/java/org/apache/royale/formatter/TestIdentifier.java @@ -0,0 +1,218 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// + +package org.apache.royale.formatter; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +public class TestIdentifier extends BaseFormatterTests { + @Test + public void testBasic() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "identifier;", + // @formatter:on + result); + } + + @Test + public void testUnaryPlus() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "+identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "+identifier;", + // @formatter:on + result); + } + + @Test + public void testUnaryPlusWithLeadingOperator() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "var a = +identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "var a = +identifier;", + // @formatter:on + result); + } + + @Test + public void testUnaryMinus() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "-identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "-identifier;", + // @formatter:on + result); + } + + @Test + public void testUnaryMinusWithLeadingOperator() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "var a = -identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "var a = -identifier;", + // @formatter:on + result); + } + + @Test + public void testUnaryMinusWithParentheses() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "(-identifier);", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "(-identifier);", + // @formatter:on + result); + } + + @Test + public void testUnaryMinusWithBrackets() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "a[-identifier];", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "a[-identifier];", + // @formatter:on + result); + } + + @Test + public void testUnaryMinusWithBlock() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "{\n" + + "\t-identifier;\n" + + "}", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "{\n" + + "\t-identifier;\n" + + "}", + // @formatter:on + result); + } + + @Test + public void testUnaryMinusWithSemicolon() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "a;\n" + + "-identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "a;\n" + + "-identifier;", + // @formatter:on + result); + } + + @Test + public void testNot() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "!identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "!identifier;", + // @formatter:on + result); + } + + @Test + public void testDoubleNot() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "!!identifier;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "!!identifier;", + // @formatter:on + result); + } +} \ No newline at end of file diff --git a/formatter/src/test/java/org/apache/royale/formatter/TestNumberLiteral.java b/formatter/src/test/java/org/apache/royale/formatter/TestNumberLiteral.java new file mode 100644 index 0000000..1148e8f --- /dev/null +++ b/formatter/src/test/java/org/apache/royale/formatter/TestNumberLiteral.java @@ -0,0 +1,77 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// + +package org.apache.royale.formatter; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class TestNumberLiteral extends BaseFormatterTests { + @Test + public void testFloat() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "123.4;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "123.4;", + // @formatter:on + result); + } + + @Test + public void testInt() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "123;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "123;", + // @formatter:on + result); + } + + @Test + public void testNegative() { + FORMATTER formatter = new FORMATTER(); + formatter.insertSpaceBeforeAndAfterBinaryOperators = true; + String result = formatter.formatText( + // @formatter:off + "-123;", + // @formatter:on + problems + ); + assertEquals( + // @formatter:off + "-123;", + // @formatter:on + result); + } +}
