Roslyn

2016-09-05 9 views
5

में अभिव्यक्तियों का नाम पार्सिंग मैं CSharpSyntaxWalker में अभिव्यक्तियों के साथ कुछ करने की कोशिश कर रहा हूं, हालांकि, मैंने देखा कि एएसटी में NameOfExpressionSyntax नहीं है। इसके बजाय मैं जो SemanticModel.GetSymbolInfo रिटर्न कोई मिलता-जुलता प्रतीकों के लिए एक InvocationExpressionSyntax मिलता है, और मंगलाचरण की अभिव्यक्ति एक IdentifierNameSyntax एक पहचानकर्ता टोकन "nameof" युक्त है।Roslyn

तो nameof भाव पहचान करने के लिए मैं एक विशेष मामले के लिए जोड़ा है | VisitInvocationExpression को, GetSymbolInfo कुछ भी देता है कि क्या के लिए और नहीं करता है, तो देख, चाहे पहचानकर्ता nameof है की तलाश में। हालांकि, यह मेरे लिए थोड़ा सा लगता है। क्या कोई बेहतर तरीका हो सकता है जो उस प्रकार के पहचान को तर्कसंगत तर्क में बदल देता है?

(पी.एस .: मैं जानता हूँ कि यह शायद पश्च संगतता कारणों के लिए इस तरह पार्स किया गया है;। बस सोच nameof और सामान्य आमंत्रण भेद के लिए एक API है कि क्या वहाँ)

+4

[किसी और ने यह भी देखा है] (https://joshvarty.wordpress.com/2015/02/16/lrn-quick-tips-working-with-nameof/)। – Rawling

+1

अभी भी # 6 ग के लिए एक औपचारिक कल्पना नहीं है, लेकिन [इस मसौदा] (https://github.com/ljw1004/csharpspec/blob/f12213c4ffe77a51dbc5412250bef6af75333f32/expressions.md#nameof-expressions) पुष्टि करने के लिए कि यह एक है प्रतीत होता है संदिग्ध पार्स और इतनी अतिरिक्त तर्क की आवश्यकता है। –

+1

@Damien_The_Unbeliever: मैं वास्तव में जहां यह निर्धारित करता है कि लेकिन रोसलिन के स्रोत कोड में जगह पाने के कोशिश की सकता है एक सरसरी खोज में नहीं। शायद मुझे फिर से देखना चाहिए। – Joey

उत्तर

1

मैं अब वास्तव में निम्नलिखित स्निपेट प्रयोग किया है: एक

if (symbolInfo.Symbol == null && 
    symbolInfo.CandidateSymbols.IsEmpty && 
    symbolInfo.CandidateReason == CandidateReason.None) { 
    var identifier = node.Expression as IdentifierNameSyntax; 
    if (identifier != null && identifier.Identifier.Kind() == SyntaxKind.IdentifierToken && identifier.Identifier.Text == "nameof") { 
    // We have a nameof expression 
    } 
} 

मैं बस में मामला सी # 8 पता लगाने के लिए निरंतर मूल्य का फायदा उठाने के लिए नहीं दिया जाए या फिर इतना है कि नस में अभी तक एक अलग ऑपरेटर कहते हैं, वह भी हो सकता है निरंतर मान, लेकिन nameof नहीं है। पता लगाने के काफी का पता लगाता है कहते हैं कि वास्तव में क्या विनिर्देश एक nameof अभिव्यक्ति जा रहा है एक मंगलाचरण निर्धारण करने के लिए प्रयोग किया जाता है:

क्योंकि nameof एक आरक्षित शब्द नहीं है, एक nameof अभिव्यक्ति हमेशा सरल नाम nameof की एक मंगलाचरण के साथ वाक्य रचना अस्पष्ट है । संगतता कारणों के लिए, यदि नाम nameof के नाम देखने सफल होता है, अभिव्यक्ति एक invocation_expression के रूप में व्यवहार किया जाता है - चाहे मंगलाचरण कानूनी है की परवाह किए बिना। अन्यथा यह nameof_expression है।

3

nameof भाव संकलन समय निरंतर कर रहे हैं। आप सामान्य तथ्य से अलग करने के लिए उस तथ्य का उपयोग कर सकते हैं। आप पर InvocationExpressionSyntax पर कॉल कर सकते हैं। मामले में यह एक nameof है, तो आप स्ट्रिंग/नाम वापस पाने के अंदर Optional<object>.Value (HasValue भी सच रिटर्न)।

+1

GetConstantValue मुझे उस मामले में मदद मिलेगी नहीं, जैसा कि मैंने कोई कस्टम नाम के प्रतीक मैप करने की आवश्यकता है, लेकिन दी अप तार की है, कि शायद यह भेद का एक अच्छा तरीका है अन्य आमंत्रणों से जो आमतौर पर स्थिर नहीं होते हैं। – Joey

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