diff options
-rw-r--r-- | src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala | 55 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/classfile/ClassfileParser.scala | 8 | ||||
-rw-r--r-- | tests/disabled/pos/i530-import-symbolic.scala (renamed from tests/disabled/i530-import-symbolic.scala) | 0 | ||||
-rw-r--r-- | tests/disabled/pos/simplesams.scala (renamed from tests/disabled/simplesams.scala) | 0 | ||||
-rw-r--r-- | tests/disabled/pos/t1237.scala (renamed from tests/disabled/t1237.scala) | 0 | ||||
-rw-r--r-- | tests/disabled/pos/t2669.scala (renamed from tests/disabled/t2669.scala) | 0 | ||||
-rw-r--r-- | tests/disabled/pos/t3174.scala (renamed from tests/disabled/t3174.scala) | 0 | ||||
-rw-r--r-- | tests/disabled/run/t7291.check (renamed from tests/run/t7291.check) | 0 | ||||
-rw-r--r-- | tests/disabled/run/t7291.scala (renamed from tests/run/t7291.scala) | 0 | ||||
-rwxr-xr-x | tests/disabled/t2503.scala (renamed from tests/run/t2503.scala) | 0 | ||||
-rw-r--r-- | tests/disabled/t5577.scala (renamed from tests/run/t5577.scala) | 0 | ||||
-rw-r--r-- | tests/pos/intersection.scala | 19 | ||||
-rw-r--r-- | tests/pos/jon.scala | 8 | ||||
-rw-r--r-- | tests/pos/pets.scala | 21 | ||||
-rw-r--r-- | tests/pos/sort.scala | 7 | ||||
-rw-r--r-- | tests/pos/staleSymbol.scala | 7 |
16 files changed, 91 insertions, 34 deletions
diff --git a/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala b/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala index b04ea99ac..dd29fa49d 100644 --- a/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala +++ b/src/dotty/tools/dotc/core/classfile/ClassfileConstants.scala @@ -329,15 +329,11 @@ object ClassfileConstants { final val impdep1 = 0xfe final val impdep2 = 0xff + import Flags._ abstract class FlagTranslation { - import Flags._ - private var isAnnotation = false - private var isClass = false - private def initFields(flags: Int) = { - isAnnotation = (flags & JAVA_ACC_ANNOTATION) != 0 - isClass = false - } + protected def baseFlags(jflags: Int) = EmptyFlags + protected def isClass: Boolean = false private def translateFlag(jflag: Int): FlagSet = (jflag: @switch) match { case JAVA_ACC_PRIVATE => Private @@ -345,8 +341,8 @@ object ClassfileConstants { case JAVA_ACC_FINAL => Final case JAVA_ACC_SYNTHETIC => Synthetic case JAVA_ACC_STATIC => JavaStatic - case JAVA_ACC_ABSTRACT => if (isAnnotation) EmptyFlags else if (isClass) Abstract else Deferred - case JAVA_ACC_INTERFACE => if (isAnnotation) EmptyFlags else PureInterfaceCreationFlags | JavaDefined + case JAVA_ACC_ABSTRACT => if (isClass) Abstract else Deferred + case JAVA_ACC_INTERFACE => PureInterfaceCreationFlags | JavaDefined case _ => EmptyFlags } @@ -354,30 +350,29 @@ object ClassfileConstants { if (jflag == 0) base else base | translateFlag(jflag) private def translateFlags(jflags: Int, baseFlags: FlagSet): FlagSet = { + val nflags = + if ((jflags & JAVA_ACC_ANNOTATION) == 0) jflags + else jflags & ~(JAVA_ACC_ABSTRACT | JAVA_ACC_INTERFACE) // annotations are neither abstract nor interfaces var res: FlagSet = baseFlags | JavaDefined - res = addFlag(res, jflags & JAVA_ACC_PRIVATE) - res = addFlag(res, jflags & JAVA_ACC_PROTECTED) - res = addFlag(res, jflags & JAVA_ACC_FINAL) - res = addFlag(res, jflags & JAVA_ACC_SYNTHETIC) - res = addFlag(res, jflags & JAVA_ACC_STATIC) - res = addFlag(res, jflags & JAVA_ACC_ABSTRACT) - res = addFlag(res, jflags & JAVA_ACC_INTERFACE) + res = addFlag(res, nflags & JAVA_ACC_PRIVATE) + res = addFlag(res, nflags & JAVA_ACC_PROTECTED) + res = addFlag(res, nflags & JAVA_ACC_FINAL) + res = addFlag(res, nflags & JAVA_ACC_SYNTHETIC) + res = addFlag(res, nflags & JAVA_ACC_STATIC) + res = addFlag(res, nflags & JAVA_ACC_ABSTRACT) + res = addFlag(res, nflags & JAVA_ACC_INTERFACE) res } - def classFlags(jflags: Int): FlagSet = { - initFields(jflags) - isClass = true - translateFlags(jflags, EmptyFlags) - } - def fieldFlags(jflags: Int): FlagSet = { - initFields(jflags) - translateFlags(jflags, if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags) - } - def methodFlags(jflags: Int): FlagSet = { - initFields(jflags) - translateFlags(jflags, if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags) - } + def flags(jflags: Int): FlagSet = translateFlags(jflags, baseFlags(jflags)) + } + val classTranslation = new FlagTranslation { + override def isClass = true + } + val fieldTranslation = new FlagTranslation { + override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_FINAL) == 0) Mutable else EmptyFlags + } + val methodTranslation = new FlagTranslation { + override def baseFlags(jflags: Int) = if ((jflags & JAVA_ACC_BRIDGE) != 0) Bridge else EmptyFlags } - object FlagTranslation extends FlagTranslation { } } diff --git a/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala b/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala index ee5453a8e..d53f545d3 100644 --- a/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala +++ b/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala @@ -89,7 +89,7 @@ class ClassfileParser( def parseClass()(implicit ctx: Context): Option[Embedded] = { val jflags = in.nextChar val isAnnotation = hasAnnotation(jflags) - val sflags = FlagTranslation.classFlags(jflags) + val sflags = classTranslation.flags(jflags) val nameIdx = in.nextChar currentClassName = pool.getClassName(nameIdx) @@ -163,8 +163,8 @@ class ClassfileParser( val start = indexCoord(in.bp) val jflags = in.nextChar val sflags = - if (method) Flags.Method | FlagTranslation.methodFlags(jflags) - else FlagTranslation.fieldFlags(jflags) + if (method) Flags.Method | methodTranslation.flags(jflags) + else fieldTranslation.flags(jflags) val name = pool.getName(in.nextChar) if (!(sflags is Flags.Private) || name == nme.CONSTRUCTOR || ctx.settings.optimise.value) { val member = ctx.newSymbol( @@ -632,7 +632,7 @@ class ClassfileParser( getOwner(jflags), entry.originalName, new ClassfileLoader(file), - FlagTranslation.classFlags(jflags), + classTranslation.flags(jflags), getScope(jflags)) } diff --git a/tests/disabled/i530-import-symbolic.scala b/tests/disabled/pos/i530-import-symbolic.scala index f2c541af4..f2c541af4 100644 --- a/tests/disabled/i530-import-symbolic.scala +++ b/tests/disabled/pos/i530-import-symbolic.scala diff --git a/tests/disabled/simplesams.scala b/tests/disabled/pos/simplesams.scala index 14a7ba6c0..14a7ba6c0 100644 --- a/tests/disabled/simplesams.scala +++ b/tests/disabled/pos/simplesams.scala diff --git a/tests/disabled/t1237.scala b/tests/disabled/pos/t1237.scala index 31ba2966a..31ba2966a 100644 --- a/tests/disabled/t1237.scala +++ b/tests/disabled/pos/t1237.scala diff --git a/tests/disabled/t2669.scala b/tests/disabled/pos/t2669.scala index 609e88786..609e88786 100644 --- a/tests/disabled/t2669.scala +++ b/tests/disabled/pos/t2669.scala diff --git a/tests/disabled/t3174.scala b/tests/disabled/pos/t3174.scala index 8d9b2578d..8d9b2578d 100644 --- a/tests/disabled/t3174.scala +++ b/tests/disabled/pos/t3174.scala diff --git a/tests/run/t7291.check b/tests/disabled/run/t7291.check index c07ba986a..c07ba986a 100644 --- a/tests/run/t7291.check +++ b/tests/disabled/run/t7291.check diff --git a/tests/run/t7291.scala b/tests/disabled/run/t7291.scala index ee22b581e..ee22b581e 100644 --- a/tests/run/t7291.scala +++ b/tests/disabled/run/t7291.scala diff --git a/tests/run/t2503.scala b/tests/disabled/t2503.scala index d0983f2ca..d0983f2ca 100755 --- a/tests/run/t2503.scala +++ b/tests/disabled/t2503.scala diff --git a/tests/run/t5577.scala b/tests/disabled/t5577.scala index d54a37e45..d54a37e45 100644 --- a/tests/run/t5577.scala +++ b/tests/disabled/t5577.scala diff --git a/tests/pos/intersection.scala b/tests/pos/intersection.scala new file mode 100644 index 000000000..2b9f6c0b7 --- /dev/null +++ b/tests/pos/intersection.scala @@ -0,0 +1,19 @@ +object intersection { + + class A + class B + + val x: A => Unit = ??? + val y: B => Unit = ??? + + val z = if (???) x else y + + val a: A & B => Unit = z + val b: (A => Unit) | (B => Unit) = z + + + + + type needsA = A => Nothing + type needsB = B => Nothing +} diff --git a/tests/pos/jon.scala b/tests/pos/jon.scala new file mode 100644 index 000000000..d4ea74f02 --- /dev/null +++ b/tests/pos/jon.scala @@ -0,0 +1,8 @@ +// This one blows up with a huge type in Scala 2. +// Reported by Jon Pretty in his talk on Scala type inference. +object Test { + + val x = List(List, Vector) + + val y: List[scala.collection.generic.SeqFactory] = x +} diff --git a/tests/pos/pets.scala b/tests/pos/pets.scala new file mode 100644 index 000000000..e1d5df44e --- /dev/null +++ b/tests/pos/pets.scala @@ -0,0 +1,21 @@ +// Representing the current type +trait Pet { + type This <: Pet + def name: String + def renamed(newName: String): This +} + +case class Fish(name: String, age: Int) extends Pet { + type This = Fish + def renamed(newName: String): Fish = copy(name = newName) +} + +case class Kitty(name: String, age: Int) extends Pet { + type This = Kitty + def renamed(newName: String): Kitty = copy(name = newName) +} + +object Test { + def esquire[A <: Pet](a: A): a.This = a.renamed(a.name + ", Esq.") + val f: Fish = esquire(new Fish("bob", 22)) +} diff --git a/tests/pos/sort.scala b/tests/pos/sort.scala new file mode 100644 index 000000000..97ee3454d --- /dev/null +++ b/tests/pos/sort.scala @@ -0,0 +1,7 @@ +object sorting { + + val xs: Array[String] = ??? + + java.util.Arrays.sort(xs, ???) + +} diff --git a/tests/pos/staleSymbol.scala b/tests/pos/staleSymbol.scala new file mode 100644 index 000000000..310d87cb9 --- /dev/null +++ b/tests/pos/staleSymbol.scala @@ -0,0 +1,7 @@ +object intersection { + + class A + class B + + val x: A => Unit = ??? +} |