2011-11-22 6 views
10

से TypeSyntax प्राप्त करें मैं Roslyn-CTP के साथ थोड़ा सा प्रयोग कर रहा हूं।ITypeSymbol

वर्तमान में मैं कंक्रीट प्रकार के साथ var को प्रतिस्थापित करने की कोशिश कर रहा हूं।

var i=1; 

हो जाना चाहिए:

int i=1; 

अनुमानित प्रकार इसके बारे में पता करना आसान है। लेकिन चूंकि यह हिस्सा अर्थपूर्ण मॉडल में होता है, इसलिए मुझे ITypeSymbol मिलता है। प्रतिस्थापन वाक्यविन्यास मॉडल में होता है, इसलिए मुझे TypeSyntax की आवश्यकता है। चूंकि मुझे एक फूला हुआ नाम नहीं चाहिए (global::System.Int32), रूपांतरण संदर्भ निर्भर है (using, नेस्टेड प्रकार इत्यादि)।

रोज़लीन का हिस्सा है जो विजुअल स्टूडियो संस्करण में पहले से ही "सरलीकृत प्रकार का नाम" क्विकफ़िक्स में यह कार्यक्षमता है, लेकिन नमूने को देखकर मुझे यह रूपांतरण करने का एक आसान तरीका नहीं मिला।


केविन Pilch-Bisson के जवाब के आधार पर मैं अब उपयोग कर रहा हूँ:

var location = document.GetSyntaxTree().GetLocation(node); 
string name = variableType.ToMinimalDisplayString((Location)location, (SemanticModel)document.GetSemanticModel()); 

एक स्थान जो ToMinimalDisplayString एक CommonSyntaxTree से प्राप्त किया जा सकता है।

एक अतिरिक्त उलझन है कि ToMinimalDisplayString, कक्षाएं Location और SemanticModel की आवश्यकता है, जबकि document.GetSemanticModel() और CommonSyntaxTree.GetLocation केवल एक अंतरफलक वापसी है।
मैंने कक्षाओं को आसानी से कास्टिंग करके काम किया, जो अब के लिए काम करता है।

हम्म ऐसा लगता है कि कक्षाएं सी # विशिष्ट हैं, और इंटरफेस भाषा स्वतंत्र हैं।


मैं GitHub पर एक काम संस्करण अपलोड कर दिया है: https://github.com/CodesInChaos/Roslyn

यह एक foreach में var लिए काम नहीं करता है, लेकिन मुझे लगता है कि वर्तमान रोसलिन निर्माण की एक सीमा है।

+2

पुन: आपका अंतिम विवरण: सही; सीटीपी निर्माण को अंतिम रूप देने से पहले हमें 'foreach 'में पूरी तरह कार्यान्वित नहीं किया गया था, क्षमा करें। –

उत्तर

12

आप ISymbol (नोट पर लागू होने वाला ToMinimalDisplayString() विस्तार विधि का उपयोग कर दिए गए स्थान पर एक प्रतीक को प्रदर्शित करने में कम से कम कानूनी स्ट्रिंग प्राप्त कर सकते हैं: यह `Roslyn.Compilers.CSharp.SymbolDisplay में पाया है

अस्वीकरण:। मैं Roslyn टीम पर माइक्रोसॉफ्ट में काम करें।

+10

बीटीडब्लू, आपको इसकी आवश्यकता नहीं है आपके उत्पाद _about_ प्रश्नों का उत्तर देने पर अस्वीकरण। यदि आप अपने उत्पाद की सिफारिश कर रहे हैं तो अस्वीकरण का उपयोग किया जाना चाहिए। – SLaks

+0

तो वह उस उपसर्ग को कैसे उपसर्ग करेगा लाइन, हानिरहित संवर्धन (उत्तर का, उत्पाद नहीं)? – sq33G

+3

@ sq33G: जब तक वह यह दिखाने की कोशिश नहीं कर रहा है कि वह जानता है कि वह क्या बात कर रहा है, उसे उस लाइन की आवश्यकता नहीं है। यदि वह है, तो वह इसे कोष्ठक में रख सकता है। – SLaks