Around 2015 or so, I had never worked on a compiler, formatter, or linter.

I started trying to use the Royale compiler (still called the FlexJS
compiler at the time) to create the AS3/MXML extension for VSCode. Soon, I
found a bug in the compiler that prevented my VSCode extension from working
properly. I tried my best to understand a small section of the compiler's
code, and I was able to fix the bug and submit a pull request. Eventually,
I fixed some more bugs, and I was asked to join the project as a
contributor. Since then, I've learned how larger and larger parts of the
compiler work. To be honest, it took probably 5-7 years before I really
felt that I understood most of what the compiler was doing. It just takes a
lot of time and persistence.

Recently, I was able to recognize that I could reuse large parts of the
compiler's code to create a formatter and a linter for ActionScript (the
ActionScript language name is where the "as" prefix of "asformat" and
"aslint" comes from, of course). I had never created a formatter or a
linter before, and it took some trial and error to figure out the best way
to do things. For the formatter, I tried to format one little thing first,
like `if (condition) {}` or something like that. Then, I slowly added more
and more (for, while, try/catch, class A extends B, etc.). It took months
of work, which was built on my previous years of work understanding and
maintaining the compiler.

Honestly, like most of everything I've ever tried to learn, I started with
one small thing. Don't try to understand everything all at once. At least
not in detail. It's often fine to have a general idea of how something
works at a high-level, even if you don't understand it completely. Then,
you can dive into the details later. Anyway, over the course of years
working on the same thing, you can really learn a lot.

--
Josh Tynjala
Bowler Hat LLC <https://bowlerhat.dev>


On Wed, Sep 28, 2022 at 1:00 PM Maria Jose Esteve <mjest...@iest.com> wrote:

> How can you know about so many things? asformat, aslint, linter... omg,
> you guys never cease to amaze me... I had to look up the meaning of each of
> these words :(
>
> I don't feel able to help you with any of this but, Yishay, if you teach
> me I can be your backup for the releases.
>
> Hiedra
>
> -----Mensaje original-----
> De: Yishay Weiss <yishayj...@hotmail.com>
> Enviado el: miƩrcoles, 28 de septiembre de 2022 20:16
> Para: dev@royale.apache.org
> Asunto: RE: Introducing asformat
>
> It's great to see this progress. I expect to see as-linter replacing
> SonarQube in our current project. Do you think it would be hard to
> integrate it with GitHub actions?
>
> The -watch option is already being used and is a big productivity boost.
>
> I expect I'll make use of asformat at some point as well. Thanks for all
> this Josh.
>
> I may get some time at the end of this month to work on a release, but I
> would prefer to do it with another volunteer, to share knowledge and add
> redundancy. Also, I want to use the new Azure VM I created (Apache funded)
> instead of Alex's so we have redundancy in that respect as well.  The VM
> isn't all set up yet so I will need to work on that.
>
>
>
>
>
> From: Josh Tynjala<mailto:joshtynj...@bowlerhat.dev>
> Sent: Wednesday, September 28, 2022 6:35 PM
> To: dev@royale.apache.org<mailto:dev@royale.apache.org>
> Subject: Re: Introducing asformat
>
> A new release sounds good to me! I just updated the compiler release
> notes, and there's a decent amount of stuff to be included. Not just these
> formatter improvements, but also the new linter, headless JS RoyaleUnit
> tests with Playwright, and the --watch compiler option are all new since
> the last release.
>
> --
> Josh Tynjala
> Bowler Hat LLC <https://bowlerhat.dev>
>
>
> On Wed, Sep 28, 2022 at 6:45 AM Harbs <harbs.li...@gmail.com> wrote:
>
> > That's great!
> >
> > This is a good reason to get another release out. :-)
> >
> > Harbs
> >
> > > On Sep 28, 2022, at 12:24 AM, Josh Tynjala
> > > <joshtynj...@bowlerhat.dev>
> > wrote:
> > >
> > > I just wanted to follow up by mentioning that I recently added the
> > ability for the formatter load configuration files, in addition to the
> > existing command line options. It will automatically detect an
> > asformat-config.xml file in the current working directory, allowing
> > you to easily specify configuration options for a specific project.
> > You can also use a new -load-config option to load a configuration
> > file from any path, not just the current working directory. You can
> > use -skip-local-config-file to ignore the asformat-config.xml file.
> > >
> > > Once we release the next Royale update, I plan to make
> > > vscode-as3mxml
> > automatically detect the asformat-config.xml file too, so you will be
> > able to configure formatting options for both the command line and
> > VSCode at the same time.
> > >
> > > I also updated the Royale documentation to add a section for the
> > formatter:
> > >
> > > https://apache.github.io/royale-docs/formatter <
> > https://apache.github.io/royale-docs/formatter><https://apache.github.
> > io/royale-docs/formatter%3e>
> > >
> > > --
> > > Josh Tynjala
> > > Bowler Hat LLC <https://bowlerhat.dev/>
> > >
> > >
> > > On Wed, Sep 22, 2021 at 10:42 AM Josh Tynjala
> > > <joshtynj...@bowlerhat.dev
> > <mailto:joshtynj...@bowlerhat.dev>> wrote:
> > > 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