pascalabcnet/SyntaxVisitors/Async/VarsHelper.cs

86 lines
3.4 KiB
C#
Raw Permalink Normal View History

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-03 17:39:57 +03:00
public class VarsHelper
{
// Множество всех переменных, находящихся в данном асинхронном методе
2024-06-03 17:39:57 +03:00
public HashSet<var_statement> VarsList = new HashSet<var_statement>();
// Множество всех явно типизированных переменных
2024-06-03 17:39:57 +03:00
public HashSet<var_statement> TypedVarsList = new HashSet<var_statement>();
// Множество всех неявно типизированных переменных
2024-06-03 17:39:57 +03:00
public HashSet<var_statement> NoneTypedVarsList = new HashSet<var_statement>();
// Множество всех параметров асинхронного метода
public HashSet<string> Parametrs = new HashSet<string>();
2024-06-03 17:39:57 +03:00
// Множество переменных, находящихся внутри await
public HashSet<string> ExprHash = new HashSet<string>();
2024-06-03 17:39:57 +03:00
// Множество переменных, являющихся Task<T>
2024-06-03 17:39:57 +03:00
public HashSet<var_statement> TasksHash = new HashSet<var_statement>();
// Словарик переменных, которые нужно переименовать
2024-06-03 17:39:57 +03:00
public Dictionary<string,string> RepVarsDict = new Dictionary<string,string>();
// Список переменных класса
2024-06-03 17:39:57 +03:00
public HashSet<string> ClassIdentSet = new HashSet<string>();
// Список статических переменных класса
public HashSet<string> ClassStaticSet = new HashSet<string>();
2024-06-03 17:39:57 +03:00
// Словарик переменных, являющихся Task<T>
public Dictionary<string, string> TaskIdents = new Dictionary<string, string>();
2024-06-03 17:39:57 +03:00
int LabelNameCounter = 0;
2024-06-03 17:39:57 +03:00
public string newLabelName(string old)
{
LabelNameCounter++;
return "@awvar@_" + LabelNameCounter.ToString() +"_" + old;
2024-06-03 17:39:57 +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-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);
}
}
}
}
}