pascalabcnet/SyntaxVisitors/VisitorsForLambdas/RenameOnExceptVarsVisitor.cs
Александр Земляк 1f4b44c2c0
Исправление ошибок при перекомпиляции pcu файлов (#3398)
* Move yield string constants to StringConstants class

* Add GeneratedNamesManager class to store all generated names during unit compilation

* Make GeneratedNamesManager class non static

* Add Utils project to installer files

* Add GeneratedNamesManager usage in CapturedVariablesSubstitutionsManager

* Move GeneratedNamesManager initialization in CompilationUnit constructor

* More GeneratedNamesManager usage

* QuestionPointDesugarVisitor fix
2026-03-08 18:30:33 +03:00

94 lines
3.3 KiB
C#

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System.Collections.Generic;
using PascalABCCompiler.CoreUtils;
using PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors
{
// Проба будущего визитора или не будущего
public class RenameOnExceptVarsVisitor : BaseChangeVisitor
{
public string NameForRename = null;
public string NewName = null;
private readonly GeneratedNamesManager generatedNamesManager;
public RenameOnExceptVarsVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public void Rename(exception_handler eh)
{
NameForRename = eh.variable?.name?.ToLower();
if (NameForRename != null)
{
NewName = GetNewVariableName(NameForRename);
ProcessNode(eh.statements);
}
}
public override void visit(ident id)
{
var idl = id.name.ToLower();
if (NameForRename == idl)
{
id.name = NewName;
}
}
public override void visit(dot_node dn)
{
ProcessNode(dn.left);
if (dn.right.GetType() != typeof(ident))
ProcessNode(dn.right);
}
private string GetNewVariableName(string name)
{
return generatedNamesManager.GenerateName("$Rename_" + name);
}
}
public class FindOnExceptVarsAndApplyRenameVisitor : BaseChangeVisitor
{
private readonly GeneratedNamesManager generatedNamesManager;
private FindOnExceptVarsAndApplyRenameVisitor(GeneratedNamesManager generatedNamesManager)
{
this.generatedNamesManager = generatedNamesManager;
}
public static FindOnExceptVarsAndApplyRenameVisitor Create(GeneratedNamesManager generatedNamesManager) => new FindOnExceptVarsAndApplyRenameVisitor(generatedNamesManager);
public override void visit(exception_handler eh)
{
if (eh.variable != null)
{
// Вначале переименовать везде кроме как в заголовке, потом добавить в блок операторов переприсваивание
var vis = new RenameOnExceptVarsVisitor(generatedNamesManager);
vis.Rename(eh);
var vs = new var_statement(new ident(vis.NewName/*, eh.statements.source_context*/), new ident(vis.NameForRename, eh.variable.source_context)/*, eh.statements.source_context*/);
var stl = new List<statement>();
stl.Add(vs);
if (eh.statements != null)
{
stl.Add(eh.statements);
ReplaceStatementUsingParent(eh.statements, stl);
}
else
{
var s = new statement_list(stl);
s.Parent = eh;
s.source_context = eh.source_context;
eh.statements = s;
}
}
base.visit(eh);
}
}
}