Я делаю какой-то домашний проект. Как я могу скопировать произвольный SyntaxNode и вставить его сразу после оригинала?
Попробовал этот общий метод (чтобы охватить все случаи):
private void AppendReplaced(SyntaxNode node)
{
var parent = node.Parent;
var replaced = CSharpSyntaxTree.ParseText(_replacer.Replace(node.ToFullString())).GetRoot();
parent.InsertNodesAfter(node, new[] { replaced });
}
Это завершается с ошибкой:
Невозможно привести объект типа
'Microsoft.CodeAnaанализ.CSharp .Syntax.CompilationUnitSyntax', чтобы ввести
'Microsoft.CodeAnaанализ.CSharp.Syntax.UsingDirectiveSyntax'.
Очевидно, существуют некоторые внутренние проверки, которые запрещает неверный синтаксис (потому что использование может иметь разное значение в разных контекстах и все подобные проблемы).
Итак, как можно правильно использовать Clone() узел ИЛИ вообще отключить проверку? Мне действительно нужно просто скопировать/вставить функциональность с небольшими текстовыми изменениями, и меня не волнует правильность/целостность базы кода.
PS:
Пришел только к такому решению:
private void AppendReplaced(SyntaxNode node)
{
ToInsert.Add(Tuple.Create(node.FullSpan.End, _replacer.Replace(node.ToFullString())));
}
var outputBuilder = new StringBuilder();
outputBuilder.Append(input);
foreach (var t in walker.ToInsert.AsEnumerable().Reverse())
{
outputBuilder.Insert(t.Item1, t.Item2);
}
output = outputBuilder.ToString();
Подробнее здесь: https://stackoverflow.com/questions/791 ... syntaxnode