2019-07-28 23:53:15 +03:00
|
|
|
|
// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
|
2017-02-19 16:29:24 +03:00
|
|
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
2026-03-08 18:30:33 +03:00
|
|
|
|
using PascalABCCompiler.CoreUtils;
|
2016-07-18 13:07:08 +03:00
|
|
|
|
using PascalABCCompiler.SyntaxTree;
|
|
|
|
|
|
|
|
|
|
|
|
namespace SyntaxVisitors
|
|
|
|
|
|
{
|
2016-07-19 21:16:08 +03:00
|
|
|
|
public class ReplaceYieldExprByVarVisitor : BaseChangeVisitor
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
2026-03-08 18:30:33 +03:00
|
|
|
|
private readonly GeneratedNamesManager generatedNamesManager;
|
2016-07-18 13:07:08 +03:00
|
|
|
|
|
2026-03-08 18:30:33 +03:00
|
|
|
|
private ReplaceYieldExprByVarVisitor(GeneratedNamesManager generatedNamesManager)
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
2026-03-08 18:30:33 +03:00
|
|
|
|
this.generatedNamesManager = generatedNamesManager;
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-08 18:30:33 +03:00
|
|
|
|
private ident NewVarName()
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
2026-03-08 18:30:33 +03:00
|
|
|
|
return new ident(generatedNamesManager.GenerateName("$yieldExprVar$"));
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-08 18:30:33 +03:00
|
|
|
|
public static ReplaceYieldExprByVarVisitor Create(GeneratedNamesManager generatedNamesManager) => new ReplaceYieldExprByVarVisitor(generatedNamesManager);
|
|
|
|
|
|
|
|
|
|
|
|
public static void Accept(procedure_definition pd, GeneratedNamesManager generatedNamesManager)
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
2026-03-08 18:30:33 +03:00
|
|
|
|
Create(generatedNamesManager).ProcessNode(pd);
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2016-07-19 21:16:08 +03:00
|
|
|
|
public override void visit(yield_node yn)
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
2016-07-19 21:16:08 +03:00
|
|
|
|
var VarIdent = this.NewVarName();
|
|
|
|
|
|
VarIdent.source_context = yn.ex.source_context;
|
2016-07-22 13:00:58 +03:00
|
|
|
|
var_statement vs;
|
|
|
|
|
|
if (yn.ex is nil_const)
|
2017-07-16 13:44:30 +03:00
|
|
|
|
vs = new var_statement(VarIdent, new named_type_reference("$yield_element_type"), yn.ex);
|
2016-07-22 13:00:58 +03:00
|
|
|
|
else
|
|
|
|
|
|
vs = new var_statement(VarIdent, yn.ex);
|
|
|
|
|
|
vs.source_context = yn.ex.source_context;
|
|
|
|
|
|
ReplaceStatement(yn, SeqStatements(vs, new yield_node(VarIdent, yn.ex.source_context)));
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
2016-07-22 13:00:58 +03:00
|
|
|
|
|
2016-07-19 21:16:08 +03:00
|
|
|
|
public override void visit(yield_sequence_node yn)
|
2016-07-18 13:07:08 +03:00
|
|
|
|
{
|
2016-07-19 21:16:08 +03:00
|
|
|
|
var VarIdent = this.NewVarName();
|
|
|
|
|
|
VarIdent.source_context = yn.ex.source_context;
|
2016-07-22 13:00:58 +03:00
|
|
|
|
|
|
|
|
|
|
var_statement vs;
|
|
|
|
|
|
if (yn.ex is nil_const)
|
2016-07-22 13:49:33 +03:00
|
|
|
|
vs = new var_statement(VarIdent, new named_type_reference("System.Object"), yn.ex); // bug fix #246
|
2016-07-22 13:00:58 +03:00
|
|
|
|
else
|
|
|
|
|
|
vs = new var_statement(VarIdent, yn.ex);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//var_statement VS = new var_statement(VarIdent, yn.ex) { source_context = yn.ex.source_context };
|
|
|
|
|
|
ReplaceStatement(yn, SeqStatements(vs, new yield_sequence_node(VarIdent, yn.ex.source_context)));
|
2016-07-18 13:07:08 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|