This commit is contained in:
Ivan Bondarev 2024-03-29 12:19:27 +01:00
commit 1d82d488a4
7 changed files with 34 additions and 9 deletions

View file

@ -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 = "3446";
public const string Revision = "3450";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3446
%REVISION%=3450
%MINOR%=9
%MAJOR%=3

View file

@ -1 +1 @@
3.9.0.3446
3.9.0.3450

View file

@ -1 +1 @@
!define VERSION '3.9.0.3446'
!define VERSION '3.9.0.3450'

View file

@ -384,6 +384,7 @@ namespace PascalABCCompiler.SyntaxTree
{
return string.Format("{0} {1} {2}", to, OperatorServices.ToString(operator_type, LanguageId.PascalABCNET), from);
}
public bool first_assignment_defines_type = false;
}
public partial class bin_expr

View file

@ -19,15 +19,18 @@ namespace SyntaxVisitors.SugarVisitors
public override void visit(assign ass)
{
if ((ass.to as ident).name != "a")
if ((ass.to as ident).name == "a") // это для примера - это надо закомментировать
ass.first_assignment_defines_type = true;
if (!ass.first_assignment_defines_type)
return;
syntax_tree_node p = ass;
while (!(p is PascalABCCompiler.SyntaxTree.block) && p != null)
while (!(p is PascalABCCompiler.SyntaxTree.block) && p != null) // ищем вверх ближайший блок
p = p.Parent;
if (p == null)
if (p == null) // если блока нет, то выходим. Не знаю, почему его может не быть
return;
var typ = new same_type_node(ass.from);
var typ = new named_type_reference("string",ass.source_context); // делаем какой-то правильный тип - всё равно при первом присваивании будем его менять
var decls = (p as block).defs;
var vds = new var_def_statement(ass.to as ident, typ, ass.source_context);
decls.Add(vds);

View file

@ -22,6 +22,12 @@ namespace PascalABCCompiler.TreeConverter
addressed_expression to;
expression_node from;
// SSM - идея для особого присваивания, по которому находится тип в SymTable
/*var sc = context.CurrentScope;
var ttt = sc.Find("a");
(ttt[0].sym_info as namespace_variable).type = convert_strong(_assign.from).type;*/
AssignCheckAndConvert(_assign, out to, out from);
@ -112,6 +118,21 @@ namespace PascalABCCompiler.TreeConverter
/// </summary>
private void AssignCheckAndConvert(assign _assign, out addressed_expression to, out expression_node from)
{
// SSM 29/03/24
var fromAsLambda0 = _assign.from as function_lambda_definition;
expression_node from0 = null;
if (fromAsLambda0 == null)
{
// Перенёс вычисление from в начало - чтобы потом сделать узел, задающий тип при первом присваивании
from0 = convert_strong(_assign.from);
if (_assign.first_assignment_defines_type) // всегда в этом случае должно быть присваивание := а не += и т.д.
{
var sc = context.CurrentScope;
var ttt = sc.Find((_assign.to as ident).name); // всегда в этом случае должно быть простое имя
(ttt[0].sym_info as namespace_variable).type = from0.type;
}
}
internal_is_assign = true;
to = convert_address_strong(_assign.to);
internal_is_assign = false;
@ -146,7 +167,7 @@ namespace PascalABCCompiler.TreeConverter
}
else
{
from = convert_strong(_assign.from);
from = from0;
ProcessAssigntToAutoType(to, ref from);
}
// end