TreeTransformScope

trait TreeTransformScope[F[_], CT, CC <: CpsMonadContext[F]] extends CpsTreeScope[F, CT, CC] with KnownTreeFragments[F, CT, CC] with TypeApplyTreeTransform[F, CT, CC] with RootTreeTransform[F, CT, CC] with ApplyTreeTransform[F, CT, CC] with ApplicationHelper[F, CT, CC] with AwaitTreeTransform[F, CT, CC] with SelectTreeTransform[F, CT, CC] with LambdaTreeTransform[F, CT, CC] with MatchTreeTransform[F, CT, CC] with AsyncTreeShifter[F, CT, CC] with RepeatedTreeTransform[F, CT, CC] with InlinedTreeTransform[F, CT, CC] with SelectOuterTreeTransform[F, CT, CC] with BlockTreeTransform[F, CT, CC] with ValDefTreeTransform[F, CT, CC]
trait ValDefTreeTransform[F, CT, CC]
trait BlockTreeTransform[F, CT, CC]
trait SelectOuterTreeTransform[F, CT, CC]
trait InlinedTreeTransform[F, CT, CC]
trait RepeatedTreeTransform[F, CT, CC]
trait AsyncTreeShifter[F, CT, CC]
trait MatchTreeTransform[F, CT, CC]
trait LambdaTreeTransform[F, CT, CC]
trait SelectTreeTransform[F, CT, CC]
trait AwaitTreeTransform[F, CT, CC]
trait ApplicationHelper[F, CT, CC]
trait PartialShiftedApplyScope[F, CT, CC]
trait ApplyArgBuilderScope[F, CT, CC]
trait ApplyArgRecordScope[F, CT, CC]
trait ApplyTreeTransform[F, CT, CC]
trait RootTreeTransform[F, CT, CC]
trait TypeApplyTreeTransform[F, CT, CC]
trait KnownTreeFragments[F, CT, CC]
trait CpsTreeScope[F, CT, CC]
class Object
trait Matchable
class Any

Type members

Classlikes

case class MessageWithPos(message: String, pos: Position)

Inherited classlikes

case class AppendCpsTree(frs: CpsTree, snd: CpsTree) extends CpsTree

append cps tree, which is frs and then snd. we use this representation instead Mapped/Flatmapped in cases, where we later can apply await to append term and simplify tree instead wrapping awaited tree in extra flatMap

append cps tree, which is frs and then snd. we use this representation instead Mapped/Flatmapped in cases, where we later can apply await to append term and simplify tree instead wrapping awaited tree in extra flatMap

Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class ApplyArgByNameRecord(term: Term, index: Int, cpsTree: CpsTree, optShiftType: Option[ApplicationShiftType]) extends ApplyArgRecord
case class ApplyArgLambdaRecord(term: Term, index: Int, cpsBody: CpsTree, optShiftType: Option[ApplicationShiftType], existsLambdaUnshift: Boolean) extends ApplyArgRecord
case class ApplyArgNamedRecord(term: NamedArg, name: String, nested: ApplyArgRecord) extends ApplyArgRecord
case class ApplyArgNoPrecalcTermRecord(term: Term, index: Int, isChanged: Boolean) extends ApplyArgRecord
case class ApplyArgPrecalcTermRecord(term: Term, index: Int, termCpsTree: CpsTree, valDef: ValDef, ident: Term) extends ApplyArgRecord
case class ApplyArgRepeatRecord(term: Repeated, index: Int, elements: List[ApplyArgRecord], seqTypeTree: TypeTree) extends ApplyArgRecord
case class ApplyArgsSummaryPropertiesStep1(hasAsync: Boolean, hasShiftedLambda: Boolean, shouldBeChangedSync: Boolean)
sealed abstract class AsyncCpsTree extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class AsyncLambdaCpsTree(originLambda: Term, params: List[ValDef], body: CpsTree, otpe: TypeRepr) extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class AwaitAsyncCpsTree(nested: CpsTree, otpe: TypeRepr) extends AsyncCpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class AwaitSyncCpsTree(origin: Term, otpe: TypeRepr) extends AsyncCpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
object B2
case class BlockCpsTree(prevs: Queue[Statement], last: CpsTree) extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class BuildApplyArgsAcc(posIndex: Int, paramIndex: Int, wasNamed: Boolean, inRepeat: Boolean, inNamed: Boolean, records: Seq[ApplyArgRecord], filledNamed: Set[Int])
case class CallChainSubstCpsTree(origin: Term, shifted: Term, otpe: TypeRepr) extends CpsTree

when we have swhifted function, which should return F[A] but we want to have in F[A] methods with special meaning, which should be performed on F[_] before jumping into monad (exampe: Iterable.withFilter) we will catch in ApplyTree such methods and substitute to appropriative calls of shifted.

when we have swhifted function, which should return F[A] but we want to have in F[A] methods with special meaning, which should be performed on F[_] before jumping into monad (exampe: Iterable.withFilter) we will catch in ApplyTree such methods and substitute to appropriative calls of shifted.

Inherited from:
CpsTreeScope
Source:
CpsTree.scala
sealed abstract class CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
object CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case object EmptyCpsTree extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class FlatMappedCpsTree(prev: CpsTree, opm: Term => Term, otpe: TypeRepr) extends AsyncCpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class InlinedBindingsRecord(changes: HashMap[Symbol, InlinedBindingRecord], newBindings: List[Definition], awaitVals: List[ValDef])
case class InlinedCpsTree(origin: Inlined, bindings: List[Definition], nested: CpsTree) extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class InlinedFunBindingRecord(newSym: Symbol, cpsTree: CpsTree, oldValDef: ValDef, newResultType: TypeRepr) extends InlinedBindingRecord
case class InlinedValBindingRecord(newSym: Symbol, cpsTree: CpsTree, oldValDef: ValDef) extends InlinedBindingRecord
case class MappedCpsTree(prev: CpsTree, op: Term => Term, otpe: TypeRepr) extends AsyncCpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class PartialShiftedApply(shiftType: ApplicationShiftType, shifted: Term)

Application with one list of params.

Application with one list of params.

Inherited from:
PartialShiftedApplyScope
Source:
PartialShiftedApplyScope.scala
case class PureCpsTree(origin: Statement, isChanged: Boolean) extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class SelectTypeApplyCpsTree(origin: Option[Term], nested: CpsTree, targs: List[TypeTree], selects: List[SelectTypeApplyRecord], otpe: TypeRepr, changed: Boolean) extends CpsTree

represent select expression, which can be in monad or outside monad.

represent select expression, which can be in monad or outside monad.

constructor is not devoted to used directly: use SelectTypeApplyCpsTree.create instead. selects is reversed (i.e. external added to head)

Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class SelectTypeApplyRecord(prevTpe: TypeRepr, symbol: Symbol, targs: List[TypeTree], level: Int)
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
case class ValCpsTree(valDef: ValDef, rightPart: CpsTree, nested: CpsTree, canBeLambda: Boolean) extends CpsTree
Inherited from:
CpsTreeScope
Source:
CpsTree.scala

Value members

Concrete methods

def isInMonad(tpe: TypeRepr): Boolean
def posExpr(t: Term): Expr[Any]
def posExprs(terms: Term*): Expr[Any]
def safeShow(t: Tree): String
def safeTypeShow(tp: TypeRepr): String

Inherited methods

def adoptContextInMyAwait(awaitTerm: Term, arg: Term, monadContext: Term): Term
def asyncShift(t: Term, shiftedSymbols: Set[Symbol]): Term
def asyncShiftCaseDef(cd: CaseDef, shiftedSymbols: Set[Symbol]): CaseDef
def asyncShiftDefinition(t: Definition, shiftedSymbols: Set[Symbol]): Definition
def asyncShiftStatement(t: Statement, shiftedSymbols: Set[Symbol]): Statement
def blockBuildAwaitValueDiscard(discardTerm: Term, p: Term): Term
def blockCheckValueDiscarded(t: Term): Boolean
def buildApply(cpsFun: CpsTree, fun: Term, argRecords: Seq[ApplyArgRecord], applyTerm: Apply, argsProperties: ApplyArgsSummaryProperties, inShiftedCallChain: Boolean, tails: List[Seq[ApplyArgRecord]]): CpsTree
def buildShiftedApply(cpsFun: CpsTree, fun: Term, argRecords: Seq[ApplyArgRecord], withAsync: Boolean, tails: List[Seq[ApplyArgRecord]], applyTerm: Apply): CpsTree
def checkLambdaDef(term: Term): Option[Term]
def cpsShiftedMethodType(paramNames: List[String], paramTypes: List[TypeRepr], otpe: TypeRepr): MethodType

method type for (p1 ... pn) => F[otpe]

method type for (p1 ... pn) => F[otpe]

Inherited from:
LambdaTreeTransform
Source:
LambdaTreeTransform.scala
def exprToTree[T](expr: CpsExpr[F, T], e: Term): CpsTree
def findAsyncShiftTerm(e: Term): (ImplicitSearchResult, TypeRepr)
def generateAwaitFor(term: Term, tpe: TypeRepr): Term
def handleArgs1(applyTerm: Apply, fun: Term, cpsFun: CpsTree, args: List[Term], tails: List[Seq[ApplyArgRecord]], unpure: Boolean): CpsTree

How to handle arguments? We want keep evaluation order from left to right, so, imagine we have function f(a1,a2,a3) and a2 is async, a1, a3 - sync. we will transform this to

How to handle arguments? We want keep evaluation order from left to right, so, imagine we have function f(a1,a2,a3) and a2 is async, a1, a3 - sync. we will transform this to

{ val arg1 = a1;
  transform(a2).flatMap( x =>
     { val arg2 = x;
       val arg3 = a3;
       f(arg1, arg2, arg3)
}    }

more generally we at first generate block: { arg1 = a1; ..... argN = aN; f(arg1,...argN) } and then transform one, knowing that all arguments to f are sync (of course, if all arguments are sync, we just call f(arg1,... arg2) without all this machinery)

Value parameters:
applyTerm

= Apply(fun, args) - origin apply

args
  • first argument list
fun
  • function to apply (with type-paerameters)
tails
  • next argument lists if any
unpure
  • if true, that this is call from shifted substitution, which is already return F[_] by design.
Inherited from:
ApplyTreeTransform
Source:
ApplyTreeTransform.scala
def handleFun(applyTerm: Apply, fun: Term, args: List[Term], tails: List[Seq[ApplyArgRecord]]): CpsTree
def handleFunApply(applyTerm: Apply, fun: Term, args: List[Term], fun1: Term, args1: List[Term], tails: List[Seq[ApplyArgRecord]]): CpsTree
def handleFunIdent(applyTerm: Apply, fun: Term, args: List[Term], name: String, tails: List[Seq[ApplyArgRecord]]): CpsTree
def handleFunSelect(applyTerm: Apply, fun: Term, args: List[Term], obj: Term, methodName: String, tails: List[Seq[ApplyArgRecord]]): CpsTree
def handleFunTypeApply(applyTerm: Apply, fun: Term, args: List[Term], obj: Term, targs: List[TypeTree], tails: List[Seq[ApplyArgRecord]]): CpsTree

applyTerm = Apply(fun, args) fun = TypeApply(obj,targs)

applyTerm = Apply(fun, args) fun = TypeApply(obj,targs)

Inherited from:
ApplyTreeTransform
Source:
ApplyTreeTransform.scala
def runApply(applyTerm: Apply, fun: Term, args: List[Term], tails: List[Seq[ApplyArgRecord]]): CpsTree

case Apply(fun,args) transform application

case Apply(fun,args) transform application

tails -- list of prepared sequence of curried arguments.

Inherited from:
ApplyTreeTransform
Source:
ApplyTreeTransform.scala
def runAwait(term: Term, arg: Term, awaitCpsMonadType: TypeRepr, awaitCpsMonad: Term, awaitCpsMonadContext: Term): CpsTree
def runBlock(block: Block, prevs: List[Statement], last: Term): CpsTree
def runInlined(origin: Inlined): CpsTree
def runLambda(lambdaTerm: Term, params: List[ValDef], expr: Term): CpsTree
def runMatch(matchTerm: Match): CpsTree
def runMyAwait(awaitTerm: Term, arg: Term, context: Term): CpsTree
def runOtherAwait(awaitTerm: Term, arg: Term, targ: TypeRepr, otherCpsMonad: Term, myMonadContext: Term): CpsTree
def runRepeated(repeated: Term, elements: List[Term], tpt: TypeTree): CpsTree
def runRoot(term: Term, muted: Boolean): CpsTree
def runRootUneta(term: Term, muted: Boolean): CpsTree
def runSelect(selectTerm: Select): CpsTree
def runTypeApply(applyTerm: Term, fun: Term, targs: List[TypeTree]): CpsTree
def runValDefFromBlock(block: Block, valDef: ValDef): CpsTree
def sameSelect(funTerm: Term, name: String, targs: List[TypeTree], args: List[Term]): Option[Term]
def shiftedApplyCps(funCpsTree: CpsTree, argRecords: Seq[ApplyArgRecord], argTails: List[Seq[ApplyArgRecord]], applyTerm: Term, withAsync: Boolean): CpsTree
def shiftedApplyTerm(funTerm: Term, argRecords: Seq[ApplyArgRecord], withAsync: Boolean): PartialShiftedApply
def shiftedLambdaType(tpe: TypeRepr): TypeRepr
def shiftedLambdaTypeTree(tpt: TypeTree): TypeTree
def shiftedResultCpsTree(origin: Term, shifted: Term): CpsTree
def termIsNoOrderDepended(x: Term): Boolean
def valDefApplyMemoization(valDef: ValDef, cpsRhs: CpsTree, rhs: Term): CpsTree
def withInlineBindings(origin: Inlined, tree: CpsTree): CpsTree

Abstract fields

Inherited fields

lazy val awaitPure: Term
lazy val awaitSymbol: Symbol
lazy val flatMapSymbol: Symbol
lazy val mapSymbol: Symbol
lazy val monadTypeTree: TypeTree
lazy val objAsyncShift: TypeRepr
lazy val partialFunctionType: TypeRepr
lazy val pureSymbol: Symbol

Extensions

Inherited extensions

extension (otherCake: TreeTransformScope[_[_], _, _])
def adopt(t: Term): Term
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
def adoptStatement(t: Statement): Statement
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
def adoptTerm(t: Term): Term
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
def adoptTermFun(op: Term => Term): Term => Term
Inherited from:
CpsTreeScope
Source:
CpsTree.scala
def adoptType(t: TypeRepr): TypeRepr
Inherited from:
CpsTreeScope
Source:
CpsTree.scala

Implicits

Implicits

implicit val ccType: Type[CC]
implicit val ctType: Type[CT]
implicit val fType: Type[F]
implicit val qctx: Quotes