Мелкие исправления yield
This commit is contained in:
parent
ac66a64784
commit
40ad330bf7
|
|
@ -15,7 +15,7 @@ internal static class RevisionClass
|
|||
public const string Major = "3";
|
||||
public const string Minor = "1";
|
||||
public const string Build = "0";
|
||||
public const string Revision = "1266";
|
||||
public const string Revision = "1269";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=1
|
||||
%REVISION%=1266
|
||||
%COREVERSION%=0
|
||||
%REVISION%=1269
|
||||
%MINOR%=1
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -958,8 +958,8 @@
|
|||
<FileName>\yield\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs</FileName>
|
||||
<Text>public ConstructFiniteAutomata1(block bl)</Text>
|
||||
<OCtx>
|
||||
<i Type="Method">public ConstructFiniteAutomata1 ( block bl )</i>
|
||||
<i Type="ClassOrNamespace">class ConstructFiniteAutomata1</i>
|
||||
<i Type="Method">public ConstructFiniteAutomata ( block bl )</i>
|
||||
<i Type="ClassOrNamespace">class ConstructFiniteAutomata</i>
|
||||
<i Type="ClassOrNamespace">namespace SyntaxVisitors</i>
|
||||
<i Type="CS_TreeNode">
|
||||
</i>
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.1.0.1266'
|
||||
!define VERSION '3.1.0.1269'
|
||||
|
|
|
|||
|
|
@ -1092,11 +1092,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
{
|
||||
DefaultVisit(_yield_unknown_foreach_type);
|
||||
}
|
||||
|
||||
public virtual void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
DefaultVisit(_yield_unknown_foreach_type_ident);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1741,14 +1741,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
{
|
||||
}
|
||||
|
||||
public virtual void pre_do_visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void post_do_visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
}
|
||||
|
||||
public override void visit(syntax_tree_node _syntax_tree_node)
|
||||
{
|
||||
DefaultVisit(_syntax_tree_node);
|
||||
|
|
@ -3608,13 +3600,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
pre_do_visit(_yield_unknown_foreach_type);
|
||||
post_do_visit(_yield_unknown_foreach_type);
|
||||
}
|
||||
|
||||
public override void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
DefaultVisit(_yield_unknown_foreach_type_ident);
|
||||
pre_do_visit(_yield_unknown_foreach_type_ident);
|
||||
post_do_visit(_yield_unknown_foreach_type_ident);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -454,8 +454,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
return new yield_variable_definitions_with_unknown_type();
|
||||
case 216:
|
||||
return new yield_unknown_foreach_type();
|
||||
case 217:
|
||||
return new yield_unknown_foreach_type_ident();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
@ -3834,17 +3832,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
read_type_definition(_yield_unknown_foreach_type);
|
||||
}
|
||||
|
||||
|
||||
public void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
read_yield_unknown_foreach_type_ident(_yield_unknown_foreach_type_ident);
|
||||
}
|
||||
|
||||
public void read_yield_unknown_foreach_type_ident(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
read_ident(_yield_unknown_foreach_type_ident);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6000,18 +6000,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
write_type_definition(_yield_unknown_foreach_type);
|
||||
}
|
||||
|
||||
|
||||
public void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
bw.Write((Int16)217);
|
||||
write_yield_unknown_foreach_type_ident(_yield_unknown_foreach_type_ident);
|
||||
}
|
||||
|
||||
public void write_yield_unknown_foreach_type_ident(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident)
|
||||
{
|
||||
write_ident(_yield_unknown_foreach_type_ident);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -32020,89 +32020,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
}
|
||||
|
||||
|
||||
///<summary>
|
||||
///Узел для приведения типа enumerator.Current к типу переменной цикла foreach
|
||||
///</summary>
|
||||
[Serializable]
|
||||
public partial class yield_unknown_foreach_type_ident : ident
|
||||
{
|
||||
|
||||
///<summary>
|
||||
///Конструктор без параметров.
|
||||
///</summary>
|
||||
public yield_unknown_foreach_type_ident()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
///<summary>
|
||||
///Конструктор с параметрами.
|
||||
///</summary>
|
||||
public yield_unknown_foreach_type_ident(string _name)
|
||||
{
|
||||
this._name=_name;
|
||||
}
|
||||
|
||||
///<summary>
|
||||
///Конструктор с параметрами.
|
||||
///</summary>
|
||||
public yield_unknown_foreach_type_ident(string _name,SourceContext sc)
|
||||
{
|
||||
this._name=_name;
|
||||
source_context = sc;
|
||||
}
|
||||
|
||||
///<summary>
|
||||
///Свойство для получения количества всех подузлов без элементов поля типа List
|
||||
///</summary>
|
||||
public override Int32 subnodes_without_list_elements_count
|
||||
{
|
||||
get
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
///<summary>
|
||||
///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List
|
||||
///</summary>
|
||||
public override Int32 subnodes_count
|
||||
{
|
||||
get
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
///<summary>
|
||||
///Индексатор для получения всех подузлов
|
||||
///</summary>
|
||||
public override syntax_tree_node this[Int32 ind]
|
||||
{
|
||||
get
|
||||
{
|
||||
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
|
||||
throw new IndexOutOfRangeException();
|
||||
return null;
|
||||
}
|
||||
set
|
||||
{
|
||||
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
|
||||
throw new IndexOutOfRangeException();
|
||||
}
|
||||
}
|
||||
///<summary>
|
||||
///Метод для обхода дерева посетителем
|
||||
///</summary>
|
||||
///<param name="visitor">Объект-посетитель.</param>
|
||||
///<returns>Return value is void</returns>
|
||||
public override void visit(IVisitor visitor)
|
||||
{
|
||||
visitor.visit(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1404,19 +1404,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
|
||||
}
|
||||
|
||||
// frninja 12/05/16 - хелпер для yield. Хранит типы локальных переменных метода-итератора
|
||||
[Serializable]
|
||||
public class yield_locals_type_map_helper
|
||||
{
|
||||
public Dictionary<var_def_statement, semantic_type_node> vars_type_map { get; private set; }
|
||||
|
||||
public yield_locals_type_map_helper()
|
||||
{
|
||||
vars_type_map = new Dictionary<var_def_statement, semantic_type_node>();
|
||||
}
|
||||
}
|
||||
// end frninja
|
||||
|
||||
// frninja 12/05/16 - хелперы для yield
|
||||
public partial class yield_unknown_expression_type : type_definition
|
||||
{
|
||||
|
|
@ -1428,56 +1415,24 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
set { _Vds = value; }
|
||||
}
|
||||
|
||||
public yield_locals_type_map_helper MapHelper { get; private set; }
|
||||
|
||||
public yield_unknown_expression_type(var_def_statement vds, yield_locals_type_map_helper map_helper)
|
||||
public yield_unknown_expression_type(var_def_statement vds)
|
||||
{
|
||||
this.Vds = vds;
|
||||
this.MapHelper = map_helper;
|
||||
}
|
||||
}
|
||||
|
||||
public partial class yield_var_def_statement_with_unknown_type : statement
|
||||
{
|
||||
public yield_locals_type_map_helper map_helper { get; private set; }
|
||||
|
||||
public yield_var_def_statement_with_unknown_type(var_def_statement vds, yield_locals_type_map_helper map_helper)
|
||||
{
|
||||
this.vars = vds;
|
||||
this.map_helper = map_helper;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var sb = new System.Text.StringBuilder();
|
||||
sb.Append(vars.ToString());
|
||||
|
||||
/*if (vars_type != null)
|
||||
{
|
||||
sb.Append(": ");
|
||||
sb.Append(vars_type.ToString());
|
||||
}
|
||||
if (inital_value != null)
|
||||
{
|
||||
sb.Append(" := ");
|
||||
sb.Append(inital_value.ToString());
|
||||
}*/
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public partial class yield_variable_definitions_with_unknown_type : declaration
|
||||
{
|
||||
public yield_locals_type_map_helper map_helper { get; private set; }
|
||||
|
||||
public yield_variable_definitions_with_unknown_type(variable_definitions vd, yield_locals_type_map_helper map_helper)
|
||||
{
|
||||
this.vars = vd;
|
||||
this.map_helper = map_helper;
|
||||
}
|
||||
}
|
||||
|
||||
public partial class yield_unknown_ident : ident
|
||||
{
|
||||
protected ident _UnknownID;
|
||||
|
|
|
|||
|
|
@ -1306,12 +1306,6 @@ namespace PascalABCCompiler.SyntaxTree
|
|||
///<param name="_yield_unknown_foreach_type">Node to visit</param>
|
||||
///<returns> Return value is void </returns>
|
||||
void visit(yield_unknown_foreach_type _yield_unknown_foreach_type);
|
||||
///<summary>
|
||||
///Method to visit yield_unknown_foreach_type_ident.
|
||||
///</summary>
|
||||
///<param name="_yield_unknown_foreach_type_ident">Node to visit</param>
|
||||
///<returns> Return value is void </returns>
|
||||
void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1698,6 +1698,8 @@ var
|
|||
ExitCode := 0; // TODO Сделать возврат в Main
|
||||
///--
|
||||
DefaultEncoding: Encoding;
|
||||
///--
|
||||
PrintDelimDefault: string := ' ';
|
||||
|
||||
///--
|
||||
var
|
||||
|
|
@ -7939,7 +7941,7 @@ end;
|
|||
/// Выводит последовательность на экран, используя пробел в качестве разделителя
|
||||
function Print<T>(Self: sequence of T): sequence of T; extensionmethod;
|
||||
begin
|
||||
Result := Self.Print(' ');
|
||||
Result := Self.Print(PrintDelimDefault);
|
||||
end;
|
||||
|
||||
/// Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку
|
||||
|
|
@ -7953,7 +7955,7 @@ end;
|
|||
/// Выводит последовательность на экран, используя пробел качестве разделителя, и переходит на новую строку
|
||||
function Println<T>(Self: sequence of T): sequence of T; extensionmethod;
|
||||
begin
|
||||
Result := Self.Println(' ');
|
||||
Result := Self.Println(PrintDelimDefault);
|
||||
end;
|
||||
|
||||
/// Выводит последовательность строк в файл
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// Модуль электронного задачника Programming Taskbook 4
|
||||
/// Модуль электронного задачника Programming Taskbook 4
|
||||
unit PT4;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -1255,6 +1255,7 @@ var __initialized := false;
|
|||
procedure __InitModule;
|
||||
begin
|
||||
CurrentIOSystem := new IOPT4System;
|
||||
PrintDelimDefault := '';
|
||||
loadNodes := new ArrayList;
|
||||
ExecuteBeforeProcessTerminateIn__Mode += PT4_ExecuteBeforeProcessTerminateIn__Mode;
|
||||
StartPT(512);
|
||||
|
|
|
|||
|
|
@ -4669,15 +4669,6 @@ namespace PascalABCCompiler.TreeConverter
|
|||
}
|
||||
// end frninja
|
||||
|
||||
// frninja 29/05/16 - для приведения типов в lowered foreach
|
||||
if (_method_call.dereferencing_value is yield_unknown_foreach_type_ident)
|
||||
{
|
||||
var nodeToVisit = new method_call(GetForeachVariableTypeName((_method_call.dereferencing_value as yield_unknown_foreach_type_ident).unknown_foreach), _method_call.parameters);
|
||||
visit(nodeToVisit);
|
||||
return;
|
||||
}
|
||||
// end frninja
|
||||
|
||||
//lroman
|
||||
if (_method_call.dereferencing_value is closure_substituting_node)
|
||||
{
|
||||
|
|
@ -15770,8 +15761,6 @@ namespace PascalABCCompiler.TreeConverter
|
|||
else AddError(to.location, "Не могу вывести тип при наличии yield: "+ to.type.full_name);
|
||||
//to.type = from.type; // и без всякого real_type!
|
||||
}
|
||||
//else if (to.type is compiled_type_node)
|
||||
//else if (to.type.name.StartsWith("IEnumerable<IEnumerableAutoType>")) // Сделать не сравнением строк!!!
|
||||
else if (to.type is compiled_generic_instance_type_node && (to.type as compiled_generic_instance_type_node).instance_params[0] is ienumerable_auto_type)
|
||||
{
|
||||
var tt = to.type;
|
||||
|
|
@ -19127,7 +19116,6 @@ namespace PascalABCCompiler.TreeConverter
|
|||
{
|
||||
// Отвечает за типизацию всех переменных с автовыведением типа
|
||||
// Пробую сделать по-другому: перевести в auto_type и потом на присваивании перехватить
|
||||
// _unk_expr.MapHelper.vars_type_map[_unk_expr.Vds].visit(this);
|
||||
var t = new semantic_type_node(new auto_type(get_location(_unk_expr)));
|
||||
t.visit(this);
|
||||
}
|
||||
|
|
@ -19135,90 +19123,22 @@ namespace PascalABCCompiler.TreeConverter
|
|||
// frninja - заполнение хелпера типов локальных переменных для yield
|
||||
public override void visit(SyntaxTree.yield_var_def_statement_with_unknown_type _vars)
|
||||
{
|
||||
/*if ((object)_vars.vars.vars_type != null)
|
||||
{
|
||||
// Visit stored vars
|
||||
_vars.vars.visit(this);
|
||||
return;
|
||||
}
|
||||
var t = convert_strong(_vars.vars.inital_value);
|
||||
_vars.map_helper.vars_type_map[_vars.vars] = new SyntaxTree.semantic_type_node(t.type);
|
||||
|
||||
*/
|
||||
// Visit stored vars
|
||||
_vars.vars.visit(this);
|
||||
}
|
||||
|
||||
// frninja - заполнение хелпера типов локальных переменных для yield// frninja - заполнение хелпера типов локальных переменных для yield
|
||||
// frninja - заполнение хелпера типов локальных переменных для yield
|
||||
public override void visit(SyntaxTree.yield_variable_definitions_with_unknown_type _vars)
|
||||
{
|
||||
/*foreach (var vd in _vars.vars.list)
|
||||
{
|
||||
if ((object)vd.vars_type != null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var t = convert_strong(vd.inital_value);
|
||||
_vars.map_helper.vars_type_map[vd] = new SyntaxTree.semantic_type_node(t.type);
|
||||
}*/
|
||||
|
||||
// Visit stored vars
|
||||
_vars.vars.visit(this);
|
||||
}
|
||||
|
||||
private Dictionary<Guid, semantic_type_node> _yieldForeachTypeMap = new Dictionary<Guid, semantic_type_node>();
|
||||
|
||||
// frninja 29/05/16 - выявляем тип перемнной в foreach
|
||||
public override void visit(SyntaxTree.yield_unknown_foreach_type _unk)
|
||||
{
|
||||
|
||||
/*var _foreach_stmt = _unk.unknown_foreach;
|
||||
|
||||
semantic_type_node t;
|
||||
|
||||
if (_yieldForeachTypeMap.ContainsKey(_foreach_stmt.Guid))
|
||||
{
|
||||
t = _yieldForeachTypeMap[_foreach_stmt.Guid];
|
||||
}
|
||||
else
|
||||
{
|
||||
expression_node in_what = convert_strong(_foreach_stmt.in_what);
|
||||
type_node elem_type = null;
|
||||
if (!FindIEnumerableElementType(_foreach_stmt, in_what.type, ref elem_type))
|
||||
{
|
||||
AddError(in_what.location, "CAN_NOT_EXECUTE_FOREACH_BY_EXPR_OF_TYPE_{0}", in_what.type.name);
|
||||
}
|
||||
t = new SyntaxTree.semantic_type_node(elem_type);
|
||||
// Add to map
|
||||
_yieldForeachTypeMap.Add(_foreach_stmt.Guid, t);
|
||||
}*/
|
||||
// Visit type
|
||||
|
||||
var t = new semantic_type_node(new ienumerable_auto_type(get_location(_unk)));
|
||||
t.visit(this);
|
||||
}
|
||||
|
||||
private ident GetForeachVariableTypeName(foreach_stmt _foreach_stmt)
|
||||
{
|
||||
type_node tn = null;
|
||||
|
||||
if (_yieldForeachTypeMap.ContainsKey(_foreach_stmt.Guid))
|
||||
{
|
||||
tn = _yieldForeachTypeMap[_foreach_stmt.Guid].type as type_node;
|
||||
}
|
||||
return new SyntaxTree.ident(tn.name);
|
||||
}
|
||||
|
||||
// frninja 29/05/16 - получаем имя типа переменной в foreach
|
||||
public override void visit(SyntaxTree.yield_unknown_foreach_type_ident _unk)
|
||||
{
|
||||
var t = this.GetForeachVariableTypeName(_unk.unknown_foreach);
|
||||
// Visit type
|
||||
t.visit(this);
|
||||
}
|
||||
|
||||
// end frninja
|
||||
|
||||
/*public SyntaxTree.question_colon_expression ConvertToQCE(dot_question_node dqn)
|
||||
{
|
||||
// Неверно работает. Пока не используется. Доделать
|
||||
|
|
|
|||
|
|
@ -345,7 +345,7 @@ namespace PascalABCCompiler.TreeRealization
|
|||
|
||||
if (shouldAddToAllTypeInstances) //lroman// Если зашли сюда при выведении типов параметров лямбды, то тип инстанцироваться может с типом lambda_any_type_node. Поэтому, если выводим типы. То данную инстанцию не добавляем
|
||||
{
|
||||
if (instance.instance_params[0] is ienumerable_auto_type)
|
||||
if (instance.instance_params[0] is ienumerable_auto_type) // SSM 10.07.16 (yields) в эту таблицу не включаются типы IEnumerable<ienumerable_auto_type>, т.к. потом они всё равно автовыводятся
|
||||
{
|
||||
//instance = instance;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,11 +16,8 @@ namespace SyntaxVisitors
|
|||
|
||||
public List<var_def_statement> LocalDeletedVS = new List<var_def_statement>(); // var_statement's, потом объединим с LocalDeletedVD для верного порядка
|
||||
|
||||
public yield_locals_type_map_helper VarTypeMap { get; private set; }
|
||||
|
||||
public LocalVariablesTypeDetectorHelperVisior(yield_locals_type_map_helper varTypeMap)
|
||||
public LocalVariablesTypeDetectorHelperVisior()
|
||||
{
|
||||
this.VarTypeMap = varTypeMap;
|
||||
}
|
||||
|
||||
public override void visit(yield_variable_definitions_with_unknown_type yvds)
|
||||
|
|
@ -33,7 +30,7 @@ namespace SyntaxVisitors
|
|||
|
||||
LocalDeletedVS.Insert(0, vs.var_def);
|
||||
|
||||
ReplaceStatement(vs, new yield_var_def_statement_with_unknown_type(vs.var_def, this.VarTypeMap));
|
||||
ReplaceStatement(vs, new yield_var_def_statement_with_unknown_type(vs.var_def));
|
||||
}
|
||||
|
||||
public override void visit(variable_definitions vd)
|
||||
|
|
@ -43,7 +40,7 @@ namespace SyntaxVisitors
|
|||
LocalDeletedDefs.Insert(0, v);
|
||||
}
|
||||
|
||||
Replace(vd, new yield_variable_definitions_with_unknown_type(vd, VarTypeMap));
|
||||
Replace(vd, new yield_variable_definitions_with_unknown_type(vd));
|
||||
|
||||
// еще - не заходить в лямбды
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,11 +80,6 @@ namespace SyntaxVisitors
|
|||
// DO NOTHING
|
||||
}
|
||||
|
||||
public override void visit(yield_unknown_foreach_type_ident _unk)
|
||||
{
|
||||
// DO NOTHING
|
||||
}
|
||||
|
||||
// frninja 21/05/16
|
||||
public override void visit(foreach_stmt frch)
|
||||
{
|
||||
|
|
@ -101,7 +96,8 @@ namespace SyntaxVisitors
|
|||
|
||||
// var a: System.Collections.Generic.IEnumerable<yield_unknown_foreach_type> := l;
|
||||
var foreachCollIdent = this.NewForeachCollectionName();
|
||||
var foreachCollType = new template_type_reference(new named_type_reference("System.Collections.Generic.IEnumerable"), new template_param_list(new yield_unknown_foreach_type(frch)));
|
||||
var foreachCollType = new template_type_reference(new named_type_reference("System.Collections.Generic.IEnumerable"),
|
||||
new template_param_list(new yield_unknown_foreach_type(frch)));
|
||||
var foreachCollVarDef = new var_statement(foreachCollIdent, foreachCollType);
|
||||
|
||||
var ass = new assign(foreachCollIdent, frch.in_what);
|
||||
|
|
@ -164,20 +160,13 @@ namespace SyntaxVisitors
|
|||
|
||||
// Добавляем тело цикла в stl
|
||||
var stl = new statement_list(st);
|
||||
ProcessNode(frch.stmt); //?? - видимо, для обработки вложенных конструкций
|
||||
ProcessNode(frch.stmt); // для обработки вложенных конструкций
|
||||
stl.Add(frch.stmt);
|
||||
|
||||
var whileNode = new while_node(new method_call(new dot_node(enumeratorIdent, "MoveNext"), new expression_list()),
|
||||
stl,
|
||||
WhileCycleType.While);
|
||||
|
||||
/*ReplaceStatement(frch,
|
||||
SeqStatements(new var_statement(enumeratorIdent,
|
||||
new named_type_reference("System.Collections.IEnumerator"),
|
||||
// НЕБЕЗОПАСНО!
|
||||
new method_call(new dot_node(frch.in_what as addressed_value, new ident("GetEnumerator")), new expression_list())),
|
||||
whileNode));
|
||||
*/
|
||||
ReplaceStatement(frch,
|
||||
SeqStatements(foreachCollVarDef, ass, enumeratorVarDef, whileNode)
|
||||
);
|
||||
|
|
|
|||
|
|
@ -82,8 +82,8 @@ namespace SyntaxVisitors
|
|||
IEnumerable<var_def_statement> fields, // локальные переменные
|
||||
IDictionary<string, string> localsMap, // отображение для захваченных имен локальных переменных
|
||||
IDictionary<string, string> formalParamsMap, // отображение для захваченных имен формальных параметров
|
||||
IDictionary<var_def_statement, var_def_statement> localsCloneMap, // отображение для оберток локальных переменных
|
||||
yield_locals_type_map_helper localTypeMapHelper) // вспомогательный узел для типов локальных переменных
|
||||
IDictionary<var_def_statement, var_def_statement> localsCloneMap // отображение для оберток локальных переменных
|
||||
)
|
||||
{
|
||||
var fh = (pd.proc_header as function_header);
|
||||
if (fh == null)
|
||||
|
|
@ -104,7 +104,7 @@ namespace SyntaxVisitors
|
|||
if (vds.inital_value != null)
|
||||
{
|
||||
//return new var_def_statement(ids, new yield_unknown_expression_type(localsCloneMap[vds], varsTypeDetectorHelper), null);
|
||||
return new var_def_statement(ids, new yield_unknown_expression_type(localsCloneMap[vds], localTypeMapHelper), null);
|
||||
return new var_def_statement(ids, new yield_unknown_expression_type(localsCloneMap[vds]), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -606,7 +606,7 @@ namespace SyntaxVisitors
|
|||
/// </summary>
|
||||
/// <param className="pd">Объявление метода</param>
|
||||
/// <returns>Коллекция посещенных локальных переменных</returns>
|
||||
private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable<var_def_statement> localsClonesCollection, out yield_locals_type_map_helper localsTypeMapHelper)
|
||||
private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable<var_def_statement> localsClonesCollection)
|
||||
{
|
||||
// Выполняем определение типов локальных переменных с автовыводом типов
|
||||
|
||||
|
|
@ -616,8 +616,7 @@ namespace SyntaxVisitors
|
|||
pdCloned.has_yield = false;
|
||||
|
||||
// Заменяем локальные переменные с неизвестным типом на обертки-хелперы (откладываем до семантики)
|
||||
localsTypeMapHelper = new yield_locals_type_map_helper();
|
||||
LocalVariablesTypeDetectorHelperVisior localsTypeDetectorHelperVisitor = new LocalVariablesTypeDetectorHelperVisior(localsTypeMapHelper);
|
||||
LocalVariablesTypeDetectorHelperVisior localsTypeDetectorHelperVisitor = new LocalVariablesTypeDetectorHelperVisior();
|
||||
pdCloned.visit(localsTypeDetectorHelperVisitor);
|
||||
|
||||
// frninja 16/03/16 - строим список локальных переменных в правильном порядке
|
||||
|
|
@ -927,9 +926,8 @@ namespace SyntaxVisitors
|
|||
pd.visit(deleteBeginEndVisitor);
|
||||
|
||||
// Обработка метода для корректного захвата локальных переменных и их типов
|
||||
yield_locals_type_map_helper localsTypeMapHelper;
|
||||
IEnumerable<var_def_statement> localsClonesCollection;
|
||||
CreateLocalVariablesTypeProxies(pd, out localsClonesCollection, out localsTypeMapHelper);
|
||||
CreateLocalVariablesTypeProxies(pd, out localsClonesCollection);
|
||||
|
||||
|
||||
// frninja 16/11/15: перенес ниже чтобы работал захват для lowered for
|
||||
|
|
@ -960,7 +958,7 @@ namespace SyntaxVisitors
|
|||
(pd.proc_body as block).program_code = cfa.res;
|
||||
|
||||
// Конструируем определение класса
|
||||
var cct = GenClassesForYield(pd, dld.LocalDeletedDefs, CapturedLocalsNamesMap, CapturedFormalParamsNamesMap, localsCloneMap, localsTypeMapHelper); // все удаленные описания переменных делаем описанием класса
|
||||
var cct = GenClassesForYield(pd, dld.LocalDeletedDefs, CapturedLocalsNamesMap, CapturedFormalParamsNamesMap, localsCloneMap); // все удаленные описания переменных делаем описанием класса
|
||||
|
||||
// Вставляем классы-хелперы
|
||||
InsertYieldHelpers(pd, cct);
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1698,6 +1698,8 @@ var
|
|||
ExitCode := 0; // TODO Сделать возврат в Main
|
||||
///--
|
||||
DefaultEncoding: Encoding;
|
||||
///--
|
||||
PrintDelimDefault: string := ' ';
|
||||
|
||||
///--
|
||||
var
|
||||
|
|
@ -7939,7 +7941,7 @@ end;
|
|||
/// Выводит последовательность на экран, используя пробел в качестве разделителя
|
||||
function Print<T>(Self: sequence of T): sequence of T; extensionmethod;
|
||||
begin
|
||||
Result := Self.Print(' ');
|
||||
Result := Self.Print(PrintDelimDefault);
|
||||
end;
|
||||
|
||||
/// Выводит последовательность на экран, используя delim в качестве разделителя, и переходит на новую строку
|
||||
|
|
@ -7953,7 +7955,7 @@ end;
|
|||
/// Выводит последовательность на экран, используя пробел качестве разделителя, и переходит на новую строку
|
||||
function Println<T>(Self: sequence of T): sequence of T; extensionmethod;
|
||||
begin
|
||||
Result := Self.Println(' ');
|
||||
Result := Self.Println(PrintDelimDefault);
|
||||
end;
|
||||
|
||||
/// Выводит последовательность строк в файл
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/// Модуль электронного задачника Programming Taskbook 4
|
||||
/// Модуль электронного задачника Programming Taskbook 4
|
||||
unit PT4;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
|
@ -1255,6 +1255,7 @@ var __initialized := false;
|
|||
procedure __InitModule;
|
||||
begin
|
||||
CurrentIOSystem := new IOPT4System;
|
||||
PrintDelimDefault := '';
|
||||
loadNodes := new ArrayList;
|
||||
ExecuteBeforeProcessTerminateIn__Mode += PT4_ExecuteBeforeProcessTerminateIn__Mode;
|
||||
StartPT(512);
|
||||
|
|
|
|||
Loading…
Reference in a new issue