From 77b51210566186f8388ff3592de4d1ad41011826 Mon Sep 17 00:00:00 2001 From: Ivan Bondarev Date: Sun, 9 Apr 2023 10:47:52 +0200 Subject: [PATCH] #2833 --- TestSuite/Deconstructs2.pas | 4 +- TestSuite/Deconstructs3.pas | 45 +++++++++++++++++++ .../SyntaxTreeVisitorNodes/Patterns.cs | 5 +-- 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 TestSuite/Deconstructs3.pas diff --git a/TestSuite/Deconstructs2.pas b/TestSuite/Deconstructs2.pas index d47b21bf0..e846eae64 100644 --- a/TestSuite/Deconstructs2.pas +++ b/TestSuite/Deconstructs2.pas @@ -8,9 +8,11 @@ type end; begin - if new t1 is t1(var a) then + var o := new t1; + if o is t1(var a) then begin i := 2; + assert(o = a); end; assert(i = 2); end. \ No newline at end of file diff --git a/TestSuite/Deconstructs3.pas b/TestSuite/Deconstructs3.pas new file mode 100644 index 000000000..8d0be3249 --- /dev/null +++ b/TestSuite/Deconstructs3.pas @@ -0,0 +1,45 @@ +type + Person = class + name: string; + age: integer; + + constructor(name: string; age: integer); + begin + self.name := name; + self.age := age; + end; + + procedure Deconstruct(var name: string; var age: integer); + begin + name := self.name; + age := self.age; + end; + end; + +begin + var p := new Person('John', 25); + var s := ''; + var i := 0; + if p is Person(var name, var age) then + begin + s := name; + i := age; + end; + + assert(s = 'John'); + assert(i = 25); + + s := ''; + i := 0; + + match p with + Person(name, age): + begin + s := name; + i := age; + end; + end; + + assert(s = 'John'); + assert(i = 25); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs index 18cdb615d..f9795205f 100644 --- a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs +++ b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs @@ -93,9 +93,8 @@ namespace PascalABCCompiler.TreeConverter out type_node[] parameterTypes) { parameterTypes = new type_node[givenParameterTypes.Length]; - if (candidate.parameters.Count == 0) - return false; - candidate.parameters[0].name = "Self"; // SSM 23.06.20 #2268 - это если в NET где-то такое нашли + if (candidate.parameters.Count > 0) + candidate.parameters[0].name = "Self"; // SSM 23.06.20 #2268 - это если в NET где-то такое нашли var selfParameter = candidate.is_extension_method ? candidate.parameters.FirstOrDefault(IsSelfParameter) : null; Debug.Assert(!candidate.is_extension_method || selfParameter != null, "Couldn't find self parameter in extension method"); var candidateParameterTypes =