Skip to content

Commit 0ee74cc

Browse files
committed
Reformat code after fixes on scala.Dynamic.
1 parent f001eef commit 0ee74cc

File tree

3 files changed

+60
-60
lines changed

3 files changed

+60
-60
lines changed

src/dotty/tools/dotc/typer/Applications.scala

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -591,17 +591,7 @@ trait Applications extends Compatibility { self: Typer with Dynamic =>
591591

592592
fun1.tpe match {
593593
case ErrorType => tree.withType(ErrorType)
594-
case TryDynamicCallType =>
595-
tree.fun match {
596-
case Select(qual, name) if !isDynamicMethod(name) =>
597-
typedDynamicApply(qual, name, None, tree.args, pt)(tree)
598-
case TypeApply(Select(qual, name), targs) if !isDynamicMethod(name) =>
599-
typedDynamicApply(qual, name, Some(targs), tree.args, pt)(tree)
600-
case TypeApply(fun, targs) =>
601-
typedDynamicApply(fun, nme.apply, Some(targs), tree.args, pt)(tree)
602-
case fun =>
603-
typedDynamicApply(fun, nme.apply, None, tree.args, pt)(tree)
604-
}
594+
case TryDynamicCallType => typedDynamicApply(tree, pt)
605595
case _ =>
606596
tryEither {
607597
implicit ctx => simpleApply(fun1, proto)
@@ -683,18 +673,12 @@ trait Applications extends Compatibility { self: Typer with Dynamic =>
683673
}
684674
case _ =>
685675
}
686-
if (typedFn.tpe eq TryDynamicCallType) {
687-
(pt, typedFn) match {
688-
case (_: FunProto, _)=>
689-
tree.withType(TryDynamicCallType)
690-
case (_, Select(qual, name)) =>
691-
typedDynamicSelect(qual, name, Some(typedArgs), pt)
692-
case _ =>
693-
tree.withType(TryDynamicCallType)
694-
}
695-
} else {
696-
assignType(cpy.TypeApply(tree)(typedFn, typedArgs), typedFn, typedArgs)
676+
def tryDynamicTypeApply(): Tree = typedFn match {
677+
case typedFn: Select if !pt.isInstanceOf[FunProto] => typedDynamicSelect(typedFn, typedArgs, pt)
678+
case _ => tree.withType(TryDynamicCallType)
697679
}
680+
if (typedFn.tpe eq TryDynamicCallType) tryDynamicTypeApply()
681+
else assignType(cpy.TypeApply(tree)(typedFn, typedArgs), typedFn, typedArgs)
698682
}
699683

700684
/** Rewrite `new Array[T](....)` if T is an unbounded generic to calls to newGenericArray.

src/dotty/tools/dotc/typer/Dynamic.scala

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package dotty.tools
22
package dotc
33
package typer
44

5-
import dotty.tools.dotc.ast.Trees.NamedArg
6-
import dotty.tools.dotc.ast.tpd._
5+
import dotty.tools.dotc.ast.Trees._
6+
import dotty.tools.dotc.ast.tpd
77
import dotty.tools.dotc.ast.untpd
88
import dotty.tools.dotc.core.Constants.Constant
99
import dotty.tools.dotc.core.Contexts.Context
@@ -27,28 +27,43 @@ object Dynamic {
2727
* The first matching rule of is applied.
2828
*/
2929
trait Dynamic { self: Typer with Applications =>
30+
import Dynamic._
31+
import tpd._
3032

3133
/** Translate selection that does not typecheck according to the normal rules into a applyDynamic/applyDynamicNamed.
3234
* foo.bar(baz0, baz1, ...) ~~> foo.applyDynamic(bar)(baz0, baz1, ...)
3335
* foo.bar[T0, ...](baz0, baz1, ...) ~~> foo.applyDynamic[T0, ...](bar)(baz0, baz1, ...)
3436
* foo.bar(x = bazX, y = bazY, baz, ...) ~~> foo.applyDynamicNamed("bar")(("x", bazX), ("y", bazY), ("", baz), ...)
3537
* foo.bar[T0, ...](x = bazX, y = bazY, baz, ...) ~~> foo.applyDynamicNamed[T0, ...]("bar")(("x", bazX), ("y", bazY), ("", baz), ...)
3638
*/
37-
def typedDynamicApply(qual: untpd.Tree, name: Name, targsOpt: Option[List[untpd.Tree]], args: List[untpd.Tree], pt: Type)(original: untpd.Apply)(
38-
implicit ctx: Context): Tree = {
39-
def isNamedArg(arg: untpd.Tree): Boolean = arg match { case NamedArg(_, _) => true; case _ => false }
40-
val dynName = if (args.exists(isNamedArg)) nme.applyDynamicNamed else nme.applyDynamic
41-
if (dynName == nme.applyDynamicNamed && untpd.isWildcardStarArgList(args)) {
42-
ctx.error("applyDynamicNamed does not support passing a vararg parameter", original.pos)
43-
original.withType(ErrorType)
44-
} else {
45-
def namedArgTuple(name: String, arg: untpd.Tree) = untpd.Tuple(List(Literal(Constant(name)), arg))
46-
def namedArgs = args.map {
47-
case NamedArg(argName, arg) => namedArgTuple(argName.toString, arg)
48-
case arg => namedArgTuple("", arg)
39+
def typedDynamicApply(tree: untpd.Apply, pt: Type)(implicit ctx: Context): Tree = {
40+
def typedDynamicApply(qual: untpd.Tree, name: Name, targs: List[untpd.Tree]): Tree = {
41+
def isNamedArg(arg: untpd.Tree): Boolean = arg match { case NamedArg(_, _) => true; case _ => false }
42+
val args = tree.args
43+
val dynName = if (args.exists(isNamedArg)) nme.applyDynamicNamed else nme.applyDynamic
44+
if (dynName == nme.applyDynamicNamed && untpd.isWildcardStarArgList(args)) {
45+
ctx.error("applyDynamicNamed does not support passing a vararg parameter", tree.pos)
46+
tree.withType(ErrorType)
47+
} else {
48+
def namedArgTuple(name: String, arg: untpd.Tree) = untpd.Tuple(List(Literal(Constant(name)), arg))
49+
def namedArgs = args.map {
50+
case NamedArg(argName, arg) => namedArgTuple(argName.toString, arg)
51+
case arg => namedArgTuple("", arg)
52+
}
53+
val args1 = if (dynName == nme.applyDynamic) args else namedArgs
54+
typedApply(untpd.Apply(coreDynamic(qual, dynName, name, targs), args1), pt)
4955
}
50-
val args1 = if (dynName == nme.applyDynamic) args else namedArgs
51-
typedApply(untpd.Apply(coreDynamic(qual, dynName, name, targsOpt), args1), pt)
56+
}
57+
58+
tree.fun match {
59+
case Select(qual, name) if !isDynamicMethod(name) =>
60+
typedDynamicApply(qual, name, Nil)
61+
case TypeApply(Select(qual, name), targs) if !isDynamicMethod(name) =>
62+
typedDynamicApply(qual, name, targs)
63+
case TypeApply(fun, targs) =>
64+
typedDynamicApply(fun, nme.apply, targs)
65+
case fun =>
66+
typedDynamicApply(fun, nme.apply, Nil)
5267
}
5368
}
5469

@@ -59,21 +74,31 @@ trait Dynamic { self: Typer with Applications =>
5974
* Note: inner part of translation foo.bar(baz) = quux ~~> foo.selectDynamic(bar).update(baz, quux) is achieved
6075
* through an existing transformation of in typedAssign [foo.bar(baz) = quux ~~> foo.bar.update(baz, quux)].
6176
*/
62-
def typedDynamicSelect(qualifier: untpd.Tree, name: Name, targsOpt: Option[List[Tree]], pt: Type)(implicit ctx: Context): Tree =
63-
typedApply(coreDynamic(qualifier, nme.selectDynamic, name, targsOpt), pt)
77+
def typedDynamicSelect(tree: untpd.Select, targs: List[Tree], pt: Type)(implicit ctx: Context): Tree =
78+
typedApply(coreDynamic(tree.qualifier, nme.selectDynamic, tree.name, targs), pt)
6479

6580
/** Translate selection that does not typecheck according to the normal rules into a updateDynamic.
6681
* foo.bar = baz ~~> foo.updateDynamic(bar)(baz)
6782
*/
68-
def typedDynamicAssign(qual: untpd.Tree, name: Name, targsOpt: Option[List[untpd.Tree]], rhs: untpd.Tree, pt: Type)(implicit ctx: Context): Tree =
69-
typedApply(untpd.Apply(coreDynamic(qual, nme.updateDynamic, name, targsOpt), rhs), pt)
83+
def typedDynamicAssign(tree: untpd.Assign, pt: Type)(implicit ctx: Context): Tree = {
84+
def typedDynamicAssign(qual: untpd.Tree, name: Name, targs: List[untpd.Tree]): Tree =
85+
typedApply(untpd.Apply(coreDynamic(qual, nme.updateDynamic, name, targs), tree.rhs), pt)
86+
tree.lhs match {
87+
case Select(qual, name) if !isDynamicMethod(name) =>
88+
typedDynamicAssign(qual, name, Nil)
89+
case TypeApply(Select(qual, name), targs) if !isDynamicMethod(name) =>
90+
typedDynamicAssign(qual, name, targs)
91+
case _ =>
92+
ctx.error("reassignment to val", tree.pos)
93+
tree.withType(ErrorType)
94+
}
95+
}
7096

71-
private def coreDynamic(qual: untpd.Tree, dynName: Name, name: Name, targsOpt: Option[List[untpd.Tree]])(implicit ctx: Context): untpd.Apply = {
97+
private def coreDynamic(qual: untpd.Tree, dynName: Name, name: Name, targs: List[untpd.Tree])(implicit ctx: Context): untpd.Apply = {
7298
val select = untpd.Select(qual, dynName)
73-
val selectWithTypes = targsOpt match {
74-
case Some(targs) => untpd.TypeApply(select, targs)
75-
case None => select
76-
}
99+
val selectWithTypes =
100+
if (targs.isEmpty) select
101+
else untpd.TypeApply(select, targs)
77102
untpd.Apply(selectWithTypes, Literal(Constant(name.toString)))
78103
}
79104
}

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

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -317,12 +317,9 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
317317
val qual1 = typedExpr(tree.qualifier, selectionProto(tree.name, pt, this))
318318
if (tree.name.isTypeName) checkStable(qual1.tpe, qual1.pos)
319319
val select = typedSelect(tree, pt, qual1)
320-
pt match {
321-
case _ if select.tpe ne TryDynamicCallType => select
322-
case _: FunProto | AssignProto => select
323-
case PolyProto(_,_) => select
324-
case _ => typedDynamicSelect(tree.qualifier, tree.name, None, pt)
325-
}
320+
if (select.tpe ne TryDynamicCallType) select
321+
else if (pt.isInstanceOf[PolyProto] || pt.isInstanceOf[FunProto] || pt == AssignProto) select
322+
else typedDynamicSelect(tree, Nil, pt)
326323
}
327324

328325
def asJavaSelectFromTypeTree(implicit ctx: Context): Tree = {
@@ -518,13 +515,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
518515
reassignmentToVal
519516
}
520517
case TryDynamicCallType =>
521-
tree match {
522-
case Assign(Select(qual, name), rhs) if !isDynamicMethod(name) =>
523-
typedDynamicAssign(qual, name, None, rhs, pt)
524-
case Assign(TypeApply(Select(qual, name), targs), rhs) if !isDynamicMethod(name) =>
525-
typedDynamicAssign(qual, name, Some(targs), rhs, pt)
526-
case _ => reassignmentToVal
527-
}
518+
typedDynamicAssign(tree, pt)
528519
case tpe =>
529520
reassignmentToVal
530521
}

0 commit comments

Comments
 (0)