Исправление ошибок в именованных аргументах
This commit is contained in:
parent
bc9e7d85d4
commit
73f5f6d09b
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%COREVERSION%=0
|
||||
%REVISION%=3280
|
||||
%MINOR%=9
|
||||
%REVISION%=3281
|
||||
%COREVERSION%=0
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.9.0.3280
|
||||
3.9.0.3281
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.9.0.3280'
|
||||
!define VERSION '3.9.0.3281'
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Reference in a new issue