Skip to content

Commit 83586fd

Browse files
committed
Add rules
1 parent 2a37da2 commit 83586fd

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

docs/docs/reference/unused-terms.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,55 @@ object Test {
144144
}
145145
}
146146
```
147+
148+
149+
Rules
150+
-----
151+
152+
1) The `unused` modifier can appear:
153+
* At the start of a parameter block of a method, function or class
154+
* In a method definition
155+
* In a `val` definition (but not `lazy val` or `var`)
156+
157+
```scala
158+
unused val x = ...
159+
unused def f = ...
160+
161+
def g(unused x: Int) = ...
162+
163+
(unused x: Int) => ...
164+
def h(x: unused Int => Int) = ...
165+
166+
class K(unused x: Int) { ... }
167+
```
168+
169+
2) A reference to an `unused` definition can only be used
170+
* Inside the expression of argument to an `unused` parameter
171+
* Inside the body of an `unused` `val` or `def`
172+
173+
3) Functions
174+
* `(unused x1: T1, x2: T2, ..., xN: TN) => y : (unused T1, T2, ..., TN) => R`
175+
* `(implicit unused x1: T1, x2: T2, ..., xN: TN) => y : (implicit unused T1, T2, ..., TN) => R`
176+
* `implicit unused T1 => R <:< unused T1 => R`
177+
* `(implicit unused T1, T2) => R <:< (unused T1, T2) => R`
178+
* ...
179+
180+
Note that there is no subtype relation between `unused T => R` and `T => R` (or `implicit unused T => R` and `implicit T => R`)
181+
182+
4) Eta expansion
183+
if `def f(unused x: T): U` then `f: (unused T) => U`.
184+
185+
186+
5) Erasure Semantics
187+
* All `unused` paramters are removed from the function
188+
* All argument to `unused` paramters are not passed to the function
189+
* All `unused` definitions are removed
190+
* All `(unused T1, T2, ..., TN) => R` and `(implicit unused T1, T2, ..., TN) => R` become `() => R`
191+
192+
6) Overloading
193+
Method with `unused` parameters will follow the normal overloading constraints after erasure.
194+
195+
7) Overriding
196+
* Member definitions overidding each other must both be `unused` or not be `unused`
197+
* `def foo(x: T): U` cannot be overriden by `def foo(unused x: T): U` an viceversa
198+

0 commit comments

Comments
 (0)