diff options
author | Martin Odersky <odersky@gmail.com> | 2013-04-05 16:54:10 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-04-05 16:54:40 +0200 |
commit | 4ce196d8152f75163edb362fcd21fb37631b7fde (patch) | |
tree | b1bfe19ab22935474b0be5939d61e93c8e86719a /src/dotty/tools/dotc/core/NameOps.scala | |
parent | 859840dd0662a12fbc1ba470438eca779b08ed89 (diff) | |
download | dotty-4ce196d8152f75163edb362fcd21fb37631b7fde.tar.gz dotty-4ce196d8152f75163edb362fcd21fb37631b7fde.tar.bz2 dotty-4ce196d8152f75163edb362fcd21fb37631b7fde.zip |
Made module class names end in '$'.
If module classes have the same names as their companion classes there is the latent trap that TypeRefs refer to one or the other. To avoid cross-talk, module classes need to have a different name.
Also, some fixes to baseType, isSubClass in SymDenotations.
Diffstat (limited to 'src/dotty/tools/dotc/core/NameOps.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/NameOps.scala | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/core/NameOps.scala b/src/dotty/tools/dotc/core/NameOps.scala index 1045d0de9..60ac3fba9 100644 --- a/src/dotty/tools/dotc/core/NameOps.scala +++ b/src/dotty/tools/dotc/core/NameOps.scala @@ -5,7 +5,7 @@ import java.security.MessageDigest import Chars.isOperatorPart import scala.annotation.switch import scala.io.Codec -import Names._, StdNames._, Contexts._, Symbols._ +import Names._, StdNames._, Contexts._, Symbols._, Flags._ import Decorators.StringDecorator object NameOps { @@ -60,7 +60,7 @@ object NameOps { def isSetterName = name endsWith SETTER_SUFFIX def isTraitSetterName = isSetterName && (name containsSlice TRAIT_SETTER_SEPARATOR) def isSingletonName = name endsWith SINGLETON_SUFFIX - def isModuleName = name endsWith MODULE_SUFFIX + def isModuleClassName = name endsWith MODULE_SUFFIX def isModuleVarName(name: Name): Boolean = name.stripAnonNumberSuffix endsWith MODULE_VAR_SUFFIX @@ -106,8 +106,14 @@ object NameOps { name } - def stripModuleSuffix: Name = - if (isModuleName) name dropRight MODULE_SUFFIX.length else name + /** If name ends in module class suffix, drop it */ + def stripModuleClassSuffix: Name = + if (isModuleClassName) name dropRight MODULE_SUFFIX.length else name + + /** If flags is a ModuleClass but not a Package, add module class suffix */ + def adjustIfModuleClass(flags: Flags.FlagSet): N = + if (flags is (ModuleClass, butNot = Package)) name.asTypeName.moduleClassName.asInstanceOf[N] + else name /** The expanded name of `name` relative to this class `base` with given `separator` */ @@ -172,6 +178,13 @@ object NameOps { tpnme.Float -> jtpnme.BoxedFloat, tpnme.Double -> jtpnme.BoxedDouble) + implicit class TypeNameDecorator(val name: TypeName) extends AnyVal { + import nme._ + + /** Convert this name to a module name */ + def moduleClassName = name ++ tpnme.MODULE_SUFFIX + } + implicit class TermNameDecorator(val name: TermName) extends AnyVal { import nme._ |