summaryrefslogtreecommitdiff
path: root/src/scalap/scala/tools/scalap/Main.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-08-03 18:02:00 +0000
committerPaul Phillips <paulp@improving.org>2010-08-03 18:02:00 +0000
commit958fb1c6f48aeecf5fc56ad9debbfad8d6d0fc66 (patch)
treee7bf0250fc31ba5650de62cad239b5bc32b9ae92 /src/scalap/scala/tools/scalap/Main.scala
parent12a41f6dcf6b9b66f5d275db5993fcf3ea67ead6 (diff)
downloadscala-958fb1c6f48aeecf5fc56ad9debbfad8d6d0fc66.tar.gz
scala-958fb1c6f48aeecf5fc56ad9debbfad8d6d0fc66.tar.bz2
scala-958fb1c6f48aeecf5fc56ad9debbfad8d6d0fc66.zip
Generalized the scala sig "look in both attribu...
Generalized the scala sig "look in both attribute and annotation" code so it can be reused outside of scalap main. Closes #3717, review by ilyas.
Diffstat (limited to 'src/scalap/scala/tools/scalap/Main.scala')
-rw-r--r--src/scalap/scala/tools/scalap/Main.scala23
1 files changed, 3 insertions, 20 deletions
diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala
index 88b6c53c46..c2b9324ba9 100644
--- a/src/scalap/scala/tools/scalap/Main.scala
+++ b/src/scalap/scala/tools/scalap/Main.scala
@@ -10,12 +10,10 @@ package scala.tools.scalap
import java.io.{PrintStream, OutputStreamWriter, ByteArrayOutputStream}
import scalax.rules.scalasig._
-import scalax.rules.scalasig.ClassFileParser.{ConstValueIndex, Annotation}
import tools.nsc.util.{ ClassPath }
import tools.util.PathResolver
import ClassPath.DefaultJavaContext
import tools.nsc.io.{PlainFile, AbstractFile}
-import scala.reflect.generic.ByteCodecs
/**The main object used to execute scalap on the command-line.
*
@@ -104,25 +102,10 @@ object Main {
def decompileScala(bytes: Array[Byte], isPackageObject: Boolean): String = {
val byteCode = ByteCode(bytes)
val classFile = ClassFileParser.parse(byteCode)
- classFile.attribute(SCALA_SIG).map(_.byteCode).map(ScalaSigAttributeParsers.parse) match {
- // No entries in ScalaSig attribute implies that the signature is stored in the annotation
- case Some(ScalaSig(_, _, entries)) if entries.length == 0 => unpickleFromAnnotation(classFile, isPackageObject)
- case Some(scalaSig) => parseScalaSignature(scalaSig, isPackageObject)
- case None => ""
- }
- }
- def unpickleFromAnnotation(classFile: ClassFile, isPackageObject: Boolean): String = {
- import classFile._
- classFile.annotation(SCALA_SIG_ANNOTATION) match {
- case None => ""
- case Some(Annotation(_, elements)) =>
- val bytesElem = elements.find(elem => constant(elem.elementNameIndex) == BYTES_VALUE).get
- val bytes = ((bytesElem.elementValue match {case ConstValueIndex(index) => constantWrapped(index)})
- .asInstanceOf[StringBytesPair].bytes)
- val length = ByteCodecs.decode(bytes)
- val scalaSig = ScalaSigAttributeParsers.parse(ByteCode(bytes.take(length)))
- parseScalaSignature(scalaSig, isPackageObject)
+ ScalaSigParser.parse(classFile) match {
+ case Some(scalaSig) => parseScalaSignature(scalaSig, isPackageObject)
+ case None => ""
}
}