diff options
author | Martin Odersky <odersky@gmail.com> | 2011-09-28 10:12:47 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2011-09-28 10:12:47 +0000 |
commit | 17654320852e262ebcf0a267603be7d35fc3b9e0 (patch) | |
tree | 41e816aa786d61bdb480e2b64f68742c3c252fee /src | |
parent | 8c9d01fffaad598d103f80e88c47fc7224f181ab (diff) | |
download | scala-17654320852e262ebcf0a267603be7d35fc3b9e0.tar.gz scala-17654320852e262ebcf0a267603be7d35fc3b9e0.tar.bz2 scala-17654320852e262ebcf0a267603be7d35fc3b9e0.zip |
More fixes to reflection; cleaned up output.
Diffstat (limited to 'src')
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 = { |