Merge branch 'master' of https://github.com/pascalabcnet/pascalabcnet
This commit is contained in:
commit
1d82d488a4
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=3446
|
||||
%REVISION%=3450
|
||||
%MINOR%=9
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.9.0.3446
|
||||
3.9.0.3450
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.9.0.3446'
|
||||
!define VERSION '3.9.0.3450'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue