[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[qvto-dev] What are the mapping refinement rules
|
Hi
When preparing my "QVT Traceability : What does it really mean?"
presentation to AMT 2015, I was forced to think hard about mapping
signatures and their relationships.
https://www.eclipse.org/mmt/qvt/docs/ICMT2014/QVTtraceability.pdf
http://www.slideshare.net/EdWillink/qvt-traceability-what-does-it-really-mean
Declaratively, independent mappings are all invoked independently,
dependent mappings such as refinements are arbitrated by their
predicates to select the best of a group of related mappings.
Imperatively, it is much simpler, mappings are explicitly invoked, so
exactly one compatible mapping is invoked per source object.
The simplest case is the invoked name corresponds to a declared mapping.
More interesting, the invoked name corresponds to a disjuncted mapping
allowing the best match of the explicit disjuncts to be invoked, else null.
I am unclear about what happens when the invoked name corresponds to a
family of 'overloaded' mappings analoguous to Java operation overloads.
e.g.
mapping A::doIt() : AA {...}
mapping B::doIt() : BB {...}
mapping C::doIt() : CC {...}
where C and B extend A
I presume that in QVTo we choose the most derived analoguously to Java.
I'm inclined to clarify this situation by defining such overloads as
implicit disjuncts, so that all colliding names contribute to a disjunct
The example is then equivalent to
mapping A::doIt() : AA
disjuncts B::doIt, C::doIt {...}
mapping B::doIt() : BB {...}
mapping C::doIt() : CC {...}
This could make disjuncts extensible since an extending transformation
could supply additional name collisions for the explicitly/implicitly
disjuncted mapping.
In order to give deterministic dispatch, the order of disjuncts is:
explicit disjuncts first, then implicit disjuncts successively ordered
by the following criteria
- most derived source type,
- most derived first argument type,
- most derived second argument type,
- etc
- alphabetically by containing class name,
- alphabetically by containing class' containing package name,
- etc
The signatures of refinements are unclear. Since a mapping is explicitly
invoked, we clearly require that disjuncting mappings have the same
number, position and direction of arguments and a covariant
(same/derived) return type. (An explicit disjunct may omit trailing in
arguments.)
Since we are invoking mappings with predicates rather than invoking
operations, we may allow disjuncting mappings to also have covariant or
even contravariant arguments. When a disjuncting mapping has a distinct
in/inout argument type, it is equivalent to an oclIsKindOf() when
predicate for that argument type with a subsequent oclAsType() in the body.
Regards
Ed Willink