Procházet zdrojové kódy

Improve invalid class private member access member errors (#1922)

Marko Lahma před 1 rokem
rodič
revize
dc129c7cd5

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

@@ -1,3 +1,5 @@
+using Jint.Runtime;
+
 namespace Jint.Tests.Runtime;
 
 public class ClassTests
@@ -45,4 +47,33 @@ public class ClassTests
         Assert.Equal(10, engine.Evaluate("board.width"));
         Assert.Equal(20, engine.Evaluate("board.doubleWidth "));
     }
+
+    [Fact]
+    public void PrivateMemberAccessOutsideOfClass()
+    {
+        var ex = Assert.Throws<JavaScriptException>(() => new Engine().Evaluate
+        (
+            """
+            class A { }
+
+            new A().#nonexistent = 1;
+            """
+        ));
+
+        Assert.Equal("Unexpected identifier '#nonexistent'", ex.Message);
+    }
+
+    [Fact]
+    public void PrivateMemberAccessAgainstUnknownMemberInConstructor()
+    {
+        var ex = Assert.Throws<JavaScriptException>(() => new Engine().Evaluate
+        (
+            """
+            class A { constructor() { #nonexistent = 2; } }
+            new A();
+            """
+        ));
+
+        Assert.Equal("Unexpected identifier '#nonexistent'", ex.Message);
+    }
 }

+ 2 - 2
Jint/Runtime/Interpreter/Expressions/JintPrivateIdentifierExpression.cs

@@ -14,13 +14,13 @@ internal sealed class JintPrivateIdentifierExpression : JintExpression
         var engine = context.Engine;
         var env = engine.ExecutionContext.PrivateEnvironment;
 
-        var privateIdentifier = env!.ResolvePrivateIdentifier(_privateIdentifierString);
+        var privateIdentifier = env?.ResolvePrivateIdentifier(_privateIdentifierString);
         if (privateIdentifier is not null)
         {
             return privateIdentifier;
         }
 
-        ExceptionHelper.ThrowReferenceError(engine.Realm, "TODO Not found!!");
+        ExceptionHelper.ThrowSyntaxError(engine.Realm, $"Unexpected identifier '#{_privateIdentifierString}'");
         return null;
     }
 }