Pārlūkot izejas kodu

Set "Computed" property on method definitions in object literals

Dmitry Panov 2 gadi atpakaļ
vecāks
revīzija
2e4cbb9852
2 mainītis faili ar 31 papildinājumiem un 7 dzēšanām
  1. 22 0
      compiler_test.go
  2. 9 7
      parser/expression.go

+ 22 - 0
compiler_test.go

@@ -5727,6 +5727,28 @@ func TestAsyncFunc(t *testing.T) {
 	testAsyncFunc(SCRIPT, valueTrue, t)
 }
 
+func TestObjectLiteralComputedMethodKeys(t *testing.T) {
+	_, err := Compile("", `
+		({
+		    ["__proto__"]() {},
+		    ["__proto__"]() {}
+		})
+	`, false)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	_, err = Compile("", `
+		({
+		    get ["__proto__"]() {},
+		    get ["__proto__"]() {}
+		})
+	`, false)
+	if err != nil {
+		t.Fatal(err)
+	}
+}
+
 /*
 func TestBabel(t *testing.T) {
 	src, err := os.ReadFile("babel7.js")

+ 9 - 7
parser/expression.go

@@ -404,9 +404,10 @@ func (self *_parser) parseObjectProperty() ast.Property {
 		switch {
 		case self.token == token.LEFT_PARENTHESIS:
 			return &ast.PropertyKeyed{
-				Key:   value,
-				Kind:  ast.PropertyKindMethod,
-				Value: self.parseMethodDefinition(keyStartIdx, ast.PropertyKindMethod, false),
+				Key:      value,
+				Kind:     ast.PropertyKindMethod,
+				Value:    self.parseMethodDefinition(keyStartIdx, ast.PropertyKindMethod, false),
+				Computed: tkn == token.ILLEGAL,
 			}
 		case self.token == token.COMMA || self.token == token.RIGHT_BRACE || self.token == token.ASSIGN: // shorthand property
 			if self.isBindingId(tkn) {
@@ -428,7 +429,7 @@ func (self *_parser) parseObjectProperty() ast.Property {
 				self.errorUnexpectedToken(self.token)
 			}
 		case (literal == "get" || literal == "set" || tkn == token.ASYNC) && self.token != token.COLON:
-			_, _, keyValue, _ := self.parseObjectPropertyKey()
+			_, _, keyValue, tkn1 := self.parseObjectPropertyKey()
 			if keyValue == nil {
 				return nil
 			}
@@ -445,9 +446,10 @@ func (self *_parser) parseObjectProperty() ast.Property {
 			}
 
 			return &ast.PropertyKeyed{
-				Key:   keyValue,
-				Kind:  kind,
-				Value: self.parseMethodDefinition(keyStartIdx, kind, async),
+				Key:      keyValue,
+				Kind:     kind,
+				Value:    self.parseMethodDefinition(keyStartIdx, kind, async),
+				Computed: tkn1 == token.ILLEGAL,
 			}
 		}
 	}