summaryrefslogtreecommitdiff
path: root/src/scalap
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-03-31 05:58:01 +0000
committerPaul Phillips <paulp@improving.org>2011-03-31 05:58:01 +0000
commitc81e94b5dd39cf86abd0145fc93e0999f57a548c (patch)
treeb9f2f6203b97a1ca2fd55991b2aa7a5c37ef65c3 /src/scalap
parent56b7e67051af95bdc7b21b3a7d9333af40ee2e7f (diff)
downloadscala-c81e94b5dd39cf86abd0145fc93e0999f57a548c.tar.gz
scala-c81e94b5dd39cf86abd0145fc93e0999f57a548c.tar.bz2
scala-c81e94b5dd39cf86abd0145fc93e0999f57a548c.zip
Some minor sensibility improvements to previous...
Some minor sensibility improvements to previous patch, and tearing out some obsolete pieces of scalap. No review.
Diffstat (limited to 'src/scalap')
-rw-r--r--src/scalap/scala/tools/scalap/Main.scala203
1 files changed, 66 insertions, 137 deletions
diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala
index 2a2716ba20..7546fd99ae 100644
--- a/src/scalap/scala/tools/scalap/Main.scala
+++ b/src/scalap/scala/tools/scalap/Main.scala
@@ -5,50 +5,33 @@
**
*/
-
package scala.tools.scalap
-import java.io.{PrintStream, OutputStreamWriter, ByteArrayOutputStream}
+import java.io.{ PrintStream, OutputStreamWriter, ByteArrayOutputStream }
import scalax.rules.scalasig._
import tools.nsc.util.{ ClassPath, JavaClassPath }
import tools.util.PathResolver
import ClassPath.DefaultJavaContext
-import tools.nsc.io.{PlainFile, AbstractFile}
+import tools.nsc.io.{ PlainFile, AbstractFile }
/**The main object used to execute scalap on the command-line.
*
* @author Matthias Zenger, Stephane Micheloud, Burak Emir, Ilya Sergey
*/
-object Main {
- val SCALA_SIG = "ScalaSig"
+class Main {
+ val SCALA_SIG = "ScalaSig"
val SCALA_SIG_ANNOTATION = "Lscala/reflect/ScalaSignature;"
- val BYTES_VALUE = "bytes"
+ val BYTES_VALUE = "bytes"
- val versionMsg = "Scala classfile decoder " +
- Properties.versionString + " -- " +
- Properties.copyrightString + "\n"
+ val versionMsg = "Scala classfile decoder %s -- %s\n".format(Properties.versionString, Properties.copyrightString)
/**Verbose program run?
*/
var verbose = false
var printPrivates = false
- /**Prints usage information for scalap.
- */
- def usage {
- Console.println("usage: scalap {<option>} <name>")
- Console.println("where <name> is fully-qualified class name or <package_name>.package for package objects")
- Console.println("and <option> is")
- Console.println(" -private print private definitions")
- Console.println(" -verbose print out additional information")
- Console.println(" -version print out the version number of scalap")
- Console.println(" -help display this usage message")
- Console.println(" -classpath <path> specify where to find user class files")
- Console.println(" -cp <path> specify where to find user class files")
- }
-
def isScalaFile(bytes: Array[Byte]): Boolean = {
- val byteCode = ByteCode(bytes)
+ val byteCode = ByteCode(bytes)
val classFile = ClassFileParser.parse(byteCode)
classFile.attribute("ScalaSig").isDefined
}
@@ -69,11 +52,12 @@ object Main {
def isPackageObjectFile(s: String) = s != null && (s.endsWith(".package") || s == "package")
def parseScalaSignature(scalaSig: ScalaSig, isPackageObject: Boolean) = {
- val baos = new ByteArrayOutputStream
+ val baos = new ByteArrayOutputStream
val stream = new PrintStream(baos)
- val syms = scalaSig.topLevelClasses ::: scalaSig.topLevelObjects
+ val syms = scalaSig.topLevelClasses ++ scalaSig.topLevelObjects
+
syms.head.parent match {
- //Partial match
+ // Partial match
case Some(p) if (p.name != "<empty>") => {
val path = p.path
if (!isPackageObject) {
@@ -93,9 +77,7 @@ object Main {
}
// Print classes
val printer = new ScalaSigPrinter(stream, printPrivates)
- for (c <- syms) {
- printer.printSymbol(c)
- }
+ syms foreach (printer printSymbol _)
baos.toString
}
@@ -109,12 +91,8 @@ object Main {
}
}
- /**Executes scalap with the given arguments and classpath for the
- * class denoted by <code>classname</code>.
- *
- * @param args...
- * @param path...
- * @param classname...
+ /** Executes scalap with the given arguments and classpath for the
+ * class denoted by `classname`.
*/
def process(args: Arguments, path: ClassPath[AbstractFile])(classname: String): Unit = {
// find the classfile
@@ -159,67 +137,6 @@ object Main {
Console.println(" def toString(): java.lang.String")
Console.println("}")
// if the class corresponds to the artificial class scala.AnyVal.
- } else if (classname == "scala.AnyVal") {
- Console.println("package scala")
- Console.println("sealed class AnyVal extends Any")
- // if the class corresponds to the artificial class scala.Boolean.
- } else if (classname == "scala.Boolean") {
- Console.println("package scala")
- Console.println("sealed abstract class Boolean extends AnyVal {")
- Console.println(" def &&(p: => scala.Boolean): scala.Boolean // boolean and")
- Console.println(" def ||(p: => scala.Boolean): scala.Boolean // boolean or")
- Console.println(" def & (x: scala.Boolean): scala.Boolean // boolean strict and")
- Console.println(" def | (x: scala.Boolean): scala.Boolean // boolean stric or")
- Console.println(" def ==(x: scala.Boolean): scala.Boolean // boolean equality")
- Console.println(" def !=(x: scala.Boolean): scala.Boolean // boolean inequality")
- Console.println(" def !: scala.Boolean // boolean negation")
- Console.println("}")
- // if the class corresponds to the artificial class scala.Int.
- } else if (classname == "scala.Int") {
- Console.println("package scala")
- Console.println("sealed abstract class Int extends AnyVal {")
- Console.println(" def ==(that: scala.Double): scala.Boolean")
- Console.println(" def ==(that: scala.Float): scala.Boolean")
- Console.println(" def ==(that: scala.Long): scala.Boolean")
- Console.println(" def ==(that: scala.Int): scala.Boolean")
- Console.println(" def ==(that: scala.Short): scala.Boolean")
- Console.println(" def ==(that: scala.Byte): scala.Boolean")
- Console.println(" def ==(that: scala.Char): scala.Boolean")
- Console.println(" /* analogous for !=, <, >, <=, >= */")
- Console.println
- Console.println(" def + (that: scala.Double): scala.Double // double addition")
- Console.println(" def + (that: scala.Float): scala.Float // float addition")
- Console.println(" def + (that: scala.Long): scala.Long // long addition")
- Console.println(" def + (that: scala.Int): scala.Int // int addition")
- Console.println(" def + (that: scala.Short): scala.Int // int addition")
- Console.println(" def + (that: scala.Byte): scala.Int // int addition")
- Console.println(" def + (that: scala.Char): scala.Int // int addition")
- Console.println(" /* analogous for -, *, /, % */")
- Console.println
- Console.println(" def & (that: scala.Long): scala.Long // long bitwise and")
- Console.println(" def & (that: scala.Int): scala.Int // int bitwise and")
- Console.println(" def & (that: scala.Short): scala.Int // int bitwise and")
- Console.println(" def & (that: scala.Byte): scala.Int // int bitwise and")
- Console.println(" def & (that: scala.Char): scala.Int // int bitwise and")
- Console.println(" /* analogous for |, ^ */")
- Console.println
- Console.println(" def <<(cnt: scala.Int): scala.Int // int left shift")
- Console.println(" def <<(cnt: scala.Long): scala.Int // long left shift")
- Console.println(" /* analogous for >>, >>> */")
- Console.println
- Console.println(" def + : scala.Int // int identity")
- Console.println(" def - : scala.Int // int negation")
- Console.println(" def ~ : scala.Int // int bitwise negation")
- Console.println
- Console.println(" def toByte: scala.Byte // convert to Byte")
- Console.println(" def toShort: scala.Short // convert to Short")
- Console.println(" def toChar: scala.Char // convert to Char")
- Console.println(" def toInt: scala.Int // convert to Int")
- Console.println(" def toLong: scala.Long // convert to Long")
- Console.println(" def toFloat: scala.Float // convert to Float")
- Console.println(" def toDouble: scala.Double // convert to Double")
- Console.println("}")
- // if the class corresponds to the artificial class scala.Nothing.
} else if (classname == "scala.Nothing") {
Console.println("package scala")
Console.println("sealed abstract class Nothing")
@@ -231,46 +148,6 @@ object Main {
Console.println("class/object " + classname + " not found.")
}
- /**The main method of this object.
- */
- def main(args: Array[String]) {
- // print usage information if there is no command-line argument
- if (args.length == 0)
- usage
- // otherwise parse the arguments...
- else {
- val arguments = Arguments.Parser('-')
- .withOption("-private")
- .withOption("-verbose")
- .withOption("-version")
- .withOption("-help")
- .withOptionalArg("-classpath")
- .withOptionalArg("-cp")
- .parse(args);
- if (arguments contains "-version")
- Console.println(versionMsg)
- if (arguments contains "-help")
- usage
- verbose = arguments contains "-verbose"
- printPrivates = arguments contains "-private"
- // construct a custom class path
- def cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _)
- val path = cparg match {
- case Some(cpstring) =>
- new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cpstring), DefaultJavaContext)
-
- case None =>
- PathResolver.fromPathString("")
- }
- // print the classpath if output is verbose
- if (verbose)
- Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path)
-
- // process all given classes
- arguments.getOthers.foreach(process(arguments, path))
- }
- }
-
object EmptyClasspath extends ClassPath[AbstractFile] {
/**
* The short name of the package (without prefix)
@@ -284,3 +161,55 @@ object Main {
val sourcepaths: List[AbstractFile] = Nil
}
}
+
+object Main extends Main {
+ /** Prints usage information for scalap. */
+ def usage() {
+ Console println """
+ |Usage: scalap {<option>} <name>
+ |where <name> is fully-qualified class name or <package_name>.package for package objects
+ |and <option> is
+ | -private print private definitions
+ | -verbose print out additional information
+ | -version print out the version number of scalap
+ | -help display this usage message
+ | -classpath <path> specify where to find user class files
+ | -cp <path> specify where to find user class files
+ """.stripMargin.trim
+ }
+
+ def main(args: Array[String]) {
+ // print usage information if there is no command-line argument
+ if (args.isEmpty)
+ return usage()
+
+ val arguments = Arguments.Parser('-')
+ .withOption("-private")
+ .withOption("-verbose")
+ .withOption("-version")
+ .withOption("-help")
+ .withOptionalArg("-classpath")
+ .withOptionalArg("-cp")
+ .parse(args);
+
+ if (arguments contains "-version")
+ Console.println(versionMsg)
+ if (arguments contains "-help")
+ usage()
+
+ verbose = arguments contains "-verbose"
+ printPrivates = arguments contains "-private"
+ // construct a custom class path
+ val cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _)
+ val path = cparg match {
+ case Some(cp) => new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cp), DefaultJavaContext)
+ case _ => PathResolver.fromPathString("")
+ }
+ // print the classpath if output is verbose
+ if (verbose)
+ Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path)
+
+ // process all given classes
+ arguments.getOthers foreach process(arguments, path)
+ }
+}