diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 982857999..a420f8734 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 = "9"; public const string Build = "0"; - public const string Revision = "3376"; + public const string Revision = "3377"; 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 914572273..eee270ad8 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=3376 %MINOR%=9 +%REVISION%=3377 +%COREVERSION%=0 %MAJOR%=3 diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 745f7f04f..ff8f609ad 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.9.0.3376 +3.9.0.3377 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index d8c4788cd..04b939113 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.9.0.3376' +!define VERSION '3.9.0.3377' diff --git a/SyntaxTree/tree/AbstractVisitor.cs b/SyntaxTree/tree/AbstractVisitor.cs index 0c8f388cf..08aa095ab 100644 --- a/SyntaxTree/tree/AbstractVisitor.cs +++ b/SyntaxTree/tree/AbstractVisitor.cs @@ -1307,6 +1307,11 @@ namespace PascalABCCompiler.SyntaxTree { DefaultVisit(_lambda_any_type_node_syntax); } + + public virtual void visit(ref_var_def_statement _ref_var_def_statement) + { + DefaultVisit(_ref_var_def_statement); + } } diff --git a/SyntaxTree/tree/HierarchyVisitor.cs b/SyntaxTree/tree/HierarchyVisitor.cs index e26e2eb72..5e5461151 100644 --- a/SyntaxTree/tree/HierarchyVisitor.cs +++ b/SyntaxTree/tree/HierarchyVisitor.cs @@ -2085,6 +2085,14 @@ namespace PascalABCCompiler.SyntaxTree { } + public virtual void pre_do_visit(ref_var_def_statement _ref_var_def_statement) + { + } + + public virtual void post_do_visit(ref_var_def_statement _ref_var_def_statement) + { + } + public override void visit(expression _expression) { DefaultVisit(_expression); @@ -4308,6 +4316,15 @@ namespace PascalABCCompiler.SyntaxTree pre_do_visit(_lambda_any_type_node_syntax); post_do_visit(_lambda_any_type_node_syntax); } + + public override void visit(ref_var_def_statement _ref_var_def_statement) + { + DefaultVisit(_ref_var_def_statement); + pre_do_visit(_ref_var_def_statement); + visit(ref_var_def_statement.var); + visit(ref_var_def_statement.initial_value); + post_do_visit(_ref_var_def_statement); + } } diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs index 416ded9e7..18e173fc1 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs @@ -540,6 +540,8 @@ namespace PascalABCCompiler.SyntaxTree return new expression_with_let(); case 259: return new lambda_any_type_node_syntax(); + case 260: + return new ref_var_def_statement(); } return null; } @@ -4532,6 +4534,19 @@ namespace PascalABCCompiler.SyntaxTree read_expression(_lambda_any_type_node_syntax); } + + public void visit(ref_var_def_statement _ref_var_def_statement) + { + read_ref_var_def_statement(_ref_var_def_statement); + } + + public void read_ref_var_def_statement(ref_var_def_statement _ref_var_def_statement) + { + read_declaration(_ref_var_def_statement); + _ref_var_def_statement.var = _read_node() as ident; + _ref_var_def_statement.initial_value = _read_node() as addressed_value; + } + } diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs index cdc67a5d0..610b08d2a 100644 --- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs +++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs @@ -7113,6 +7113,36 @@ namespace PascalABCCompiler.SyntaxTree write_expression(_lambda_any_type_node_syntax); } + + public void visit(ref_var_def_statement _ref_var_def_statement) + { + bw.Write((Int16)260); + write_ref_var_def_statement(_ref_var_def_statement); + } + + public void write_ref_var_def_statement(ref_var_def_statement _ref_var_def_statement) + { + write_declaration(_ref_var_def_statement); + if (_ref_var_def_statement.var == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _ref_var_def_statement.var.visit(this); + } + if (_ref_var_def_statement.initial_value == null) + { + bw.Write((byte)0); + } + else + { + bw.Write((byte)1); + _ref_var_def_statement.initial_value.visit(this); + } + } + } diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs index 62505cecf..1932bc206 100644 --- a/SyntaxTree/tree/Tree.cs +++ b/SyntaxTree/tree/Tree.cs @@ -55517,6 +55517,196 @@ namespace PascalABCCompiler.SyntaxTree } + /// + ///Для конструкции refvar id := ref addrValue, которая не имеет аналога в языке и генерируется при развертывании кортежного присваивания в конструкции (a,a[i]) := (b,666); + /// + [Serializable] + public partial class ref_var_def_statement : declaration + { + + /// + ///Конструктор без параметров. + /// + public ref_var_def_statement() + { + + } + + /// + ///Конструктор с параметрами. + /// + public ref_var_def_statement(ident _var,addressed_value _initial_value) + { + this._var=_var; + this._initial_value=_initial_value; + FillParentsInDirectChilds(); + } + + /// + ///Конструктор с параметрами. + /// + public ref_var_def_statement(ident _var,addressed_value _initial_value,SourceContext sc) + { + this._var=_var; + this._initial_value=_initial_value; + source_context = sc; + FillParentsInDirectChilds(); + } + protected ident _var; + protected addressed_value _initial_value; + + /// + ///ref var id := ref add_value + /// + public ident var + { + get + { + return _var; + } + set + { + _var=value; + if (_var != null) + _var.Parent = this; + } + } + + /// + /// + /// + public addressed_value initial_value + { + get + { + return _initial_value; + } + set + { + _initial_value=value; + if (_initial_value != null) + _initial_value.Parent = this; + } + } + + + /// Создает копию узла + public override syntax_tree_node Clone() + { + ref_var_def_statement copy = new ref_var_def_statement(); + copy.Parent = this.Parent; + if (source_context != null) + copy.source_context = new SourceContext(source_context); + if (attributes != null) + { + copy.attributes = (attribute_list)attributes.Clone(); + copy.attributes.Parent = copy; + } + if (var != null) + { + copy.var = (ident)var.Clone(); + copy.var.Parent = copy; + } + if (initial_value != null) + { + copy.initial_value = (addressed_value)initial_value.Clone(); + copy.initial_value.Parent = copy; + } + return copy; + } + + /// Получает копию данного узла корректного типа + public new ref_var_def_statement TypedClone() + { + return Clone() as ref_var_def_statement; + } + + /// Заполняет поля Parent в непосредственных дочерних узлах + public override void FillParentsInDirectChilds() + { + if (attributes != null) + attributes.Parent = this; + if (var != null) + var.Parent = this; + if (initial_value != null) + initial_value.Parent = this; + } + + /// Заполняет поля Parent во всем поддереве + public override void FillParentsInAllChilds() + { + FillParentsInDirectChilds(); + attributes?.FillParentsInAllChilds(); + var?.FillParentsInAllChilds(); + initial_value?.FillParentsInAllChilds(); + } + + /// + ///Свойство для получения количества всех подузлов без элементов поля типа List + /// + public override Int32 subnodes_without_list_elements_count + { + get + { + return 2; + } + } + /// + ///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List + /// + public override Int32 subnodes_count + { + get + { + return 2; + } + } + /// + ///Индексатор для получения всех подузлов + /// + public override syntax_tree_node this[Int32 ind] + { + get + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + return var; + case 1: + return initial_value; + } + return null; + } + set + { + if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1) + throw new IndexOutOfRangeException(); + switch(ind) + { + case 0: + var = (ident)value; + break; + case 1: + initial_value = (addressed_value)value; + break; + } + } + } + /// + ///Метод для обхода дерева посетителем + /// + ///Объект-посетитель. + ///Return value is void + public override void visit(IVisitor visitor) + { + visitor.visit(this); + } + + } + + } diff --git a/SyntaxTree/tree/Visitor.cs b/SyntaxTree/tree/Visitor.cs index 5d7670103..cded27d93 100644 --- a/SyntaxTree/tree/Visitor.cs +++ b/SyntaxTree/tree/Visitor.cs @@ -1564,6 +1564,12 @@ namespace PascalABCCompiler.SyntaxTree ///Node to visit /// Return value is void void visit(lambda_any_type_node_syntax _lambda_any_type_node_syntax); + /// + ///Method to visit ref_var_def_statement. + /// + ///Node to visit + /// Return value is void + void visit(ref_var_def_statement _ref_var_def_statement); } diff --git a/SyntaxTree/tree/tree.xml b/SyntaxTree/tree/tree.xml index 8dce13c27..8fe2b56c9 100644 --- a/SyntaxTree/tree/tree.xml +++ b/SyntaxTree/tree/tree.xml @@ -3346,6 +3346,17 @@ + + + + + + + + + + + Tree.cs @@ -3419,6 +3430,7 @@ + @@ -3468,6 +3480,7 @@ + @@ -4460,6 +4473,9 @@ + + + diff --git a/TestSuite/CompilationSamples/GraphWPF.pas b/TestSuite/CompilationSamples/GraphWPF.pas index e7ae142b0..eb02664ae 100644 --- a/TestSuite/CompilationSamples/GraphWPF.pas +++ b/TestSuite/CompilationSamples/GraphWPF.pas @@ -361,6 +361,10 @@ procedure FillRectangle(x,y,w,h: real; c: Color); procedure Arc(x, y, r, angle1, angle2: real); /// Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенную между двумя лучами, образующими углы angle1 и angle2 с осью OX, цветом c procedure Arc(x, y, r, angle1, angle2: real; c: Color); +/// Рисует дугу окружности с центром в точке p и радиусом r, заключенную между двумя лучами, образующими углы angle1 и angle2 с осью OX +procedure Arc(p: Point; r, angle1, angle2: real); +/// Рисует дугу окружности с центром в точке p и радиусом r, заключенную между двумя лучами, образующими углы angle1 и angle2 с осью OX, цветом c + procedure Arc(p: Point; r, angle1, angle2: real; c: Color); /// Рисует сектор окружности с центром в точке (x,y) и радиусом r, заключенный между двумя лучами, образующими углы angle1 и angle2 с осью OX procedure Sector(x, y, r, angle1, angle2: real); @@ -1528,6 +1532,8 @@ procedure FillRectangle(x,y,w,h: real; c: GColor) := InvokeVisual(FillRectangleP /// Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы angle1 и angle2 с осью OX (angle1 и angle2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) procedure Arc(x, y, r, angle1, angle2: real) := InvokeVisual(ArcP,x, y, r, angle1, angle2); procedure Arc(x, y, r, angle1, angle2: real; c: GColor) := InvokeVisual(ArcPC,x, y, r, angle1, angle2, c); +procedure Arc(p: Point; r, angle1, angle2: real) := Arc(p.x, p.y, r, angle1, angle2); +procedure Arc(p: Point; r, angle1, angle2: real; c: Color) := Arc(p.x, p.y, r, angle1, angle2, c); /// Рисует сектор окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы angle1 и angle2 с осью OX (angle1 и angle2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) procedure Sector(x, y, r, angle1, angle2: real) := InvokeVisual(SectorP,x, y, r, angle1, angle2); diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas index d35e555b3..f26780be6 100644 --- a/TestSuite/CompilationSamples/PABCSystem.pas +++ b/TestSuite/CompilationSamples/PABCSystem.pas @@ -9996,6 +9996,10 @@ begin Result := Self end; +/// Преобразует последовательность последовательностей в плоскую последовательность +function Flatten(Self: sequence of sequence of T): sequence of T; extensionmethod + := Self.SelectMany(x -> x); + /// Преобразует элементы последовательности в строковое представление, после чего объединяет их в строку, используя delim в качестве разделителя function JoinToString(Self: sequence of T; delim: string): string; extensionmethod; begin diff --git a/bin/Lib/PABCSystem.xml b/bin/Lib/PABCSystem.xml index 8c51f637c..2423c92e7 100644 --- a/bin/Lib/PABCSystem.xml +++ b/bin/Lib/PABCSystem.xml @@ -1141,19 +1141,19 @@ -- - + -- - + -- - + -- - + -- - + --