Contexts

object Contexts
class Object
trait Matchable
class Any

Type members

Classlikes

abstract
class Context(val base: ContextBase)

A context is passed basically everywhere in dotc. This is convenient but carries the risk of captured contexts in objects that turn into space leaks. To combat this risk, here are some conventions to follow:

A context is passed basically everywhere in dotc. This is convenient but carries the risk of captured contexts in objects that turn into space leaks. To combat this risk, here are some conventions to follow:

  • Never let an implicit context be an argument of a class whose instances live longer than the context.
  • Classes that need contexts for their initialization take an explicit parameter named initctx. They pass initctx to all positions where it is needed (and these positions should all be part of the intialization sequence of the class).
  • Classes that need contexts that survive initialization are instead passed a "condensed context", typically named cctx (or they create one). Condensed contexts just add some basic information to the context base without the risk of capturing complete trees.
  • To make sure these rules are kept, it would be good to do a sanity check using bytecode inspection with javap or scalap: Keep track of all class fields of type context; allow them only in whitelisted classes (which should be short-lived).
class ContextBase extends ContextState with PhasesBase with Plugins

A context base defines state and associated methods that exist once per compiler run.

A context base defines state and associated methods that exist once per compiler run.

The essential mutable state of a context base, collected into a common class

The essential mutable state of a context base, collected into a common class

class FreshContext(base: ContextBase) extends Context

A fresh context allows selective modification of its attributes using the with... methods.

A fresh context allows selective modification of its attributes using the with... methods.

object NoContext extends Context

Value members

Concrete methods

inline
def atNextPhase[T](inline op: Context => T)(using Context): T
inline
def atPeriod[T](pd: Period)(inline op: Context => T)(using Context): T

Execute op at given period

Execute op at given period

inline
def atPhase[T](pid: PhaseId)(inline op: Context => T)(using Context): T

Execute op at given phase id

Execute op at given phase id

inline
def atPhase[T](phase: Phase)(inline op: Context => T)(using Context): T

Execute op at given phase

Execute op at given phase

inline
def atPhaseBeforeTransforms[T](inline op: Context => T)(using Context): T

Execute op at the current phase if it's before the first transform phase, otherwise at the last phase before the first transform phase.

Execute op at the current phase if it's before the first transform phase, otherwise at the last phase before the first transform phase.

Note: this should be used instead of atPhaseNoLater(ctx.picklerPhase) because the later won't work if the Pickler phase is not present (for example, when using QuoteCompiler).

inline
def atPhaseNoEarlier[T](limit: Phase)(inline op: Context => T)(using Context): T
inline
def atPhaseNoLater[T](limit: Phase)(inline op: Context => T)(using Context): T
inline
def comparing[T](inline op: TypeComparer => T)(using Context): T
inline
def ctx(using ctx: Context): Context

The current context

The current context

inline
def explore[T](inline op: Context => T)(using Context): T
inline
def exploreInFreshCtx[T](inline op: FreshContext => T)(using Context): T
inline
def inContext[T](c: Context)(inline op: Context => T): T

Run op with given context

Run op with given context

inline
def inMode[T](mode: Mode)(inline op: Context => T)(using ctx: Context): T
inline
def runWithOwner[T](owner: Symbol)(inline op: Context => T)(using Context): T

Run op in current context, with a mode is temporarily set as specified.

Run op in current context, with a mode is temporarily set as specified.

inline
def withMode[T](mode: Mode)(inline op: Context => T)(using ctx: Context): T
inline
def withoutMode[T](mode: Mode)(inline op: Context => T)(using ctx: Context): T

Givens

Givens

given ops

Extensions

Extensions

extension (c: FreshContext)
final
def addMode(mode: Mode): c
final
def retractMode(mode: Mode): c
extension (c: Context)
final
def addMode(mode: Mode): Context
final
final