This commit is contained in:
Бондарев Иван 2018-08-09 11:38:44 +02:00
parent b825635319
commit f69a84b1d1
2 changed files with 53 additions and 8 deletions

45
TestSuite/params11.pas Normal file
View file

@ -0,0 +1,45 @@
var i: integer;
procedure p(b: integer; params a:array of integer);
begin
i := b;
if a.Length > 0 then
i := a[0];
end;
procedure p4(b: integer; b2: integer; params a:array of integer);
begin
i := b;
if a.Length > 0 then
i := a[0];
end;
procedure p2(self: object; b: integer; params a:array of integer); extensionmethod;
begin
i := b;
if a.Length > 0 then
i := a[0];
end;
procedure p3(self: object; params a:array of integer); extensionmethod;
begin
i := 4;
end;
begin
p(2);
assert(i = 2);
p(2,1,3);
assert(i = 1);
var o := new object;
o.p2(2);
assert(i = 2);
o.p2(2,1,3);
assert(i = 1);
o.p3;
assert(i = 4);
p4(2,2);
assert(i = 2);
p4(2,1,3);
assert(i = 3);
end.

View file

@ -1613,9 +1613,9 @@ namespace PascalABCCompiler.TreeConverter
//TODO: Можно сделать параметры по умолчанию для откомпилированных функций.
if ((exprs.Count < fn.parameters.Count) && (fn.node_kind == SemanticTree.node_kind.common))
{
if (exprs.Count == 0 && fn.parameters != null && fn.parameters.Count == 1 && fn.parameters[0].is_params ||
exprs.Count == 1 && fn.parameters != null && fn is common_namespace_function_node && (fn as common_namespace_function_node).ConnectedToType != null &&
fn.parameters.Count == 2 && fn.parameters[1].is_params)
if (!(fn is common_namespace_function_node && (fn as common_namespace_function_node).ConnectedToType != null) && fn.parameters != null && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count-1].is_params ||
fn is common_namespace_function_node && (fn as common_namespace_function_node).ConnectedToType != null && fn.parameters != null
&& fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count - 1].is_params)
{
statements_expression_node sre = new statements_expression_node(ptcal.snl, ptcal.var_ref, ptcal.var_ref.location);
//exprs.remove_range(fn.parameters.Count - 1, exprs.Count - fn.parameters.Count);
@ -1633,9 +1633,9 @@ namespace PascalABCCompiler.TreeConverter
}
else if ((exprs.Count < fn.parameters.Count) && (fn.node_kind == SemanticTree.node_kind.compiled))
{
if (exprs.Count == 0 && fn.parameters != null && fn.parameters.Count == 1 && fn.parameters[0].is_params ||
exprs.Count == 1 && fn.parameters != null && fn is compiled_function_node && (fn as compiled_function_node).ConnectedToType != null &&
fn.parameters.Count == 2 && fn.parameters[1].is_params)
if (!(fn is compiled_function_node && (fn as compiled_function_node).ConnectedToType != null) && fn.parameters != null && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count - 1].is_params ||
fn is compiled_function_node && (fn as compiled_function_node).ConnectedToType != null
&& fn.parameters != null && fn.parameters.Count - 1 == exprs.Count && fn.parameters[fn.parameters.Count - 1].is_params)
{
statements_expression_node sre = new statements_expression_node(ptcal.snl, ptcal.var_ref, ptcal.var_ref.location);
exprs.AddElement(sre);
@ -1809,9 +1809,9 @@ namespace PascalABCCompiler.TreeConverter
}
}
}
else if ((parameters.Count == 0 && fn.parameters.Count == 1) && fn.parameters[0].is_params && !set_of_possible_functions.Contains(fn))
//else if ((parameters.Count == 0 && fn.parameters.Count == 1) && fn.parameters[0].is_params && !set_of_possible_functions.Contains(fn))
// SSM 6.08.18 - так просто исправить не получается - видимо, сопоставление параметров работает неверно
//else if ((parameters.Count == fn.parameters.Count - 1) && fn.parameters[fn.parameters.Count-1].is_params && !set_of_possible_functions.Contains(fn))
else if ((parameters.Count == fn.parameters.Count - 1) && fn.parameters[fn.parameters.Count-1].is_params && !set_of_possible_functions.Contains(fn))
set_of_possible_functions.AddElement(fn);
else if (fn.num_of_default_parameters != 0 && parameters.Count >= fn.parameters.Count - fn.num_of_default_parameters)
{