From 3e1d264cbdc11ef48a6f855ff9dbd1c4c3179525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Thu, 19 Apr 2018 20:11:51 +0200 Subject: [PATCH] bug fix #778 --- .../YieldVisitors/CollectClassFieldsVisitor.cs | 2 ++ .../YieldVisitors/CollectClassMethodsVisitor.cs | 3 ++- .../CollectClassPropertiesVisitor.cs | 3 ++- TestSuite/yield4.pas | 16 ++++++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 TestSuite/yield4.pas diff --git a/SyntaxVisitors/YieldVisitors/CollectClassFieldsVisitor.cs b/SyntaxVisitors/YieldVisitors/CollectClassFieldsVisitor.cs index aee6090ff..d294be9ab 100644 --- a/SyntaxVisitors/YieldVisitors/CollectClassFieldsVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/CollectClassFieldsVisitor.cs @@ -41,6 +41,8 @@ namespace SyntaxVisitors return; } + if (cd.body == null) + return; var fields = cd.body.class_def_blocks.SelectMany(cm => cm.members.Where(decl => decl is var_def_statement) .Select(decl1 => (decl1 as var_def_statement).vars.idents) .SelectMany(ids => ids.Select(id => id))); diff --git a/SyntaxVisitors/YieldVisitors/CollectClassMethodsVisitor.cs b/SyntaxVisitors/YieldVisitors/CollectClassMethodsVisitor.cs index 11e453cda..15710887d 100644 --- a/SyntaxVisitors/YieldVisitors/CollectClassMethodsVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/CollectClassMethodsVisitor.cs @@ -39,7 +39,8 @@ namespace SyntaxVisitors // Yoda return; } - + if (cd.body == null) + return; var methods = cd.body.class_def_blocks.SelectMany(cm => cm.members.Select(decl1 => { if (decl1 is procedure_header) diff --git a/SyntaxVisitors/YieldVisitors/CollectClassPropertiesVisitor.cs b/SyntaxVisitors/YieldVisitors/CollectClassPropertiesVisitor.cs index b7f600000..307b9f0d5 100644 --- a/SyntaxVisitors/YieldVisitors/CollectClassPropertiesVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/CollectClassPropertiesVisitor.cs @@ -39,7 +39,8 @@ namespace SyntaxVisitors // Yoda return; } - + if (cd.body == null) + return; var properties = cd.body.class_def_blocks.SelectMany(cm => cm.members.Select(decl => decl as simple_property) .Where(name => (object)name != null) .Select(sp => sp.property_name)); diff --git a/TestSuite/yield4.pas b/TestSuite/yield4.pas new file mode 100644 index 000000000..99b6aa89d --- /dev/null +++ b/TestSuite/yield4.pas @@ -0,0 +1,16 @@ +type + t1 = class; + + t1 = class + function f1: sequence of byte; + begin + yield 0;//обязательно yield + yield 1; + end; + end; + +begin + var o1:t1 := new t1; + var arr := o1.f1.ToArray; + assert(arr[1] = 1); +end. \ No newline at end of file