Skip to content

Commit d096f00

Browse files
committed
Simplify typedSelect logic
1 parent bb224fb commit d096f00

File tree

1 file changed

+22
-25
lines changed

1 file changed

+22
-25
lines changed

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

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -363,45 +363,42 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
363363
else tree
364364

365365
def typedSelect(tree: untpd.Select, pt: Type)(implicit ctx: Context): Tree = track("typedSelect") {
366-
def typeAsIs(implicit ctx: Context): Tree = {
367-
if (tree.qualifier.isType) {
368-
val qual1 = typedType(tree.qualifier, selectionProto(tree.name, pt, this))
369-
assignType(cpy.Select(tree)(qual1, tree.name), qual1)
370-
}
371-
else {
372-
val qual1 = typedExpr(tree.qualifier, selectionProto(tree.name, pt, this))
373-
if (tree.name.isTypeName) checkStable(qual1.tpe, qual1.pos)
374-
val select = typedSelect(tree, pt, qual1)
375-
if (select.tpe ne TryDynamicCallType) select
376-
else if (pt.isInstanceOf[PolyProto] || pt.isInstanceOf[FunProto] || pt == AssignProto) select
377-
else typedDynamicSelect(tree, Nil, pt)
378-
}
366+
def typeSelectOnTerm(implicit ctx: Context): Tree = {
367+
val qual1 = typedExpr(tree.qualifier, selectionProto(tree.name, pt, this))
368+
if (tree.name.isTypeName) checkStable(qual1.tpe, qual1.pos)
369+
val select = typedSelect(tree, pt, qual1)
370+
if (select.tpe ne TryDynamicCallType) select
371+
else if (pt.isInstanceOf[PolyProto] || pt.isInstanceOf[FunProto] || pt == AssignProto) select
372+
else typedDynamicSelect(tree, Nil, pt)
379373
}
380374

381-
def asJavaSelectFromType(implicit ctx: Context): Tree = {
382-
def typeSelectOnType(qual: untpd.Tree) =
383-
typedSelect(untpd.cpy.Select(tree)(qual, tree.name.toTypeName), pt)
384-
tree.qualifier match {
385-
case Select(qual, name) => typeSelectOnType(untpd.Select(qual, name.toTypeName))
386-
case Ident(name) => typeSelectOnType(untpd.Ident(name.toTypeName))
387-
case _ => errorTree(tree, "cannot convert to type selection") // will never be printed due to fallback
388-
}
375+
def typeSelectOnType(qual: untpd.Tree)(implicit ctx: Context) =
376+
typedSelect(untpd.cpy.Select(tree)(qual, tree.name.toTypeName), pt)
377+
378+
def tryJavaSelectOnType(implicit ctx: Context): Tree = tree.qualifier match {
379+
case Select(qual, name) => typeSelectOnType(untpd.Select(qual, name.toTypeName))
380+
case Ident(name) => typeSelectOnType(untpd.Ident(name.toTypeName))
381+
case _ => errorTree(tree, "cannot convert to type selection") // will never be printed due to fallback
389382
}
390383

391384
def selectWithFallback(fallBack: Context => Tree) =
392-
tryAlternatively(typeAsIs(_))(fallBack)
385+
tryAlternatively(typeSelectOnTerm(_))(fallBack)
393386

394-
if (ctx.compilationUnit.isJava && tree.name.isTypeName)
387+
if (tree.qualifier.isType) {
388+
val qual1 = typedType(tree.qualifier, selectionProto(tree.name, pt, this))
389+
assignType(cpy.Select(tree)(qual1, tree.name), qual1)
390+
}
391+
else if (ctx.compilationUnit.isJava && tree.name.isTypeName)
395392
// SI-3120 Java uses the same syntax, A.B, to express selection from the
396393
// value A and from the type A. We have to try both.
397-
selectWithFallback(asJavaSelectFromType(_)) // !!! possibly exponential bcs of qualifier retyping
394+
selectWithFallback(tryJavaSelectOnType(_)) // !!! possibly exponential bcs of qualifier retyping
398395
else if (tree.name == nme.withFilter && tree.getAttachment(desugar.MaybeFilter).isDefined)
399396
selectWithFallback {
400397
implicit ctx =>
401398
typedSelect(untpd.cpy.Select(tree)(tree.qualifier, nme.filter), pt) // !!! possibly exponential bcs of qualifier retyping
402399
}
403400
else
404-
typeAsIs(ctx)
401+
typeSelectOnTerm(ctx)
405402
}
406403

407404
def typedThis(tree: untpd.This)(implicit ctx: Context): Tree = track("typedThis") {

0 commit comments

Comments
 (0)