using PascalABCCompiler.SyntaxTree; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SyntaxVisitors.Async { // Класс для работы с переменными public class VarsHelper { // Множество всех переменных, находящихся в данном асинхронном методе public HashSet VarsList = new HashSet(); // Множество всех явно типизированных переменных public HashSet TypedVarsList = new HashSet(); // Множество всех неявно типизированных переменных public HashSet NoneTypedVarsList = new HashSet(); // Множество всех параметров асинхронного метода public HashSet Parametrs = new HashSet(); // Множество переменных, находящихся внутри await public HashSet ExprHash = new HashSet(); // Множество переменных, являющихся Task public HashSet TasksHash = new HashSet(); // Словарик переменных, которые нужно переименовать public Dictionary RepVarsDict = new Dictionary(); // Список переменных класса public HashSet ClassIdentSet = new HashSet(); // Список статических переменных класса public HashSet ClassStaticSet = new HashSet(); // Словарик переменных, являющихся Task public Dictionary TaskIdents = new Dictionary(); int LabelNameCounter = 0; public string newLabelName(string old) { LabelNameCounter++; return "@awvar@_" + LabelNameCounter.ToString() +"_" + old; } // Добавляем новую переменную, которую нужно будет переименовать public void AddNewRep(var_statement var_Statement) { foreach (var v in var_Statement.var_def.vars.list) if (!RepVarsDict.ContainsKey(v.name)) { if (v.name.StartsWith("@")) { continue; } var nv = newLabelName(v.name); RepVarsDict.Add(v.name, nv); v.name = nv; } } // Помечаем какими являются переменные, чтобы знать // что делать с ними дальше public void MarkVars() { foreach (var var in VarsList) { var v = var.var_def; if (v.vars_type != null) TypedVarsList.Add(var); else NoneTypedVarsList.Add(var); var vd = var.var_def; if (ExprHash.Contains(vd.vars.list[0].name)) { TasksHash.Add(var); } } } } }