Roslyn

2015-09-19 6 views
6

Roslyn का उपयोग करके एक अद्वितीय पहचानकर्ता नाम निर्धारित करना, मैं अपने नियंत्रण के बाहर कोड से पार्स किए गए विधि प्रतीक के आधार पर सी # कोड उत्पन्न कर रहा हूं। इसलिए, विधि में कई तर्क हो सकते हैं।Roslyn

// my code generator might produce this 
public void SomeMethod(int x) 
{ 
    DoSomething(x => x.Foo()); 
} 

इस कोड:

// I'm generating code like this 
public void SomeMethod() 
{ 
    DoSomething(x => x.Foo()); 
} 

इस कोड के साथ एक संभावित समस्या युक्त विधि एक पैरामीटर x बुलाया भी शामिल है यदि: कोड मैं उत्पन्न एक लैम्ब्डा अभिव्यक्ति है कि इस तरह के रूप में एक भी तर्क लेता है, भी शामिल है परिणामस्वरूप एक त्रुटि:

A local or parameter named 'x' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter

पर्याप्त मेला।

इस के आसपास जाने के लिए, मैं सोच रहा था कि मैं पहचानकर्ता नाम x से शुरू कर सकता हूं, यह देखने के लिए कि यह पहले से परिभाषित है या नहीं, SemanticModel.LookupSymbols का उपयोग करें। यदि ऐसा है, तो _ (_x प्राप्त करने के लिए) दोहराएं और दोहराएं।

लेकिन क्या यह सबसे अच्छा तरीका है? और यदि हां, तो मैं LookupSymbols का उपयोग कैसे करूं जब मेरे पास एक विधि प्रतीक हो?

एक अन्य विकल्प जिसे मैंने सोचा था कि विधि प्रतीक में Parameters संग्रह का उपयोग करना था। मैं इसके बजाय उनके खिलाफ एक ही नाम चयन एल्गोरिदम प्रदर्शन कर सकता था। लेकिन क्या यह पर्याप्त होगा? उदाहरण के लिए:

private static string GetIdentifierName(IMethodSymbol within) 
{ 
    var proposed = "x"; 

    while (within.Parameters.Any(x => x.Name == proposed)) 
    { 
     proposed = "_" + proposed; 
    } 

    return proposed; 
} 
+0

जब मुझे विधि पैरामीटर पहचानकर्ताओं के खिलाफ सत्यापित करना पड़ा, तो मैंने आपके दूसरे दृष्टिकोण का भी उपयोग किया। –

+0

आपको स्थानीय लोगों की जांच करने की भी आवश्यकता है। – SLaks

+0

@ स्लक्स: मैं विधि उत्पन्न कर रहा हूं, इसलिए मैं स्थानीय लोगों के नियंत्रण में हूं (कोई भी नहीं है)। –

उत्तर

1

SemanticModel.LookupSymbols का उपयोग करते हुए एक अच्छा दृष्टिकोण की तरह लगता है। इस तरह विजुअल स्टूडियो चयनित तरीकों को नए तरीकों से ले जाता है। Roslyn में UniqueNameGenerator आंतरिक कक्षा देखें।

के लिए के रूप में कैसे LookupSymbols उपयोग करने के लिए जब आपके पास एक विधि प्रतीक है: आप पहले से ही जोड़ने द्वारा अपने कोड में DoSomething(x => x.Foo()); उत्पन्न है, तो आप आप सिर्फ एक विधि प्रतीक से अधिक है, है ना? लेकिन किसी भी मामले में, IMethodSymbol से आप संबंधित वाक्यविन्यास नोड्स तक पहुंचने के लिए DeclaringSyntaxReferences प्राप्त कर सकते हैं।

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