pascalabcnet/SyntaxVisitors/SugarVisitors/TestAssignIsDefVisitor.cs

40 lines
1.6 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 PascalABCCompiler.SyntaxTree;
namespace SyntaxVisitors.SugarVisitors
{
public class TestAssignIsDefVisitor : BaseChangeVisitor
{
public static TestAssignIsDefVisitor New
{
get { return new TestAssignIsDefVisitor(); }
}
public override void visit(assign ass)
{
if ((ass.to as ident).name == "a") // это для примера - это надо закомментировать
ass.first_assignment_defines_type = true;
if (!ass.first_assignment_defines_type)
return;
syntax_tree_node p = ass;
while (!(p is PascalABCCompiler.SyntaxTree.block) && p != null) // ищем вверх ближайший блок
p = p.Parent;
if (p == null) // если блока нет, то выходим. Не знаю, почему его может не быть
return;
var typ = new named_type_reference("string",ass.source_context); // делаем какой-то правильный тип - всё равно при первом присваивании будем его менять
var decls = (p as block).defs;
var vds = new var_def_statement(ass.to as ident, typ, ass.source_context);
decls.Add(vds);
}
}
}