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 @@
--
-
+
--
-
+
--
-
+
--
-
+
--
-
+
--