pascalabcnet/SyntaxVisitors/YieldVisitors/ReplaceVariableNameVisitor.cs

58 lines
2.2 KiB
C#
Raw Permalink Normal View History

// 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
{
2017-05-01 17:08:26 +03:00
private string _oldName;
private string _newName;
public ReplaceVariableNameVisitor(ident oldName, ident newName)
{
2017-05-01 17:08:26 +03:00
_oldName = oldName.name;
_newName = newName.name;
}
2017-05-01 17:08:26 +03:00
// Этот алгоритм маломощный и меняет всё внутри лямбды.
// Например, если переименовывается x, то
// в записи t := y->begin var x := '4'; Result := x*2 end;
// и в записи t := x->x;
// все x будут переименованы. Но это нестрашно, хотя неэффективно
public override void visit(ident id)
{
2017-05-01 17:08:26 +03:00
if (id.name != _oldName)
{
return;
}
2017-05-01 17:08:26 +03:00
//var upperNode = UpperNode();
//if (
// upperNode != null /*&& (upperNode as dot_node) == null*/) // Я не знаю, зачем вообще было второе условие. Видимо, это всё надо убрать SSM
//{
2017-02-18 00:19:27 +03:00
//Replace(id, _newName);
// заменяются только строки, а сами идентификаторы как объекты не меняются!
2017-05-01 17:08:26 +03:00
id.name = _newName;
//}
}
2017-05-01 17:08:26 +03:00
// 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);
}
}
}