bug fix #268
This commit is contained in:
parent
89c9e3ee58
commit
5272e1db91
|
|
@ -1181,6 +1181,32 @@
|
|||
<i Type="Method">public override void visit ( formal_parameters fp )</i>
|
||||
</ICtx>
|
||||
</Node>
|
||||
<Node Name="ForwardDefInUnitError">
|
||||
<Items>
|
||||
<Node Name="InsertGlobalIteratorMethodPredefinition">
|
||||
<FileName>\syntaxvisitors\yieldvisitors\processyieldscapturedvars.cs</FileName>
|
||||
<Text>private bool InsertGlobalIteratorMethodPredefinition(procedure_definition pd)</Text>
|
||||
<OCtx>
|
||||
<i Type="Method">private bool InsertGlobalIteratorMethodPredefinition ( procedure_definition pd )</i>
|
||||
<i Type="ClassOrNamespace">public class ProcessYieldCapturedVarsVisitor : BaseChangeVisitor</i>
|
||||
<i Type="ClassOrNamespace">namespace SyntaxVisitors</i>
|
||||
<i Type="CS_TreeNode">
|
||||
</i>
|
||||
</OCtx>
|
||||
</Node>
|
||||
<Node Name="check_unique_or_predefined(common_function_node fn)">
|
||||
<FileName>\TreeConverter\TreeConversion\compilation_context.cs</FileName>
|
||||
<Text>private bool check_unique_or_predefined(common_function_node fn)</Text>
|
||||
<OCtx>
|
||||
<i Type="Method">private bool check_unique_or_predefined ( common_function_node fn )</i>
|
||||
<i Type="ClassOrNamespace">public class compilation_context</i>
|
||||
<i Type="ClassOrNamespace">namespace PascalABCCompiler . TreeConverter</i>
|
||||
<i Type="CS_TreeNode">
|
||||
</i>
|
||||
</OCtx>
|
||||
</Node>
|
||||
</Items>
|
||||
</Node>
|
||||
</Items>
|
||||
</Node>
|
||||
<Node Name="a.Sort((row1, row2) -> 1)">
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -832,6 +832,20 @@ namespace SyntaxVisitors
|
|||
return false;
|
||||
}
|
||||
|
||||
// SSM и еще нельзя генерировать если это функция, описанная в interface и implementation модуля
|
||||
var un = UpperNode(2) as implementation_node;
|
||||
if (un != null)
|
||||
{
|
||||
var cu = UpperNode(3) as unit_module;
|
||||
if (cu != null) // а это всегда так
|
||||
{
|
||||
var fhh = cu.interface_part.interface_definitions.defs.OfType<function_header>().Where(fh => fh.name.meth_name.name.ToLower()==pd.proc_header.name.meth_name.name.ToLower());
|
||||
if (fhh.Any()) // если еть в разделе интерфейса такие же имена, то не генерировать предописание
|
||||
return false;
|
||||
// вообще-то надо сравнивать заголовки - не только имена - но даже так устраняется основная масса ошибок
|
||||
}
|
||||
}
|
||||
|
||||
var pdPredefs = UpperTo<declarations>().defs
|
||||
.OfType<procedure_definition>()
|
||||
.Where(lpd => lpd.proc_body == null
|
||||
|
|
@ -877,6 +891,8 @@ namespace SyntaxVisitors
|
|||
return;
|
||||
|
||||
// frninja 05/06/16 - вставляем предописание если метод-итератор описан не в классе (обычная функция) чтоб работали рекурсивные вызовы
|
||||
// Нужен также для верной работы <yield_error> функции, проверяющей разные ошибки на этапе семантики
|
||||
// Как только уберу <yield_error>-функцию, от этого тоже можно избавиться
|
||||
bool methodPredefCreated = InsertGlobalIteratorMethodPredefinition(pd);
|
||||
|
||||
// frninja 24/05/16 - оборачиваем одиночные операторы в begin..end
|
||||
|
|
@ -966,10 +982,10 @@ namespace SyntaxVisitors
|
|||
pd.has_yield = false;
|
||||
|
||||
// frninja 05/06/16 - убираем where-секцию у описания метода. Они уже скопированы куда надо
|
||||
if (methodPredefCreated)
|
||||
/*if (methodPredefCreated)
|
||||
{
|
||||
pd.proc_header.where_defs = null;
|
||||
}
|
||||
}*/
|
||||
|
||||
//mids = null; // вдруг мы выйдем из процедуры, не зайдем в другую, а там - оператор! Такого конечно не может быть
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1562,6 +1562,8 @@ function ReadSeqReal(const prompt: string; n: integer): sequence of real;
|
|||
/// Выводит приглашение к вводу и возвращает последовательность из n строк, введенных с клавиатуры
|
||||
function ReadSeqString(const prompt: string; n: integer): sequence of string;
|
||||
|
||||
/// Возвращает последовательность целых, вводимых с клавиатуры пока выполняется определенное условие
|
||||
//function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
|
||||
|
||||
// -----------------------------------------------------
|
||||
//>> Подпрограммы для генерации динамических массивов # Subroutines for array of T generation
|
||||
|
|
@ -4094,6 +4096,17 @@ begin
|
|||
Result := Range(1,n).Select(i->ReadInteger());
|
||||
end;
|
||||
|
||||
function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
|
||||
begin
|
||||
while True do
|
||||
begin
|
||||
var x := ReadInteger();
|
||||
if cond(x) then
|
||||
break;
|
||||
yield 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ReadSeqInteger(const prompt: string; n: integer): sequence of integer;
|
||||
begin
|
||||
Print(prompt);
|
||||
|
|
@ -8765,6 +8778,8 @@ begin
|
|||
yield c.TakeGroup();
|
||||
end;
|
||||
|
||||
//ToDo Сделать AdjacentGroup с функцией сравнения
|
||||
|
||||
/// Возвращает минимальный элемент
|
||||
function Min<T>(Self: array of T): T; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
|
|
|
|||
|
|
@ -3001,7 +3001,9 @@ namespace PascalABCCompiler.TreeConverter
|
|||
AddError(new FunctionDuplicateDefinition(compar, fn));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(new FunctionDuplicateDefinition(compar, fn));
|
||||
}
|
||||
}
|
||||
}
|
||||
si = si.Next;
|
||||
|
|
@ -3279,7 +3281,9 @@ namespace PascalABCCompiler.TreeConverter
|
|||
AddError(new FunctionDuplicateDefinition(compar, fn));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(new FunctionDuplicateDefinition(compar,fn));
|
||||
}
|
||||
}
|
||||
si = si.Next;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,12 +25,13 @@ namespace YieldDesugarSyntaxTreeConverter
|
|||
public syntax_tree_node Convert(syntax_tree_node root)
|
||||
{
|
||||
root.visit(new MarkMethodHasYieldAndCheckSomeErrorsVisitor());
|
||||
root.visit(new ProcessYieldCapturedVarsVisitor());
|
||||
ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);
|
||||
//root.visit(py); - пропускал корень
|
||||
|
||||
#if DEBUG
|
||||
try
|
||||
{
|
||||
//root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt"));
|
||||
root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt"));
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1562,6 +1562,8 @@ function ReadSeqReal(const prompt: string; n: integer): sequence of real;
|
|||
/// Выводит приглашение к вводу и возвращает последовательность из n строк, введенных с клавиатуры
|
||||
function ReadSeqString(const prompt: string; n: integer): sequence of string;
|
||||
|
||||
/// Возвращает последовательность целых, вводимых с клавиатуры пока выполняется определенное условие
|
||||
function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
|
||||
|
||||
// -----------------------------------------------------
|
||||
//>> Подпрограммы для генерации динамических массивов # Subroutines for array of T generation
|
||||
|
|
@ -4094,6 +4096,17 @@ begin
|
|||
Result := Range(1,n).Select(i->ReadInteger());
|
||||
end;
|
||||
|
||||
function ReadSeqIntegerWhile(cond: integer -> boolean): sequence of integer;
|
||||
begin
|
||||
while True do
|
||||
begin
|
||||
var x := ReadInteger();
|
||||
if not cond(x) then
|
||||
break;
|
||||
yield x;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ReadSeqInteger(const prompt: string; n: integer): sequence of integer;
|
||||
begin
|
||||
Print(prompt);
|
||||
|
|
@ -8765,6 +8778,8 @@ begin
|
|||
yield c.TakeGroup();
|
||||
end;
|
||||
|
||||
//ToDo Сделать AdjacentGroup с функцией сравнения
|
||||
|
||||
/// Возвращает минимальный элемент
|
||||
function Min<T>(Self: array of T): T; extensionmethod; where T: System.IComparable<T>;
|
||||
begin
|
||||
|
|
|
|||
Loading…
Reference in a new issue