diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-03 07:08:14 -0700 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2012-07-03 07:08:14 -0700 |
commit | 1fe5087c8e7713cbb42e1da6c1486de3531dd544 (patch) | |
tree | 821e687fa2f475eafd0871cd8b55c21fdf5404f1 | |
parent | bc2e6fe8bf20b2aa985ea78a2c610ac33497da38 (diff) | |
parent | 2ad2ef9d129b209edb9377da0899f5f35b674197 (diff) | |
download | scala-1fe5087c8e7713cbb42e1da6c1486de3531dd544.tar.gz scala-1fe5087c8e7713cbb42e1da6c1486de3531dd544.tar.bz2 scala-1fe5087c8e7713cbb42e1da6c1486de3531dd544.zip |
Merge pull request #815 from scalamacros/ticket/5990
u.build now correctly invokes missing symbol hooks
-rw-r--r-- | src/reflect/scala/reflect/internal/BuildUtils.scala | 24 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Mirrors.scala | 4 | ||||
-rw-r--r-- | test/files/run/reify_magicsymbols.check | 13 | ||||
-rw-r--r-- | test/files/run/reify_magicsymbols.scala | 17 |
4 files changed, 46 insertions, 12 deletions
diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala index 3bde57ded8..0bf5aa4b69 100644 --- a/src/reflect/scala/reflect/internal/BuildUtils.scala +++ b/src/reflect/scala/reflect/internal/BuildUtils.scala @@ -7,19 +7,21 @@ trait BuildUtils extends base.BuildUtils { self: SymbolTable => class BuildImpl extends BuildBase { - def selectType(owner: Symbol, name: String): TypeSymbol = { - val result = owner.info.decl(newTypeName(name)) - if (result ne NoSymbol) result.asTypeSymbol - else MissingRequirementError.notFound("type %s in %s".format(name, owner.fullName)) - } + def selectType(owner: Symbol, name: String): TypeSymbol = + select(owner, newTypeName(name)).asTypeSymbol def selectTerm(owner: Symbol, name: String): TermSymbol = { - val sym = owner.info.decl(newTermName(name)) - val result = - if (sym.isOverloaded) sym.suchThat(!_.isMethod) - else sym - if (result ne NoSymbol) result.asTermSymbol - else MissingRequirementError.notFound("term %s in %s".format(name, owner.fullName)) + val result = select(owner, newTermName(name)).asTermSymbol + if (result.isOverloaded) result.suchThat(!_.isMethod).asTermSymbol + else result + } + + private def select(owner: Symbol, name: Name): Symbol = { + val result = owner.info decl name + if (result ne NoSymbol) result + else + mirrorThatLoaded(owner).tryMissingHooks(owner, name) orElse + MissingRequirementError.notFound("%s %s in %s".format(if (name.isTermName) "term" else "type", name, owner.fullName)) } def selectOverloadedMethod(owner: Symbol, name: String, index: Int): MethodSymbol = { diff --git a/src/reflect/scala/reflect/internal/Mirrors.scala b/src/reflect/scala/reflect/internal/Mirrors.scala index e3680b14d5..dedfd41e83 100644 --- a/src/reflect/scala/reflect/internal/Mirrors.scala +++ b/src/reflect/scala/reflect/internal/Mirrors.scala @@ -41,7 +41,7 @@ trait Mirrors extends api.Mirrors { if (result != NoSymbol) result else { if (settings.debug.value) { log(sym.info); log(sym.info.members) }//debug - mirrorMissingHook(owner, name) orElse symbolTableMissingHook(owner, name) orElse { + tryMissingHooks(owner, name) orElse { MissingRequirementError.notFound((if (path.isTermName) "object " else "class ")+path+" in "+thisMirror) } } @@ -51,6 +51,8 @@ trait Mirrors extends api.Mirrors { protected def symbolTableMissingHook(owner: Symbol, name: Name): Symbol = self.missingHook(owner, name) + private[reflect] def tryMissingHooks(owner: Symbol, name: Name): Symbol = mirrorMissingHook(owner, name) orElse symbolTableMissingHook(owner, name) + /** If you're looking for a class, pass a type name. * If a module, a term name. */ diff --git a/test/files/run/reify_magicsymbols.check b/test/files/run/reify_magicsymbols.check new file mode 100644 index 0000000000..e2aa46a364 --- /dev/null +++ b/test/files/run/reify_magicsymbols.check @@ -0,0 +1,13 @@ +Any +AnyVal +AnyRef +Null +Nothing +List[Any] +List[AnyVal] +List[AnyRef] +List[Null] +List[Nothing] +AnyRef{def foo(x: Int): Int} +Int* => Unit +=> Int => Unit diff --git a/test/files/run/reify_magicsymbols.scala b/test/files/run/reify_magicsymbols.scala new file mode 100644 index 0000000000..256ecbea33 --- /dev/null +++ b/test/files/run/reify_magicsymbols.scala @@ -0,0 +1,17 @@ +import scala.reflect.runtime.universe._ + +object Test extends App { + println(typeOf[Any]) + println(typeOf[AnyVal]) + println(typeOf[AnyRef]) + println(typeOf[Null]) + println(typeOf[Nothing]) + println(typeOf[List[Any]]) + println(typeOf[List[AnyVal]]) + println(typeOf[List[AnyRef]]) + println(typeOf[List[Null]]) + println(typeOf[List[Nothing]]) + println(typeOf[{def foo(x: Int): Int}]) + println(typeOf[(Int*) => Unit]) + println(typeOf[(=> Int) => Unit]) +}
\ No newline at end of file |