# Syntax Tree Transformations

## for in vs. for =

By default if the RHS is a range, i.e. 1:10 then for in is converted to for =. Otherwise for = is converted to for in. See this issue for the rationale and further explanation.

Alternative to the above - setting always_for_in to true, i.e. format_text(..., always_for_in = true) will always convert = to in even if the RHS is a range. always_for_in=nothing will leave the choice of in vs = up to the user.

## Trailing Commas

If the node is iterable, for example a function call or list and is nested, a trailing comma is added to the last argument. The trailing comma is removed if unnested:

func(a, b, c)

->

func(
a,
b,
c,
)

See this issue for more details.

## Trailing Semicolons

If a matrix node is nested the semicolons are removed.

A = [1 0; 0 1]

->

A = [
1 0
0 1
]

See this issue for more details.

## Leading and trailing 0s for float literals

If a float literal is missing a trailing 0 it is added:

a = 1.

->

a = 1.0

If a float literal is missing a leading 0 it is added:

a = .1

->

a = 0.1

For Float32 if there is no decimal point, .0 is added:

a = 1f0

->

a = 1.0f0

See this issue for more details.

## Surround where arguments with curly brackets

If the arguments of a where call are not surrounded by curly brackets, they are added:

foo(x::T) where T = ...

->

foo(x::T) where {T} = ...

See this issue for more details.

## Annotate unannotated type fields with Any

struct Foo
field
end

->

struct Foo
field::Any
end

## Move @ in macro calls to the final identifier

@Module.macro

->

Module.@macro