diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index bc18dc8b9..aff13ffd8 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -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; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 69000ff71..7008504df 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=1 -%REVISION%=1266 %COREVERSION%=0 +%REVISION%=1269 +%MINOR%=1 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index 350e2b5da..208219497 100644 Binary files a/Localization/DefaultLang.resources and b/Localization/DefaultLang.resources differ diff --git a/PascalABCNET.axml b/PascalABCNET.axml index fa9a5843d..7900a9550 100644 --- a/PascalABCNET.axml +++ b/PascalABCNET.axml @@ -958,8 +958,8 @@ \yield\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs public ConstructFiniteAutomata1(block bl) - public ConstructFiniteAutomata1 ( block bl ) - class ConstructFiniteAutomata1 + public ConstructFiniteAutomata ( block bl ) + class ConstructFiniteAutomata namespace SyntaxVisitors diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 6f73c4f46..fff479009 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.1.0.1266' +!define VERSION '3.1.0.1269' diff --git a/SyntaxTree/tree/AbstractVisitor.cs b/SyntaxTree/tree/AbstractVisitor.cs index bc50bf3bb..74f225239 100644 --- a/SyntaxTree/tree/AbstractVisitor.cs +++ b/SyntaxTree/tree/AbstractVisitor.cs @@ -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); - } } diff --git a/SyntaxTree/tree/HierarchyVisitor.cs b/SyntaxTree/tree/HierarchyVisitor.cs index 114c95f19..ad0d7a400 100644 --- a/SyntaxTree/tree/HierarchyVisitor.cs +++ b/SyntaxTree/tree/HierarchyVisitor.cs @@ -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); - } } diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs index b6aab7323..c99f2b2af 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs @@ -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); - } - } diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs index 6da79e841..ecb55e5ba 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs @@ -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); - } - } diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs index ec283d662..dfe738421 100644 --- a/SyntaxTree/tree/Tree.cs +++ b/SyntaxTree/tree/Tree.cs @@ -32020,89 +32020,6 @@ namespace PascalABCCompiler.SyntaxTree } - /// - ///Узел для приведения типа enumerator.Current к типу переменной цикла foreach - /// - [Serializable] - public partial class yield_unknown_foreach_type_ident : ident - { - - /// - ///Конструктор без параметров. - /// - public yield_unknown_foreach_type_ident() - { - - } - - - /// - ///Конструктор с параметрами. - /// - public yield_unknown_foreach_type_ident(string _name) - { - this._name=_name; - } - - /// - ///Конструктор с параметрами. - /// - public yield_unknown_foreach_type_ident(string _name,SourceContext sc) - { - this._name=_name; - source_context = sc; - } - - /// - ///Свойство для получения количества всех подузлов без элементов поля типа List - /// - public override Int32 subnodes_without_list_elements_count - { - get - { - return 0; - } - } - /// - ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List - /// - public override Int32 subnodes_count - { - get - { - return 0; - } - } - /// - ///Индексатор для получения всех подузлов - /// - 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(); - } - } - /// - ///Метод для обхода дерева посетителем - /// - ///Объект-посетитель. - ///Return value is void - public override void visit(IVisitor visitor) - { - visitor.visit(this); - } - - } - - } diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs index 4ebff6240..b7e7a8bde 100644 --- a/SyntaxTree/tree/TreeHelper.cs +++ b/SyntaxTree/tree/TreeHelper.cs @@ -1404,19 +1404,6 @@ namespace PascalABCCompiler.SyntaxTree } - // frninja 12/05/16 - хелпер для yield. Хранит типы локальных переменных метода-итератора - [Serializable] - public class yield_locals_type_map_helper - { - public Dictionary vars_type_map { get; private set; } - - public yield_locals_type_map_helper() - { - vars_type_map = new Dictionary(); - } - } - // 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; diff --git a/SyntaxTree/tree/Visitor.cs b/SyntaxTree/tree/Visitor.cs index 241d479bf..8b68ec973 100644 --- a/SyntaxTree/tree/Visitor.cs +++ b/SyntaxTree/tree/Visitor.cs @@ -1306,12 +1306,6 @@ namespace PascalABCCompiler.SyntaxTree ///Node to visit /// Return value is void void visit(yield_unknown_foreach_type _yield_unknown_foreach_type); - /// - ///Method to visit yield_unknown_foreach_type_ident. - /// - ///Node to visit - /// Return value is void - void visit(yield_unknown_foreach_type_ident _yield_unknown_foreach_type_ident); } diff --git a/SyntaxTree/tree/tree.nin b/SyntaxTree/tree/tree.nin index 144717dc5..0061a5f0f 100644 Binary files a/SyntaxTree/tree/tree.nin and b/SyntaxTree/tree/tree.nin differ diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index a727bc7f0..a2f55d87a 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -1698,6 +1698,8 @@ var ExitCode := 0; // TODO Сделать возврат в Main ///-- DefaultEncoding: Encoding; + ///-- + PrintDelimDefault: string := ' '; ///-- var @@ -7939,7 +7941,7 @@ end; /// Выводит последовательность на экран, используя пробел в качестве разделителя function Print(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(Self: sequence of T): sequence of T; extensionmethod; begin - Result := Self.Println(' '); + Result := Self.Println(PrintDelimDefault); end; /// Выводит последовательность строк в файл diff --git a/TestSuite/CompilationSamples/PT4.pas b/TestSuite/CompilationSamples/PT4.pas index 0e18976a9..a3f4148bf 100644 --- a/TestSuite/CompilationSamples/PT4.pas +++ b/TestSuite/CompilationSamples/PT4.pas @@ -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); diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 5dd157c66..eb4a6afe4 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -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")) // Сделать не сравнением строк!!! 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 _yieldForeachTypeMap = new Dictionary(); - // 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) { // Неверно работает. Пока не используется. Доделать diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 3bb4a1835..ae5b2a483 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -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, т.к. потом они всё равно автовыводятся { //instance = instance; } diff --git a/Yield/SyntaxVisitors/YieldVisitors/LocalVariablesTypeDetectorHelperVisior.cs b/Yield/SyntaxVisitors/YieldVisitors/LocalVariablesTypeDetectorHelperVisior.cs index ca077c176..e452cf4c0 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/LocalVariablesTypeDetectorHelperVisior.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/LocalVariablesTypeDetectorHelperVisior.cs @@ -16,11 +16,8 @@ namespace SyntaxVisitors public List LocalDeletedVS = new List(); // 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)); // еще - не заходить в лямбды } diff --git a/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs b/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs index 379afb7e2..4ea176bd1 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/LoweringVisitor.cs @@ -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 := 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) ); diff --git a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs index 3d4c22645..94980b8d1 100644 --- a/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs +++ b/Yield/SyntaxVisitors/YieldVisitors/ProcessYieldsCapturedVars.cs @@ -82,8 +82,8 @@ namespace SyntaxVisitors IEnumerable fields, // локальные переменные IDictionary localsMap, // отображение для захваченных имен локальных переменных IDictionary formalParamsMap, // отображение для захваченных имен формальных параметров - IDictionary localsCloneMap, // отображение для оберток локальных переменных - yield_locals_type_map_helper localTypeMapHelper) // вспомогательный узел для типов локальных переменных + IDictionary 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 /// /// Объявление метода /// Коллекция посещенных локальных переменных - private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable localsClonesCollection, out yield_locals_type_map_helper localsTypeMapHelper) + private void CreateLocalVariablesTypeProxies(procedure_definition pd, out IEnumerable 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 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); diff --git a/bin/Lib/PABCRtl.dll b/bin/Lib/PABCRtl.dll index 1380f8427..a1c705591 100644 Binary files a/bin/Lib/PABCRtl.dll and b/bin/Lib/PABCRtl.dll differ diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas index a727bc7f0..a2f55d87a 100644 --- a/bin/Lib/PABCSystem.pas +++ b/bin/Lib/PABCSystem.pas @@ -1698,6 +1698,8 @@ var ExitCode := 0; // TODO Сделать возврат в Main ///-- DefaultEncoding: Encoding; + ///-- + PrintDelimDefault: string := ' '; ///-- var @@ -7939,7 +7941,7 @@ end; /// Выводит последовательность на экран, используя пробел в качестве разделителя function Print(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(Self: sequence of T): sequence of T; extensionmethod; begin - Result := Self.Println(' '); + Result := Self.Println(PrintDelimDefault); end; /// Выводит последовательность строк в файл diff --git a/bin/Lib/PT4.pas b/bin/Lib/PT4.pas index 0e18976a9..a3f4148bf 100644 --- a/bin/Lib/PT4.pas +++ b/bin/Lib/PT4.pas @@ -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);