replace outer this references by outer paths.
They are called from erasure. There are two constraints which
suggest these operations should be done in erasure.
Replacing this references with outer paths loses aliasing information,
so programs will not typecheck with unerased types unless a lot of type
refinements are added. Therefore, outer paths should be computed no
earlier than erasure.
outer parameters should not show up in signatures, so again
they cannot be added before erasure.
outer arguments need access to outer parameters as well as to the
original type prefixes of types in New expressions. These prefixes
get erased during erasure. Therefore, outer arguments have to be passed
no later than erasure.
A path of outer accessors starting from node start. start defaults to the
context owner's this node. There are two alternative conditions that determine
where the path ends:
A path of outer accessors starting from node start. start defaults to the
context owner's this node. There are two alternative conditions that determine
where the path ends:
if the initial count parameter is non-negative: where the number of
outer accessors reaches count.
if the initial count parameter is negative: where the class symbol of
the type of the reached tree matches toCls.