From 750654fd9fecb4f9619095dece9860e716225ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9F=D0=BE=D0=B3=D0=BE=D1=80=D0=B5=D0=BB=D0=BE=D0=B2?= Date: Mon, 10 Feb 2020 15:51:16 +0300 Subject: [PATCH] fix #2164 --- .../PascalABCParserNewSaushkin/ABCPascal.cs | 6 +-- .../ABCPascalYacc.cs | 6 +-- .../PatternsDesugaringVisitor.cs | 44 ++++++++++++++++--- .../patterns-nested-const-pattern.pas | 14 ++++++ 4 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 TestSuite/patterns/patterns-nested-const-pattern.pas diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs index 328f73cdb..7afcc186f 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascal.cs @@ -1,9 +1,9 @@ // // This CSharp output file generated by Gardens Point LEX // Version: 1.1.3.301 -// Machine: DESKTOP-G8V08V4 -// DateTime: 13.01.2020 1:44:39 -// UserName: ????????? +// Machine: DESKTOP-P4NLNB1 +// DateTime: 2/10/2020 2:41:45 PM +// UserName: fatco // GPLEX input file // GPLEX frame file // diff --git a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs index f7e6de280..6c3244baa 100644 --- a/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs +++ b/Parsers/PascalABCParserNewSaushkin/ABCPascalYacc.cs @@ -1,9 +1,9 @@ // (see accompanying GPPGcopyright.rtf) // GPPG version 1.3.6 -// Machine: DESKTOP-G8V08V4 -// DateTime: 13.01.2020 1:44:39 -// UserName: ????????? +// Machine: DESKTOP-P4NLNB1 +// DateTime: 2/10/2020 2:41:46 PM +// UserName: fatco // Input file // options: no-lines gplex diff --git a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs index 698dafbdd..df5000a5c 100644 --- a/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs +++ b/SyntaxVisitors/SugarVisitors/PatternsDesugaringVisitor.cs @@ -124,14 +124,15 @@ namespace SyntaxVisitors.SugarVisitors { if (patternCase == null) continue; + DefaultDesugarPattern(matchWith.expr, patternCase); - switch (patternCase.pattern) + /*switch (patternCase.pattern) { case deconstructor_pattern pattern: { // Проверяем встречался ли уже такой тип при деконструкции // SSM 02.01.19 пока закомментировал этот кусок т.к. при этом коде падает стандартный пример ArithmSimplify.cs. #1408 снова открыл - /*var deconstructionType = (patternCase.pattern as deconstructor_pattern). + var deconstructionType = (patternCase.pattern as deconstructor_pattern). type as named_type_reference; if (deconstructionType != null && deconstructionType.names != null && @@ -144,14 +145,15 @@ namespace SyntaxVisitors.SugarVisitors patternCase.pattern.source_context); } usedDeconstructionTypes.Add(deconstructionTypeName); - } */ + } - DefaultDesugarPattern(matchWith.expr, patternCase); + DefaultDesugarPattern(matchWith.expr, patternCase); break; } case const_pattern p: { - DesugarConstPatternCase(matchWith.expr, patternCase); + //DesugarConstPatternCase(matchWith.expr, patternCase); + DefaultDesugarPattern(matchWith.expr, patternCase); break; } case collection_pattern p: @@ -164,7 +166,7 @@ namespace SyntaxVisitors.SugarVisitors DefaultDesugarPattern(matchWith.expr, patternCase); break; } - } + }*/ } if (matchWith.defaultAction != null) @@ -692,6 +694,9 @@ namespace SyntaxVisitors.SugarVisitors case tuple_pattern cp: statementsToAdd = ProcessDesugaringForTuplePattern(isExpression); break; + case const_pattern cp: + statementsToAdd = ProcessDesugaringForConstPattern(isExpression); + break; } var enclosingIf = GetAscendant(isExpression); @@ -712,6 +717,33 @@ namespace SyntaxVisitors.SugarVisitors } } + private List ProcessDesugaringForConstPattern(is_pattern_expr isExpression) + { + var patternExpressionNode = isExpression.right as const_pattern; + + var statementsToAdd = new List(); + var equalCalls = new List(); + + foreach (var patternExpression in patternExpressionNode.pattern_expressions.expressions) + { + statementsToAdd.Add(GetTypeCompatibilityCheck(isExpression.left, patternExpression)); + + equalCalls.Add( + new bin_expr(isExpression.left, patternExpression, Operators.Equal, isExpression.source_context + ) + ); + } + typeChecks.AddRange(statementsToAdd); + expression orPatternCases = equalCalls[0]; + for (int i = 1; i < equalCalls.Count; ++i) + { + orPatternCases = bin_expr.LogicalOr(orPatternCases, equalCalls[i]); + } + + ReplaceUsingParent(isExpression, orPatternCases); + return statementsToAdd; + } + private List ProcessDesugaringForDeconstructorPattern(is_pattern_expr isExpression) { var pattern = isExpression.right as deconstructor_pattern; diff --git a/TestSuite/patterns/patterns-nested-const-pattern.pas b/TestSuite/patterns/patterns-nested-const-pattern.pas new file mode 100644 index 000000000..18a3f2170 --- /dev/null +++ b/TestSuite/patterns/patterns-nested-const-pattern.pas @@ -0,0 +1,14 @@ +begin + var a := 3; + var b := 2; + match a with + 1: assert(false); + 2: assert(false); + 3: + match b with + 1: assert(false); + 2: exit; + end; + end; + assert(false); +end. \ No newline at end of file