Исправление ошибок в именованных аргументах

This commit is contained in:
Mikhalkovich Stanislav 2023-05-15 12:32:06 +03:00
parent bc9e7d85d4
commit 73f5f6d09b
7 changed files with 27 additions and 10 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 = "3280";
public const string Revision = "3281";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3280
%MINOR%=9
%REVISION%=3281
%COREVERSION%=0
%MAJOR%=3

View file

@ -1 +1 @@
3.9.0.3280
3.9.0.3281

View file

@ -1 +1 @@
!define VERSION '3.9.0.3280'
!define VERSION '3.9.0.3281'

View file

@ -3000,8 +3000,9 @@ namespace PascalABCCompiler.TreeConverter
return AddError<function_node>(new SeveralFunctionsCanBeCalled(loc, list)); // или другое сообщение
// Теперь раз в list осталась одна функция, найти её в functions и только её и оставить
functions.RemoveAll(fun => fun.sym_info != list[0]);
if (functions.Count == 0)
// Надо делать копию functions иначе это влияет на следующий код
var functions1 = functions.Where(fun => fun.sym_info == list[0]).ToList();
if (functions1.Count == 0)
return AddError<function_node>(new NoFunctionWithSameArguments(FunctionName, loc, true)); // это не должно случиться, но вдруг
// Вот и в functions осталась одна функция
// Теперь делаем словарь сопоставлений именам -> expression_node (в параметрах)
@ -3016,7 +3017,7 @@ namespace PascalABCCompiler.TreeConverter
// Я бы очистил хвост parameters и добавлял бы в него как раньше параметры по умолчанию
parameters.remove_range(indexOfFirstNamedArgumentSem, parameters.Count - indexOfFirstNamedArgumentSem); // удалить хвост
var fun1 = functions[0].sym_info as function_node; // это - единственная функция
var fun1 = functions1[0].sym_info as function_node; // это - единственная функция
var is_ext = fun1.is_extension_method;
for (int i = indexOfFirstNamedArgument + (is_ext ? 1 : 0); i < fun1.parameters.Count; i++) // сверить это с другим кодом
{
@ -3031,7 +3032,7 @@ namespace PascalABCCompiler.TreeConverter
// syntax_nodes_parameters мне кажется всё испортят - там именованные аргументы стоят не на своих местах!!!
// Это единственный - опасный и потенциально с ошибками вызов!
// Но ощущение, что всё верно, т.к. это нужно только для параметров лямбд, а у именованных аргументов их быть не может
list = select_function_helper(parameters, functions, loc, syntax_nodes_parameters, only_from_not_extensions, out err_out);
list = select_function_helper(parameters, functions1, loc, syntax_nodes_parameters, only_from_not_extensions, out err_out);
if (err_out != null)
return AddError<function_node>(err_out);
return list[0];

View file

@ -5910,6 +5910,9 @@ namespace PascalABCCompiler.TreeConverter
// Семантическая разница между exprs.Count и s_n_p.Count равна 1 !!! Только здесь! И вот ее и передавать!
// exprs.Count = 3; s_n_p = 2; false - не удаляем 1 параметр
// Добавил последний параметр = 1 - это единственное место где длина exprs на 1 больше
// Это первый вызов. Будет второй поэтому надо сохранить копию expr до вызова
var exprs_copy = exprs.Clone();
fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters, false, 1);
if (fn == null && skip_first_parameter)
{
@ -5921,8 +5924,10 @@ namespace PascalABCCompiler.TreeConverter
Errors.Error last_err = LastError();
skip_first_parameter = false;
sil = tmp_sil;
exprs = exprs_copy;
exprs.remove_at(0);
// exprs.Count = 2; s_n_p = 2; true - удаляем 1 параметр, пропускаем расширения
// Только для методов, исключая методы расширения
fn = convertion_data_and_alghoritms.select_function(exprs, sil, subloc, syntax_nodes_parameters,true);
if (fn == null)
{
@ -5943,8 +5948,11 @@ namespace PascalABCCompiler.TreeConverter
throw last_err;
}
}
// Это значит, что нашли метод расширения, но на всякий случай ищем метод поскольку он имеет приоритет
else if (fn != null && skip_first_parameter && sil.Count() > 1 && !sil.HasOnlyExtensionMethods())
{
var exprs_saved = exprs; // запомнили то что нашли - вдруг здесь не найдем
exprs = exprs_copy; // восстановили начальное exprs
function_node tmp_fn = fn;
exprs.remove_at(0);
sil = tmp_sil;
@ -5954,7 +5962,8 @@ namespace PascalABCCompiler.TreeConverter
{
fn = tmp_fn;
RemoveLastError();
exprs.AddElementFirst(exp);
exprs = exprs_saved; // восстановили - т.к. здесь не нашли
//exprs.AddElementFirst(exp);
}
}
}

View file

@ -13,6 +13,13 @@ namespace PascalABCCompiler.TreeRealization
public class expressions_list : extended_collection<expression_node>
{
public override string ToString() => string.Join(", ", this._elements);
public expressions_list Clone()
{
var exprl = new expressions_list();
foreach (var elem in this)
exprl.AddElement(elem);
return exprl;
}
}
[Serializable]