Hey everyone, I recently created asformat, which is a formatter for ActionScript code. It is based on the Royale compiler's lexer that creates a stream of tokens. One nice thing about working with the token stream versus a full AST (Abstract Syntax Tree) is that it's easier to keep track of existing whitespace to preserve it where appropriate.
In addition to command line usage, this formatter is intended to eventually be used by IDEs/editors, such as VSCode and Moonshine. You can find asformat in nightly builds for now. I'm still testing it with existing codebases, but I wanted to share my progress so that others could check it out, if interested. Usage: Format a file, and write it back to the file system: asformat --write-files src/com/example/MyClass.as Alternatively, format all .as files in a directory: asformat --write-files src Options: --write-files: Writes the formatting changes back to the original files. If a file has no formatting changes, it will not be modified. Alias: -w. Default: false. --list-files: Lists the files that have been changed by formatting. If a file has no formatting changes, it won't be listed. Alias: -l. Default: false. --insert-spaces: Indents with spaces instead of tabs. (Default: false) --tab-width: The width of tabs when insert-spaces is specified. (Default: 4) --insert-final-new-line: Adds a final empty line at the end of the file, if one doesn't exist already. (Default: false) --open-brace-new-line: Controls whether an opening curly brace is placed on a new line, or is "cuddled" on the current line. (Default: true) --insert-space-for-loop-semicolon: Controls whether a space is inserted after the semicolons in a for() loop. (Default: true) --insert-space-control-flow-keywords: Controls whether a space is inserted between control flow keywords (like if, for, while) and the following ( open parenthesis. (Default: true) --insert-space-anonymous-function-keyword: Controls whether a space is inserted between the function keyword and the following ( open parenthesis, if the function is anonymous (if it doesn't have a name). (Default: false) --insert-space-binary-operators: Controls whether a space is inserted before and after binary operators (like +, -, *, /, &&, ||, etc.) (Default: true) --insert-space-comma-delimiter: Controls whether a space is inserted after comma delimiters in Object and Array literals. (Default: true) --collapse-empty-blocks: Controls whether empty blocks are collapsed so that the opening and closing curly brace are both on the same line or not. (Default: false) --max-preserve-new-lines: Specify the maximum number of new line characters that are allowed to appear consecutively. (Default: 2) --semicolons: Controls how semicolons are handled. Valid values are insert, remove, and ignore. Insert means that missing semicolons are inserted. Remove means that all semicolons are removed, and ignore means that there is no change to semicolons in the file. (Default: insert) Additional notes: If neither --write-files nor --list-files is specified, the formatted source code is written to standard output instead. If no files are specified, asformat waits for standard input instead. -- Josh Tynjala Bowler Hat LLC <https://bowlerhat.dev>