Skip to content

Commit 684596f

Browse files
committed
Merge pull request #846 from kamalmarhubi/update-design-doc
doc: Update Design.md to mention syntex_syntax and config
2 parents c018a97 + 1a26a32 commit 684596f

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

Design.md

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -134,25 +134,34 @@ not worthwhile due to uniformity being desirable, but it is a useful goal).
134134

135135
### Architecture details
136136

137-
We use the AST from libsyntax. We use libsyntax's visit module to walk the AST
138-
to find starting points for reformatting. Eventually, we should reformat everything
139-
and we shouldn't need the visit module. We keep track of the last formatted
140-
position in the code, and when we reformat the next piece of code we make sure
141-
to output the span for all the code in between (handled by missed_spans.rs).
137+
We use the AST from [syntex_syntax], an export of rustc's libsyntax. We use
138+
syntex_syntax's visit module to walk the AST to find starting points for
139+
reformatting. Eventually, we should reformat everything and we shouldn't need
140+
the visit module. We keep track of the last formatted position in the code, and
141+
when we reformat the next piece of code we make sure to output the span for all
142+
the code in between (handled by missed_spans.rs).
143+
144+
[syntex_syntax]: https://crates.io/crates/syntex_syntax
145+
146+
We read in formatting configuration from a `rustfmt.toml` file if there is one.
147+
The options and their defaults are defined in `config.rs`. A `Config` object is
148+
passed throughout the formatting code, and each formatting routine looks there
149+
for its configuration.
142150

143151
Our visitor keeps track of the desired current indent due to blocks (
144-
`block_indent`). Each `visit_*` method reformats code according to this indent
145-
and `IDEAL_WIDTH` and `MAX_WIDTH` (which should one day be supplied from a
146-
config file). Most reformatting done in the `visit_*` methods is a bit hackey
147-
and is meant to be temporary until it can be done properly.
152+
`block_indent`). Each `visit_*` method reformats code according to this indent,
153+
`config.ideal_width` and `config.max_width`. Most reformatting done in the
154+
`visit_*` methods is a bit hackey and is meant to be temporary until it can be
155+
done properly.
148156

149157
There are a bunch of methods called `rewrite_*`. There do the bulk of the
150158
reformatting. These take the AST node to be reformatted (this may not literally
151-
be an AST node from libsyntax, there might be multiple parameters describing a
152-
logical node), the current indent, and the current width budget. They return a
153-
`String` (or sometimes an `Option<String>`) which formats the code in the box
154-
given by the indent and width budget. If the method fails, it returns `None` and
155-
the calling method then has to fallback in some way to give the callee more space.
159+
be an AST node from syntex_syntax: there might be multiple parameters
160+
describing a logical node), the current indent, and the current width budget.
161+
They return a `String` (or sometimes an `Option<String>`) which formats the
162+
code in the box given by the indent and width budget. If the method fails, it
163+
returns `None` and the calling method then has to fallback in some way to give
164+
the callee more space.
156165

157166
So, in summary to format a node, we calculate the width budget and then walk down
158167
the tree from the node. At a leaf, we generate an actual string and then unwind,

0 commit comments

Comments
 (0)