Handles programmable member selections of Dynamic
instances and values
with structural types. Two functionalities:
- Translates selection that does not typecheck according to the scala.Dynamic rules: foo.bar(baz) = quux ~~> foo.selectDynamic(bar).update(baz, quux) foo.bar = baz ~~> foo.updateDynamic("bar")(baz) foo.bar(x = bazX, y = bazY, baz, ...) ~~> foo.applyDynamicNamed("bar")(("x", bazX), ("y", bazY), ("", baz), ...) foo.bar(baz0, baz1, ...) ~~> foo.applyDynamic(bar)(baz0, baz1, ...) foo.bar ~~> foo.selectDynamic(bar)
The first matching rule of is applied.
- Translates member selections on structural types to calls of
selectDynamic
orselectDynamicMethod
on aSelectable
instance. @See handleStructural.
Constructors
Members
Handle reflection-based dispatch for members of structural types.
Given x.a
, where x
is of (widened) type T
and x.a
is of type U
:
If U
is a value type,...
[U]
[(T1,...,Tn) => R]
Handle reflection-based dispatch for members of structural types.
Given x.a
, where x
is of (widened) type T
and x.a
is of type U
:
If U
is a value type, map x.a
to the equivalent of:
(x: Selectable).selectDynamic(x, "a").asInstanceOf[U]
If U
is a method type (T1,...,Tn)R, map x.a
to the equivalent of:
(x: Selectable).selectDynamicMethod("a", CT1, ..., CTn).asInstanceOf[(T1,...,Tn) => R]
where CT1,...,CTn are the class tags representing the erasure of T1,...,Tn.
It's an error if U is neither a value nor a method type, or a dependent method type, or of too large arity (limit is Definitions.MaxStructuralMethodArity).
Translate selection that does not typecheck according to the normal rules into a applyDynamic/applyDynamicNamed. foo.bar(baz0, baz1, ...)... [T0, ...] [T0, ...]
Translate selection that does not typecheck according to the normal rules into a applyDynamic/applyDynamicNamed. foo.bar(baz0, baz1, ...) ~~> foo.applyDynamic(bar)(baz0, baz1, ...) foo.bar[T0, ...](baz0, baz1, ...) ~~> foo.applyDynamicT0, ...(baz0, baz1, ...) foo.bar(x = bazX, y = bazY, baz, ...) ~~> foo.applyDynamicNamed("bar")(("x", bazX), ("y", bazY), ("", baz), ...) foo.bar[T0, ...](x = bazX, y = bazY, baz, ...) ~~> foo.applyDynamicNamedT0, ...(("x", bazX), ("y", bazY), ("", baz), ...)
Translate selection that does not typecheck according to the normal rules into a updateDynamic. foo.bar = baz ~~> foo.updateDynamic(bar)(baz)
Translate selection that does not typecheck according to the normal rules into a updateDynamic. foo.bar = baz ~~> foo.updateDynamic(bar)(baz)
Translate selection that does not typecheck according to the normal rules into a selectDynamic. foo.bar ~~> foo.selectDynamic(bar) foo.barT0, ....
[foo.bar(baz) = quux ~~> foo.bar.update(baz, quux)]
Translate selection that does not typecheck according to the normal rules into a selectDynamic. foo.bar ~~> foo.selectDynamic(bar) foo.bar[T0, ...] ~~> foo.selectDynamicT0, ...
Note: inner part of translation foo.bar(baz) = quux ~~> foo.selectDynamic(bar).update(baz, quux) is achieved through an existing transformation of in typedAssign [foo.bar(baz) = quux ~~> foo.bar.update(baz, quux)].