using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.Scripting { public class ScriptParser { public List ParseScript(String code) { List vars = new List(); SyntaxTree tree = CSharpSyntaxTree.ParseText(code); var root = (CompilationUnitSyntax)tree.GetRoot(); List variables = new List(); FillVariables(variables, root.Members[0]); variables = variables.Distinct().ToList(); foreach (var item in variables) { ScriptVariable v = new ScriptVariable(); v.Name = item.Identifier.ToString(); if (item.Initializer.Value.GetType() == typeof(ObjectCreationExpressionSyntax)) { v.Type = (item.Initializer.Value as ObjectCreationExpressionSyntax).Type.ToString(); } else if (item.Initializer.Value.GetType() == typeof(InvocationExpressionSyntax)) { v.Type = (((item.Initializer.Value as InvocationExpressionSyntax).Expression as MemberAccessExpressionSyntax).Name as GenericNameSyntax).TypeArgumentList.Arguments[0].ToString(); } vars.Add(v); } return vars; } private void FillVariables(List variables, SyntaxNode node) { foreach (var item in node.DescendantNodes(x => true)) { if (item.GetType() == typeof(VariableDeclaratorSyntax)) { variables.Add(item as VariableDeclaratorSyntax); } else { FillVariables(variables, item); } } } } public class ScriptVariable { public String Name { get; set; } public String Type { get; set; } public override string ToString() { return String.Format("{0} : {1}", Type, Name); } } }