खोज…


MSBuild परियोजना से कार्यक्षेत्र बनाएँ

पहले Microsoft.CodeAnalysis.CSharp.Workspaces जारी रखने से पहले nuget प्राप्त करें।

var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();
var project = await workspace.OpenProjectAsync(projectFilePath);
var compilation = await project.GetCompilationAsync();

foreach (var diagnostic in compilation.GetDiagnostics()
    .Where(d => d.Severity == Microsoft.CodeAnalysis.DiagnosticSeverity.Error))
{
    Console.WriteLine(diagnostic);
}

कार्यक्षेत्र में मौजूदा कोड लोड करने के लिए, त्रुटियों को संकलित और रिपोर्ट करें। बाद में कोड मेमोरी में स्थित होगा। यहाँ से, दोनों वाक्यात्मक और अर्थ पक्ष साथ काम करने के लिए उपलब्ध होंगे।

सिंटेक्स का पेड़

एक सिंटेक्स ट्री एक अपरिवर्तनीय डेटा संरचना है जो कार्यक्रम को नाम, आदेशों और चिह्नों के पेड़ के रूप में दर्शाती है (जैसा कि पहले संपादक में कॉन्फ़िगर किया गया था।)

उदाहरण के लिए, मान लें कि Microsoft.CodeAnalysis.Compilation उदाहरण compilation नाम कॉन्फ़िगर किया गया है। लोड किए गए कोड में घोषित हर चर के नाम को सूचीबद्ध करने के कई तरीके हैं। भोलेपन से ऐसा करने के लिए, प्रत्येक दस्तावेज़ में सभी सिंटैक्स के टुकड़े लें ( DescendantNodes विधि) और Linq का उपयोग नोड्स का चयन करने के लिए करें जो चर घोषणा का वर्णन करते हैं:

foreach (var syntaxTree in compilation.SyntaxTrees)
{
    var root = await syntaxTree.GetRootAsync();
    var declaredIdentifiers = root.DescendantNodes()
        .Where(an => an is VariableDeclaratorSyntax)
        .Cast<VariableDeclaratorSyntax>()
        .Select(vd => vd.Identifier);

    foreach (var di in declaredIdentifiers)
    {
        Console.WriteLine(di);
    }
}

सिंटैक्स ट्री में प्रत्येक प्रकार का C # कंस्ट्रक्शन एक संगत प्रकार के साथ मौजूद होगा। विशिष्ट प्रकारों को जल्दी से खोजने के लिए, Visual Studio से Syntax Visualizer विंडो का उपयोग करें। यह मौजूदा खुले दस्तावेज़ को रोज़लिन सिंटैक्स ट्री के रूप में व्याख्या करेगा।

शब्दार्थ मॉडल

एक सिमेंटिक मॉडल एक वाक्यविन्यास पेड़ की तुलना में कोड की व्याख्या और अंतर्दृष्टि का एक गहरा स्तर प्रदान करता है। जहाँ सिंटेक्स के पेड़ चर के नाम बता सकते हैं, शब्दार्थ मॉडल भी प्रकार और सभी संदर्भ देते हैं। सिंटैक्स ट्री नोटिस विधि कॉल करते हैं, लेकिन सिमेंटिक मॉडल उस सटीक स्थान का संदर्भ देते हैं जो विधि घोषित की गई है (अधिभार संकल्प लागू होने के बाद)।

var workspace = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();
var sln = await workspace.OpenSolutionAsync(solutionFilePath);
var project = sln.Projects.First();
var compilation = await project.GetCompilationAsync();

foreach (var syntaxTree in compilation.SyntaxTrees)
{
    var root = await syntaxTree.GetRootAsync();

    var declaredIdentifiers = root.DescendantNodes()
        .Where(an => an is VariableDeclaratorSyntax)
        .Cast<VariableDeclaratorSyntax>();

    foreach (var di in declaredIdentifiers)
    {
        Console.WriteLine(di.Identifier);
        // => "root"

        var variableSymbol = compilation
            .GetSemanticModel(syntaxTree)
            .GetDeclaredSymbol(di) as ILocalSymbol;

        Console.WriteLine(variableSymbol.Type);
        // => "Microsoft.CodeAnalysis.SyntaxNode"

        var references = await SymbolFinder.FindReferencesAsync(variableSymbol, sln);
        foreach (var reference in references)
        {
            foreach (var loc in reference.Locations)
            {
                Console.WriteLine(loc.Location.SourceSpan);
                // => "[1375..1379)"
            }
        }
    }
}

यह सिंटैक्स ट्री का उपयोग करके स्थानीय चर की एक सूची को आउटपुट करता है। फिर यह पूर्ण प्रकार का नाम पाने के लिए सिमेंटिक मॉडल का संरक्षण करता है और हर चर के सभी संदर्भों को खोजता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow