diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 5e459281e..fb791182f 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "5"; public const string Build = "0"; - public const string Revision = "2134"; + public const string Revision = "2135"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 00f46a84a..1400801e2 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%COREVERSION%=0 -%REVISION%=2134 %MINOR%=5 +%REVISION%=2135 +%COREVERSION%=0 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index d66cafe07..316bb8f10 100644 Binary files a/Localization/DefaultLang.resources and b/Localization/DefaultLang.resources differ diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 17f92584e..613957321 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.5.0.2134' +!define VERSION '3.5.0.2135' diff --git a/SyntaxVisitors/BaseVisitors/HasStatementVisitor.cs b/SyntaxVisitors/BaseVisitors/HasStatementVisitor.cs index 4cb0c6346..f4d28c06e 100644 --- a/SyntaxVisitors/BaseVisitors/HasStatementVisitor.cs +++ b/SyntaxVisitors/BaseVisitors/HasStatementVisitor.cs @@ -30,7 +30,38 @@ namespace SyntaxVisitors { if (node is T) foundT = true; - else + else + base.DefaultVisit(node); + } + } + public class HasStatementWithBarrierVisitor : BaseEnterExitVisitor + where T : statement + where Barrier: syntax_tree_node + { + private bool foundT = false; + + public static bool Has(syntax_tree_node node) + { + HasStatementWithBarrierVisitor vis = new HasStatementWithBarrierVisitor(); + + vis.ProcessNode(node); + + return vis.foundT; + } + + public override void Enter(syntax_tree_node sn) // Искать всюду, но не заходить в узлы Barrier и вложенные + { + if (sn is Barrier) + { + visitNode = false; + } + } + + public override void DefaultVisit(syntax_tree_node node) + { + if (node is T) + foundT = true; + else base.DefaultVisit(node); } } diff --git a/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs b/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs index 2b9dd28bb..7dedb81fb 100644 --- a/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/MarkMethodHasYieldVisitor.cs @@ -100,12 +100,14 @@ namespace SyntaxVisitors throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_NESTED_SUBROUTINES", pd.source_context); } - if (pd.has_yield && pd.DescendantNodes().OfType().Count() > 0) + if (pd.has_yield && HasStatementWithBarrierVisitor.Has(pd)) + //pd.DescendantNodes().OfType().Count() > 0) { throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_TRY_EXCEPT_FINALLY", pd.source_context); } - if (pd.has_yield && pd.DescendantNodes().OfType().Count() > 0) + if (pd.has_yield && HasStatementWithBarrierVisitor.Has(pd)) + //pd.DescendantNodes().OfType().Count() > 0) { throw new SyntaxVisitorError("FUNCTIONS_WITH_YIELDS_CANNOT_CONTAIN_LOCK", pd.source_context); } diff --git a/TestSuite/lock_in_lambda_in_yield.pas b/TestSuite/lock_in_lambda_in_yield.pas new file mode 100644 index 000000000..f91850c4a --- /dev/null +++ b/TestSuite/lock_in_lambda_in_yield.pas @@ -0,0 +1,16 @@ +function f1: sequence of byte; //Ошибка: Функции с yield не могут содержать блоков try..except и try..finally +begin + yield 0; + + var p: procedure := ()-> + begin + lock(new object) do + begin + + end; + end; + +end; + +begin +end. \ No newline at end of file diff --git a/TestSuite/try_in_lambda_in_yield.pas b/TestSuite/try_in_lambda_in_yield.pas new file mode 100644 index 000000000..309406579 --- /dev/null +++ b/TestSuite/try_in_lambda_in_yield.pas @@ -0,0 +1,15 @@ +function f1: sequence of byte; //Ошибка: Функции с yield не могут содержать блоков try..except и try..finally +begin + yield 0; + + var p: procedure := ()-> + begin + try + except + end + end; + +end; + +begin +end. \ No newline at end of file