Goal
Ruby タブで class Sprite1 < ::Smalruby3::Sprite, class Sprite1 < Smalruby3::Sprite, class Sprite1 < Foo と記述した場合、コードタブへの遷移(Ruby→ブロック変換)と Ruby タブへの復帰(ブロック→Ruby生成)のラウンドトリップで、継承の指定が消えずに保持されるようにする。
現状の問題
- コンバータ (
index.js:403): superclass を「読み飛ばし」 — コメントにも classInfo にも保存しない
- コメント形式:
@ruby:class:attr1,attr2,... に superclass フィールドがない
- ジェネレータ (
index.js:327): forFileOutput 時に ' < ::Smalruby3::Sprite' をハードコード
コメント形式
@ruby:class コメントに <= プレフィックスで superclass を記録する。:: は : がコメント区切り文字と衝突するため / に置き換える。
| Ruby |
コメント |
class Sprite1 < ::Smalruby3::Sprite |
@ruby:class:<=//Smalruby3/Sprite |
class Sprite1 < Smalruby3::Sprite |
@ruby:class:<=Smalruby3/Sprite |
class Sprite1 < Sprite |
@ruby:class:<=Sprite |
class Sprite1 < Foo |
@ruby:class:<=Foo |
class Sprite1(継承なし) |
@ruby:class(<= フィールドなし) |
他属性との組み合わせ例: @ruby:class:<=//Smalruby3/Sprite,name=MySprite,x,y
Stage の制約
Stage クラスは以下のみ受け付ける(それ以外の superclass はエラー):
- 継承なし:
class Stage
class Stage < ::Smalruby3::Stage
class Stage < Smalruby3::Stage
Affected Files
packages/scratch-gui/src/lib/ruby-to-blocks-converter/index.js — visitClassNode() で superclass をパースして <=X をコメントに追加
packages/scratch-gui/src/lib/ruby-generator/index.js — _wrapWithClass() で <=X をパースして継承文字列を生成
packages/scratch-gui/test/unit/lib/ruby-to-blocks-converter/class.test.js — superclass 保持テスト追加
packages/scratch-gui/test/unit/lib/ruby-generator/class.test.js — superclass 出力テスト追加
packages/scratch-gui/test/unit/lib/ruby-roundtrip-class-*.test.js — ラウンドトリップテスト追加
Implementation Steps
Test Plan
| Type |
Timing |
Target |
| Unit tests (TDD) |
Phase 1, 2 |
converter の superclass パース、generator の superclass 出力 |
| Round-trip tests |
Phase 3 |
::Smalruby3::Sprite, Smalruby3::Sprite, Sprite, Foo, 継承なし |
Risks & Open Questions
class Sprite1 < Foo の Foo は将来、別スプライトのクラス名となる予定。現時点ではコメントに保存するのみで VM 側の動作変更は不要
Goal
Ruby タブで
class Sprite1 < ::Smalruby3::Sprite,class Sprite1 < Smalruby3::Sprite,class Sprite1 < Fooと記述した場合、コードタブへの遷移(Ruby→ブロック変換)と Ruby タブへの復帰(ブロック→Ruby生成)のラウンドトリップで、継承の指定が消えずに保持されるようにする。現状の問題
index.js:403): superclass を「読み飛ばし」 — コメントにも classInfo にも保存しない@ruby:class:attr1,attr2,...に superclass フィールドがないindex.js:327):forFileOutput時に' < ::Smalruby3::Sprite'をハードコードコメント形式
@ruby:classコメントに<=プレフィックスで superclass を記録する。::は:がコメント区切り文字と衝突するため/に置き換える。class Sprite1 < ::Smalruby3::Sprite@ruby:class:<=//Smalruby3/Spriteclass Sprite1 < Smalruby3::Sprite@ruby:class:<=Smalruby3/Spriteclass Sprite1 < Sprite@ruby:class:<=Spriteclass Sprite1 < Foo@ruby:class:<=Fooclass Sprite1(継承なし)@ruby:class(<=フィールドなし)他属性との組み合わせ例:
@ruby:class:<=//Smalruby3/Sprite,name=MySprite,x,yStage の制約
Stage クラスは以下のみ受け付ける(それ以外の superclass はエラー):
class Stageclass Stage < ::Smalruby3::Stageclass Stage < Smalruby3::StageAffected Files
packages/scratch-gui/src/lib/ruby-to-blocks-converter/index.js—visitClassNode()で superclass をパースして<=Xをコメントに追加packages/scratch-gui/src/lib/ruby-generator/index.js—_wrapWithClass()で<=Xをパースして継承文字列を生成packages/scratch-gui/test/unit/lib/ruby-to-blocks-converter/class.test.js— superclass 保持テスト追加packages/scratch-gui/test/unit/lib/ruby-generator/class.test.js— superclass 出力テスト追加packages/scratch-gui/test/unit/lib/ruby-roundtrip-class-*.test.js— ラウンドトリップテスト追加Implementation Steps
Phase 1: コンバータに superclass 保存を追加
class.test.jsに superclass 保持テスト追加(::Smalruby3::Sprite,Smalruby3::Sprite,Foo,Sprite, 継承なし、Stage の受理/拒否)visitClassNode()で superclass をパースし<=Xコメントに保存Phase 2: ジェネレータで superclass を出力
class.test.jsに superclass 出力テスト追加_wrapWithClass()で<=Xをパースして出力Phase 3: ラウンドトリップテスト
Test Plan
::Smalruby3::Sprite,Smalruby3::Sprite,Sprite,Foo, 継承なしRisks & Open Questions
class Sprite1 < FooのFooは将来、別スプライトのクラス名となる予定。現時点ではコメントに保存するのみで VM 側の動作変更は不要