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>

Reply via email to