Catcall Test Proposal
This article describe an implementation made by Eiffel Software in October 2007 for a solution of the CATCALL issue. It is merely a variation of already explored solution.
Syntax changes
A Type declaration can be preceded by the keyword frozen
, that is to say:
a: frozen A
An actual generic parameter can be preceded by the keyword variant
, that is to say:
a: LIST [variant A]
New conformance rules
When the actual generic parameters are preceded by variant
then the existing conformance rules apply, otherwise it has to be the same type.
New validity rules
- The target of a call involving a covariantly redefined routine should either be marked
frozen
or else the call has to be valid for all descendant types. - If the formal arguments of a call involves a formal generic parameter, the corresponding actual should not be marked
variant
.
Implementation details
The tricky part in the above is the checks for the validity of a covariant call for all the descendant types of the target. The issue is when a descendant type is generic and the new formal generic parameter has not corresponding type in the ancestor. For example:
class A f (a: ANY) do end end class B [G] inherit A redefine f end feature f (a: STRING) do end end class TEST feature make is local a: A do a.f ("My String") end end end
In our case, we assume the descendant type to be instantiated with its constraint, in the above case B [ANY]
.