Я пытаюсь выполнить базовую проверку кода с помощью Roslyn API и сталкиваюсь с неожиданными проблемами. По сути, у меня есть два одинаковых куска кода, за исключением одной добавленной строки. Это должно просто вернуть строку измененного текста, но по какой-то причине он говорит мне, что все изменилось. Я также пробовал просто редактировать одну строку вместо добавления строки, но получаю тот же результат. Я хотел бы иметь возможность применить это к двум версиям исходного файла, чтобы определить различия между ними. Вот код, который я сейчас использую:
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 . . .
Интересно, что он, похоже, показывает каждую строку в виде лексем для каждой строки, кроме добавленной строки, где он отображает строку без разбиения на части. Кто-нибудь знает, как изолировать фактические изменения?