मैं रोज़लिन में एक वाक्यविन्यास पेड़ के भीतर नोड्स को प्रतिस्थापित करने की कोशिश कर रहा हूं, और यह सिर्फ काम करने के बारे में है, लेकिन एक परेशानी के साथ यह महसूस करता है कि कोई समस्या नहीं होनी चाहिए।SyntaxNode.ReplaceNode SyntaxTree विकल्पों को क्यों बदलता है?
सिंटैक्स पेड़ एक स्क्रिप्ट से उत्पन्न होता है, और मैं परिणाम को स्क्रिप्ट-आधारित सिंटैक्स पेड़ भी बनना चाहता हूं - लेकिन किसी कारण से, पेड़ में नोड को बदलकर बदलते विकल्पों के साथ एक नया वाक्यविन्यास पेड़ बनाता है: Kind
Script
के बजाय Regular
बन जाता है। यह SyntaxTree.WithRootAndOptions
के साथ फिक्स करने योग्य है लेकिन ऐसा लगता है कि अगर मुझे कॉल करने की आवश्यकता है तो मैं कुछ गलत कर रहा हूं।
नमूना कार्यक्रम:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
Script script = CSharpScript.Create("Console.WriteLine(\"Before\")",
ScriptOptions.Default.AddImports("System"));
var compilation = script.GetCompilation();
var tree = compilation.SyntaxTrees.Single();
var after = SyntaxFactory.LiteralExpression(
SyntaxKind.StringLiteralExpression,
SyntaxFactory.Literal("After"));
var root = tree.GetRoot();
var before = root.DescendantNodes().OfType<LiteralExpressionSyntax>().Single();
var newRoot = root.ReplaceNode(before, after);
var fixedTree = newRoot.SyntaxTree.WithRootAndOptions(newRoot, tree.Options);
Console.WriteLine(newRoot); // Console.WriteLine("After")
Console.WriteLine(tree.Options.Kind); // Script
Console.WriteLine(newRoot.SyntaxTree.Options.Kind); // Regular
Console.WriteLine(fixedTree.Options.Kind); // Script
}
}
(। आउटपुट टिप्पणी में है)
इस समाधान वास्तव में सही है, या वहाँ कुछ अलग तरह से मैं एक वृक्ष के नोड की जगह किया जाना चाहिए?
भाषा संस्करण भी बदलता है। यदि आप सी # 5 सिंटैक्स पेड़ चाहते हैं तो आपको स्पष्ट रूप से निर्दिष्ट करना होगा। मैंने 'विथ रूट एंड ऑप्शन()' का भी उपयोग किया और इसके साथ कभी भी समस्या नहीं थी। – Tamas
मेरा आंत कह रहा है कि यह एक बग है ... –
@ जेसनमालिनोस्की: मुझे खुशी है कि आप यह कहने वाले हैं - मैं निश्चित रूप से नहीं चाहता था :) (लेकिन हाँ, यह मुझे भी ऐसा लगता है।) –