From 72e40bf4e9fb5c22015b00addc473af02b2707a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?=
=?UTF-8?q?=D0=97=D0=B5=D0=BC=D0=BB=D1=8F=D0=BA?=
<92867056+AlexanderZemlyak@users.noreply.github.com>
Date: Sun, 4 Jan 2026 14:05:57 +0200
Subject: [PATCH] Add first_assignment_defines_type field to Tree.cs (#3370)
---
.../TreeNodesRearrangementVisitor.cs | 10 --------
SyntaxTree/tree/SyntaxTreeStreamReader.cs | 1 +
SyntaxTree/tree/SyntaxTreeStreamWriter.cs | 1 +
SyntaxTree/tree/Tree.cs | 23 +++++++++++++++++--
SyntaxTree/tree/TreeHelper.cs | 8 ++++++-
SyntaxTree/tree/tree.xml | 3 ++-
6 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/TreeNodesRearrangementVisitor.cs b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/TreeNodesRearrangementVisitor.cs
index 61c36d54c..6244ec537 100644
--- a/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/TreeNodesRearrangementVisitor.cs
+++ b/AdditionalLanguages/SPython/SyntaxTreeConverters/SPythonStandardTreeConverter/TreeNodesRearrangementVisitor.cs
@@ -53,16 +53,6 @@ namespace Languages.SPython.Frontend.Converters
private void BuildMainFunction(statement_list _statement_list)
{
statement_list mainBody = _statement_list.TypedClone();
-
- // Нужно поправить это клонирование
- for (var i = 0; i < _statement_list.Count; i++)
- {
- if (_statement_list[i] is assign ass && ass.first_assignment_defines_type)
- {
- ((assign)mainBody[i]).first_assignment_defines_type = true;
- }
- }
-
mainBody.source_context = mainBody.Parent.source_context; // source context для MAIN охватывает весь файл
procedure_header _procedure_header = new procedure_header(mainFunctionName);
block _block = new block(null, mainBody, mainBody.source_context);
diff --git a/SyntaxTree/tree/SyntaxTreeStreamReader.cs b/SyntaxTree/tree/SyntaxTreeStreamReader.cs
index 5560b3dbf..96fa1e125 100644
--- a/SyntaxTree/tree/SyntaxTreeStreamReader.cs
+++ b/SyntaxTree/tree/SyntaxTreeStreamReader.cs
@@ -684,6 +684,7 @@ namespace PascalABCCompiler.SyntaxTree
_assign.to = _read_node() as addressed_value;
_assign.from = _read_node() as expression;
_assign.operator_type = (Operators)br.ReadByte();
+ _assign.first_assignment_defines_type = br.ReadBoolean();
}
diff --git a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs
index cf9bd35a4..1835d2f6a 100644
--- a/SyntaxTree/tree/SyntaxTreeStreamWriter.cs
+++ b/SyntaxTree/tree/SyntaxTreeStreamWriter.cs
@@ -180,6 +180,7 @@ namespace PascalABCCompiler.SyntaxTree
_assign.from.visit(this);
}
bw.Write((byte)_assign.operator_type);
+ bw.Write(_assign.first_assignment_defines_type);
}
diff --git a/SyntaxTree/tree/Tree.cs b/SyntaxTree/tree/Tree.cs
index 44bd571df..5380688d5 100644
--- a/SyntaxTree/tree/Tree.cs
+++ b/SyntaxTree/tree/Tree.cs
@@ -910,28 +910,31 @@ namespace PascalABCCompiler.SyntaxTree
///
///Конструктор с параметрами.
///
- public assign(addressed_value _to,expression _from,Operators _operator_type)
+ public assign(addressed_value _to,expression _from,Operators _operator_type,bool _first_assignment_defines_type)
{
this._to=_to;
this._from=_from;
this._operator_type=_operator_type;
+ this._first_assignment_defines_type=_first_assignment_defines_type;
FillParentsInDirectChilds();
}
///
///Конструктор с параметрами.
///
- public assign(addressed_value _to,expression _from,Operators _operator_type,SourceContext sc)
+ public assign(addressed_value _to,expression _from,Operators _operator_type,bool _first_assignment_defines_type,SourceContext sc)
{
this._to=_to;
this._from=_from;
this._operator_type=_operator_type;
+ this._first_assignment_defines_type=_first_assignment_defines_type;
source_context = sc;
FillParentsInDirectChilds();
}
protected addressed_value _to;
protected expression _from;
protected Operators _operator_type;
+ protected bool _first_assignment_defines_type;
///
///Левый операнд оператора присваивания (чему присваивать).
@@ -982,6 +985,21 @@ namespace PascalABCCompiler.SyntaxTree
}
}
+ ///
+ ///Необходимо ли задать тип переменной равным типу правой части
+ ///
+ public bool first_assignment_defines_type
+ {
+ get
+ {
+ return _first_assignment_defines_type;
+ }
+ set
+ {
+ _first_assignment_defines_type=value;
+ }
+ }
+
/// Создает копию узла
public override syntax_tree_node Clone()
@@ -1006,6 +1024,7 @@ namespace PascalABCCompiler.SyntaxTree
copy.from.Parent = copy;
}
copy.operator_type = operator_type;
+ copy.first_assignment_defines_type = first_assignment_defines_type;
return copy;
}
diff --git a/SyntaxTree/tree/TreeHelper.cs b/SyntaxTree/tree/TreeHelper.cs
index 976623b83..6368efaad 100644
--- a/SyntaxTree/tree/TreeHelper.cs
+++ b/SyntaxTree/tree/TreeHelper.cs
@@ -381,11 +381,17 @@ namespace PascalABCCompiler.SyntaxTree
{ }
public assign(string name, bool value) : this(new ident(name), new bool_const(value))
{ }
+
+ public assign(addressed_value _to, expression _from, Operators _operator_type) : this(_to, _from, _operator_type, false)
+ { }
+
+ public assign(addressed_value _to, expression _from, Operators _operator_type, SourceContext sc) : this(_to, _from, _operator_type, false, sc)
+ { }
+
public override string ToString()
{
return string.Format("{0} {1} {2}", to, OperatorServices.ToString(operator_type, StringConstants.pascalLanguageName), from);
}
- public bool first_assignment_defines_type = false;
}
public partial class bin_expr
diff --git a/SyntaxTree/tree/tree.xml b/SyntaxTree/tree/tree.xml
index f5afe5da7..4303306f6 100644
--- a/SyntaxTree/tree/tree.xml
+++ b/SyntaxTree/tree/tree.xml
@@ -71,6 +71,7 @@
+
@@ -3654,7 +3655,7 @@
-
+