You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -117,6 +117,109 @@ Additionally, I use `cargo run --release -p rust-analyzer -- analysis-stats
117
117
path/to/some/rust/crate` to run a batch analysis. This is primarily useful for
118
118
performance optimizations, or for bug minimization.
119
119
120
+
# Code Style & Review Process
121
+
122
+
Our approach to "clean code" is two fold:
123
+
124
+
* We generally don't block PRs on style changes.
125
+
* At the same time, all code in rust-analyzer is constantly refactored.
126
+
127
+
It is explicitly OK for reviewer to flag only some nits in the PR, and than send a follow up cleanup PR for things which are easier to explain by example, cc-ing the original author.
128
+
Sending small cleanup PRs (like rename a single local variable) is encouraged.
129
+
130
+
## Scale of Changes
131
+
132
+
Everyone knows that it's better to send small & focused pull requests.
133
+
The problem is, sometimes you *have* to, eg, rewrite the whole compiler, and that just doesn't fit into a set of isolated PRs.
134
+
135
+
The main thing too keep an eye on is the boundaries between various components.
136
+
There are three kinds of changes:
137
+
138
+
1. Internals of a single component are changed.
139
+
Specifically, you don't change any `pub` items.
140
+
A good example here would be an addition of a new assist.
141
+
142
+
2. API of a component is expanded.
143
+
Specifically, you add a new `pub` function which wasn't there before.
144
+
A good example here would be expansion of assist API, for example, to implement lazy assists or assists groups.
145
+
146
+
3. A new dependency between components is introduced.
147
+
Specifically, you add a `pub use` reexport from another crate or you add a new line to `[dependencies]` section of `Cargo.toml`.
148
+
A good example here would be adding reference search capability to the assists crates.
149
+
150
+
For the first group, the change is generally merged as long as:
151
+
152
+
* it works for the happy case,
153
+
* it has tests,
154
+
* it doesn't panic for unhappy case.
155
+
156
+
For the second group, the change would be subjected to quite a bit of scrutiny and iteration.
157
+
The new API needs to be right (or at least easy to change later).
158
+
The actual implementation doesn't matter that much.
159
+
It's very important to minimize the amount of changed lines of code for changes of the second kind.
160
+
Often, you start doing change of the first kind, only to realise that you need to elevate to a change of the second kind.
161
+
In this case, we'll probably ask you to split API changes into a separate PR.
162
+
163
+
Changes of the third group should be pretty rare, so we don't specify any specific process for them.
164
+
That said, adding an innocent-looking `pub use` is a very simple way to break encapsulation, keep an eye on it!
165
+
166
+
Note: if you enjoyed this abstract hand-waving about boundaries, you might appreciate
0 commit comments