diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-10-03 22:04:59 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-10-04 10:55:11 -0700 |
commit | 657e85fe2412cdadc5ee9dc348159b32dcdfcba7 (patch) | |
tree | 28738fe4f1870a47e06c505d073f52567e8d29ab /test/files/pos/sammy_poly.scala | |
parent | e864129a7e7f01d76e177d1bba46d54aea39368e (diff) | |
download | scala-657e85fe2412cdadc5ee9dc348159b32dcdfcba7.tar.gz scala-657e85fe2412cdadc5ee9dc348159b32dcdfcba7.tar.bz2 scala-657e85fe2412cdadc5ee9dc348159b32dcdfcba7.zip |
Single Abstract Method support: synthesis helpers
`synthesizeSAMFunction` will be used to expand the following tree:
```
{ (p1: T1, ..., pN: TN) => body } : S
```
to:
```
{
def apply$body(p1: T1, ..., pN: TN): T = body
new S { def apply(p1: T1, ..., pN: TN): T = apply$body(p1,..., pN) }
}
```
The expansion assumes `S` (the expected type) defines a single abstract method
(let's call that method `apply` for simplicity).
1. If 'T' is not fully defined, it is inferred by type checking
`def apply$body` without a result type before type checking the block.
The method's inferred result type is used instead of T`.
[See test/files/pos/sammy_poly.scala]
2. To more easily enforce S's members are not in scope in `body`, that tree
goes to the `apply$body` method that's outside the anonymous subclass of S.
(The separate `apply$body` method simplifies the implementation of 1&2.)
3. The following restrictions apply to S:
1. Its primary constructor (if any) must be public, no-args, not overloaded.
2. S must have exactly one abstract member, its SAM
3. SAM must take exactly one argument list
4. SAM must be monomorphic
We may later relax these requirements to allow an implicit argument list,
both on the constructor and the SAM. Could also let the SAM be polymorphic.
Diffstat (limited to 'test/files/pos/sammy_poly.scala')
0 files changed, 0 insertions, 0 deletions