summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-09-28 10:12:47 +0000
committerMartin Odersky <odersky@gmail.com>2011-09-28 10:12:47 +0000
commit17654320852e262ebcf0a267603be7d35fc3b9e0 (patch)
tree41e816aa786d61bdb480e2b64f68742c3c252fee
parent8c9d01fffaad598d103f80e88c47fc7224f181ab (diff)
downloadscala-17654320852e262ebcf0a267603be7d35fc3b9e0.tar.gz
scala-17654320852e262ebcf0a267603be7d35fc3b9e0.tar.bz2
scala-17654320852e262ebcf0a267603be7d35fc3b9e0.zip
More fixes to reflection; cleaned up output.
-rw-r--r--src/compiler/scala/reflect/internal/Definitions.scala1
-rw-r--r--src/compiler/scala/reflect/runtime/ConversionUtil.scala2
-rw-r--r--src/compiler/scala/reflect/runtime/JavaToScala.scala9
-rw-r--r--src/compiler/scala/reflect/runtime/Loaders.scala6
-rw-r--r--src/compiler/scala/reflect/runtime/SymbolTable.scala15
-rw-r--r--src/compiler/scala/tools/nsc/transform/LiftCode.scala9
6 files changed, 23 insertions, 19 deletions
diff --git a/src/compiler/scala/reflect/internal/Definitions.scala b/src/compiler/scala/reflect/internal/Definitions.scala
index 17dc33278d..ba9bd27ab6 100644
--- a/src/compiler/scala/reflect/internal/Definitions.scala
+++ b/src/compiler/scala/reflect/internal/Definitions.scala
@@ -666,7 +666,6 @@ trait Definitions extends reflect.api.StandardDefinitions {
val point = path lastPos('.', len - 1)
val owner =
if (point > 0) getModuleOrClass(path.toTermName, point)
- else if (path.isTypeName) EmptyPackageClass
else RootClass
val name = path subName (point + 1, len)
val sym = owner.info member name
diff --git a/src/compiler/scala/reflect/runtime/ConversionUtil.scala b/src/compiler/scala/reflect/runtime/ConversionUtil.scala
index 3ffcf9de03..bd40200310 100644
--- a/src/compiler/scala/reflect/runtime/ConversionUtil.scala
+++ b/src/compiler/scala/reflect/runtime/ConversionUtil.scala
@@ -18,7 +18,7 @@ trait ConversionUtil { self: SymbolTable =>
private val toJavaMap = new HashMap[S, J]
def enter(j: J, s: S) = {
- info("cached: "+j+"/"+s)
+ debugInfo("cached: "+j+"/"+s)
toScalaMap(j) = s
toJavaMap(s) = j
}
diff --git a/src/compiler/scala/reflect/runtime/JavaToScala.scala b/src/compiler/scala/reflect/runtime/JavaToScala.scala
index 0c7f54e1bb..3d295e3ff9 100644
--- a/src/compiler/scala/reflect/runtime/JavaToScala.scala
+++ b/src/compiler/scala/reflect/runtime/JavaToScala.scala
@@ -67,16 +67,17 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
else "error while loading " + clazz.name) + ", " + msg)
}
try {
- info("unpickling " + clazz + " " + module) //debug
markAbsent(NoType)
val ssig = jclazz.getAnnotation(classOf[scala.reflect.ScalaSignature])
if (ssig != null) {
+ info("unpickling Scala "+clazz + " and " + module+ ", owner = " + clazz.owner)
val bytes = ssig.bytes.getBytes
val len = ByteCodecs.decode(bytes)
unpickler.unpickle(bytes take len, 0, clazz, module, jclazz.getName)
} else {
val slsig = jclazz.getAnnotation(classOf[scala.reflect.ScalaLongSignature])
if (slsig != null) {
+ info("unpickling Scala "+clazz + " and " + module + " with long Scala signature")
val byteSegments = slsig.bytes map (_.getBytes)
val lens = byteSegments map ByteCodecs.decode
val bytes = Array.ofDim[Byte](lens.sum)
@@ -87,7 +88,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
}
unpickler.unpickle(bytes, 0, clazz, module, jclazz.getName)
} else { // class does not have a Scala signature; it's a Java class
- info("no sig found for " + jclazz) //debug
+ info("translating reflection info for Java " + jclazz) //debug
initClassModule(clazz, module, new FromJavaClassCompleter(clazz, module, jclazz))
}
}
@@ -142,7 +143,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
*/
private class FromJavaClassCompleter(clazz: Symbol, module: Symbol, jclazz: jClass[_]) extends LazyType {
override def load(sym: Symbol) = {
- info("completing from Java " + sym + "/" + clazz.fullName)//debug
+ debugInfo("completing from Java " + sym + "/" + clazz.fullName)//debug
assert(sym == clazz || (module != NoSymbol && (sym == module || sym == module.moduleClass)), sym)
val flags = toScalaFlags(jclazz.getModifiers, isClass = true)
clazz setFlag (flags | JAVA)
@@ -319,7 +320,6 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
* this one bypasses the cache.
*/
def makeScalaPackage(fullname: String): Symbol = {
- info("make scala pkg "+fullname)
val split = fullname lastIndexOf '.'
val owner = if (split > 0) packageNameToScala(fullname take split) else RootClass
assert(owner.isModuleClass, owner+" when making "+fullname)
@@ -330,6 +330,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
pkg.moduleClass setInfo new LazyPackageType
pkg setInfo pkg.moduleClass.tpe
owner.info.decls enter pkg
+ info("made Scala "+pkg)
} else if (!pkg.isPackage)
throw new ReflectError(pkg+" is not a package")
pkg.moduleClass
diff --git a/src/compiler/scala/reflect/runtime/Loaders.scala b/src/compiler/scala/reflect/runtime/Loaders.scala
index a38328ab63..e16431df99 100644
--- a/src/compiler/scala/reflect/runtime/Loaders.scala
+++ b/src/compiler/scala/reflect/runtime/Loaders.scala
@@ -31,7 +31,7 @@ trait Loaders { self: SymbolTable =>
// }
override def complete(sym: Symbol) = {
- info("completing "+sym+"/"+clazz.fullName)
+ debugInfo("completing "+sym+"/"+clazz.fullName)
assert(sym == clazz || sym == module || sym == module.moduleClass)
// try {
atPhaseNotLaterThan(picklerPhase) {
@@ -108,10 +108,10 @@ trait Loaders { self: SymbolTable =>
else pkgClass.fullName + "." + name
if (isJavaClass(path)) {
val (clazz, module) = createClassModule(pkgClass, name.toTypeName, new TopClassCompleter(_, _))
- info("created "+module+"/"+module.moduleClass+" in "+pkgClass)
+ debugInfo("created "+module+"/"+module.moduleClass+" in "+pkgClass)
lookupEntry(name)
} else {
- info("*** not found : "+path)
+ debugInfo("*** not found : "+path)
negatives += name
null
}
diff --git a/src/compiler/scala/reflect/runtime/SymbolTable.scala b/src/compiler/scala/reflect/runtime/SymbolTable.scala
index c54205de9f..cced8aa6b1 100644
--- a/src/compiler/scala/reflect/runtime/SymbolTable.scala
+++ b/src/compiler/scala/reflect/runtime/SymbolTable.scala
@@ -8,12 +8,14 @@ package runtime
*/
trait SymbolTable extends internal.SymbolTable with JavaToScala with ScalaToJava with Loaders {
- /** If `owner` is a package class and `name` is a term name, make a new package
- * <owner>.<name>, otherwise return NoSymbol
+ /** If `owner` is a package class (but not the empty package) and `name` is a term name, make a new package
+ * <owner>.<name>, otherwise return NoSymbol.
+ * Exception: If owner is root and a java class with given name exists, create symbol in empty package instead.
*/
override def missingHook(owner: Symbol, name: Name): Symbol =
- if (name.isTermName && owner.hasPackageFlag &&
- !(owner.isRoot && isJavaClass(name.toString))) // top-level classes go into empty package, not root
+ if (owner.isRoot && isJavaClass(name.toString))
+ definitions.EmptyPackageClass.info decl name
+ else if (name.isTermName && owner.hasPackageFlag && !owner.isEmptyPackageClass)
makeScalaPackage(if (owner.isRoot) name.toString else owner.fullName+"."+name).sourceModule
else {
info("*** missing: "+name+"/"+name.isTermName+"/"+owner+"/"+owner.hasPackageFlag+"/"+owner.info.decls.getClass)
@@ -26,5 +28,8 @@ trait SymbolTable extends internal.SymbolTable with JavaToScala with ScalaToJava
}
def info(msg: => String) =
- if (settings.verbose.value) println("[reflect-compiler] "+msg)
+ if (true || settings.verbose.value) println("[reflect-compiler] "+msg)
+
+ def debugInfo(msg: => String) =
+ if (settings.debug.value) info(msg)
}
diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala
index b4d3b09e47..431aa28541 100644
--- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala
+++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala
@@ -193,7 +193,9 @@ abstract class LiftCode extends Transform with TypingTransformers {
case Some(idx) =>
Ident(localName(sym))
case None =>
- if (sym.isModuleClass)
+ if (sym == NoSymbol)
+ mirrorSelect("NoSymbol")
+ else if (sym.isModuleClass)
Select(reifySymRef(sym.sourceModule), "moduleClass")
else if (sym.isStatic && sym.isClass)
mirrorCall("staticClass", reify(sym.fullName))
@@ -320,10 +322,7 @@ abstract class LiftCode extends Transform with TypingTransformers {
* to a global value, or else a mirror Literal.
*/
private def reifyFree(tree: Tree): Tree =
- if (tree.symbol.isStaticModule)
- reify(termPath(tree.symbol.fullName))
- else // make an Ident to a freeVar
- mirrorCall("Ident", reifySymRef(tree.symbol))
+ mirrorCall("Ident", reifySymRef(tree.symbol))
/** Reify an arbitary value */
private def reify(value: Any): Tree = {