2012-08-30 7 views
8

में पहचानकर्ता का पता लगाएं मान लीजिए मैं एक स्रोत फ़ाइल है कि इस तरह दिखता है:सिमेंटिक मॉडल

public class FieldReference 
{ 
    int field; 

    public FieldReference() 
    { 
     field = 1; 
    } 
} 

मैं एक SyntaxRewriter उपयोग कर रहा हूँ इस फ़ाइल में पहचानकर्ता के सभी यात्रा करने के लिए। VisitIdentifierName विधि में, मैं यह पहचानने के लिए कि क्या एक पहचानकर्ता वर्तमान वर्ग के सदस्य को संदर्भित करता है, मैं अर्थात् मॉडल में पहचानकर्ता को देखना चाहता हूं। वहाँ SemanticModel.GetDeclaredSymbol विधि का कोई अधिभार है कि एक IdentifierNameSyntax स्वीकार करता है -

public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node) 
{ 
    SemanticModel model = this.compilation.GetSemanticModel(this.src); 
    // ?? look up identifier in compilation here ?? 
    return base.VisitIdentifierName(node); 
} 

हालांकि मैं दूर symantic मॉडल में पहचानकर्ता को देखने के लिए नहीं मिल सकता है:

यह वही है मैं अब तक किया है ।

कोई विचार मुझे यह कैसे करना चाहिए?

उत्तर

9

आपको अभिव्यक्ति पर SemanticModel.GetSymbolInfo का उपयोग करना चाहिए (इस विशेष मामले में IdentifierNameSyntax)।

GetDeclaredSymbol घोषणा बिंदु (int field; उपरोक्त) से प्रतीक के लिए जा रहा है। कंपाइलर के बाध्यकारी तर्क को निष्पादित करने के लिए और देखें कि एक विशेष अभिव्यक्ति किस प्रतीक से जुड़ी है, GetSymbolInfo का उपयोग करें।

+0

धन्यवाद केविन, यह सुनिश्चित नहीं है कि मैंने इसे कैसे नजरअंदाज किया। मुझे लगता है कि मेरे लिए बस इतना नया! – Grokys

+0

हम्म, यह Roslyn के वर्तमान पूर्वावलोकन संस्करण में टूटा हुआ लगता है। नमूने प्रोजेक्ट => ConvertToAutoPropertyCS => PropertyRewriter => VisitFieldDeclaration (FieldDeclarationSyntax फ़ील्ड) फ़ील्ड पैरामीटर के लिए प्रतीक प्राप्त करने का कोई तरीका नहीं है। – mynkow

+0

क्योंकि एक फ़ील्ड घोषणा एक से अधिक प्रतीकों की घोषणा कर सकती है, आपको वास्तव में वेरिएबलडेक्लेरेटर सिंटैक्स का उपयोग करने की आवश्यकता है। –