mirror of https://github.com/sbt/sbt.git
66 lines
2.1 KiB
Scala
66 lines
2.1 KiB
Scala
/* sbt -- Simple Build Tool
|
|
* Copyright 2009 Mark Harrah
|
|
*/
|
|
package sbt
|
|
package classfile
|
|
|
|
import Constants._
|
|
import java.io.File
|
|
|
|
private[sbt] trait ClassFile
|
|
{
|
|
val majorVersion: Int
|
|
val minorVersion: Int
|
|
val fileName: String
|
|
val className: String
|
|
val superClassName: String
|
|
val interfaceNames: Array[String]
|
|
val accessFlags: Int
|
|
val constantPool: Array[Constant]
|
|
val fields: Array[FieldOrMethodInfo]
|
|
val methods: Array[FieldOrMethodInfo]
|
|
val attributes: Array[AttributeInfo]
|
|
val sourceFile: Option[String]
|
|
def types: Set[String]
|
|
def stringValue(a: AttributeInfo): String
|
|
}
|
|
|
|
private[sbt] final case class Constant(tag: Byte, nameIndex: Int, typeIndex: Int, value: Option[AnyRef]) extends NotNull
|
|
{
|
|
def this(tag: Byte, nameIndex: Int, typeIndex: Int) = this(tag, nameIndex, typeIndex, None)
|
|
def this(tag: Byte, nameIndex: Int) = this(tag, nameIndex, -1)
|
|
def this(tag: Byte, value: AnyRef) = this(tag, -1, -1, Some(value))
|
|
def wide = tag == ConstantLong || tag == ConstantDouble
|
|
}
|
|
private[sbt] final case class FieldOrMethodInfo(accessFlags: Int, name: Option[String], descriptor: Option[String], attributes: IndexedSeq[AttributeInfo]) extends NotNull
|
|
{
|
|
def isStatic = (accessFlags&ACC_STATIC)== ACC_STATIC
|
|
def isPublic = (accessFlags&ACC_PUBLIC)==ACC_PUBLIC
|
|
def isMain = isPublic && isStatic && descriptor.filter(_ == "([Ljava/lang/String;)V").isDefined
|
|
}
|
|
private[sbt] final case class AttributeInfo(name: Option[String], value: Array[Byte]) extends NotNull
|
|
{
|
|
def isNamed(s: String) = name.filter(s == _).isDefined
|
|
def isSignature = isNamed("Signature")
|
|
def isSourceFile = isNamed("SourceFile")
|
|
}
|
|
private[sbt] object Constants
|
|
{
|
|
final val ACC_STATIC = 0x0008
|
|
final val ACC_PUBLIC = 0x0001
|
|
|
|
final val JavaMagic = 0xCAFEBABE
|
|
final val ConstantUTF8 = 1
|
|
final val ConstantUnicode = 2
|
|
final val ConstantInteger = 3
|
|
final val ConstantFloat = 4
|
|
final val ConstantLong = 5
|
|
final val ConstantDouble = 6
|
|
final val ConstantClass = 7
|
|
final val ConstantString = 8
|
|
final val ConstantField = 9
|
|
final val ConstantMethod = 10
|
|
final val ConstantInterfaceMethod = 11
|
|
final val ConstantNameAndType = 12
|
|
final val ClassDescriptor = 'L'
|
|
} |