aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-06-16 15:02:22 +0200
committerMartin Odersky <odersky@gmail.com>2015-06-16 16:42:54 +0200
commitd25497a92f425c8966dce47cd17fba456ef2660f (patch)
tree7168598edac4f5a13e174052257e16af9a98d65c /src
parentbb940560529ba460af4caa967caaa7f34f944b04 (diff)
downloaddotty-d25497a92f425c8966dce47cd17fba456ef2660f.tar.gz
dotty-d25497a92f425c8966dce47cd17fba456ef2660f.tar.bz2
dotty-d25497a92f425c8966dce47cd17fba456ef2660f.zip
Avoid double negation in isJvmSam.
Found while trying to chase down the problem with stale symbols in last commit. Double negation is confusing. The new formulation avoids it.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/ExpandSAMs.scala17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/transform/ExpandSAMs.scala b/src/dotty/tools/dotc/transform/ExpandSAMs.scala
index 2416e4624..1650a244d 100644
--- a/src/dotty/tools/dotc/transform/ExpandSAMs.scala
+++ b/src/dotty/tools/dotc/transform/ExpandSAMs.scala
@@ -25,20 +25,19 @@ class ExpandSAMs extends MiniPhaseTransform { thisTransformer =>
import ast.tpd._
- def noJvmSam(cls: ClassSymbol)(implicit ctx: Context): Boolean =
- !cls.is(Trait) ||
- cls.superClass != defn.ObjectClass ||
- !cls.is(NoInits) ||
- !cls.directlyInheritedTraits.forall(_.is(NoInits)) ||
- ExplicitOuter.needsOuterIfReferenced(cls) ||
- cls.typeRef.fields.nonEmpty // Superaccessors already show up as abstract methods here, so no test necessary
-
+ /** Is SAMType `cls` also a SAM under the rules of the JVM? */
+ def isJvmSam(cls: ClassSymbol)(implicit ctx: Context): Boolean =
+ cls.is(NoInitsTrait) &&
+ cls.superClass == defn.ObjectClass &&
+ cls.directlyInheritedTraits.forall(_.is(NoInits)) &&
+ !ExplicitOuter.needsOuterIfReferenced(cls) &&
+ cls.typeRef.fields.isEmpty // Superaccessors already show up as abstract methods here, so no test necessary
override def transformBlock(tree: Block)(implicit ctx: Context, info: TransformerInfo): Tree = tree match {
case Block(stats @ (fn: DefDef) :: Nil, Closure(_, fnRef, tpt)) if fnRef.symbol == fn.symbol =>
tpt.tpe match {
case NoType => tree // it's a plain function
- case tpe @ SAMType(_) if !noJvmSam(tpe.classSymbol.asClass) =>
+ case tpe @ SAMType(_) if isJvmSam(tpe.classSymbol.asClass) =>
if (tpe isRef defn.PartialFunctionClass) toPartialFunction(tree)
else tree
case tpe =>