Symbols
Symbols for all kinds of definitions in Scala programs.
Every definition, like classes, defs, types and type parameters, is
associated with a Symbol. Symbols are organized in a hierarchy,
depending on what kind of definitions they represent.
Symbol
|
+- NoSymbol singleton instance used when there is no symbol
|
+- PackageSymbol any package, including the root package, the empty package, and nested packages
|
+- TermOrTypeSymbol any term or type symbol, i.e., not a package
|
+- TermSymbol any term definition:
| `val`, `var`, `def`, term param, term capture, `object` value
|
+- TypeSymbol any definition for a type
+- ClassSymbol definition for a `class`, `trait`, or the module class of an `object`
+- TypeSymbolWithBounds any other kind of type: `type` definitions, type params, type captures
+- TypeMemberSymbol `type` definition, further refined through its `typeDef`
+- TypeParamSymbol
+- ClassTypeParamSymbol type parameter of a class
+- LocalTypeParamSymbol any other type parameter
Additionally, PackageSymbol and ClassSymbol extend DeclaringSymbol.
Declaring symbols are the ones that contain declarations, which can be
looked up with their names.
TypeMemberSymbols exist in 3 flavors, indicated by their typeDef field,
of type TypeMemberDefinition:
TypeAlias(alias): type alias of the formtype T = aliasAbstractType(bounds): abstract type member of the formtype T >: bounds.low <: bounds.highOpaqueTypeAlias(bounds, alias): opaque type alias of the formtype T >: bounds.low <: bounds.high = alias
The main property a TermSymbol is its declaredType, which is a Type.
All TypeSymbolWithBounds have bounds of type TypeBounds, which are
often used as their primary characteristic. ClassSymbols are entirely
defined by themselves.
With the exception of NoSymbol and the root package symbol, all symbols
have an owner which is another Symbol.
All symbols also have a name. It is a TypeName for TypeSymbols, and a
TermName for TermSymbols, PackageSymbols and NoSymbol.