2015-10-02 6 views
5

मैं किसी निर्देशिका में मिली कुछ फ़ाइलों के आधार पर किसी दिए गए मॉड्यूल में गतिशील रूप से कुछ नए प्रकार जोड़ना चाहता हूं।हक्स में, आप मैक्रोज़ के साथ मॉड्यूल में प्रकार/कक्षा कैसे जोड़ते हैं?

मैं अनिवार्य रूप से मॉड्यूल के नीचे @:file(...) एम्बेड कक्षाओं का एक समूह तैयार करने की कोशिश कर रहा हूं।

//This is the module I'm targeting to append embedded ByteArray subtypes (see below) 
@:build(macros.AutoEmbed.build("some/folder/")) 
class Embeds { 
    //Empty on purpose, just let the Macro do its thing! 
} 


// At "macro-time", it should generate these: 

@:file("some/folder/ui_main.xml") 
class UI_MAIN_XML extends flash.utils.ByteArray { } 

@:file("some/folder/config.template.json") 
class CONFIG_TEMPLATE_JSON extends flash.utils.ByteArray { } 

क्या मैं अब तक पता लगाने के लिए कर लिया है मैं Embeds.hx मॉड्यूल को बदलने के लिए हो सकता है है। तो मैंने Context.getModule(Context.getLocalModule()) में देखा। मैंने TypeDefinition में भी देखा है क्योंकि यह स्क्रैच से एक नए प्रकार को परिभाषित करने का एकमात्र तरीका लगता है।

Context.getModule(...) के साथ समस्या यह है कि यह एक सरणी Array<Type>, नहीं Array<TypeDefinition> देता है, इसलिए मैं यह करने के लिए नए TypeDefinition संलग्न नहीं कर सकते हैं (प्लस मैं यह पता लगाने कैसे उन, ughh लिखने के लिए है)। यह शायद मेरे हिस्से पर एक बुरा धारणा है, लेकिन मैंने सोचा कि TypeDefinition में बस इसे जोड़कर मैं गतिशील रूप से मॉड्यूल में अधिक प्रकार प्रदान कर सकता हूं।

मै मैक्रोज़ के लिए अभी भी बहुत नया हूं जैसा कि आप बता सकते हैं!

संपादित

यह सच है कि मैं सिर्फ गतिशील लिख सकता है/के साथ एक FileSystem/फ़ाइल संकलन समय में एक नई Embeds.hx फ़ाइल को अधिलेखित समाधान लिखते हैं, लेकिन यह है कि पहले कम से कम एक बार संकलित करने के लिए की आवश्यकता होगी, का तात्पर्य अपने आईडीई का ऑटो-पूर्णता जेनरेट Embeds.* कक्षाएं (मेरे मामले में फ्लैशडिफायर) उठा सकता है। इसके अलावा परिभाषित फ़ोल्डर में किसी भी समय नई फाइलें गिरा दी जाती हैं, एक ही समस्या: आईडीई इसे पहचानने से पहले आपको पहले संकलित करने की आवश्यकता होती है। हां, मुझे वास्तव में ऑटो-पूर्णता पसंद है :)

उत्तर

6

शुरू निर्माण मैक्रो से अच्छा है:

तो वास्तव में नए वर्गों/मॉड्यूल आप Context.defineModule उपयोग कर सकते हैं बनाने के लिए। आप कक्षा के क्षेत्र बना सकते हैं और प्रकार बना सकते हैं।

#if macro 
import haxe.macro.Context; 
import haxe.macro.Expr; 

class AutoEmbed 
{ 
    macro static public function build(folder:String):Array<Field> 
    { 
     var inClass = Context.getLocalClass().get(); 

     // explore folder and create those: 

     var fileName = 'resource/strings.json'; 
     var name = fileName.split('/').pop().split('.').join('_'); 

     var valueExpr = makeType(inClass.pack, name, fileName); 

     var field = { 
      name: name, 
      access: [APublic, AStatic, AInline], 
      kind: FVar(null, valueExpr), 
      pos: Context.currentPos() 
     } 

     return [field]; 
    } 

    static function makeType(pack:Array<String>, name:String, fileName:String) 
    { 
     var pos = Context.currentPos(); 
     var className = name.toUpperCase(); 

     var cdef = macro class Tmp extends haxe.io.BytesData { } 
     cdef.pack = pack.copy(); 
     cdef.name = className; 

     cdef.meta = [{ 
      name: ':file', 
      params: [Context.makeExpr(fileName, pos)], 
      pos: pos 
     }]; 

     haxe.macro.Context.defineType(cdef); 

     return { 
      expr:EConst(CIdent(className)), 
      pos:pos 
     }; 
    } 
} 
#end 

अब यह उपयोग करने के लिए:

trace(Embed.strings_json); // [ByteArray] 

@:build(AutoEmbed.build('some/folder')) 
class Embeds 
{ 
    // generate field strings_json pointing to class STRINGS_JSON 
} 
+0

अच्छा और पूरा कोड-उदाहरण

यहाँ एक मैक्रो जो केवल एक ही प्रकार और एक इसी क्षेत्र उत्पन्न होगा है! धन्यवाद। हालांकि प्रश्न, 'मैक्रो क्लास टीएमपी' से 'टीएमपी' कहां से आता है haxe.io.BytesData' भाग बढ़ाता है? और क्या मैं अभी भी Flash.utils.ByteArray का विस्तार कर सकता हूं हक्स के संस्करण के बजाय (दोनों के बीच अंतर के बारे में निश्चित नहीं है ...)? – bigp

+0

मैं एक डमी क्लास नाम का उपयोग करता हूं क्योंकि मुझे यह नहीं पता था कि डायनामिक वैल्यू का उपयोग कैसे करें ... बाइट्सडाटा फ्लैश बाइटएरे के समान है - आप शायद इसका भी उपयोग कर सकते हैं। – Philippe

संबंधित मुद्दे