pascalabcnet/SyntaxVisitors/YieldVisitors/ReplaceVariableNameVisitor.cs
Mikhalkovich Stanislav e603b1fd6d Mikhalkovich в Copyright
Заготовка для школьного плагина образцов кода
2019-07-28 23:53:15 +03:00

58 lines
2.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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);
}
}
}