Kaynağa Gözat

Fix nested object member destructuring (#1359)

Marko Lahma 2 yıl önce
ebeveyn
işleme
f840b094e6

+ 28 - 0
Jint.Tests/Runtime/ClassTests.cs

@@ -17,4 +17,32 @@ public class ClassTests
         var engine = new Engine();
         Assert.True(engine.Evaluate(Script).AsBoolean());
     }
+
+    [Fact]
+    public void CanDestructureNestedMembers()
+    {
+        const string Script = @"
+            class Board {
+                constructor () {
+                    this.grid = {width: 10, height: 10}
+                }
+
+                get width () {
+                    const {grid} = this
+                    return grid.width
+                }
+
+                get doubleWidth () {
+                    const {width} = this
+                    return width * 2
+                }
+            }";
+
+        var engine = new Engine();
+        engine.Execute(Script);
+
+        engine.Evaluate("var board = new Board()");
+        Assert.Equal(10, engine.Evaluate("board.width"));
+        Assert.Equal(20, engine.Evaluate("board.doubleWidth "));
+    }
 }

+ 5 - 5
Jint/Runtime/Interpreter/Expressions/BindingPatternAssignmentExpression.cs

@@ -324,7 +324,7 @@ namespace Jint.Runtime.Interpreter.Expressions
                     processedProperties?.Add(sourceKey);
                     if (p.Value is AssignmentPattern assignmentPattern)
                     {
-                        source.TryGetValue(sourceKey, out var value);
+                        var value = source.Get(sourceKey);
                         if (value.IsUndefined())
                         {
                             var jintExpression = Build(assignmentPattern.Right);
@@ -353,21 +353,21 @@ namespace Jint.Runtime.Interpreter.Expressions
                     }
                     else if (p.Value is BindingPattern bindingPattern)
                     {
-                        source.TryGetValue(sourceKey, out var value);
+                        var value = source.Get(sourceKey);
                         ProcessPatterns(context, bindingPattern, value, environment);
                     }
                     else if (p.Value is MemberExpression memberExpression)
                     {
                         var reference = GetReferenceFromMember(context, memberExpression);
-                        source.TryGetValue(sourceKey, out var value);
+                        var value = source.Get(sourceKey);
                         AssignToReference(context.Engine, reference, value, environment);
                     }
                     else
                     {
                         var identifierReference = p.Value as Identifier;
                         var target = identifierReference ?? identifier;
-                        source.TryGetValue(sourceKey, out var v);
-                        AssignToIdentifier(context.Engine, target!.Name, v, environment, checkReference);
+                        var value = source.Get(sourceKey);
+                        AssignToIdentifier(context.Engine, target!.Name, value, environment, checkReference);
                     }
                 }
                 else