diff options
author | Adriaan Moors <adriaan.moors@typesafe.com> | 2015-11-03 17:53:04 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2015-11-12 13:28:15 -0800 |
commit | c0454b1ea635ca0b6a57805572a6da96c76aff2e (patch) | |
tree | 4b19970483f0c2dc0bc55b353079dd98f875f679 /src | |
parent | 2a20ced512038a930e79fc14bb30782fbd910ac1 (diff) | |
download | scala-c0454b1ea635ca0b6a57805572a6da96c76aff2e.tar.gz scala-c0454b1ea635ca0b6a57805572a6da96c76aff2e.tar.bz2 scala-c0454b1ea635ca0b6a57805572a6da96c76aff2e.zip |
Refactor AddInterfaces triage of impl v iface member
A tiny bit more duplicated code, but so much more intelligible.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/AddInterfaces.scala | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala index 82e7c76409..085a814c6b 100644 --- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala +++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala @@ -242,20 +242,18 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure => } } - private def createMemberDef(tree: Tree, isForInterface: Boolean)(create: Tree => Tree) = { - val isInterfaceTree = tree.isDef && isInterfaceMember(tree.symbol) - if (isInterfaceTree && needsImplMethod(tree.symbol)) - create(tree) - else if (isInterfaceTree == isForInterface) - tree - else - EmptyTree - } - private def implMemberDef(tree: Tree): Tree = createMemberDef(tree, false)(implMethodDef) - private def ifaceMemberDef(tree: Tree): Tree = createMemberDef(tree, true)(t => DefDef(t.symbol, EmptyTree)) + private def isInterfaceTree(tree: Tree) = tree.isDef && isInterfaceMember(tree.symbol) + + private def deriveMemberForImplClass(tree: Tree): Tree = + if (isInterfaceTree(tree)) if (needsImplMethod(tree.symbol)) implMethodDef(tree) else EmptyTree + else tree + + private def deriveMemberForInterface(tree: Tree): Tree = + if (isInterfaceTree(tree)) if (needsImplMethod(tree.symbol)) DefDef(tree.symbol, EmptyTree) else tree + else EmptyTree private def ifaceTemplate(templ: Template): Template = - treeCopy.Template(templ, templ.parents, noSelfType, templ.body map ifaceMemberDef) + treeCopy.Template(templ, templ.parents, noSelfType, templ.body map deriveMemberForInterface) /** Transforms the member tree containing the implementation * into a member of the impl class. @@ -286,7 +284,7 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure => private def implTemplate(clazz: Symbol, templ: Template): Template = atPos(templ.pos) { val templ1 = ( - Template(templ.parents, noSelfType, addMixinConstructorDef(clazz, templ.body map implMemberDef)) + Template(templ.parents, noSelfType, addMixinConstructorDef(clazz, templ.body map deriveMemberForImplClass)) setSymbol clazz.newLocalDummy(templ.pos) ) templ1.changeOwner(templ.symbol.owner -> clazz, templ.symbol -> templ1.symbol) |