Treatment of Comments
Tombi provides sophisticated comment interpretation to support automatic sorting.
While most users will learn how comments are handled by observing the formatter's behavior, this page offers a systematic understanding of Tombi's comment treatment.
Terminology
In TOML files, there are three types of comments:
- Leading comments
- Trailing comment
- Dangling comments
Types 1 and 2 are associated with specific elements. Leading comments appear on the lines before an element and can span multiple consecutive lines. Trailing comment appear at the end of the line after an element and are limited to one per line.
# leading comment1
# leading comment2
key = "value" # trailing comment
Type 3, Dangling comments, are comments that are not associated with any specific element.
# dangling comment1
# dangling comment2
key = "value"
# dangling comment3
# dangling comment4
It is impossible to automatically sort Dangling Comments.
Consider this example:
# dangling comment1
key2 = "value2"
# dangling comment2
# leading comment1
# leading comment2
key1 = "value1" # trailing comment
# dangling comment3
# dangling comment4
When sorting keys in ascending order, key1
should come before key2
.
But where should dangling comment2
be placed? Before key1
or after key2
?
Tombi cannot determine which element the comment is intended for.
Should we use AI to interpret the comment content?
No, Tombi solves this problem through a set of special rules.
Limiting the Use of Dangling Comments
The key to Tombi's ability to auto-sort is treating some comments that appear to be Dangling Comments as Leading Comments.
Tombi allows Dangling Comments to be placed before and after key values, and before and after the brackets of arrays and inline tables.
# dangling comment
# dangling comment
key = "value"
# dangling comment
# dangling comment
[table]
# dangling comment
# dangling comment
key = [
# dangling comment
# dangling comment
"value",
# dangling comment
# dangling comment
]
# dangling comment
# dangling comment
[[array_of_table]]
# dangling comment
# dangling comment
key = {
# dangling comment
# dangling comment
key = "value"
# dangling comment
# dangling comment
}
# dangling comment
# dangling comment
Dangling comments can be separated by blank lines, allowing multiple groups to be placed.
# dangling comment
# dangling comment
# dangling comment
# dangling comment
# dangling comment
# dangling comment
The proposed TOML v1.1.0 specification allows multi-line and trailing commas in Inline Tables.
What happens to dangling comments in other locations?
Merging Leading Comments
Consider a case where comments exist between key values, where dangling comments are not allowed:
key1 = 1
# dangling comment?
# dangling comment?
# dangling comment?
# dangling comment?
key2 = 2
In such cases, Tombi treats these dangling comments as leading comments and removes blank lines between them:
key1 = 1
# dangling comment?
# dangling comment?
# dangling comment?
# dangling comment?
key2 = 2
Through this special pre-processing, Tombi maintains the meaning of comments while enabling automatic sorting.
Summary of Comment Handling
Let's examine a comprehensive example to understand how Tombi handles comments:
# dangling comment
# dangling comment
# leading comment
# leading comment
key1 = 1 # trailing comment
# leading comment
# leading comment
# leading comment
# leading comment
key2 = 2 # trailing comment
# dangling comment
# dangling comment
# leading comment
# leading comment
[table]
# dangling comment
# dangling comment
# dangling comment
# leading comment
# leading comment
key1 = 1 # trailing comment
# leading comment
# leading comment
# leading comment
key2 = [
# dangling comment
# dangling comment
# leading comment
# leading comment
"value1", # trailing comment
# leading comment
# leading comment
# leading comment
# leading comment
"value2", # trailing comment
# dangling comment
# dangling comment
# dangling comment
# dangling comment
] # trailing comment
# dangling comment
# dangling comment
# leading comment
[[array_of_table]]
# dangling comment
# dangling comment
key1 = {
# dangling comment
# dangling comment
# dangling comment
# dangling comment
# leading comment
# leading comment
key1 = "value1", # trailing comment
# leading comment
# leading comment
# leading comment
# leading comment
key2 = "value2" # trailing comment
# leading comment
# leading comment
# leading comment
, # trailing comment
# dangling comment
# dangling comment
# dangling comment
# dangling comment
} # trailing comment
# dangling comment
# dangling comment
# dangling comment
After formatting, the comments are rearranged as follows:
# dangling comment
# dangling comment
# leading comment
# leading comment
key1 = 1 # trailing comment
# leading comment
# leading comment
# leading comment
# leading comment
key2 = 2 # trailing comment
# dangling comment
# dangling comment
# leading comment
# leading comment
[table]
# dangling comment
# dangling comment
# dangling comment
# leading comment
# leading comment
key1 = 1 # trailing comment
# leading comment
# leading comment
# leading comment
key2 = [
# dangling comment
# dangling comment
# leading comment
# leading comment
"value1", # trailing comment
# leading comment
# leading comment
# leading comment
# leading comment
"value2", # trailing comment
# dangling comment
# dangling comment
# dangling comment
# dangling comment
] # trailing comment
# dangling comment
# dangling comment
# leading comment
[[array_of_table]]
# dangling comment
# dangling comment
key1 = {
# dangling comment
# dangling comment
# dangling comment
# dangling comment
# leading comment
# leading comment
key1 = "value1", # trailing comment
# leading comment
# leading comment
# leading comment
# leading comment
key2 = "value2" # trailing comment
# leading comment
# leading comment
# leading comment
, # trailing comment
# dangling comment
# dangling comment
# dangling comment
# dangling comment
} # trailing comment
# dangling comment
# dangling comment
# dangling comment
Through this intelligent comment interpretation, Tombi enables automatic sorting 🚀