Skip to content

Commit ee0dd75

Browse files
committed
samplee output
1 parent 5436979 commit ee0dd75

File tree

1 file changed

+105
-93
lines changed

1 file changed

+105
-93
lines changed

src/walkthrough.md

Lines changed: 105 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
# Walkthrough: a typical contribution
22

33
There are _a lot_ of ways to contribute to the Rust compiler, including fixing
4-
bugs, improving performance, helping design features, providing feedback on
5-
existing features, etc. This chapter does not claim to scratch the surface.
6-
Instead, it walks through the design and implementation of a new feature. Not
7-
all of the steps and processes described here are needed for every
4+
bugs, improving performance, helping design features, providing feedback on existing features, etc.
5+
This chapter does not claim to scratch the surface.
6+
Instead, it walks through the design and implementation of a new feature.
7+
Not all of the steps and processes described here are needed for every
88
contribution, and I will try to point those out as they arise.
99

1010
In general, if you are interested in making a contribution and aren't sure
1111
where to start, please feel free to ask!
1212

1313
## Overview
1414

15-
The feature I will discuss in this chapter is the `?` Kleene operator for
16-
macros. Basically, we want to be able to write something like this:
15+
The feature I will discuss in this chapter is the `?` Kleene operator for macros.
16+
Basically, we want to be able to write something like this:
1717

1818
```rust,ignore
1919
macro_rules! foo {
@@ -36,25 +36,30 @@ fn main() {
3636
So basically, the `$(pat)?` matcher in the macro means "this pattern can occur
3737
0 or 1 times", similar to other regex syntaxes.
3838

39-
There were a number of steps to go from an idea to stable Rust feature. Here is
40-
a quick list. We will go through each of these in order below. As I mentioned
41-
before, not all of these are needed for every type of contribution.
39+
There were a number of steps to go from an idea to stable Rust feature.
40+
Here is a quick list.
41+
We will go through each of these in order below.
42+
As I mentioned before, not all of these are needed for every type of contribution.
4243

4344
- **Idea discussion/Pre-RFC** A Pre-RFC is an early draft or design discussion
44-
of a feature. This stage is intended to flesh out the design space a bit and
45-
get a grasp on the different merits and problems with an idea. It's a great
46-
way to get early feedback on your idea before presenting it to the wider
47-
audience. You can find the original discussion [here][prerfc].
45+
of a feature.
46+
This stage is intended to flesh out the design space a bit and
47+
get a grasp on the different merits and problems with an idea.
48+
It's a great way to get early feedback on your idea before presenting it to the wider
49+
audience.
50+
You can find the original discussion [here][prerfc].
4851
- **RFC** This is when you formally present your idea to the community for
49-
consideration. You can find the RFC [here][rfc].
52+
consideration.
53+
You can find the RFC [here][rfc].
5054
- **Implementation** Implement your idea unstably in the compiler. You can
5155
find the original implementation [here][impl1].
5256
- **Possibly iterate/refine** As the community gets experience with your
5357
feature on the nightly compiler and in `std`, there may be additional
54-
feedback about design choice that might be adjusted. This particular feature
55-
went [through][impl2] a [number][impl3] of [iterations][impl4].
58+
feedback about design choice that might be adjusted.
59+
This particular feature went [through][impl2] a [number][impl3] of [iterations][impl4].
5660
- **Stabilization** When your feature has baked enough, a Rust team member may
57-
[propose to stabilize it][merge]. If there is consensus, this is done.
61+
[propose to stabilize it][merge].
62+
If there is consensus, this is done.
5863
- **Relax** Your feature is now a stable Rust feature!
5964

6065
[prerfc]: https://internals.rust-lang.org/t/pre-rfc-at-most-one-repetition-macro-patterns/6557
@@ -75,58 +80,62 @@ before, not all of these are needed for every type of contribution.
7580
7681
[rfcwhen]: https://github.com/rust-lang/rfcs#when-you-need-to-follow-this-process
7782

78-
An RFC is a document that describes the feature or change you are proposing in
79-
detail. Anyone can write an RFC; the process is the same for everyone,
83+
An RFC is a document that describes the feature or change you are proposing in detail.
84+
Anyone can write an RFC; the process is the same for everyone,
8085
including Rust team members.
8186

82-
To open an RFC, open a PR on the
83-
[rust-lang/rfcs](https://github.com/rust-lang/rfcs) repo on GitHub. You can
84-
find detailed instructions in the
87+
To open an RFC, open a PR on the [rust-lang/rfcs](https://github.com/rust-lang/rfcs) repo on GitHub.
88+
You can find detailed instructions in the
8589
[README](https://github.com/rust-lang/rfcs#what-the-process-is).
8690

8791
Before opening an RFC, you should do the research to "flesh out" your idea.
88-
Hastily-proposed RFCs tend not to be accepted. You should generally have a good
89-
description of the motivation, impact, disadvantages, and potential
92+
Hastily-proposed RFCs tend not to be accepted.
93+
You should generally have a good description of the motivation, impact, disadvantages, and potential
9094
interactions with other features.
9195

92-
If that sounds like a lot of work, it's because it is. But no fear! Even if
96+
If that sounds like a lot of work, it's because it is.
97+
But no fear! Even if
9398
you're not a compiler hacker, you can get great feedback by doing a _pre-RFC_.
94-
This is an _informal_ discussion of the idea. The best place to do this is
95-
internals.rust-lang.org. Your post doesn't have to follow any particular
96-
structure. It doesn't even need to be a cohesive idea. Generally, you will get
97-
tons of feedback that you can integrate back to produce a good RFC.
99+
This is an _informal_ discussion of the idea.
100+
The best place to do this is internals.rust-lang.org.
101+
Your post doesn't have to follow any particular structure.
102+
It doesn't even need to be a cohesive idea.
103+
Generally, you will get tons of feedback that you can integrate back to produce a good RFC.
98104

99-
(Another pro-tip: try searching the RFCs repo and internals for prior related
100-
ideas. A lot of times an idea has already been considered and was either
101-
rejected or postponed to be tried again later. This can save you and everybody
102-
else some time)
105+
(Another pro-tip: try searching the RFCs repo and internals for prior related ideas.
106+
A lot of times an idea has already been considered and was either
107+
rejected or postponed to be tried again later.
108+
This can save you and everybody else some time)
103109

104110
In the case of our example, a participant in the pre-RFC thread pointed out a
105-
syntax ambiguity and a potential resolution. Also, the overall feedback seemed
106-
positive. In this case, the discussion converged pretty quickly, but for some
111+
syntax ambiguity and a potential resolution.
112+
Also, the overall feedback seemed positive.
113+
In this case, the discussion converged pretty quickly, but for some
107114
ideas, a lot more discussion can happen (e.g. see [this RFC][nonascii] which
108-
received a whopping 684 comments!). If that happens, don't be discouraged; it
109-
means the community is interested in your idea, but it perhaps needs some
110-
adjustments.
115+
received a whopping 684 comments!).
116+
If that happens, don't be discouraged; it
117+
means the community is interested in your idea, but it perhaps needs some adjustments.
111118

112119
[nonascii]: https://github.com/rust-lang/rfcs/pull/2457
113120

114-
The RFC for our `?` macro feature did receive some discussion on the RFC thread
115-
too. As with most RFCs, there were a few questions that we couldn't answer by
116-
discussion: we needed experience using the feature to decide. Such questions
117-
are listed in the "Unresolved Questions" section of the RFC. Also, over the
118-
course of the RFC discussion, you will probably want to update the RFC document
121+
The RFC for our `?` macro feature did receive some discussion on the RFC thread too.
122+
As with most RFCs, there were a few questions that we couldn't answer by
123+
discussion: we needed experience using the feature to decide.
124+
Such questions are listed in the "Unresolved Questions" section of the RFC.
125+
Also, over the course of the RFC discussion, you will probably want to update the RFC document
119126
itself to reflect the course of the discussion (e.g. new alternatives or prior
120127
work may be added or you may decide to change parts of the proposal itself).
121128

122129
In the end, when the discussion seems to reach a consensus and die down a bit,
123130
a Rust team member may propose to move to "final comment period" (FCP) with one
124-
of three possible dispositions. This means that they want the other members of
125-
the appropriate teams to review and comment on the RFC. More discussion may
126-
ensue, which may result in more changes or unresolved questions being added. At
127-
some point, when everyone is satisfied, the RFC enters the FCP, which is the
128-
last chance for people to bring up objections. When the FCP is over, the
129-
disposition is adopted. Here are the three possible dispositions:
131+
of three possible dispositions.
132+
This means that they want the other members of
133+
the appropriate teams to review and comment on the RFC.
134+
More discussion may ensue, which may result in more changes or unresolved questions being added.
135+
At some point, when everyone is satisfied, the RFC enters the FCP, which is the
136+
last chance for people to bring up objections.
137+
When the FCP is over, the disposition is adopted.
138+
Here are the three possible dispositions:
130139

131140
- _Merge_: accept the feature. Here is the proposal to merge for our [`?` macro
132141
feature][rfcmerge].
@@ -136,14 +145,14 @@ disposition is adopted. Here are the three possible dispositions:
136145
will go a different direction.
137146
- _Postpone_: there is interest in going this direction but not at the moment.
138147
This happens most often because the appropriate Rust team doesn't have the
139-
bandwidth to shepherd the feature through the process to stabilization. Often
140-
this is the case when the feature doesn't fit into the team's roadmap.
148+
bandwidth to shepherd the feature through the process to stabilization.
149+
Often this is the case when the feature doesn't fit into the team's roadmap.
141150
Postponed ideas may be revisited later.
142151

143152
[rfcmerge]: https://github.com/rust-lang/rfcs/pull/2298#issuecomment-360582667
144153

145-
When an RFC is merged, the PR is merged into the RFCs repo. A new _tracking
146-
issue_ is created in the [rust-lang/rust] repo to track progress on the feature
154+
When an RFC is merged, the PR is merged into the RFCs repo.
155+
A new _tracking issue_ is created in the [rust-lang/rust] repo to track progress on the feature
147156
and discuss unresolved questions, implementation progress and blockers, etc.
148157
Here is the tracking issue on for our [`?` macro feature][tracking].
149158

@@ -158,66 +167,71 @@ To make a change to the compiler, open a PR against the [rust-lang/rust] repo.
158167
[rust-lang/rust]: https://github.com/rust-lang/rust
159168

160169
Depending on the feature/change/bug fix/improvement, implementation may be
161-
relatively-straightforward or it may be a major undertaking. You can always ask
162-
for help or mentorship from more experienced compiler devs. Also, you don't
163-
have to be the one to implement your feature; but keep in mind that if you
164-
don't, it might be a while before someone else does.
170+
relatively-straightforward or it may be a major undertaking.
171+
You can always ask for help or mentorship from more experienced compiler devs.
172+
Also, you don't have to be the one to implement your feature;
173+
but keep in mind that if you don't, it might be a while before someone else does.
165174

166175
For the `?` macro feature, I needed to go understand the relevant parts of
167-
macro expansion in the compiler. Personally, I find that [improving the
176+
macro expansion in the compiler.
177+
Personally, I find that [improving the
168178
comments][comments] in the code is a helpful way of making sure I understand
169179
it, but you don't have to do that if you don't want to.
170180

171181
[comments]: https://github.com/rust-lang/rust/pull/47732
172182

173-
I then [implemented][impl1] the original feature, as described in the RFC. When
174-
a new feature is implemented, it goes behind a _feature gate_, which means that
175-
you have to use `#![feature(my_feature_name)]` to use the feature. The feature
176-
gate is removed when the feature is stabilized.
183+
I then [implemented][impl1] the original feature, as described in the RFC.
184+
When a new feature is implemented, it goes behind a _feature gate_, which means that
185+
you have to use `#![feature(my_feature_name)]` to use the feature.
186+
The feature gate is removed when the feature is stabilized.
177187

178188
**Most bug fixes and improvements** don't require a feature gate. You can just
179189
make your changes/improvements.
180190

181-
When you open a PR on the [rust-lang/rust], a bot will assign your PR to a
182-
reviewer. If there is a particular Rust team member you are working with, you can
191+
When you open a PR on the [rust-lang/rust], a bot will assign your PR to a reviewer.
192+
If there is a particular Rust team member you are working with, you can
183193
request that reviewer by leaving a comment on the thread with `r?
184194
@reviewer-github-id` (e.g. `r? @eddyb`). If you don't know who to request,
185195
don't request anyone; the bot will assign someone automatically based on which files you changed.
186196

187197
The reviewer may request changes before they approve your PR, they may mark the PR with label
188198
"S-waiting-on-author" after leaving comments, this means that the PR is blocked on you to make
189-
some requested changes. When you finished iterating on the changes, you can mark the PR as
199+
some requested changes.
200+
When you finished iterating on the changes, you can mark the PR as
190201
`S-waiting-on-review` again by leaving a comment with `@rustbot ready`, this will remove the
191202
`S-waiting-on-author` label and add the `S-waiting-on-review` label.
192203

193-
Feel free to ask questions or discuss things you don't understand or disagree with. However,
194-
recognize that the PR won't be merged unless someone on the Rust team approves
195-
it. If a reviewer leave a comment like `r=me after fixing ...`, that means they approve the PR and
204+
Feel free to ask questions or discuss things you don't understand or disagree with.
205+
However, recognize that the PR won't be merged unless someone on the Rust team approves
206+
it.
207+
If a reviewer leave a comment like `r=me after fixing ...`, that means they approve the PR and
196208
you can merge it with comment with `@bors r=reviewer-github-id`(e.g. `@bors r=eddyb`) to merge it
197-
after fixing trivial issues. Note that `r=someone` requires permission and bors could say
198-
something like "🔑 Insufficient privileges..." when commenting `r=someone`. In that case,
199-
you have to ask the reviewer to revisit your PR.
200-
201-
When your reviewer approves the PR, it will go into a queue for yet another bot
202-
called `@bors`. `@bors` manages the CI build/merge queue. When your PR reaches
203-
the head of the `@bors` queue, `@bors` will test out the merge by running all
204-
tests against your PR on GitHub Actions. This takes a lot of time to
205-
finish. If all tests pass, the PR is merged and becomes part of the next
206-
nightly compiler!
209+
after fixing trivial issues.
210+
Note that `r=someone` requires permission and bors could say
211+
something like "🔑 Insufficient privileges..." when commenting `r=someone`.
212+
In that case, you have to ask the reviewer to revisit your PR.
213+
214+
When your reviewer approves the PR, it will go into a queue for yet another bot called `@bors`.
215+
`@bors` manages the CI build/merge queue.
216+
When your PR reaches the head of the `@bors` queue, `@bors` will test out the merge by running all
217+
tests against your PR on GitHub Actions.
218+
This takes a lot of time to finish.
219+
If all tests pass, the PR is merged and becomes part of the next nightly compiler!
207220

208221
There are a couple of things that may happen for some PRs during the review process
209222

210223
- If the change is substantial enough, the reviewer may request an FCP on
211-
the PR. This gives all members of the appropriate team a chance to review the
212-
changes.
224+
the PR.
225+
This gives all members of the appropriate team a chance to review the changes.
213226
- If the change may cause breakage, the reviewer may request a [crater] run.
214227
This compiles the compiler with your changes and then attempts to compile all
215-
crates on crates.io with your modified compiler. This is a great smoke test
228+
crates on crates.io with your modified compiler.
229+
This is a great smoke test
216230
to check if you introduced a change to compiler behavior that affects a large
217231
portion of the ecosystem.
218232
- If the diff of your PR is large or the reviewer is busy, your PR may have
219-
some merge conflicts with other PRs that happen to get merged first. You
220-
should fix these merge conflicts using the normal git procedures.
233+
some merge conflicts with other PRs that happen to get merged first.
234+
You should fix these merge conflicts using the normal git procedures.
221235

222236
[crater]: ./tests/crater.html
223237

@@ -227,24 +241,22 @@ fixing a bug), then that's it! Thanks for your contribution :)
227241
## Refining your implementation
228242

229243
As people get experience with your new feature on nightly, slight changes may
230-
be proposed and unresolved questions may become resolved. Updates/changes go
231-
through the same process for implementing any other changes, as described
244+
be proposed and unresolved questions may become resolved.
245+
Updates/changes go through the same process for implementing any other changes, as described
232246
above (i.e. submit a PR, go through review, wait for `@bors`, etc).
233247

234-
Some changes may be major enough to require an FCP and some review by Rust team
235-
members.
248+
Some changes may be major enough to require an FCP and some review by Rust team members.
236249

237250
For the `?` macro feature, we went through a few different iterations after the
238251
original implementation: [1][impl2], [2][impl3], [3][impl4].
239252

240253
Along the way, we decided that `?` should not take a separator, which was
241-
previously an unresolved question listed in the RFC. We also changed the
242-
disambiguation strategy: we decided to remove the ability to use `?` as a
254+
previously an unresolved question listed in the RFC.
255+
We also changed the disambiguation strategy: we decided to remove the ability to use `?` as a
243256
separator token for other repetition operators (e.g. `+` or `*`). However,
244257
since this was a breaking change, we decided to do it over an edition boundary.
245258
Thus, the new feature can be enabled only in edition 2018. These deviations
246-
from the original RFC required [another
247-
FCP](https://github.com/rust-lang/rust/issues/51934).
259+
from the original RFC required [another FCP](https://github.com/rust-lang/rust/issues/51934).
248260

249261
## Stabilization
250262

@@ -264,8 +276,8 @@ The stabilization report for our feature is [here][stabrep].
264276
[stabrep]: https://github.com/rust-lang/rust/issues/48075#issuecomment-433243048
265277

266278
After this, [a PR is made][stab] to remove the feature gate, enabling the feature by
267-
default (on the 2018 edition). A note is added to the [Release notes][relnotes]
268-
about the feature.
279+
default (on the 2018 edition).
280+
A note is added to the [Release notes][relnotes] about the feature.
269281

270282
[stab]: https://github.com/rust-lang/rust/pull/56245
271283

0 commit comments

Comments
 (0)