Skip to content

Commit 0aabecf

Browse files
chorman0773ehuss
authored andcommitted
Add identifier syntax to items.md and subchapters
1 parent 85c4a7a commit 0aabecf

16 files changed

+714
-50
lines changed

src/items.md

+39-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Items
22

3+
r[items]
4+
5+
r[items.syntax]
36
> **<sup>Syntax:<sup>**\
47
> _Item_:\
58
> &nbsp;&nbsp; [_OuterAttribute_]<sup>\*</sup>\
@@ -28,36 +31,71 @@
2831
> &nbsp;&nbsp; &nbsp;&nbsp; [_MacroInvocationSemi_]\
2932
> &nbsp;&nbsp; | [_MacroRulesDefinition_]
3033
31-
34+
r[items.intro]
3235
An _item_ is a component of a crate. Items are organized within a crate by a
3336
nested set of [modules]. Every crate has a single "outermost" anonymous module;
3437
all further items within the crate have [paths] within the module tree of the
3538
crate.
3639

40+
r[items.static-def]
3741
Items are entirely determined at compile-time, generally remain fixed during
3842
execution, and may reside in read-only memory.
3943

44+
r[items.kinds]
4045
There are several kinds of items:
4146

47+
r[items.kind-modules]
4248
* [modules]
49+
50+
r[items.kind-extern-crate]
4351
* [`extern crate` declarations]
52+
53+
r[items.kind-use]
4454
* [`use` declarations]
55+
56+
r[items.kind-fn]
4557
* [function definitions]
58+
59+
r[items.kind-type]
4660
* [type definitions]
61+
62+
r[items.kind-struct]
4763
* [struct definitions]
64+
65+
r[items.kind-enum]
4866
* [enumeration definitions]
67+
68+
r[items.kind-union]
4969
* [union definitions]
70+
71+
r[items.kind-const]
5072
* [constant items]
73+
74+
r[items.kind-static]
5175
* [static items]
76+
77+
r[items.kind-trait]
5278
* [trait definitions]
79+
80+
r[items.kind-impl]
5381
* [implementations]
82+
83+
r[items.kind-extern]
5484
* [`extern` blocks]
5585

86+
r[items.locations]
5687
Items may be declared in the [root of the crate], a [module][modules], or a [block expression].
88+
89+
r[items.associated-locations]
5790
A subset of items, called [associated items], may be declared in [traits] and [implementations].
91+
92+
r[items.extern-locations]
5893
A subset of items, called external items, may be declared in [`extern` blocks].
5994

95+
r[items.decl-order]
6096
Items may be defined in any order, with the exception of [`macro_rules`] which has its own scoping behavior.
97+
98+
r[items.name-resolution]
6199
[Name resolution] of item names allows items to be defined before or after where the item is referred to in the module or block.
62100

63101
See [item scopes] for information on the scoping rules of items.

src/items/associated-items.md

+73-14
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,62 @@
11
# Associated Items
22

3+
r[items.associated]
4+
5+
r[items.associated.syntax]
36
> **<sup>Syntax</sup>**\
47
> _AssociatedItem_ :\
58
> &nbsp;&nbsp; [_OuterAttribute_]<sup>\*</sup> (\
69
> &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [_MacroInvocationSemi_]\
710
> &nbsp;&nbsp; &nbsp;&nbsp; | ( [_Visibility_]<sup>?</sup> ( [_TypeAlias_] | [_ConstantItem_] | [_Function_] ) )\
811
> &nbsp;&nbsp; )
912
13+
r[items.associated.intro]
1014
*Associated Items* are the items declared in [traits] or defined in
1115
[implementations]. They are called this because they are defined on an associate
12-
type &mdash; the type in the implementation. They are a subset of the kinds of
13-
items you can declare in a module. Specifically, there are [associated
14-
functions] (including methods), [associated types], and [associated constants].
16+
type &mdash; the type in the implementation
17+
18+
r[items.associated.kinds]
19+
They are a subset of the kinds of items you can declare in a module.
20+
Specifically, there are [associated functions] (including methods), [associated types], and [associated constants].
1521

1622
[associated functions]: #associated-functions-and-methods
1723
[associated types]: #associated-types
1824
[associated constants]: #associated-constants
1925

26+
r[items.associated.related]
2027
Associated items are useful when the associated item logically is related to the
2128
associating item. For example, the `is_some` method on `Option` is intrinsically
2229
related to Options, so should be associated.
2330

31+
r[items.associated.decl-def]
2432
Every associated item kind comes in two varieties: definitions that contain the
2533
actual implementation and declarations that declare signatures for
2634
definitions.
2735

36+
r[items.associated.trait-items]
2837
It is the declarations that make up the contract of traits and what is available
2938
on generic types.
3039

3140
## Associated functions and methods
3241

42+
r[items.associated.fn]
43+
44+
r[items.associated.fn.intro]
3345
*Associated functions* are [functions] associated with a type.
3446

47+
r[items.associated.fn.decl]
3548
An *associated function declaration* declares a signature for an associated
3649
function definition. It is written as a function item, except the
3750
function body is replaced with a `;`.
3851

39-
The identifier is the name of the function. The generics, parameter list,
40-
return type, and where clause of the associated function must be the same as the
52+
r[items.associated.name]
53+
The identifier is the name of the function.
54+
55+
r[items.associated.constraint]
56+
The generics, parameter list, return type, and where clause of the associated function must be the same as the
4157
associated function declarations's.
4258

59+
r[items.associated.fn.def]
4360
An *associated function definition* defines a function associated with another
4461
type. It is written the same as a [function item].
4562

@@ -64,6 +81,7 @@ fn main () {
6481
}
6582
```
6683

84+
r[items.associated.fn.qualified-self]
6785
When the associated function is declared on a trait, the function can also be
6886
called with a [path] that is a path to the trait appended by the name of the
6987
trait. When this happens, it is substituted for `<_ as Trait>::function_name`.
@@ -86,10 +104,14 @@ let _: f64 = f64::from_i32(42);
86104

87105
### Methods
88106

107+
r[items.associated.fn.method]
108+
109+
r[items.associated.fn.method.intro]
89110
Associated functions whose first parameter is named `self` are called *methods*
90111
and may be invoked using the [method call operator], for example, `x.foo()`, as
91112
well as the usual function call notation.
92113

114+
r[items.associated.fn.method.constraint]
93115
If the type of the `self` parameter is specified, it is limited to types resolving
94116
to one generated by the following grammar (where `'lt` denotes some arbitrary
95117
lifetime):
@@ -99,6 +121,7 @@ P = &'lt S | &'lt mut S | Box<S> | Rc<S> | Arc<S> | Pin<P>
99121
S = Self | P
100122
```
101123

124+
r[items.associated.fn.method.self-ty]
102125
The `Self` terminal in this grammar denotes a type resolving to the implementing type.
103126
This can also include the contextual type alias `Self`, other type aliases,
104127
or associated type projections resolving to the implementing type.
@@ -127,6 +150,7 @@ impl Example {
127150
}
128151
```
129152

153+
r[associated.fn.method.self-pat-shorthands]
130154
Shorthand syntax can be used without specifying a type, which have the
131155
following equivalents:
132156

@@ -138,6 +162,7 @@ Shorthand | Equivalent
138162

139163
> **Note**: Lifetimes can be, and usually are, elided with this shorthand.
140164
165+
r[associated.fn.method.self-pat-mut]
141166
If the `self` parameter is prefixed with `mut`, it becomes a mutable variable,
142167
similar to regular parameters using a `mut` [identifier pattern]. For example:
143168

@@ -189,21 +214,30 @@ let circle_shape = Circle::new();
189214
let bounding_box = circle_shape.bounding_box();
190215
```
191216

217+
r[items.associated.fn.params-edition2015]
192218
> **Edition differences**: In the 2015 edition, it is possible to declare trait
193219
> methods with anonymous parameters (e.g. `fn foo(u8)`). This is deprecated and
194220
> an error as of the 2018 edition. All parameters must have an argument name.
195221
196222
#### Attributes on method parameters
197223

224+
r[items.associated.fn.param-attributes]
225+
198226
Attributes on method parameters follow the same rules and restrictions as
199227
[regular function parameters].
200228

201229
## Associated Types
202230

203-
*Associated types* are [type aliases] associated with another type. Associated
204-
types cannot be defined in [inherent implementations] nor can they be given a
231+
r[items.associated.type]
232+
233+
r[items.associated.type.intro]
234+
*Associated types* are [type aliases] associated with another type.
235+
236+
r[items.associated.type.constraint]
237+
Associated types cannot be defined in [inherent implementations] nor can they be given a
205238
default implementation in traits.
206239

240+
r[items.associated.type.decl]
207241
An *associated type declaration* declares a signature for associated type
208242
definitions. It is written in one of the following forms, where `Assoc` is the
209243
name of the associated type, `Params` is a comma-separated list of type,
@@ -221,13 +255,21 @@ type Assoc<Params> where WhereBounds;
221255
type Assoc<Params>: Bounds where WhereBounds;
222256
```
223257

224-
The identifier is the name of the declared type alias. The optional trait bounds
225-
must be fulfilled by the implementations of the type alias.
258+
r[items.associated.type.name]
259+
The identifier is the name of the declared type alias
260+
261+
r[items.associated.type.constraint-impl]
262+
The optional trait bounds must be fulfilled by the implementations of the type alias.
263+
264+
r[items.associated.type.sized]
226265
There is an implicit [`Sized`] bound on associated types that can be relaxed using the special `?Sized` bound.
227266

267+
r[items.associated.type.def]
228268
An *associated type definition* defines a type alias for the implementation
229-
of a trait on a type. They are written similarly to an *associated type declaration*,
230-
but cannot contain `Bounds`, but instead must contain a `Type`:
269+
of a trait on a type
270+
271+
r[items.associated.type.restriction-def]
272+
They are written similarly to an *associated type declaration*, but cannot contain `Bounds`, but instead must contain a `Type`:
231273

232274
<!-- ignore: illustrative example forms -->
233275
```rust,ignore
@@ -237,11 +279,15 @@ type Assoc<Params> = Type where WhereBounds;
237279
type Assoc<Params> where WhereBounds = Type; // deprecated, prefer the form above
238280
```
239281

282+
r[items.associated.type.alias]
240283
If a type `Item` has an associated type `Assoc` from a trait `Trait`, then
241284
`<Item as Trait>::Assoc` is a type that is an alias of the type specified in the
242-
associated type definition. Furthermore, if `Item` is a type parameter, then
243-
`Item::Assoc` can be used in type parameters.
285+
associated type definition
286+
287+
r[items.associated.type.param]
288+
Furthermore, if `Item` is a type parameter, then `Item::Assoc` can be used in type parameters.
244289

290+
r[items.associated.type.generic]
245291
Associated types may include [generic parameters] and [where clauses]; these are
246292
often referred to as *generic associated types*, or *GATs*. If the type `Thing`
247293
has an associated type `Item` from a trait `Trait` with the generics `<'a>` , the
@@ -300,7 +346,6 @@ fn borrow<'a, T: Lend>(array: &'a mut T) -> <T as Lend>::Lender<'a> {
300346
array.lend()
301347
}
302348

303-
304349
fn main() {
305350
let mut array = [0usize; 16];
306351
let lender = borrow(&mut array);
@@ -352,11 +397,15 @@ Given a reference to the associated type like `<X as Example>::Output<Y>`, the a
352397

353398
### Required where clauses on generic associated types
354399

400+
r[items.associated.type.generic-where-clause]
401+
402+
r[items.associated.type.generic-where-clause.intro]
355403
Generic associated type declarations on traits currently may require a list of
356404
where clauses, dependent on functions in the trait and how the GAT is used. These
357405
rules may be loosened in the future; updates can be found [on the generic
358406
associated types initiative repository](https://rust-lang.github.io/generic-associated-types-initiative/explainer/required_bounds.html).
359407

408+
r[items.associated.type.generic-where-clause.constraint-valid-fn]
360409
In a few words, these where clauses are required in order to maximize the allowed
361410
definitions of the associated type in impls. To do this, any clauses that *can be
362411
proven to hold* on functions (using the parameters of the function or trait)
@@ -373,6 +422,7 @@ In the above, on the `next` function, we can prove that `Self: 'a`, because of
373422
the implied bounds from `&'a mut self`; therefore, we must write the equivalent
374423
bound on the GAT itself: `where Self: 'x`.
375424

425+
r[items.associated.type.generic-where-clause.constraint-intersection]
376426
When there are multiple functions in a trait that use the GAT, then the
377427
*intersection* of the bounds from the different functions are used, rather than
378428
the union.
@@ -390,6 +440,7 @@ know that `T: 'a` on `create_checker`, we do not know that on `do_check`. Howeve
390440
if `do_check` was commented out, then the `where T: 'x` bound would be required
391441
on `Checker`.
392442

443+
r[items.associated.type.generic-where-clause.constraint-forward]
393444
The bounds on associated types also propagate required where clauses.
394445

395446
```rust
@@ -404,6 +455,7 @@ Here, `where Self: 'a` is required on `Item` because of `iter`. However, `Item`
404455
is used in the bounds of `Iterator`, the `where Self: 'a` clause is also required
405456
there.
406457

458+
r[items.associated.type.generic-where-clause.static]
407459
Finally, any explicit uses of `'static` on GATs in the trait do not count towards
408460
the required bounds.
409461

@@ -416,18 +468,25 @@ trait StaticReturn {
416468

417469
## Associated Constants
418470

471+
r[items.associated.const]
472+
473+
r[items.associated.const.intro]
419474
*Associated constants* are [constants] associated with a type.
420475

476+
r[items.associated.const.decl]
421477
An *associated constant declaration* declares a signature for associated
422478
constant definitions. It is written as `const`, then an identifier,
423479
then `:`, then a type, finished by a `;`.
424480

481+
r[items.associated.const.name]
425482
The identifier is the name of the constant used in the path. The type is the
426483
type that the definition has to implement.
427484

485+
r[items.associated.const.def]
428486
An *associated constant definition* defines a constant associated with a
429487
type. It is written the same as a [constant item].
430488

489+
r[items.associated.const.eval]
431490
Associated constant definitions undergo [constant evaluation] only when
432491
referenced. Further, definitions that include [generic parameters] are
433492
evaluated after monomorphization.

0 commit comments

Comments
 (0)