Я работаю над разработкой приложения, которое переписывает код CSharp
. Я делаю это с Roslyn
. Я столкнулся с проблемой splitting expressions
.Разбиение выражений с помощью Roslyn
Sample класс
class Program
{
static void Main(string[] args)
{
float floatVariable = 20;
Int16 intVariable = 10;
string str = "School";
Console.Write(str + floatVariable.ToString() + intVariable.ToString()); // Facing problem with this statement
}
}
Пример кода Я использую
string code = new StreamReader(classPath).ReadToEnd();
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxRoot = syntaxTree.GetRoot();
//This will get the method and local variables declared inside the method
var MyMethods = syntaxRoot.DescendantNodes().OfType<MethodDeclarationSyntax>();
foreach (MethodDeclarationSyntax mds in MyMethods)
{
syntaxTree = CSharpSyntaxTree.ParseText(mds.ToFullString());
IEnumerable<SyntaxNode> nodes = syntaxTree.GetRoot().DescendantNodes();
IEnumerable<VariableDeclarationSyntax> variableDeclarations = nodes.OfType<VariableDeclarationSyntax>();
foreach (VariableDeclarationSyntax variable in variableDeclarations)
{
// I will collect the variable details like Datatype, variable names and initialized values here
}
foreach (StatementSyntax statement in mds.Body.Statements)
{
if (statement.CSharpKind() == SyntaxKind.ExpressionStatement)
{
//I want to split the expressions "Console.Write(str + floatVariable.ToString() + intVariable.ToString());" as below
//1. intVariable.ToString()
//2. floatVariable.ToString()
//3. str
//Then I have to find the whole data type from the resolved result of above 3 => string here
}
}
}
Любая помощь будет оценена.
Edit: У меня возникли проблемы в расщеплении параметризованных инструкций выражения. Я пытаюсь это сделать,
if (statement.CSharpKind() == SyntaxKind.ExpressionStatement)
{
ExpressionStatementSyntax expression = statement as ExpressionStatementSyntax;
var expressions = expression.Expression.DescendantNodes();
}
Но это разделяет каждый токен как отдельный элемент. Я просто хочу, чтобы расколоть Console.Write(str + floatVariable.ToString() + intVariable.ToString())
в,
- Console.Write()
- ул
- intVariable.ToString()
- floatVariable.ToString()
код [Рослин Синтаксис дерева Visualiser] (https://visualstudiogallery.msdn.microsoft.com/70e184da-9b3a- 402f-b210-d62a898e2887) может помочь вам здесь. – Rawling
В чем же проблема? Получение выражения параметра из инструкции? Работа с бинарными выражениями для '+'? Что вы пробовали? Как это случилось? – svick
@svick: Я отредактировал вопрос. Пожалуйста, найдите его в блоке ** Изменить **. –