2023-08-02 17:03:33 +02:00

3.2 KiB

16. Formatter

Sample implementation of Simple language formatter.

Reference:

Code: SimpleBlock, SimpleFormattingModelBuilder

Testing:

The IntelliJ Platform includes a powerful framework for implementing formatting for custom languages. A formatter enables reformatting code automatically based on code style settings. The formatter controls spaces, indents, wrap, and alignment.

Define a Block

The formatting model represents the formatting structure of a file as a tree of Block objects, with associated indent, wrap, alignment and spacing settings. The goal is to cover each PSI element with such a block. Since each block builds its children's blocks, it can generate extra blocks or skip any PSI elements. Define SimpleBlock based on AbstractBlock.

{src="simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleBlock.java" include-symbol="SimpleBlock"}

Define a Formatting Model Builder

Define a formatter that removes extra spaces except for the single spaces around the property separator:

foo  =    bar
foo = bar

Create SimpleFormattingModelBuilder by implementing FormattingModelBuilder.

{src="simple_language_plugin/src/main/java/org/intellij/sdk/language/SimpleFormattingModelBuilder.java" include-symbol="SimpleFormattingModelBuilder"}

Register the Formatter

The SimpleFormattingModelBuilder implementation is registered with the IntelliJ Platform in the plugin configuration file using the com.intellij.lang.formatter extension point.

<extensions defaultExtensionNs="com.intellij">
  <lang.formatter
      language="Simple"
      implementationClass="org.intellij.sdk.language.SimpleFormattingModelBuilder"/>
</extensions>

Run the Project

Run the plugin by using the Gradle runIde task.

Open the example Simple Language properties file in the IDE Development Instance. Add some extra spaces around the = separator between language and English. Reformat the code by invoking Code | Reformat File... dialog and choose Run.

Formatter