aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-03-30 14:06:43 +0200
committerMartin Odersky <odersky@gmail.com>2017-04-11 09:33:11 +0200
commitab2d095943dc63414da8352ebf1e82bdb642450d (patch)
tree972ef8f09fac18b8ae20f0d5bd03e6edddb639da
parent21ded6ee9f727bd5a1c3975809c06868fe1b5536 (diff)
downloaddotty-ab2d095943dc63414da8352ebf1e82bdb642450d.tar.gz
dotty-ab2d095943dc63414da8352ebf1e82bdb642450d.tar.bz2
dotty-ab2d095943dc63414da8352ebf1e82bdb642450d.zip
Make "direct names" semantic
-rw-r--r--compiler/src/dotty/tools/dotc/core/NameKinds.scala1
-rw-r--r--compiler/src/dotty/tools/dotc/core/StdNames.scala2
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala2
-rw-r--r--compiler/src/dotty/tools/dotc/transform/ShortcutImplicits.scala7
4 files changed, 7 insertions, 5 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/NameKinds.scala b/compiler/src/dotty/tools/dotc/core/NameKinds.scala
index 381bb3fc0..f5a758256 100644
--- a/compiler/src/dotty/tools/dotc/core/NameKinds.scala
+++ b/compiler/src/dotty/tools/dotc/core/NameKinds.scala
@@ -248,6 +248,7 @@ object NameKinds {
val ProtectedAccessorName = new PrefixNameKind(PROTECTEDACCESSOR, "protected$")
val ProtectedSetterName = new PrefixNameKind(PROTECTEDSETTER, "protected$set") // dubious encoding, kept for Scala2 compatibility
val AvoidClashName = new SuffixNameKind(AVOIDCLASH, "$_avoid_name_clash_$")
+ val DirectName = new SuffixNameKind(DIRECT, "$direct")
val ModuleClassName = new SuffixNameKind(OBJECTCLASS, "$", optInfoString = "ModuleClass")
object SignedName extends NameKind(63) {
diff --git a/compiler/src/dotty/tools/dotc/core/StdNames.scala b/compiler/src/dotty/tools/dotc/core/StdNames.scala
index 51821c51b..ece3d42dd 100644
--- a/compiler/src/dotty/tools/dotc/core/StdNames.scala
+++ b/compiler/src/dotty/tools/dotc/core/StdNames.scala
@@ -132,7 +132,6 @@ object StdNames {
val COMPANION_MODULE_METHOD: N = "companion$module"
val COMPANION_CLASS_METHOD: N = "companion$class"
val TRAIT_SETTER_SEPARATOR: N = str.TRAIT_SETTER_SEPARATOR
- val DIRECT_SUFFIX: N = "$direct"
// value types (and AnyRef) are all used as terms as well
// as (at least) arguments to the @specialize annotation.
@@ -166,7 +165,6 @@ object StdNames {
// fictions we use as both types and terms
final val ERROR: N = "<error>"
- final val ERRORenc: N = encode("<error>")
final val NO_NAME: N = "<none>" // formerly NOSYMBOL
final val WILDCARD: N = "_"
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala
index ec59e711a..4acadc943 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala
@@ -235,9 +235,11 @@ object TastyFormat {
final val INITIALIZER = 23
final val SHADOWED = 24
final val AVOIDCLASH = 27
+ final val DIRECT = 28
final val OBJECTCLASS = 29
final val SIGNED = 63
+ final val firstInternalTag = 64
// AST tags
diff --git a/compiler/src/dotty/tools/dotc/transform/ShortcutImplicits.scala b/compiler/src/dotty/tools/dotc/transform/ShortcutImplicits.scala
index 1a530b95c..2fea19847 100644
--- a/compiler/src/dotty/tools/dotc/transform/ShortcutImplicits.scala
+++ b/compiler/src/dotty/tools/dotc/transform/ShortcutImplicits.scala
@@ -11,6 +11,7 @@ import core.Decorators._
import core.StdNames.nme
import core.Names._
import core.NameOps._
+import core.NameKinds.DirectName
import ast.Trees._
import ast.tpd
import collection.mutable
@@ -91,7 +92,7 @@ class ShortcutImplicits extends MiniPhase with IdentityDenotTransformer { thisTr
/** A new `m$direct` method to accompany the given method `m` */
private def newDirectMethod(sym: Symbol)(implicit ctx: Context): Symbol = {
val direct = sym.copy(
- name = sym.name.directName,
+ name = DirectName(sym.name.asTermName).asInstanceOf[sym.ThisName],
flags = sym.flags | Synthetic,
info = directInfo(sym.info))
if (direct.allOverriddenSymbols.isEmpty) direct.resetFlag(Override)
@@ -103,7 +104,7 @@ class ShortcutImplicits extends MiniPhase with IdentityDenotTransformer { thisTr
*/
private def directMethod(sym: Symbol)(implicit ctx: Context): Symbol =
if (sym.owner.isClass) {
- val direct = sym.owner.info.member(sym.name.directName)
+ val direct = sym.owner.info.member(DirectName(sym.name.asTermName))
.suchThat(_.info matches directInfo(sym.info)).symbol
if (direct.maybeOwner == sym.owner) direct
else newDirectMethod(sym).enteredAfter(thisTransform)
@@ -121,7 +122,7 @@ class ShortcutImplicits extends MiniPhase with IdentityDenotTransformer { thisTr
case TypeApply(fn, args) => cpy.TypeApply(tree)(directQual(fn), args)
case Block(stats, expr) => cpy.Block(tree)(stats, directQual(expr))
case tree: RefTree =>
- cpy.Ref(tree)(tree.name.directName)
+ cpy.Ref(tree)(DirectName(tree.name.asTermName))
.withType(directMethod(tree.symbol).termRef)
}
directQual(tree.qualifier)