2016-08-09 5 views
10

अनुरोध:पुनर्विक्रेता प्लगइन में गतिशील रूप से एएसटी को फिर से लिखना कैसे?

मैं एक विश्लेषक लिखने में सक्षम होना चाहता हूं जो एक निश्चित अभिव्यक्ति के लिए प्रॉक्सी मान प्रदान कर सकता है और दस्तावेज़ की पुन: विश्लेषण को ट्रिगर कर सकता है।

प्रेरणा:

हमारे कोड ABTests है कि या तो एक नियंत्रण और संस्करण समूह के साथ एक तैनात या सक्रिय स्थिति में हो सकता है से अटे पड़े है। एक परीक्षण की स्थिति निर्धारित करना डेटाबेस लुकअप के माध्यम से किया जाता है। मैं कम से यह पक्का हो जानेवाला द्वारा समय विकसित से निपटने के लिए इस आसान बनाने के लिए टूलींग प्रदान करने के लिए कोशिश कर रहा हूँ

if(ExperimentService.IsInVariant(ABTest.Test1)) 
{ 
} 

: परीक्षण है कि नियंत्रण समूह के साथ तैनात किया गया है के लिए, निम्न प्रपत्र के किसी भी बयान को गलत पर मूल्यांकन करेंगे इस परिदृश्य में बाहर। जैसा कि यह है, यह काफी सीमित है और मजबूत नहीं है क्योंकि मुझे मूल रूप से खुद को पार्सर खेलना है।

क्या होगा अगर वास्तविक कोड

if(!ExperimentService.IsInVariant(ABTest.Test1)) 

या

if(ExperimentService.IsInVariant(ABTest.Test1) || true) 

या

var val = ..... && (ExperimentService.IsInVariant(ABTest.Test1); 
if(val){ 
    // val is always going to be false if we deployed control. 
} 

एक संभावित दृष्टिकोण मैं प्रदान की देख सकता है विश्लेषक कि निकाल दिया जाता है लिखने के लिए अनुमति देकर है एक बार वास्तविक आईडीई पार्सिंग होने से पहले पेड़ को फिर से लिखना (या, ठीक है, बस इसे दूसरी बार पार्स करें)। इन्हें केवल एक बार आग लगनी चाहिए और हमें एक निश्चित अभिव्यक्ति को दूसरे के साथ बदलने की अनुमति दें। इससे मुझे इन सभी प्रयोगों को सही और झूठे अक्षर के लिए स्वैप करने की अनुमति मिल जाएगी।

नतीजतन, इन वर्गों में इस तरह के कोड

पहुँच योग्य नहीं कोड के लिए पक्का हो जानेवाला लेकिन यह भी एक चर की तरह अधिक जटिल वाले कभी नहीं होगा कि एक अलग मूल्य के रूप में अन्य सभी आईडीई सुविधाओं से फायदा हो सकता है जाहिर है यह सिर्फ एक उदाहरण है और मुझे यकीन नहीं है कि यह कितना व्यवहार्य है। उचित सुविधा या कुछ जो पहले से मौजूद है, के लिए कोई भी सुझाव स्वागत से अधिक है।

उत्तर

1

मैं वहाँ एक दृष्टिकोण है कि एक समझौता नहीं है है नहीं लगता कि देखें।

रीशेर्पर विश्लेषण से पहले एएसटी को फिर से लिखने का समर्थन नहीं करता है - जो फ़ाइल में टेक्स्ट को फिर से लिख देगा।

आप if ब्लॉक की सामग्री पर "मृत कोड" हाइलाइट लागू करके एक कोडर लिख सकते हैं, लेकिन जैसा कि आप कहते हैं, आपको कोड को पार्स करने और क्रम में नियंत्रण प्रवाह का विश्लेषण करने की आवश्यकता होगी इसे सही करने के लिए, और मुझे लगता है कि यह बहुत मुश्किल होगा (ReSharper नियंत्रण प्रवाह ग्राफ प्रदान करता है, ताकि आप इसे चल सकें, लेकिन यह आपके लिए पर निर्भर होगा IsInVariant और बी का वापसी मूल्य खोजें। जो भी परिस्थितियों, && या || कथन के माध्यम से उस मूल्य का पता लगाता है जब तक कि आपको उचित if ब्लॉक नहीं मिलता)।

वैकल्पिक रूप से, आप ContractAnnotation विशेषता के साथ IsInVariant विधि को चिह्नित कर सकता है, कुछ की तरह:

[ContractAnnotation("=> false")] 
public bool IsInVariant(string identifier) 
{ 
    // whatever... 
} 

यह ReSharper के विश्लेषण बता देंगे कि इस विधि हमेशा रिटर्न false (आप यह भी कह सकते यह true वापस आ जाएगी/false/null/विशिष्ट इनपुट के आधार पर शून्य नहीं)। चूंकि यह हमेशा false देता है, तो if कथन, या else शाखा में कोड को ग्रे आउट कर देगा यदि आप if (!IsInVariant(…)) करते हैं।

नकारात्मकता यह है कि ReSharper if कथन में एक चेतावनी भी जोड़ देगा ताकि आपको यह बताने के लिए कि अभिव्यक्ति हमेशा false लौटाती है। तो, यह एक समझौता है, लेकिन आप उस चेतावनी की गंभीरता को संकेत में बदल सकते हैं, इसलिए यह इतना घुसपैठ नहीं है।

+0

मैंने सुना है, मेरा आखिरी विचार यह होगा (यदि आप गलत लगता है जो कुछ भी खोज सकते हैं?)। क्या होगा यदि मैं अपनी सी # भाषा सेवा तैयार करता हूं जो रिशेर्पर के सीएसआरआरएस सेवा कार्यान्वयन को ओवरराइड करता है? मैं मौजूदा रिशेर्पर सेवा को अपने आप से सजाने के लिए तैयार करूंगा, और मैं अपने स्वयं के पार्सर के साथ सीएसएचआरपीएसर को लपेट सकता हूं, और संभावित रूप से एएसटी की अंतिम पार्सिंग का ख्याल रख सकता हूं? –

+0

मैं सबसे अच्छी किस्मत कहूंगा :) मुझे नहीं पता कि वास्तव में क्या होगा, लेकिन अगर यह काम करता है तो मुझे आश्चर्य होगा। ReSharper एएसटी और दस्तावेज़ के पाठ को सिंक में रखता है - यदि आप एक बदलते हैं, तो अन्य परिवर्तन। यदि आप एक तरफ अलग करते हैं, तो मुझे संदेह है कि यह अच्छी तरह समाप्त होगा। मुझे एक विश्लेषक लिखने पर संदेह है जो नियंत्रण प्रवाह ग्राफ का उपयोग करना आसान होगा (लेकिन फिर भी गैर-तुच्छ) और काम करने की अधिक संभावना है। लेकिन हे, आधा मजा कोशिश कर रहा है :) – citizenmatt

1

यह वास्तव में बक्षीस की गारंटी देने के लिए पर्याप्त नहीं है, लेकिन developer documentation से लागू होने वाला एक समाधान custom language बनाना और मूल नियमों का विस्तार करना है।

आप मैं इस परिदृश्य में इसे बाहर पक्का हो जानेवाला द्वारा पर समय का विकास से निपटने के लिए इस आसान बनाने के लिए टूलींग प्रदान करने के लिए कोशिश कर रहा हूँ

कहा।

संबंधित भागों को बाहर निकालना सिंटैक्स हाइलाइटिंग नियमों को बदलकर किया जा सकता है।

this example for .tt files.

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