Denotations represent the meaning of symbols and named types.
The following diagram shows how the principal types of denotations
and their denoting entities relate to each other. Lines ending in
a down-arrow v are member methods. The two methods shown in the diagram are
"symbol" and "deref". Both methods are parameterized by the current context,
and are effectively indexed by current period.
Lines ending in a horizontal line mean subtyping (right is a subtype of left).
NamedType
| Symbol---------ClassSymbol
| | |
| denot | denot | denot
v v v
Denotation-+-----SingleDenotation-+------SymDenotation-+----ClassDenotation
| |
+-----MultiDenotation |
|
+--UniqueRefDenotation
+--JointRefDenotation
Here's a short summary of the classes in this diagram.
NamedType A type consisting of a prefix type and a name, with fields
prefix: Type
name: Name
It has two subtypes: TermRef and TypeRef
Symbol A label for a definition or declaration in one compiler run
ClassSymbol A symbol representing a class
Denotation The meaning of a named type or symbol during a period
MultiDenotation A denotation representing several overloaded members
SingleDenotation A denotation representing a non-overloaded member or definition, with main fields
symbol: Symbol
info: Type
UniqueRefDenotation A denotation referring to a single definition with some member type
JointRefDenotation A denotation referring to a member that could resolve to several definitions
SymDenotation A denotation representing a single definition with its original type, with main fields
name: Name
owner: Symbol
flags: Flags
privateWithin: Symbol
annotations: List[Annotation]
ClassDenotation A denotation representing a single class definition.
A denotation is the result of resolving
a name (either simple identifier or select) during a given period.
A denotation is the result of resolving
a name (either simple identifier or select) during a given period.
Denotations can be combined with & and |.
& is conjunction, | is disjunction.
& will create an overloaded denotation from two
non-overloaded denotations if their signatures differ.
Analogously | of two denotations with different signatures will give
an empty denotation NoDenotation.
A denotation might refer to NoSymbol. This is the case if the denotation
was produced from a disjunction of two denotations with different symbols
and there was no common symbol in a superclass that could substitute for
both symbols. Here is an example:
Say, we have:
class A { def f: A }
class B { def f: B }
val x: A | B = if (test) new A else new B
val y = x.f
Then the denotation of y is SingleDenotation(NoSymbol, A | B).
Attributes
symbol
The referencing symbol, or NoSymbol is none exists
An error denotation that provides more info about alternatives
that were found but that do not qualify.
Produced by staticRef, consumed by requiredSymbol.
An error denotation that provides more info about alternatives
that were found but that do not qualify.
Produced by staticRef, consumed by requiredSymbol.
A PreDenotation represents a group of single denotations or a single multi-denotation
It is used as an optimization to avoid forming MultiDenotations too eagerly.
A PreDenotation represents a group of single denotations or a single multi-denotation
It is used as an optimization to avoid forming MultiDenotations too eagerly.
Normally, tp1 & tp2, with extra care taken to return tp1 or tp2 directly if that's
a valid answer. Special cases for matching methods and classes, with
the possibility of returning NoType. Special handling of ExprTypes, where mixed
intersections widen the ExprType away.
Normally, tp1 & tp2, with extra care taken to return tp1 or tp2 directly if that's
a valid answer. Special cases for matching methods and classes, with
the possibility of returning NoType. Special handling of ExprTypes, where mixed
intersections widen the ExprType away.
The current denotation of the static reference given by path,
or a MissingRef or NoQualifyingRef instance, if it does not exist.
if generateStubs is set, generates stubs for missing top-level symbols
The current denotation of the static reference given by path,
or a MissingRef or NoQualifyingRef instance, if it does not exist.
if generateStubs is set, generates stubs for missing top-level symbols