a fun language for serious programming

NAME

nitpretty - pretty print Nit code from Nit source files.

SYNOPSIS

nitpretty [options]... FILE

OPTIONS

--dir

Working directory (default is '.nitpretty').

-o, --output

Output name (default is pretty.nit).

--diff

Show diff between source and output.

--meld

Show diff between source and output using meld.

--check

Check format of Nit source files.

This option creates a temporary pretty printed file then checks if the output of the diff command on the source file and the pretty printed one is empty.

--break-strings

Break too long string literals.

--inline-do

Force do keyword on the same line as the method signature.

--skip-empty

Force formatting of empty lines.

By default empty lines are kept as they were typed in the file. When enabling this option, nitpretty will decide where to break lines and will put empty lines to separate properties and code blocks.

--line-width

Maximum length of lines (use 0 to disable automatic line breaks).

--no-inline

Disable automatic one-liners.

SPECIFICATION

The specification of the pretty printing is described here.

  • Default indentation level is one '\t' character and is increased by one for each indentation level.
  • Default line max-size is 80.

COMMENTS

There is many categories of comments:

Licence comments are attached to the top of the file no blank line before, one after.

# This is a licence comment

# Documentation for module `foo`
module foo

ADoc are documentation comments attached to a AModule, AClassdef, APropdef.

They are printed before the definition with a blank line before and no after at the same indentation level than the definition.

# Documentation for module `foo`
module foo

# Documentation for class `Bar`
class Bar
     # Documentation for method `baz`
     fun baz do end
end

Block comments are comments composed of one or more line rattached to nothing. They are displayed with one blank line before and after at current indent level.

<blank
# block
# comment
<blank

Attached comments are comments attached to a production. They are printed as this.

fun foo do # attached comment
end

nitpretty automatically remove multiple blanks between comments:

# Licence
# ...
<blank
# Block comment

INLINING

Productions are automatically inlined when possible.

Conditions:

  • The production must be syntactically inlinable
  • The inlined production length is less than PrettyPrinterVisitor::max-size
  • The production do not contains any comments

MODULES

  • There is a blank between the module declaration and its imports
  • There is no blank between imports and only one after
  • There is a blank between each extern block definition
  • There is a blank between each class definition
  • There is no blank line at the end of the module
# Documentation for module `foo`
module foo

import a
import b
import c

# Documentation for class `Bar`
class Bar end

class Baz end # not a `ADoc` comment

CLASSES

  • There is no blank between the class definition and its super-classes declarations
  • There is no blank between two inlined property definition
  • There is a blank between each block definition
  • There no blank line at the end of the class definition
# Documentation for class `Bar`
class Bar end

class Baz
    super Bar

    fun a is abstract
    private fun b do end

    fun c do
        # ...
    end
end

Generic types have no space after or before brackets and are separated by a comma and a space:

class A[E: Type1, F: Type1] end

BLOCKS

  • Inlined productions have no blank lines between them
  • Block productions have a blank before and after
var a = 10
var b = 0

if a > b then
     is positive
     print "positive"
end

print "end"

CALLS AND BINARY OPS

Arguments are always printed separated with a comma and a space:

foo(a, b, c)

Binary ops are always printed wrapped with spaces:

var c = 1 + 2

Calls and binary ops can be splitted to fit the max-size constraint. Breaking priority is given to arguments declaration after the comma.

return foo("aaaaaaaaaaaaaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbbbbbbbbbbb",
    "cccccccccccccccccccccccccc")

Binary ops can also be broken to fit the max-size limit:

return "aaaaaaaaaaaaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbbbbbbbbbbbbbbb" +
    "cccccccccccccccccccccccccc"