diff options
Diffstat (limited to 'src/dotty/tools/dotc/core')
-rw-r--r-- | src/dotty/tools/dotc/core/Definitions.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Names.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Phases.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/StdNames.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/SymDenotations.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 13 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/ClassfileParser.scala | 4 |
7 files changed, 29 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala index 19d175088..a7c7ac3c6 100644 --- a/src/dotty/tools/dotc/core/Definitions.scala +++ b/src/dotty/tools/dotc/core/Definitions.scala @@ -269,11 +269,11 @@ class Definitions { // fundamental classes lazy val StringClass = ctx.requiredClass("java.lang.String") - lazy val StringModule = StringClass.moduleClass + lazy val StringModule = StringClass.linkedClass lazy val String_+ = newMethod(StringClass, nme.raw.PLUS, methOfAny(StringType), Final) lazy val String_valueOf_Object = StringModule.info.member(nme.valueOf).suchThat(_.info.firstParamTypes match { - case List(pt) => pt isRef ObjectClass + case List(pt) => (pt isRef AnyClass) || (pt isRef ObjectClass) case _ => false }).symbol @@ -398,7 +398,7 @@ class Definitions { def apply(elem: Type)(implicit ctx: Context) = if (ctx.erasedTypes) JavaArrayType(elem) else ArrayClass.typeRef.appliedTo(elem :: Nil) - def unapply(tp: Type)(implicit ctx: Context) = tp.dealias match { + def unapply(tp: Type)(implicit ctx: Context): Option[Type] = tp.dealias match { case at: RefinedType if (at isRef ArrayClass) && at.argInfos.length == 1 => Some(at.argInfos.head) case _ => None } diff --git a/src/dotty/tools/dotc/core/Names.scala b/src/dotty/tools/dotc/core/Names.scala index cf53d0445..f0d3f02eb 100644 --- a/src/dotty/tools/dotc/core/Names.scala +++ b/src/dotty/tools/dotc/core/Names.scala @@ -200,7 +200,7 @@ object Names { private final val fillFactor = 0.7 /** Memory to store all names sequentially. */ - private var chrs: Array[Char] = new Array[Char](InitialNameSize) + private[dotty] var chrs: Array[Char] = new Array[Char](InitialNameSize) /** The number of characters filled. */ private var nc = 0 diff --git a/src/dotty/tools/dotc/core/Phases.scala b/src/dotty/tools/dotc/core/Phases.scala index 5777c0f5b..70dd4296a 100644 --- a/src/dotty/tools/dotc/core/Phases.scala +++ b/src/dotty/tools/dotc/core/Phases.scala @@ -3,6 +3,7 @@ package core import Periods._ import Contexts._ +import dotty.tools.backend.jvm.GenBCode import util.DotClass import DenotTransformers._ import Denotations._ @@ -171,6 +172,7 @@ object Phases { private val flattenCache = new PhaseCache(classOf[Flatten]) private val explicitOuterCache = new PhaseCache(classOf[ExplicitOuter]) private val gettersCache = new PhaseCache(classOf[Getters]) + private val genBCodeCache = new PhaseCache(classOf[GenBCode]) def typerPhase = typerCache.phase def refchecksPhase = refChecksCache.phase @@ -179,6 +181,7 @@ object Phases { def flattenPhase = flattenCache.phase def explicitOuterPhase = explicitOuterCache.phase def gettersPhase = gettersCache.phase + def genBCodePhase = genBCodeCache.phase def isAfterTyper(phase: Phase): Boolean = phase.id > typerPhase.id } diff --git a/src/dotty/tools/dotc/core/StdNames.scala b/src/dotty/tools/dotc/core/StdNames.scala index 24e948fa9..04bcf616d 100644 --- a/src/dotty/tools/dotc/core/StdNames.scala +++ b/src/dotty/tools/dotc/core/StdNames.scala @@ -510,6 +510,9 @@ object StdNames { val wrap: N = "wrap" val zero: N = "zero" val zip: N = "zip" + val nothingRuntimeClass: N = "scala.runtime.Nothing$" + val nullRuntimeClass: N = "scala.runtime.Null$" + val synthSwitch: N = "$synthSwitch" diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index a05296802..eccdcbfb9 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -324,6 +324,9 @@ object SymDenotations { final def isAnonymousClass(implicit ctx: Context): Boolean = isClass && (initial.asSymDenotation.name startsWith tpnme.ANON_CLASS) + final def isAnonymousFunction(implicit ctx: Context) = + this.symbol.is(Method) && (initial.asSymDenotation.name startsWith nme.ANON_FUN) + /** Is symbol a primitive value class? */ def isPrimitiveValueClass(implicit ctx: Context) = defn.ScalaValueClasses contains symbol diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index 473b23f7b..a1ca7796f 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -29,6 +29,7 @@ import collection.{mutable, Seq, breakOut} import config.Config import config.Printers._ import annotation.tailrec +import Flags.FlagSet import language.implicitConversions object Types { @@ -523,6 +524,18 @@ object Types { .toList.map(d => TermRef.withSig(this, d.symbol.asTerm)) } + /** The set of member classes of this type */ + final def memberClasses(implicit ctx: Context): Seq[SingleDenotation] = track("implicitMembers") { + memberDenots(typeNameFilter, + (name, buf) => buf ++= member(name).altsWith(x => x.isClass)) + } + + /** The set of members of this type having at least one of `requiredFlags` but none of `excludedFlags` set */ + final def membersBasedOnFlags(requiredFlags: FlagSet, excludedFlags: FlagSet)(implicit ctx: Context): Seq[SingleDenotation] = track("implicitMembers") { + memberDenots(takeAllFilter, + (name, buf) => buf ++= member(name).altsWith(x => x.is(requiredFlags, butNot = excludedFlags))) + } + /** The info of `sym`, seen as a member of this type. */ final def memberInfo(sym: Symbol)(implicit ctx: Context): Type = sym.info.asSeenFrom(this, sym.owner) diff --git a/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala b/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala index 8231c25af..cc3d3eb7f 100644 --- a/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala +++ b/src/dotty/tools/dotc/core/pickling/ClassfileParser.scala @@ -876,7 +876,9 @@ class ClassfileParser( val start = starts(index) if (in.buf(start).toInt != CONSTANT_CLASS) errorBadTag(start) val name = getExternalName(in.getChar(start + 1)) - if (name.isModuleClassName) c = ctx.requiredModule(name.sourceModuleName) + if (name.isModuleClassName && (name ne nme.nothingRuntimeClass) && (name ne nme.nullRuntimeClass)) + // Null$ and Nothing$ ARE classes + c = ctx.requiredModule(name.sourceModuleName) else c = classNameToSymbol(name) values(index) = c } |