コンストラクタヌパラメヌタヌをMXML Flexコンパむラヌに远加する

2007幎4月26日。 アドビは、Flexフレヌムワヌクがオヌプン゜ヌスに翻蚳されおいるこずを衚明しおいたす。 このニュヌスは䞖界䞭のフラッシャヌの間で拍手ofの嵐を匕き起こし、これに基づいた根本的に新しいフレヌムワヌクが登堎したすが、これはいく぀かのプロゞェクトを超えたせんでした。



圓時Flexを䜿甚しおプロゞェクトを行っおいたしたが、プロゞェクトが増えれば増えるほど、内郚構造の埮劙な違いが気に入らなくなりたした。

Flexで䜜業した人は誰でも、その問題ずMXMLで蚘述および生成されたコヌドの䜎品質を知っおいるず思うので、Flexコンパむラのデバむスをクリヌンアップしお把握するためにこのプロセスに介入するこずにしたした。圌は、MXMLに砂糖を远加するこずから始め、Adobeの発案による他の機胜の粟神で、できる限り匷力にしようずしたした。 2幎埌、私はあなたず私の知識を共有するこずにしたした。



たえがき



SVNリポゞトリからFlexSDKプロゞェクトをチェックアりトするプロセスの説明は行いたせん。 このプロセスの説明ぞのリンクを残したす



この蚘事の執筆時点では、最新バヌゞョンはFlex 4.5.14.5.1.21328であったため、それに基づいおビルドする必芁がありたす。



コンパむラを掘り始めたばかりの頃、私はJavaの十分な知識を持っおいなかったので、垞識を䜿わなければなりたせんでした。すべおの倉曎はNotepad ++で行われたした。

お気に入りのJava IDEを䜿甚するこずをお勧めしたす。 ブラックゞャックず売春婊なしでは、 「埌藀宣蚀」ず「䜿甚法を芋぀ける」は非垞に難しいからです。



䞭身は䜕ですか



残念ながら、1぀の蚘事ではコンパむラ党䜓のデバむスをカバヌするのに十分ではないため、この蚘事ではMXMLトランスレヌタずいうほんの䞀郚に぀いおのみ説明したす。

それに関連するすべおの゜ヌスは、modules / compiler / src / java / flex2 / compiler / mxmlフォルダヌにありたす。











理論から実践ぞ



それ自䜓はそれほど倚くの「理論」が刀明するこずを期埅しおいたせんでしたが、それはあなたがどこで、䜕で、なぜ理解するのに倧いに圹立ちたす。 そしお、ここで、MXMLオブゞェクトのコンストラクタヌパラメヌタヌを指定する機胜であるものに盎接進みたす。



AS3の倚くのクラスには必須のコンストラクタヌパラメヌタヌがありたす。これらのクラスは、パラメヌタヌなしのオブゞェクトでラップするか、<fxScript />タグで䜜成する必芁がありたす。 

<?xml version="1.0"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"> <fx:Declarations> <Timer xmlns="flash.utils.*" new="1000, 1" /> </fx:Declarations> </s:Application>
      
      







新しいキヌワヌドの遞択は、AS3ではnewずいう名前のプロパティを䜜成できないためです。 予玄されおいたす。 newで枡されるものは、オブゞェクトを初期化するずきに角括匧で囲たれたす。この堎合、

 new Timer(1000, 1);
      
      







怜蚌に合栌


バリデヌタヌが新しい属性をスキップするには、同じ属性に远加する必芁がありたすたずえば、includeIn、excludeFromなど。 テキスト怜玢により、この属性は最初にlang / StandardDefs.javaで宣蚀され、次にbuilder / ComponentBuilder.javaisSpecialAttributeメ゜ッドで怜蚌されるこずが瀺されたした



StandardDefsに远加

 public static final String PROP_NEW = "new";
      
      





310行埌

 public static final String PROP_ID = "id";
      
      







ComponentBuilderでもisSpecialAttributeメ゜ッド

 if (namespace.length() == 0 || namespace.equals(document.getLanguageNamespace())) { if (StandardDefs.PROP_ID.equals(localPart) || StandardDefs.PROP_NEW.equals(localPart) || StandardDefs.PROP_INCLUDE_STATES.equals(localPart) || StandardDefs.PROP_EXCLUDE_STATES.equals(localPart) || StandardDefs.PROP_ITEM_CREATION_POLICY.equals(localPart) || StandardDefs.PROP_ITEM_DESTRUCTION_POLICY.equals(localPart)) { isSpecial = true; } }
      
      





これで、バリデヌタヌはMXMLタグの新しい属性を誓いたせん。



オブゞェクトモデルの新しいプロパティを登録する


だから、私たちの属性はそうなりたすが、どこかにその倀を保存する必芁がありたすか このために、Model.javaがありたす。

クラスにプロパティず2぀のメ゜ッドを远加するこずにより、rep / Model.javaのコンストラクタパラメヌタのゲッタヌ/セッタヌを䜜成したす。

 protected String constructorParams; public void setConstructorParams(String value) { constructorParams = value; } public String getConstructorParams() { return constructorParams; }
      
      







AbstractBuilder.javaクラスのregisterModelノヌドノヌド、モデルモデル、ブヌル倀topLevelメ゜ッドでこのプロパティを䜿甚したす1617行目。

 protected void registerModel(Node node, Model model, boolean topLevel) { String id = (String)getLanguageAttributeValue(node, StandardDefs.PROP_ID); String newValue = (String)getLanguageAttributeValue(node, StandardDefs.PROP_NEW); // get the comment from the node and store in the model if(node.comment != null) { // if generate ast if false, lets not scan the tokens here because they will be scanned later in asc scanner. // we will go the velocity template route if(!mxmlConfiguration.getGenerateAbstractSyntaxTree()) { model.comment = node.comment; } else { model.comment = MxmlCommentUtil.commentToXmlComment(node.comment); } } if(newValue != null) { model.setConstructorParams(newValue); } registerModel(id, model, topLevel); }
      
      







コヌド生成で属性を䜿甚したす


最小の郚分は残りたす-オブゞェクトが䜜成される堎所に属性を远加し、コンストラクタヌブラケットで珟状のたたに枡したす。 すぐに蚀っおやった



467行目のAdobe TODOの盎埌のrep / init / ValueInitializer.javaクラス、getDefinitionBodyメ゜ッド

 else { // TODO confirm the availability of a 0-arg ctor!! but do it upstream from here, like when Model is built stringBuilder.append("new " + selfTypeName + "("); if(self.getConstructorParams() != null) { stringBuilder.append(self.getConstructorParams()); } stringBuilder.append(")"); }
      
      







線集


ここで、フレヌムワヌクのルヌトフォルダヌリポゞトリ、リポゞトリ党䜓をダりンロヌドした堎合はトランクのコン゜ヌルに移動し、ビルドプロゞェクトを実行するために残りたす。

 BSiDeUp-Mac-mini:trunk bsideup$ ant build
      
      





次のように、コヌヒヌを入れたり、クラッカヌを也かしたり、怅子に寄りかかったりするこずができたす必芁に応じお䞋線を匕く このプロセスには玄5分かかりたす。

ヒント最初のビルド埌、antコンパむラヌのみを起動でき、コンパむラヌモゞュヌルのみがビルドされたす



この碑文のようなものを埅った埌

  main: [echo] ant main target completed on 09/16/2011 11:54:25 AM BUILD SUCCESSFUL Total time: 5 minutes 33 seconds
      
      





そうでなければ、私たちは喜び、喜びたす-zanのマニュアルを読み盎し、芋逃したものを探したす。



おわりに



お気に入りのIDEでフレヌムワヌクをFlexフレヌムワヌクの堎所ずしお自信を持っお指定できるようになりたした。これにより、新しいをサポヌトする修正されたコンパむラの䜿甚が開始されたす。



今回は、MXMLを䜿甚しお他のプロゞェクトを問題なくコンパむルできる䞋䜍互換性の倉曎を行いたした。次の蚘事では、トピックが興味深い堎合、MXMLの暙準動䜜を倉曎し、プログラマヌの生掻をさらに簡単にする方法を説明したすが、䞋䜍互換性は倱われたす。



プロセスではなく結果に興味がある人のために、既補のmxmlc.jarファむルぞのリンクを提䟛し 、Flex SDK 4.5をダりンロヌドしお$ {FLEX_SDK_DIR} /lib/mxmlc.jarファむルを眮き換えたす。



ご枅聎ありがずうございたした。



All Articles