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