2014-11-02 8 views
10

मैं कुछ दिनों पहले टेकएड में था, और मैंने this talk by Kevin Pilch-Bisson (relevent part starts at about 18 minutes) देखा ... मैंने सोचा कि बहुत अच्छा था, इसलिए मैंने रोज़लिन के साथ खेलने का फैसला किया। -Roslyn CodeFixProvider का उपयोग कर विधि में एक्सेस संशोधक जोड़ें?

मैं एक नियम "प्रवेश संशोधक घोषित किया जाना चाहिए" बनाने के लिए कोशिश कर रहा हूँ (StyleCop SA1400) जिसका अर्थ है,

यह नियम का उल्लंघन करती है:

static void Main(string[] args) 
    { 
    } 

यह ठीक है:

public static void Main(string[] args) 
    { 
    } 

यह एक स्पष्ट आंतरिक कीवर्ड, सार्वजनिक कीवर्ड, निजी कीवर्ड या समर्थक होना आवश्यक है tected कीवर्ड।

उल्लंघन का पता लगाना काफी आसान था, लेकिन अब मैं एक फिक्स प्रदान करने की कोशिश कर रहा हूं। मैं चीजों की कोशिश कर रहा हूं और हर जगह खोज रहा हूं, लेकिन मुझे यह नहीं पता कि एक्सेस संशोधक कैसे जोड़ सकते हैं।

public async Task<IEnumerable<CodeAction>> GetFixesAsync(Document document, TextSpan span, IEnumerable<Diagnostic> diagnostics, CancellationToken cancellationToken) 
{ 
    var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); 
    var token = root.FindToken(span.Start); 

    var methodDeclaration = token.Parent as MethodDeclarationSyntax; 

    //var newModifiers = methodDeclaration.Modifiers.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.PublicKeyword));   
    //var newModifiers = new SyntaxTokenList() { new SyntaxToken() }; 

    MethodDeclarationSyntax newMethodDeclaration = methodDeclaration.WithModifiers(methodDeclaration.Modifiers); 
    var newRoot = root.ReplaceNode(methodDeclaration, newMethodDeclaration); 
    var newDocument = document.WithSyntaxRoot(newRoot); 

    return new[] { CodeAction.Create("Add Public Keyword", newDocument) }; 
} 

WithModifiers की जरूरत है एक SyntaxTokenList, जो मैं नया(), लेकिन मैं कैसे SyntaxKind.PublicKeyword की इसे बनाने के लिए पता नहीं है कर सकते हैं:

यह वही है मैं अब तक है। मुझे यह भी यकीन नहीं है कि क्या मुझे यह भी नया लगता है, या SyntaxFactory का उपयोग करें। हालांकि, जब SyntaxFactory का उपयोग कर, मैं भी समझ नहीं कि कौन सी विधि मैं SyntaxKind.PublicKeyword

के SyntaxToken बनाने के लिए मैं ब्याज हो, तो DiagnosticAnalyzer सहित पूरे बात पोस्ट कर सकते हैं की जरूरत है ...

उत्तर

3

मैं वास्तव में क्या जरूरत थी इस:

var newModifiers = SyntaxFactory.TokenList(SyntaxFactory.Token(accessModifierToken)) 
.AddRange(methodDeclaration.Modifiers); 

इसके लगभग क्या क्रिस Eelmaa सुझाव दिया, लेकिन उस सुझाव के साथ मैं static public void Main के साथ समाप्त हुआ जो मान्य है, लेकिन बदसूरत है।

जनता को जोड़ना इसे सूची के अंत में जोड़ता है, और जहां तक ​​मुझे पता है, एक्सेस संशोधक हमेशा पहले होना चाहिए।

+1

मुझे अच्छा लगता है, सिवाय इसके कि आपके पास एक अप्रयुक्त स्थानीय "सार्वजनिक टोकनलिस्ट" है। आपके Func को पूर्वावलोकन बनाने के साथ ही क्लिक करने के लिए बुलाया जाएगा, लेकिन यह ठीक होना चाहिए। –

+0

ठीक है धन्यवाद :) हाँ भूल गए publicTokenList, आमतौर पर resharper मुझे उन लोगों के बारे में बताता है, लेकिन जब से मैं बनाम 14 में काम कर रहा था, यह नहीं था .. –

1

ठीक है, एक संशोधक कि संकेत मिलता है public static बनाने के लिए, तो आप इस का उपयोग कर सकते हैं:

var modifiers = SyntaxFactory.TokenList(
    new SyntaxToken[] { 
     SyntaxFactory.Token(SyntaxKind.PublicKeyword), 
     SyntaxFactory.Token(SyntaxKind.StaticKeyword) 
    }), 

लेकिन आपके मामले में, मैं देख नहीं आता कि क्यों

var updatedModifiers = methodDeclaration 
       .Modifiers 
       .Add(SyntaxFactory.Token(SyntaxKind.PublicKeyword)); 

methodDeclaration.WithModifiers(updatedModifiers); 

काम नहीं करेगा।

+0

पहला सुझाव काम नहीं करता है क्योंकि आपको स्पष्ट रूप से स्थिर की आवश्यकता नहीं होती है, लेकिन मुझे सिंटैक्स की व्याख्या करने के लिए यह मिलता है ... फिर भी, दूसरा सुझाव भी वास्तव में काम नहीं करता है, इसके परिणामस्वरूप 'स्थिर सार्वजनिक शून्य मुख्य 'या स्थैतिक पब्लिकवोइड मुख्य –

+0

@RonSijm, +1। यदि आप अपना उत्तर साफ़ करते हैं और केवल प्रासंगिक सामान डालते हैं तो मुझे कोई समस्या नहीं है (उदाहरण के लिए 'GetFixesAsync' और' CreateAction' 'से छुटकारा पाएं और इसे स्वीकार करें। यह एक अच्छा सवाल है। –

6

खुशी है कि आपने बात का आनंद लिया! हम वास्तव में यह आसान सूची में आइटम जोड़ने के लिए बनाने के लिए सिन्टैक्स मॉडल में कुछ सहायकों है, तो आप की तरह कुछ करने के लिए सक्षम होना चाहिए:

var newMethodDeclaration = methodDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)); 

नई विधि घोषणा प्राप्त करने के लिए।

इस का विस्तृत रूप होगा कुछ की तरह: आशा

var newModifiers = SyntaxFactory.TokenList(modifiers.Concat(new[] { SyntaxFactory.Token(SyntaxKind.PublicKeyword)})); 
var newMethodDeclaration = methodDeclaration.WithModifiers(newModifiers); 

इस मदद करता है

+0

मुझे बहुत पसंद आया! तकनीक पर मैंने देखा है कि सबसे अच्छी बात के बारे में, Async एक के साथ :) - वैसे भी, आपके सुझाव की तरह काम करता है, लेकिन मैं 'स्थिर सार्वजनिक शून्य मुख्य 'के साथ समाप्त होता है। मैंने अपना खुद का समाधान जोड़ा है जो काम करता है। यदि समीक्षा की जा सकती है तो अगर मैंने कुछ अजीब किया, तो यह बहुत अच्छा होगा। रोज़लिन के लिए मैंने पहली चीज बनाई है, इसलिए शायद –

+0

में सुधार करने के लिए चीजों का एक समूह है ओह बीटीडब्ल्यू, विश्लेषण विश्लेषण का सिंटैक्स क्यों है: 'सार्वजनिक शून्य विश्लेषण नोड (सिंटेक्स नोड नोड, सेमेन्टिक मॉडेल अर्थात् मॉडल, एक्शन एडडिआग्नोस्टिक' और यह नहीं : 'पब्लिक एक्शन विश्लेषण नोड (सिंटेक्स नोड नोड, सेमेन्टिक मॉडेल अर्थात् मॉडल'? यह थोड़ा अजीब लगता है –

+1

क्योंकि आप कई डायग्नोस्टिक्स की रिपोर्ट कर सकते हैं। साथ ही, उन्हें कॉलबैक होने से हमें कुछ आवंटन से बचने और परिणामों की रिपोर्ट करने के लिए स्ट्रीम करने की सुविधा मिलती है असीमित रूप से। –

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