2010-12-27 31 views
2

scalapライブラリには、クラスファイルからScala固有の情報を解析する機能があります。通常の授業では、私はそのような情報を得ることができます:コンパニオンオブジェクトのScalaSigを取得するにはどうすればよいですか?

...そこから、内部について何か良い点があります。しかし、コンパニオンオブジェクトの場合:

scala> ScalaSigParser.parse(classOf[BasicCase$]) 
res47: Option[scala.tools.scalap.scalax.rules.scalasig.ScalaSig] = None 

...私は何も得られません。しかし、Scalapはコンパニオンオブジェクトクラスで動作します:

scalap -cp . BasicCase$ 
package BasicCase$; 
final class BasicCase$ extends scala.runtime.AbstractFunction3 with java.io.Serializable with scala.ScalaObject { 
    def this(): scala.Unit; 
    def apply(scala.Any, scala.Any, scala.Any): scala.Any; 
    def readResolve(): scala.Any; 
    def apply(scala.Int, java.lang.String, scala.Option): BasicCase; 
    def unapply(BasicCase): scala.Option; 
} 
object BasicCase$ { 
    final val MODULE$: BasicCase$; 
} 

したがって、私はそれを見つけることができませんでした。誰でもアイデアはありますか?

編集:私はそれを見つけましたが、まだまだ必要があります。

scala> bcSig.topLevelObjects 
res59: List[scala.tools.scalap.scalax.rules.scalasig.ObjectSymbol] = List(ObjectSymbol(BasicCase, owner=<empty>, flags=200402, info=124)) 

scala> bcSig.topLevelObjects.head 
res60: scala.tools.scalap.scalax.rules.scalasig.ObjectSymbol = ObjectSymbol(BasicCase, owner=<empty>, flags=200402, info=124) 

残念ながら、子どもたちの方法は私に方法を与えていないようです:通常のクラスとは異なり

scala> res60.children       
res70: Seq[scala.tools.scalap.scalax.rules.scalasig.Symbol] = List() 

scala> bcSym.children 
res71: Seq[scala.tools.scalap.scalax.rules.scalasig.Symbol] = List(MethodSymbol(id, owner=0, flags=29400200, info=25 ,None), MethodSymbol(id , owner=0, flags=21080004, info=26 ,None), MethodSymbol(name, owner=0, flags=29400200, info=33 ,None), MethodSymbol(name , owner=0, flags=21080004, info=34 ,None), MethodSymbol(data, owner=0, flags=29400200, info=45 ,None), MethodSymbol(data , owner=0, flags=21080004, info=46 ,None), MethodSymbol(<init>, owner=0, flags=200, info=53 ,None), MethodSymbol(copy, owner=0, flags=200200, info=61 ,None), MethodSymbol(copy$default$1, owner=0, flags=2200200, info=67 ,None), MethodSymbol(copy$default$2, owner=0, flags=2200200, info=80 ,None), MethodSymbol(copy$default$3, owner=0, flags=2200200, info=84 ,None), MethodSymbol(hashCode, owner=0, flags=40000220, i... 

答えて

1

infoTypeを使用してコンパニオンのメソッドを取得できると思っています。 List私のサンプルとres17があなたのres60と同等であるとして:

scala> res17 
    res23: scala.tools.scalap.scalax.rules.scalasig.ObjectSymbol = 
ObjectSymbol(List, owner=scala.collection.immutable, flags=402, info=273) 

    scala> res17.infoType.asInstanceOf[TypeRefType].symbol.children 
    res22: Seq[scala.tools.scalap.scalax.rules.scalasig.Symbol] = List(
    MethodSymbol(<init>, owner=274, flags=200, info=280 ,None), 
    MethodSymbol(canBuildFrom, owner=274, flags=201, info=283 ,None), 
    MethodSymbol(newBuilder, owner=274, flags=200, info=294 ,None), 
    MethodSymbol(empty, owner=274, flags=220, info=306 ,None), 
    MethodSymbol(apply, owner=274, flags=220, info=312 ,None), 
    MethodSymbol(range, owner=274, flags=200, info=324 ,None), 
    MethodSymbol(make, owner=274, flags=200, info=336 ,None), 
    MethodSymbol(flatten, owner=274, flags=200, info=348 ,None), 
    MethodSymbol(unzip, owner=274, flags=200, info=361 ,None), 
    MethodSymbol(unzip, owner=274, flags=200, info=377 ,None), 
    MethodSymbol(lefts, owner=274, flags=200, info=394 ,None), 
    MethodSymbol(rights, owner=274, flags=200, info=412 ,None)... 

はListクラスには存在しないleftsrights方法を、注意してください。

関連する問題