40 lines
1.6 KiB
C#
40 lines
1.6 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 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);
|
||
}
|
||
}
|
||
}
|