Rakefileに何らかの定義を書くかや起動オプションの指定で、全てのBridgeSupportファイルの定数やクラスなどを参照実行するプログラムがコンパイルされて、REPLから見えるようになるモードがあると便利そうだ。
- Path: /Library/RubyMotion/data/[ios|osx]/[version]/BridgeSupport/[framework].bridgesupport
- Rakefileに定義されているFrameworkのBridgeSupportファイルを読み込む
- デフォルトで定義されてる3つ
- 追加されているFramework
- vendor/**/*.bridgesupport
- struct, const, enum, classのname attributeをリストアップ
- tmp = NAME のような行を延々実行するAppDelegateのメソッドを追加するプログラムファイルを自動生成してappの下に放り込む
プリ起動時にそのメソッドが実行されるようにするプログラムを置いてコンパイルするだけで定義されるようです
Rakefileでの定義はたぶんこんなの
:
app.definition_preload = true
:
もしくは、起動時に指定。
$ rake definition_preload=1
実際の処理はこんな感じ?
require 'nokogiri'
doc = Nokogiri::XML(File.new("/Library/RubyMotion/data/ios/6.1/BridgeSupport/UIKit.bridgesupport"))
names = doc.xpath('//struct').map{|s| s.attributes['name'].value}
names += doc.xpath('//constant').map{|s| s.attributes['name'].value}
names += doc.xpath('//class').map{|s| s.attributes['name'].value}
names += doc.xpath('//enum').map{|s| s.attributes['name'].value}
puts "class AppDelegate"
puts " def _definition_preload_"
names.each {|name| puts " tmp = #{name}"}
puts " end"
puts " private :_definition_preload_"
puts "end"
Nokogiriは標準添付ライブラリじゃないのでREXMLか文字列マッチ使わないとダメかもだが
しかし実際にFoundation.bridgesupportでやってみたら、くっそそれなりに遅かった(-ω-)だから実行時参照されるまで定義されないのね…
しかしREPLでいろいろ確認ができるのは便利そうなので気が向いたら作る。