Skip to content

Instantly share code, notes, and snippets.

@iwazer
Last active December 21, 2015 08:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iwazer/6276884 to your computer and use it in GitHub Desktop.
Save iwazer/6276884 to your computer and use it in GitHub Desktop.

RubyMotionのREPLで全ての定数とClassを参照可能にする拡張(案)

Rakefileに何らかの定義を書くかや起動オプションの指定で、全てのBridgeSupportファイルの定数やクラスなどを参照実行するプログラムがコンパイルされて、REPLから見えるようになるモードがあると便利そうだ。

  1. Path: /Library/RubyMotion/data/[ios|osx]/[version]/BridgeSupport/[framework].bridgesupport
  2. Rakefileに定義されているFrameworkのBridgeSupportファイルを読み込む
  • デフォルトで定義されてる3つ
  • 追加されているFramework
  • vendor/**/*.bridgesupport
  1. struct, const, enum, classのname attributeをリストアップ
  2. tmp = NAME のような行を延々実行するAppDelegateのメソッドを追加するプログラムファイルを自動生成してappの下に放り込む
  3. プリ起動時にそのメソッドが実行されるようにする プログラムを置いてコンパイルするだけで定義されるようです

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でいろいろ確認ができるのは便利そうなので気が向いたら作る。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment