SCALAの記事一覧

Top / ScalaSigParser

目次

ScalaSigParser

2010/01/23現在では、scalaの安定バージョンは2.7.7だが、バージョン2.8がNight Buildからダウンロードできるようになっており、ScalaSigParserが使えるようになっている。

具体的にはscalaのバージョン2.8をいれると下記に示すURLのサンプルコードのimport文でエラーがでなくなる。

参考URL

http://stackoverflow.com/questions/1833762/scala-reflection-getdeclaringtrait

変更内容

http://www.scala-lang.org/node/4587

ScalaSigParserインポート

import tools.scalap.scalax.rules.scalasig._
import scala.runtime._

例:RichDouble? クラスの情報をパースしてみる。

val scalaSig = ScalaSigParser.parse(classOf[RichDouble]).get

結果

scalaSig にクラス情報が格納される。 実行結果の結果表示がたくさんあるため、14行程度で出力が打ち止めになっている。

scalaSig: scala.tools.scalap.scalax.rules.scalasig.ScalaSig =
ScalaSig version 5.0
0:      ClassSymbol(RichDouble, owner=scala.runtime, flags=40000002, info=7 ,Non
e)
1:      RichDouble
2:      scala.runtime
3:      runtime
4:      scala
5:      scala
6:      NoSymbol
7:      ClassInfoType(ClassSymbol(RichDouble, owner=scala.runtime, flags=4000000
2, info=7 ,None),List(TypeRefType(ThisType(java.lang),java.lang.Object,List()),
TypeRefType(ThisType(scala),scala.Proxy,List()), TypeRefType(SingleType(SingleTy
pe(ThisType(<nosymbol>.<root>),scala),scala.package),scala.package.Ordered,List

(TypeRefType?(ThisType?(scala),scala.Double,List()))), TypeRefType?(ThisType?(scala)

scala.ScalaObject?List())))
8:      TypeRefType(ThisType(java.lang),java.lang.Object,List())
9:      ThisType(java.lang)
10:     java.lang
11:     lang
12:     java
13:     java
14:     java.lang.O...

クラス情報のtopLevelClasses?の一つ目の情報を取得してみる。

val richDoubleSymbol = scalaSig.topLevelClasses.head

結果

richDoubleSymbol: scala.tools.scalap.scalax.rules.scalasig.ClassSymbol = ClassSy

mbol(RichDouble?, owner=scala.runtime, flags=40000002, info=7 ,None)

クラス情報のtopLevelClasses?の一つ目の情報のメソッド情報をみてみる

val methods = richDoubleSymbol.children filter ( _ match {
         case m : MethodSymbol => true
         case _ => false
     })

結果

結果が改行無しで大量に表示されおり、途中で打ち止めになっている。

methods: Seq[scala.tools.scalap.scalax.rules.scalasig.Symbol] = List(MethodSymbo? l(x, owner=0, flags=20080004, info=32 ,None), MethodSymbol?(<init>, owner=0, flag s=200, info=42 ,None), MethodSymbol?(self, owner=0, flags=200, info=48 ,None), Me thodSymbol(compare, owner=0, flags=200, info=54 ,None), MethodSymbol?(min, owner= 0, flags=200, info=62 ,None), MethodSymbol?(max, owner=0, flags=200, info=66 ,Non e), MethodSymbol?(abs, owner=0, flags=200, info=70 ,None), MethodSymbol?(round, ow ner=0, flags=200, info=73 ,None), MethodSymbol?(ceil, owner=0, flags=200, info=70

,None), MethodSymbol(floor, owner=0, flags=200, info=70 ,None), MethodSymbol(un

til, owner=0, flags=200, info=83 ,None), MethodSymbol?(until, owner=0, flags=200,

info=102 ,None), MethodSymbol(to, owner=0, flags=200, info=108 ,None), Metho...

結果をみやすくしてみる

methods foreach println
MethodSymbol(x, owner=0, flags=20080004, info=32 ,None)
MethodSymbol(<init>, owner=0, flags=200, info=42 ,None)
MethodSymbol(self, owner=0, flags=200, info=48 ,None)
MethodSymbol(compare, owner=0, flags=200, info=54 ,None)
MethodSymbol(min, owner=0, flags=200, info=62 ,None)
MethodSymbol(max, owner=0, flags=200, info=66 ,None)
MethodSymbol(abs, owner=0, flags=200, info=70 ,None)
MethodSymbol(round, owner=0, flags=200, info=73 ,None)
MethodSymbol(ceil, owner=0, flags=200, info=70 ,None)
MethodSymbol(floor, owner=0, flags=200, info=70 ,None)
MethodSymbol(until, owner=0, flags=200, info=83 ,None)
MethodSymbol(until, owner=0, flags=200, info=102 ,None)
MethodSymbol(to, owner=0, flags=200, info=108 ,None)
MethodSymbol(to, owner=0, flags=200, info=111 ,None)
MethodSymbol(toRadians, owner=0, flags=200, info=70 ,None)
MethodSymbol(toDegrees, owner=0, flags=200, info=70 ,None)
MethodSymbol(isInfinity, owner=0, flags=200, info=120 ,None)
MethodSymbol(isPosInfinity, owner=0, flags=200, info=120 ,None)
MethodSymbol(isNegInfinity, owner=0, flags=200, info=120 ,None) 

どのようなメソッドが実装されているのか一覧を得ることができた。

Traitなのかどうか調べる

richDoubleSymbol.isTrait

結果

res1: Boolean = false

他のクラスでTraitかどうか調べる方法一行バージョン

ScalaSigParser.parse(classOf[Ordered[Any]]).get.topLevelClasses.head.isTrait

結果

res2: Boolean = true

他参考URL

http://www.scala-lang.org/node/4721

感想

ScalaSigParserに関する情報はまだ乏しく、こまめに検索などをして情報を集める必要があるかもしれません。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-01-29 (金) 22:42:14 (5200d)