के साथ अर्थपूर्ण कोड उत्पन्न करना हम Roslyn के साथ कोड उत्पन्न करने का तरीका जानने का प्रयास करते हैं। मैं CSharpSyntaxTree.ParseText
जैसे कुछ के बारे में बात नहीं कर रहा हूं जो कुछ तारों को ले जाएगा और उन्हें एएसटी में परिवर्तित करेगा। इसके बजाय, मैं इस (छद्म कोड) की तरह किसी भी तरह अपने मॉडल का निर्माण करना चाहते हैं:रोसलीन
- संकलन इकाई के रूप में
file
बनाएं - जोड़े वर्ग
MyClass
file
विधि जोड़ने के लिए DoSomething
MyClass
को- के सेट शरीर
DoSomething
इसी तरह के फैशन मेंSystem.Linq.Expressions
हमने हाल ही में खोज की Microsoft.CodeAnalysis.CSharp.SyntaxFactory
, और यह आशाजनक प्रतीत होता था। हालांकि, जाहिर है हमें खुद को ट्रिविया जोड़ना है।
SyntaxFactory.CompilationUnit()
के साथ एक पेड़ बनाने के बाद और कुछ सदस्यों को आगे और आगे जोड़ने के बाद, ToFullString()
का आउटपुट केवल टेक्स्ट का एक गुच्छा है, जो न तो पठनीय है, न ही संकलित (उदा।, लापता ब्रेसिज़)। क्या मॉडल से पाठ उत्पन्न करते समय हमें कुछ याद आती है?
संपादित करें:
कार्यस्थानों उपयोग करते समय, आप सेट कर सकते हैं विकल्प खाली स्थान के व्यवहार को प्रभावित:
public string Generate (CompilationNode rootNode)
{
var cw = new CustomWorkspace();
cw.Options.WithChangedOption (CSharpFormattingOptions.IndentBraces, true);
var formattedCode = Formatter.Format (CreateFile(rootNode), cw);
return formattedCode.ToFullString();
}
यह पहले से ही बेहतर परिणाम अर्जित करता है। क्या कोई इसे एक अच्छे समाधान के रूप में पुष्टि कर सकता है या यह एक हैक है?
एक समस्या बनी हुई है। हम वर्तमान में SF.AccessorDeclaration
का उपयोग कर एक ऑटो-प्रॉपर्टी जेनरेट करना चाहते हैं, लेकिन पूर्ण स्ट्रिंग में कनवर्ट करते समय अर्धविराम को याद करते हैं।
आपका लक्ष्य कोड को निकालना है, है ना? संकलित नहीं है? – i3arnon
हां, लेकिन स्पष्ट रूप से ट्रिविया निर्दिष्ट किए बिना। मेरे पास रीशेर्पर एसडीके का उपयोग करके कुछ अनुभव भी है, जो मूल रूप से एप्लिकेशन का एक ही क्षेत्र है। वे * कारखानों में होते हैं जो सामान्य ज्ञान के लिए अनजान होते हैं, और यह सभी जेनरेट किए गए कोड को साफ और संकलित करता है। मैंने कोडडॉम का उपयोग करने के लिए सुझाव देने वाले अन्य उपयोगकर्ताओं की कुछ टिप्पणियां पार कर लीं, और रोस्लिन इस के लिए उपयुक्त नहीं है, लेकिन यह अब तक का सबसे बड़ा असफल प्रतीत होता है :) – Matthias
खैर ... रोज़लीन, एक कंपाइलर होने के नाते, कोड का उपभोग करने के लिए है, इसे उत्पन्न नहीं करते हैं। – i3arnon