2024-06-03 17:39:57 +03:00
|
|
|
|
using PascalABCCompiler.SyntaxTree;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace SyntaxVisitors.Async
|
|
|
|
|
|
{
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Класс для работы с переменными
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public class VarsHelper
|
|
|
|
|
|
{
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Множество всех переменных, находящихся в данном асинхронном методе
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public HashSet<var_statement> VarsList = new HashSet<var_statement>();
|
|
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Множество всех явно типизированных переменных
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public HashSet<var_statement> TypedVarsList = new HashSet<var_statement>();
|
|
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Множество всех неявно типизированных переменных
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public HashSet<var_statement> NoneTypedVarsList = new HashSet<var_statement>();
|
|
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Множество всех параметров асинхронного метода
|
|
|
|
|
|
public HashSet<string> Parametrs = new HashSet<string>();
|
2024-06-03 17:39:57 +03:00
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Множество переменных, находящихся внутри await
|
|
|
|
|
|
public HashSet<string> ExprHash = new HashSet<string>();
|
2024-06-03 17:39:57 +03:00
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Множество переменных, являющихся Task<T>
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public HashSet<var_statement> TasksHash = new HashSet<var_statement>();
|
|
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Словарик переменных, которые нужно переименовать
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public Dictionary<string,string> RepVarsDict = new Dictionary<string,string>();
|
|
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Список переменных класса
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public HashSet<string> ClassIdentSet = new HashSet<string>();
|
|
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Список статических переменных класса
|
|
|
|
|
|
public HashSet<string> ClassStaticSet = new HashSet<string>();
|
2024-06-03 17:39:57 +03:00
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Словарик переменных, являющихся Task<T>
|
|
|
|
|
|
public Dictionary<string, string> TaskIdents = new Dictionary<string, string>();
|
2024-06-03 17:39:57 +03:00
|
|
|
|
|
2024-06-12 16:14:38 +03:00
|
|
|
|
int LabelNameCounter = 0;
|
2024-06-03 17:39:57 +03:00
|
|
|
|
public string newLabelName(string old)
|
|
|
|
|
|
{
|
2024-06-12 16:14:38 +03:00
|
|
|
|
LabelNameCounter++;
|
|
|
|
|
|
return "@awvar@_" + LabelNameCounter.ToString() +"_" + old;
|
2024-06-03 17:39:57 +03:00
|
|
|
|
}
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Добавляем новую переменную, которую нужно будет переименовать
|
2024-06-03 17:39:57 +03:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-06-12 16:14:38 +03:00
|
|
|
|
// Помечаем какими являются переменные, чтобы знать
|
|
|
|
|
|
// что делать с ними дальше
|
2024-06-03 17:39:57 +03:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|