2017-02-19 16:29:24 +03:00
|
|
|
|
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
|
|
|
|
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
|
|
|
|
|
using System;
|
2016-07-18 13:07:08 +03:00
|
|
|
|
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;
|
2016-07-18 13:07:08 +03:00
|
|
|
|
|
|
|
|
|
|
public ReplaceVariableNameVisitor(ident oldName, ident newName)
|
|
|
|
|
|
{
|
2017-05-01 17:08:26 +03:00
|
|
|
|
_oldName = oldName.name;
|
|
|
|
|
|
_newName = newName.name;
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-05-01 17:08:26 +03:00
|
|
|
|
// Этот алгоритм маломощный и меняет всё внутри лямбды.
|
|
|
|
|
|
// Например, если переименовывается x, то
|
|
|
|
|
|
// в записи t := y->begin var x := '4'; Result := x*2 end;
|
|
|
|
|
|
// и в записи t := x->x;
|
|
|
|
|
|
// все x будут переименованы. Но это нестрашно, хотя неэффективно
|
|
|
|
|
|
|
2016-07-18 13:07:08 +03:00
|
|
|
|
public override void visit(ident id)
|
|
|
|
|
|
{
|
2017-05-01 17:08:26 +03:00
|
|
|
|
if (id.name != _oldName)
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
|
|
|
|
|
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;
|
|
|
|
|
|
//}
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-05-01 17:08:26 +03:00
|
|
|
|
// SSM 29/04/17 - В записи x.x обходится (и заменяется если надо) только первое x
|
|
|
|
|
|
// Важно что в записи x.x.y всё разбивается на части так: x.x и y
|
2016-07-18 13:07:08 +03:00
|
|
|
|
public override void visit(dot_node dn)
|
|
|
|
|
|
{
|
|
|
|
|
|
ProcessNode(dn.left);
|
|
|
|
|
|
if (dn.right.GetType() != typeof(ident))
|
|
|
|
|
|
ProcessNode(dn.right);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|