Я пытаюсь выполнить базовый код с API Roslyn, и у меня возникают непредвиденные проблемы. По сути, у меня есть два кода, которые одинаковы, кроме одной строки. Это должно просто вернуть строку измененного текста, но по какой-то причине это говорит мне, что все изменилось. Я также попытался просто отредактировать одну строку вместо добавления строки, но я получаю тот же результат. Я хотел бы иметь возможность применить это к двум версиям исходного файла, чтобы идентифицировать различия между ними. Здесь код, который я использую в настоящее время:
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
}
}
}");
var root = (CompilationUnitSyntax)tree.Root;
var compilation = Compilation.Create("HelloWorld")
.AddReferences(
new AssemblyFileReference(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);
var nameInfo = model.GetSemanticInfo(root.Usings[0].Name);
var systemSymbol = (NamespaceSymbol)nameInfo.Symbol;
SyntaxTree tree2 = SyntaxTree.ParseCompilationUnit(
@"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello, World!"");
Console.WriteLine(""jjfjjf"");
}
}
}");
var root2 = (CompilationUnitSyntax)tree2.Root;
var compilation2 = Compilation.Create("HelloWorld")
.AddReferences(
new AssemblyFileReference(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree2);
var model2 = compilation2.GetSemanticModel(tree2);
var nameInfo2 = model2.GetSemanticInfo(root2.Usings[0].Name);
var systemSymbol2 = (NamespaceSymbol)nameInfo2.Symbol;
foreach (TextSpan t in tree2.GetChangedSpans(tree))
{
Console.WriteLine(tree2.Text.GetText(t));
}
И вот вывод, который я получаю:
System
using System
Collections
Generic
using System
Linq
using System
Text
namespace HelloWorld
{
class Program
{
static
Main
args
{
Console
WriteLine
"Hello, World!"
Console.WriteLine("jjfjjf");
}
}
}
Press any key to continue . . .
Интересно, что каждая строка отображается как токены для каждой строки, за исключением добавленной строки, где отображается строка, не разбирая ее. Кто-нибудь знает, как изолировать фактические изменения?