Skip to content

Commit 8a6b695

Browse files
Start moving code from Typer
1 parent 7a0a826 commit 8a6b695

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import NamerOps._
2323
import ContextOps._
2424
import Variances.Invariant
2525
import TastyUnpickler.NameTable
26-
import typer.Typer
2726
import typer.ConstFold
2827
import typer.Checking.checkNonCyclic
2928
import typer.Nullables._
@@ -34,6 +33,7 @@ import Trees._
3433
import Decorators._
3534
import transform.SymUtils._
3635
import cc.{adaptFunctionTypeUnderPureFuns, adaptByNameArgUnderPureFuns}
36+
import inlines.Inlines
3737

3838
import dotty.tools.tasty.{TastyBuffer, TastyReader}
3939
import TastyBuffer._
@@ -1051,20 +1051,20 @@ class TreeUnpickler(reader: TastyReader,
10511051
.map(_.changeOwner(localDummy, constr.symbol)))
10521052
else parents
10531053

1054-
val statsStart = currentAddr
10551054
val lazyStats = readLater(end, rdr => {
10561055
val stats = rdr.readIndexedStats(localDummy, end)
10571056
tparams ++ vparams ++ stats
10581057
})
10591058
if cls.isInlineTrait then
1059+
val statsStart = currentAddr
10601060
cls.addAnnotation(LazyBodyAnnotation { (ctx0: Context) ?=>
10611061
val ctx1 = localContext(cls)(using ctx0).addMode(Mode.ReadPositions)
10621062
inContext(sourceChangeContext(Addr(0))(using ctx1)) {
10631063
// avoids space leaks by not capturing the current context
10641064

10651065
val fork = forkAt(statsStart)
10661066
val stats = fork.readIndexedStats(localDummy, end)
1067-
val inlinedMembers = (tparams ++ vparams ++ stats).filter(member => Typer.isInlineableFromInlineTrait(cls, member))
1067+
val inlinedMembers = (tparams ++ vparams ++ stats).filter(member => Inlines.isInlineableFromInlineTrait(cls, member))
10681068
Block(inlinedMembers, unitLiteral).withSpan(cls.span)
10691069
}
10701070
})

compiler/src/dotty/tools/dotc/inlines/Inlines.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,28 @@ object Inlines:
5858
def isInlineable(meth: Symbol)(using Context): Boolean =
5959
meth.is(Inline) && meth.hasAnnotation(defn.BodyAnnot) && !inInlineMethod
6060

61+
def isInlineableFromInlineTrait(inlinedTraitSym: ClassSymbol, member: tpd.Tree)(using Context): Boolean =
62+
!(member.isInstanceOf[tpd.TypeDef] && inlinedTraitSym.typeParams.contains(member.symbol))
63+
&& !member.symbol.isAllOf(Inline)
64+
6165
/** Should call be inlined in this context? */
62-
def needsInlining(tree: Tree)(using Context): Boolean = tree match {
63-
case Block(_, expr) => needsInlining(expr)
64-
case _ =>
65-
isInlineable(tree.symbol)
66-
&& !tree.tpe.widenTermRefExpr.isInstanceOf[MethodOrPoly]
67-
&& StagingLevel.level == 0
66+
def needsInlining(tree: Tree)(using Context): Boolean =
67+
val isInlineableInCtx =
68+
StagingLevel.level == 0
6869
&& (
6970
ctx.phase == Phases.inliningPhase
7071
|| (ctx.phase == Phases.typerPhase && needsTransparentInlining(tree))
7172
)
7273
&& !ctx.typer.hasInliningErrors
7374
&& !ctx.base.stopInlining
74-
}
75+
76+
tree match
77+
case Block(_, expr) =>
78+
needsInlining(expr)
79+
case tdef @ TypeDef(_, impl: Template) =>
80+
!tdef.symbol.isInlineTrait && impl.parents.exists(_.symbol.isInlineTrait) && isInlineableInCtx
81+
case _ =>
82+
isInlineable(tree.symbol) && !tree.tpe.widenTermRefExpr.isInstanceOf[MethodOrPoly] && isInlineableInCtx
7583

7684
private def needsTransparentInlining(tree: Tree)(using Context): Boolean =
7785
tree.symbol.is(Transparent)

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import Inferencing._
2929
import Dynamic.isDynamicExpansion
3030
import EtaExpansion.etaExpand
3131
import TypeComparer.CompareResult
32-
import inlines.{Inliner, Inlines, PrepareInlineable}
32+
import inlines.{Inlines, PrepareInlineable}
3333
import util.Spans._
3434
import util.common._
3535
import util.{Property, SimpleIdentityMap, SrcPos}
@@ -108,10 +108,6 @@ object Typer {
108108
def rememberSearchFailure(tree: tpd.Tree, fail: SearchFailure) =
109109
tree.putAttachment(HiddenSearchFailure,
110110
fail :: tree.attachmentOrElse(HiddenSearchFailure, Nil))
111-
112-
def isInlineableFromInlineTrait(inlinedTraitSym: ClassSymbol, member: tpd.Tree)(using Context): Boolean =
113-
!(member.isInstanceOf[tpd.TypeDef] && inlinedTraitSym.typeParams.contains(member.symbol))
114-
&& !member.symbol.isAllOf(Inline)
115111
}
116112
/** Typecheck trees, the main entry point is `typed`.
117113
*
@@ -2666,7 +2662,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
26662662
val body1 = addAccessorDefs(cls, typedStats(impl.body, dummy)(using ctx.inClassContext(self1.symbol))._1) ::: inlineTraitDefs
26672663

26682664
if !ctx.isAfterTyper && cls.isInlineTrait then
2669-
val membersToInline = body1.filter(member => isInlineableFromInlineTrait(cls, member))
2665+
val membersToInline = body1.filter(member => Inlines.isInlineableFromInlineTrait(cls, member))
26702666
val wrappedMembersToInline = Block(membersToInline, unitLiteral).withSpan(cdef.span)
26712667
PrepareInlineable.registerInlineInfo(cls, wrappedMembersToInline)
26722668

0 commit comments

Comments
 (0)