Skip to content

Allow two type parameter sections in extension methods. #10950

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 22 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
ec5c9ed
Allow leading context parameters in extension methods
odersky Dec 28, 2020
a132934
Fix scala3doc test
odersky Dec 28, 2020
42c1da8
Refine encoding of right-associative extension methods
odersky Dec 28, 2020
520e357
Fix wording according to review suggestions
odersky Dec 29, 2020
7de6d01
Make polyDefDef pass type trees instead of types
odersky Dec 29, 2020
8a8a4f1
make tpd.appliedToArgss also work for type arguments
odersky Dec 29, 2020
a53b8fe
Improve handling of parameters in Tasty format
odersky Dec 30, 2020
fb87082
Merge type params and term params in DefDef nodes
odersky Dec 30, 2020
8340bd3
Optimize termParamss
odersky Dec 31, 2020
ba8d0ab
Use single parameter list for tpd.DefDef methods
odersky Dec 31, 2020
d3f045f
Eliminate polyDefDef def and calls
odersky Dec 31, 2020
8bcbd6e
Allow two type parameter lists in extension methods
odersky Jan 1, 2021
5dd7801
Disable macro tests
odersky Jan 1, 2021
78562e9
Workaround for community-build failure
odersky Jan 1, 2021
055a4b5
Update reference docs
odersky Jan 1, 2021
55eb393
Fix definition of asExprOf on Tree
nicolasstucki Jan 4, 2021
871c820
Update extension docs
odersky Jan 4, 2021
d9bd6cd
Drop IntegratedTypeArgs
odersky Jan 4, 2021
e08919f
Fix inlining with multiple type argument clauses
odersky Jan 4, 2021
89fd8f4
Add tests with dependencies from second type parameter clause
odersky Jan 4, 2021
102bfd5
Make overloading resolution work for embedded type params
odersky Jan 4, 2021
5cbe0ab
Revert patches of asExprOf
nicolasstucki Jan 5, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion community-build/community-projects/intent
2,889 changes: 2,889 additions & 0 deletions compiler/src-bootstrapped/scala/quoted/runtime/impl/QuotesImpl.scala

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler

/** Convert this to an `quoted.Expr[X]` if this expression is a valid expression of type `X` or throws */
def asExprOf(using scala.quoted.Type[X]): scala.quoted.Expr[X] = {
if isExprOf[X] then
if self.isExprOf[X] then
self.asInstanceOf[scala.quoted.Expr[X]]
else
throw Exception(
Expand Down Expand Up @@ -257,17 +257,20 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler

object DefDef extends DefDefModule:
def apply(symbol: Symbol, rhsFn: List[TypeRepr] => List[List[Term]] => Option[Term]): DefDef =
withDefaultPos(tpd.polyDefDef(symbol.asTerm, tparams => vparamss => yCheckedOwners(rhsFn(tparams)(vparamss), symbol).getOrElse(tpd.EmptyTree)))
withDefaultPos(tpd.DefDef(symbol.asTerm, prefss => {
val (tparams, vparamss) = tpd.splitArgs(prefss)
yCheckedOwners(rhsFn(tparams.map(_.tpe))(vparamss), symbol).getOrElse(tpd.EmptyTree)
}))
def copy(original: Tree)(name: String, typeParams: List[TypeDef], paramss: List[List[ValDef]], tpt: TypeTree, rhs: Option[Term]): DefDef =
tpd.cpy.DefDef(original)(name.toTermName, typeParams, paramss, tpt, yCheckedOwners(rhs, original.symbol).getOrElse(tpd.EmptyTree))
tpd.cpy.DefDef(original)(name.toTermName, tpd.joinParams(typeParams, paramss), tpt, yCheckedOwners(rhs, original.symbol).getOrElse(tpd.EmptyTree))
def unapply(ddef: DefDef): (String, List[TypeDef], List[List[ValDef]], TypeTree, Option[Term]) =
(ddef.name.toString, ddef.typeParams, ddef.paramss, ddef.tpt, optional(ddef.rhs))
(ddef.name.toString, ddef.typeParams, ddef.termParamss, ddef.tpt, optional(ddef.rhs))
end DefDef

given DefDefMethods: DefDefMethods with
extension (self: DefDef)
def typeParams: List[TypeDef] = self.tparams
def paramss: List[List[ValDef]] = self.vparamss
def typeParams: List[TypeDef] = self.leadingTypeParams // TODO: adapt to multiple type parameter clauses
def paramss: List[List[ValDef]] = self.termParamss
def returnTpt: TypeTree = self.tpt
def rhs: Option[Term] = optional(self.rhs)
end extension
Expand Down Expand Up @@ -380,7 +383,7 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
}
val closureTpe = Types.MethodType(mtpe.paramNames, mtpe.paramInfos, closureResType)
val closureMethod = dotc.core.Symbols.newSymbol(owner, nme.ANON_FUN, Synthetic | Method, closureTpe)
tpd.Closure(closureMethod, tss => new tpd.TreeOps(self).appliedToArgs(tss.head).etaExpand(closureMethod))
tpd.Closure(closureMethod, tss => new tpd.TreeOps(self).appliedToTermArgs(tss.head).etaExpand(closureMethod))
case _ => self
}

Expand Down
6 changes: 3 additions & 3 deletions compiler/src/dotty/tools/backend/jvm/BCodeSkelBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {

def rewire(stat: Tree) = thisMap.transform(stat).changeOwner(claszSymbol.primaryConstructor, clInitSymbol)

val callConstructor = New(claszSymbol.typeRef).select(claszSymbol.primaryConstructor).appliedToArgs(Nil)
val callConstructor = New(claszSymbol.typeRef).select(claszSymbol.primaryConstructor).appliedToTermArgs(Nil)
val assignModuleField = Assign(ref(moduleField), callConstructor)
val remainingConstrStatsSubst = remainingConstrStats.map(rewire)
val clinit = clinits match {
Expand Down Expand Up @@ -667,7 +667,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {
val enclosingClass = origSym.owner.asClass
new TreeTypeMap(
typeMap = _.substThis(enclosingClass, selfParamRef.symbol.termRef)
.subst(dd.vparamss.head.map(_.symbol), regularParamRefs.map(_.symbol.termRef)),
.subst(dd.termParamss.head.map(_.symbol), regularParamRefs.map(_.symbol.termRef)),
treeMap = {
case tree: This if tree.symbol == enclosingClass => selfParamRef
case tree => tree
Expand Down Expand Up @@ -714,7 +714,7 @@ trait BCodeSkelBuilder extends BCodeHelpers {

def genDefDef(dd: DefDef): Unit = {
val rhs = dd.rhs
val vparamss = dd.vparamss
val vparamss = dd.termParamss
// the only method whose implementation is not emitted: getClass()
if (dd.symbol eq defn.Any_getClass) { return }
assert(mnode == null, "GenBCode detected nested method.")
Expand Down
2 changes: 1 addition & 1 deletion compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1035,7 +1035,7 @@ class JSCodeGen()(using genCtx: Context) {
private def genMethodWithCurrentLocalNameScope(dd: DefDef): Option[js.MethodDef] = {
implicit val pos = dd.span
val sym = dd.symbol
val vparamss = dd.vparamss
val vparamss = dd.termParamss
val rhs = dd.rhs

withScopedVars(
Expand Down
Loading