aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/transform/Erasure.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-12-04 15:55:33 +0100
committerMartin Odersky <odersky@gmail.com>2016-12-17 18:34:27 +0100
commitd5ff7e052f4c321e3089e0543617f81416e4aed4 (patch)
treefdbe5b7aaeff10b7cda8945e0eb87d894855d6cc /compiler/src/dotty/tools/dotc/transform/Erasure.scala
parentaecfb37919291f3d191aa3c04f753cc2df4d962a (diff)
downloaddotty-d5ff7e052f4c321e3089e0543617f81416e4aed4.tar.gz
dotty-d5ff7e052f4c321e3089e0543617f81416e4aed4.tar.bz2
dotty-d5ff7e052f4c321e3089e0543617f81416e4aed4.zip
Fix erasure of implicit functions
and check at runtime that it works
Diffstat (limited to 'compiler/src/dotty/tools/dotc/transform/Erasure.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/transform/Erasure.scala28
1 files changed, 15 insertions, 13 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/Erasure.scala b/compiler/src/dotty/tools/dotc/transform/Erasure.scala
index 7595e5f2e..71ecb5c65 100644
--- a/compiler/src/dotty/tools/dotc/transform/Erasure.scala
+++ b/compiler/src/dotty/tools/dotc/transform/Erasure.scala
@@ -345,21 +345,23 @@ object Erasure extends TypeTestsCasts{
override def typedSelect(tree: untpd.Select, pt: Type)(implicit ctx: Context): Tree = {
def mapOwner(sym: Symbol): Symbol = {
- val owner = sym.owner
- if ((owner eq defn.AnyClass) || (owner eq defn.AnyValClass)) {
- assert(sym.isConstructor, s"${sym.showLocated}")
- defn.ObjectClass
- }
- else if (defn.isUnimplementedFunctionClass(owner))
- defn.FunctionXXLClass
- else
- owner
+ def recur(owner: Symbol): Symbol =
+ if ((owner eq defn.AnyClass) || (owner eq defn.AnyValClass)) {
+ assert(sym.isConstructor, s"${sym.showLocated}")
+ defn.ObjectClass
+ } else if (defn.isUnimplementedFunctionClass(owner))
+ defn.FunctionXXLClass
+ else if (defn.isImplicitFunctionClass(owner))
+ recur(defn.FunctionClass(owner.name.functionArity))
+ else
+ owner
+ recur(sym.owner)
}
- var sym = tree.symbol
- val owner = mapOwner(sym)
- if (owner ne sym.owner) sym = owner.info.decl(sym.name).symbol
- assert(sym.exists, owner)
+ val origSym = tree.symbol
+ val owner = mapOwner(origSym)
+ val sym = if (owner eq origSym.owner) origSym else owner.info.decl(origSym.name).symbol
+ assert(sym.exists, origSym.showLocated)
def select(qual: Tree, sym: Symbol): Tree = {
val name = tree.typeOpt match {