The implicit scope of a type tp, which is specified by the following definitions.
The implicit scope of a type tp, which is specified by the following definitions.
A reference is an anchor if it refers to an object, a class, a trait, an abstract type, an opaque type alias, or a match type alias. References to packages and package objects are anchors only under -source:3.0-migration.
The anchors of a type T is a set of references defined as follows:
If T is a reference to an anchor, T itself plus, if T is of the form P#A, the anchors of P.
If T is an alias of U, the anchors of U.
If T is a reference to a type parameter, the union of the anchors of both of its bounds.
If T is a singleton reference, the anchors of its underlying type, plus, if T is of the form (P#x).type, the anchors of P.
If T is the this-type of a static object, the anchors of a term reference to that object.
If T is some other this-type P.this.type, the anchors of P.
If T is some other type, the union of the anchors of each constituent type of T.
The implicit scope of a type tp is the smallest set S of term references (i.e. TermRefs) such that
If T is a reference to a class, S includes a reference to the companion object of the class, if it exists, as well as the implicit scopes of all of T's parent classes.
If T is a reference to an object, S includes T itself as well as the implicit scopes of all of T's parent classes.
If T is a reference to an opaque type alias named A, S includes a reference to an object A defined in the same scope as the type, if it exists, as well as the implicit scope of T's underlying type or bounds.
If T is a reference to an an abstract type or match type alias named A, S includes a reference to an object A defined in the same scope as the type, if it exists, as well as the implicit scopes of T's lower and upper bound, if present.
If T is a reference to an anchor of the form p.A then S also includes all term references on the path p.
If T is some other type, S includes the implicit scopes of all anchors of T.