58 lines
2.2 KiB
C#
58 lines
2.2 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;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
using PascalABCCompiler;
|
||
using PascalABCCompiler.SyntaxTree;
|
||
|
||
namespace SyntaxVisitors
|
||
{
|
||
public class ReplaceVariableNameVisitor : BaseChangeVisitor
|
||
{
|
||
private string _oldName;
|
||
private string _newName;
|
||
|
||
public ReplaceVariableNameVisitor(ident oldName, ident newName)
|
||
{
|
||
_oldName = oldName.name;
|
||
_newName = newName.name;
|
||
}
|
||
|
||
// Этот алгоритм маломощный и меняет всё внутри лямбды.
|
||
// Например, если переименовывается x, то
|
||
// в записи t := y->begin var x := '4'; Result := x*2 end;
|
||
// и в записи t := x->x;
|
||
// все x будут переименованы. Но это нестрашно, хотя неэффективно
|
||
|
||
public override void visit(ident id)
|
||
{
|
||
if (id.name != _oldName)
|
||
{
|
||
return;
|
||
}
|
||
|
||
//var upperNode = UpperNode();
|
||
//if (
|
||
// upperNode != null /*&& (upperNode as dot_node) == null*/) // Я не знаю, зачем вообще было второе условие. Видимо, это всё надо убрать SSM
|
||
//{
|
||
//Replace(id, _newName);
|
||
// заменяются только строки, а сами идентификаторы как объекты не меняются!
|
||
id.name = _newName;
|
||
//}
|
||
}
|
||
|
||
// SSM 29/04/17 - В записи x.x обходится (и заменяется если надо) только первое x
|
||
// Важно что в записи x.x.y всё разбивается на части так: x.x и y
|
||
public override void visit(dot_node dn)
|
||
{
|
||
ProcessNode(dn.left);
|
||
if (dn.right.GetType() != typeof(ident))
|
||
ProcessNode(dn.right);
|
||
}
|
||
}
|
||
}
|