Repository: swc-project/swc (rust)

Issue:
Unexpected token `.`. Expected identifier, string literal, numeric literal or [ for the computed key
### Describe the bug

When using decorators that have changed function calls, there is a transpilation error.

### Input code

```typescript
import * as joiful from 'joiful';

class Schema {
  @joiful.string().guid().required()
  public id: string;
}
```


### Config

```json
{
    "jsc": {
        "parser": {
            "syntax": "typescript",
            "decorators": true
        },
        "transform": {
            "legacyDecorator": true,
            "decoratorMetadata": true
        }
    },
    "module": {
        "type": "commonjs"
    },
    "sourceMaps": "inline"
}
```


### Playground link

https://play.swc.rs/?version=1.2.133&code=H4sIAAAAAAAAA8vMLcgvKlHQUkgsVsjKz0wrzVFIK8rPVVCHcNStubiScxKLixWCkzNScxMVqrkUgMABIqtXXFKUmZeuoamXXpqZAqSKUgtLM4tSgUywsswUKwWIEmuuWi4A7bsqiWsAAAA%3D&config=H4sIAAAAAAAAA03NQQoDIQyF4btkPSdw3e0cIsS0OKiRJEJlmLtXaQe6C%2BR9%2FCccRhBOaKjGui4b1fENAXw0NtLUHDaITKLoogbBtfO1gStWe4qWpTK%2FkMbjXn1Hf2xnx4iOPz15kdgzL7tCs0dSitTDYD5NuhLv2GYOUs2pMlwfBDeAbK0AAAA%3D

### Expected behavior

The class and decorators should be transpiled.

### Actual behavior

Error occurs saying 

```
Caused by:
    0: failed to process js file
    1: Syntax Error
error: Unexpected token `.`. Expected identifier, string literal, numeric literal or [ for the computed key
```

### Version

1.2.133

### Additional context

_No response_

Pull request description:
fix(es/parser): Fix parsing of decorators
**Description:**

swc_ecma_parser:
 - Parse decorators using `parse_subscripts`.

**Related issue (if exists):**

 - Closes #3337

Patch:
diff --git a/crates/swc_ecma_parser/src/parser/class_and_fn.rs b/crates/swc_ecma_parser/src/parser/class_and_fn.rs
index 1d5728db0a..d10e122565 100644
--- a/crates/swc_ecma_parser/src/parser/class_and_fn.rs
+++ b/crates/swc_ecma_parser/src/parser/class_and_fn.rs
@@ -192,6 +192,7 @@ impl<'a, I: Tokens> Parser<I> {
         if !self.syntax().decorators() {
             return Ok(vec![]);
         }
+        trace_cur!(self, parse_decorators);
 
         let mut decorators = vec![];
         let start = cur_pos!(self);
@@ -221,6 +222,7 @@ impl<'a, I: Tokens> Parser<I> {
 
     fn parse_decorator(&mut self) -> PResult<Decorator> {
         let start = cur_pos!(self);
+        trace_cur!(self, parse_decorator);
 
         assert_and_bump!(self, '@');
 
@@ -229,24 +231,12 @@ impl<'a, I: Tokens> Parser<I> {
             expect!(self, ')');
             expr
         } else {
-            let mut expr = self
+            let expr = self
                 .parse_ident(false, false)
                 .map(Expr::from)
                 .map(Box::new)?;
 
-            while eat!(self, '.') {
-                let ident = self.parse_ident(true, true)?;
-
-                let span = Span::new(start, expr.span().hi(), Default::default());
-
-                expr = Box::new(Expr::Member(MemberExpr {
-                    span,
-                    obj: expr,
-                    prop: MemberProp::Ident(ident),
-                }));
-            }
-
-            expr
+            self.parse_subscripts(Callee::Expr(expr), false, true)?
         };
 
         let expr = self.parse_maybe_decorator_args(expr)?;
diff --git a/crates/swc_ecma_parser/src/parser/expr.rs b/crates/swc_ecma_parser/src/parser/expr.rs
index 00ceddfa3e..c4c51dee2f 100644
--- a/crates/swc_ecma_parser/src/parser/expr.rs
+++ b/crates/swc_ecma_parser/src/parser/expr.rs
@@ -506,7 +506,7 @@ impl<'a, I: Tokens> Parser<I> {
                         kind: MetaPropKind::NewTarget,
                     }));
 
-                    return self.parse_subscripts(Callee::Expr(expr), true);
+                    return self.parse_subscripts(Callee::Expr(expr), true, false);
                 }
 
                 unexpected!(self, "target")
@@ -542,7 +542,7 @@ impl<'a, I: Tokens> Parser<I> {
 
                 // We should parse subscripts for MemberExpression.
                 // Because it's left recursive.
-                return self.parse_subscripts(new_expr, true);
+                return self.parse_subscripts(new_expr, true, false);
             }
 
             // Parsed with 'NewExpression' production.
@@ -559,18 +559,18 @@ impl<'a, I: Tokens> Parser<I> {
             let base = Callee::Super(Super {
                 span: span!(self, start),
             });
-            return self.parse_subscripts(base, true);
+            return self.parse_subscripts(base, true, false);
         }
         if eat!(self, "import") {
             let base = Callee::Import(Import {
                 span: span!(self, start),
             });
-            return self.parse_subscripts(base, true);
+            return self.parse_subscripts(base, true, false);
         }
         let obj = self.parse_primary_expr()?;
         return_if_arrow!(self, obj);
 
-        self.parse_subscripts(Callee::Expr(obj), true)
+        self.parse_subscripts(Callee::Expr(obj), true, false)
     }
 
     /// Parse `NewExpression`.
@@ -973,10 +973,15 @@ impl<'a, I: Tokens> Parser<I> {
         })
     }
 
-    fn parse_subscripts(&mut self, mut obj: Callee, no_call: bool) -> PResult<Box<Expr>> {
+    pub(super) fn parse_subscripts(
+        &mut self,
+        mut obj: Callee,
+        no_call: bool,
+        no_computed_member: bool,
+    ) -> PResult<Box<Expr>> {
         let start = obj.span().lo;
         loop {
-            obj = match self.parse_subscript(start, obj, no_call)? {
+            obj = match self.parse_subscript(start, obj, no_call, no_computed_member)? {
                 (expr, false) => return Ok(expr),
                 (expr, true) => Callee::Expr(expr),
             }
@@ -989,6 +994,7 @@ impl<'a, I: Tokens> Parser<I> {
         start: BytePos,
         mut obj: Callee,
         no_call: bool,
+        no_computed_member: bool,
     ) -> PResult<(Box<Expr>, bool)> {
         let _ = cur!(self, false);
 
@@ -1114,12 +1120,13 @@ impl<'a, I: Tokens> Parser<I> {
         }
 
         // $obj[name()]
-        if (question_dot_token.is_some()
-            && is!(self, '.')
-            && peeked_is!(self, '[')
-            && eat!(self, '.')
-            && eat!(self, '['))
-            || eat!(self, '[')
+        if !no_computed_member
+            && ((question_dot_token.is_some()
+                && is!(self, '.')
+                && peeked_is!(self, '[')
+                && eat!(self, '.')
+                && eat!(self, '['))
+                || eat!(self, '['))
         {
             let bracket_lo = self.input.prev_span().lo;
             let prop = self.include_in_expr(true).parse_expr()?;
@@ -1338,13 +1345,13 @@ impl<'a, I: Tokens> Parser<I> {
             let obj = Callee::Super(Super {
                 span: span!(self, start),
             });
-            return self.parse_subscripts(obj, false);
+            return self.parse_subscripts(obj, false, false);
         }
         if eat!(self, "import") {
             let obj = Callee::Import(Import {
                 span: span!(self, start),
             });
-            return self.parse_subscripts(obj, false);
+            return self.parse_subscripts(obj, false, false);
         }
 
         let callee = self.parse_new_expr()?;
@@ -1401,7 +1408,7 @@ impl<'a, I: Tokens> Parser<I> {
                 type_args,
             }));
 
-            return self.parse_subscripts(Callee::Expr(call_expr), false);
+            return self.parse_subscripts(Callee::Expr(call_expr), false, false);
         }
         if type_args.is_some() {
             // This fails
@@ -1797,7 +1804,7 @@ impl<'a, I: Tokens> Parser<I> {
             type_args: Default::default(),
         }));
 
-        self.parse_subscripts(Callee::Expr(import), true)
+        self.parse_subscripts(Callee::Expr(import), true, false)
     }
 
     pub(super) fn check_assign_target(&mut self, expr: &Expr, deny_call: bool) {
diff --git a/crates/swc_ecma_parser/src/parser/macros.rs b/crates/swc_ecma_parser/src/parser/macros.rs
index cb094159a9..b52572efee 100644
--- a/crates/swc_ecma_parser/src/parser/macros.rs
+++ b/crates/swc_ecma_parser/src/parser/macros.rs
@@ -355,6 +355,16 @@ macro_rules! syntax_error {
 
     ($p:expr, $span:expr, $err:expr) => {{
         let err = make_error!($p, $span, $err);
+
+        if cfg!(feature = "debug") {
+            tracing::error!(
+                "Syntax error called from {}:{}:{}\nCurrent token = {:?}",
+                file!(),
+                line!(),
+                column!(),
+                $p.input.cur()
+            );
+        }
         return Err(err.into());
     }};
 }


Test patch:
diff --git a/crates/swc/tests/fixture/issue-3337/input/.swcrc b/crates/swc/tests/fixture/issue-3337/input/.swcrc
new file mode 100644
index 0000000000..8ded2457fb
--- /dev/null
+++ b/crates/swc/tests/fixture/issue-3337/input/.swcrc
@@ -0,0 +1,15 @@
+{
+    "jsc": {
+        "parser": {
+            "syntax": "typescript",
+            "decorators": true
+        },
+        "transform": {
+            "legacyDecorator": true,
+            "decoratorMetadata": true
+        }
+    },
+    "module": {
+        "type": "commonjs"
+    }
+}
\ No newline at end of file
diff --git a/crates/swc/tests/fixture/issue-3337/input/input.ts b/crates/swc/tests/fixture/issue-3337/input/input.ts
new file mode 100644
index 0000000000..4bdcfe1a81
--- /dev/null
+++ b/crates/swc/tests/fixture/issue-3337/input/input.ts
@@ -0,0 +1,6 @@
+import * as joiful from 'joiful';
+
+class Schema {
+    @joiful.string().guid().required()
+    public id: string;
+}
diff --git a/crates/swc/tests/fixture/issue-3337/output/input.ts b/crates/swc/tests/fixture/issue-3337/output/input.ts
new file mode 100644
index 0000000000..0467bd0a8b
--- /dev/null
+++ b/crates/swc/tests/fixture/issue-3337/output/input.ts
@@ -0,0 +1,79 @@
+"use strict";
+var joiful = _interopRequireWildcard(require("joiful"));
+function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
+    var desc = {};
+    Object.keys(descriptor).forEach(function(key) {
+        desc[key] = descriptor[key];
+    });
+    desc.enumerable = !!desc.enumerable;
+    desc.configurable = !!desc.configurable;
+    if ("value" in desc || desc.initializer) {
+        desc.writable = true;
+    }
+    desc = decorators.slice().reverse().reduce(function(desc, decorator) {
+        return decorator ? decorator(target, property, desc) || desc : desc;
+    }, desc);
+    if (context && desc.initializer !== void 0) {
+        desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
+        desc.initializer = undefined;
+    }
+    var own = Object.getOwnPropertyDescriptor(target, property);
+    if (own && (own.get || own.set)) {
+        delete desc.writable;
+        delete desc.initializer;
+    }
+    if (desc.initializer === void 0) {
+        Object.defineProperty(target, property, desc);
+        desc = null;
+    }
+    return desc;
+}
+function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+        throw new TypeError("Cannot call a class as a function");
+    }
+}
+function _initializerDefineProperty(target, property, descriptor, context) {
+    if (!descriptor) return;
+    Object.defineProperty(target, property, {
+        enumerable: descriptor.enumerable,
+        configurable: descriptor.configurable,
+        writable: descriptor.writable,
+        value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
+    });
+}
+function _interopRequireWildcard(obj) {
+    if (obj && obj.__esModule) {
+        return obj;
+    } else {
+        var newObj = {};
+        if (obj != null) {
+            for(var key in obj){
+                if (Object.prototype.hasOwnProperty.call(obj, key)) {
+                    var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
+                    if (desc.get || desc.set) {
+                        Object.defineProperty(newObj, key, desc);
+                    } else {
+                        newObj[key] = obj[key];
+                    }
+                }
+            }
+        }
+        newObj.default = obj;
+        return newObj;
+    }
+}
+var _class, _descriptor, _dec, _dec1;
+var Schema = ((_class = function Schema() {
+    "use strict";
+    _classCallCheck(this, Schema);
+    _initializerDefineProperty(this, "id", _descriptor, this);
+}) || _class, _dec = joiful.string().guid().required(), _dec1 = typeof Reflect !== "undefined" && typeof Reflect.metadata === "function" && Reflect.metadata("design:type", String), _descriptor = _applyDecoratedDescriptor(_class.prototype, "id", [
+    _dec,
+    _dec1
+], {
+    configurable: true,
+    enumerable: true,
+    writable: true,
+    initializer: void 0
+}), _class);
diff --git a/crates/swc/tests/projects.rs b/crates/swc/tests/projects.rs
index 9c5d1d3950..941803661e 100644
--- a/crates/swc/tests/projects.rs
+++ b/crates/swc/tests/projects.rs
@@ -286,7 +286,7 @@ fn issue_414() {
 fn issue_415() {
     let s = file("tests/projects/issue-415/input.js").unwrap();
 
-    assert!(s.replace(" ", "").contains("return(/*#__PURE__*/"));
+    assert!(s.replace(' ', "").contains("return(/*#__PURE__*/"));
 }
 
 #[test]
@@ -313,7 +313,7 @@ fn issue_468() {
 fn issue_528() {
     let f = file("tests/projects/issue-528/input.js")
         .unwrap()
-        .replace(" ", "");
+        .replace(' ', "");
     let f = f.trim();
 
     println!("{}", f);
@@ -335,7 +335,7 @@ b)
 fn env_entry_chrome_49() {
     let f = file("tests/env/entry/chrome-49/input.js")
         .unwrap()
-        .replace(" ", "");
+        .replace(' ', "");
     let f = f.trim();
 
     println!("{}", f);
@@ -347,7 +347,7 @@ fn env_entry_chrome_49() {
 fn env_entry_chrome_71() {
     let f = file("tests/env/entry/chrome-71/input.js")
         .unwrap()
-        .replace(" ", "");
+        .replace(' ', "");
     let f = f.trim();
 
     println!("{}", f);
@@ -359,7 +359,7 @@ fn env_entry_chrome_71() {
 fn env_query_chrome_71() {
     let f = file("tests/env/query/chrome-71/input.js")
         .unwrap()
-        .replace(" ", "");
+        .replace(' ', "");
     let f = f.trim();
 
     println!("{}", f);
diff --git a/crates/swc_ecma_parser/tests/typescript/decorators/type-arguments/input.ts.json b/crates/swc_ecma_parser/tests/typescript/decorators/type-arguments/input.ts.json
index 963992e69d..2c2180a2dd 100644
--- a/crates/swc_ecma_parser/tests/typescript/decorators/type-arguments/input.ts.json
+++ b/crates/swc_ecma_parser/tests/typescript/decorators/type-arguments/input.ts.json
@@ -50,7 +50,25 @@
               "optional": false
             },
             "arguments": [],
-            "typeArguments": null
+            "typeArguments": {
+              "type": "TsTypeParameterInstantiation",
+              "span": {
+                "start": 10,
+                "end": 18,
+                "ctxt": 0
+              },
+              "params": [
+                {
+                  "type": "TsKeywordType",
+                  "span": {
+                    "start": 11,
+                    "end": 17,
+                    "ctxt": 0
+                  },
+                  "kind": "string"
+                }
+              ]
+            }
           }
         }
       ],
diff --git a/crates/swc_ecma_parser/tests/typescript/issue-3337/input.ts b/crates/swc_ecma_parser/tests/typescript/issue-3337/input.ts
new file mode 100644
index 0000000000..7fb9b7765b
--- /dev/null
+++ b/crates/swc_ecma_parser/tests/typescript/issue-3337/input.ts
@@ -0,0 +1,6 @@
+import * as joiful from 'joiful';
+
+class Schema {
+    @joiful.string().guid().required()
+    public id: string;
+}
\ No newline at end of file
diff --git a/crates/swc_ecma_parser/tests/typescript/issue-3337/input.ts.json b/crates/swc_ecma_parser/tests/typescript/issue-3337/input.ts.json
new file mode 100644
index 0000000000..56ed560a6e
--- /dev/null
+++ b/crates/swc_ecma_parser/tests/typescript/issue-3337/input.ts.json
@@ -0,0 +1,230 @@
+{
+  "type": "Module",
+  "span": {
+    "start": 0,
+    "end": 113,
+    "ctxt": 0
+  },
+  "body": [
+    {
+      "type": "ImportDeclaration",
+      "span": {
+        "start": 0,
+        "end": 33,
+        "ctxt": 0
+      },
+      "specifiers": [
+        {
+          "type": "ImportNamespaceSpecifier",
+          "span": {
+            "start": 7,
+            "end": 18,
+            "ctxt": 0
+          },
+          "local": {
+            "type": "Identifier",
+            "span": {
+              "start": 12,
+              "end": 18,
+              "ctxt": 0
+            },
+            "value": "joiful",
+            "optional": false
+          }
+        }
+      ],
+      "source": {
+        "type": "StringLiteral",
+        "span": {
+          "start": 24,
+          "end": 32,
+          "ctxt": 0
+        },
+        "value": "joiful",
+        "hasEscape": false,
+        "kind": {
+          "type": "normal",
+          "containsQuote": true
+        }
+      },
+      "typeOnly": false,
+      "asserts": null
+    },
+    {
+      "type": "ClassDeclaration",
+      "identifier": {
+        "type": "Identifier",
+        "span": {
+          "start": 41,
+          "end": 47,
+          "ctxt": 0
+        },
+        "value": "Schema",
+        "optional": false
+      },
+      "declare": false,
+      "span": {
+        "start": 35,
+        "end": 113,
+        "ctxt": 0
+      },
+      "decorators": [],
+      "body": [
+        {
+          "type": "ClassProperty",
+          "span": {
+            "start": 54,
+            "end": 111,
+            "ctxt": 0
+          },
+          "key": {
+            "type": "Identifier",
+            "span": {
+              "start": 100,
+              "end": 102,
+              "ctxt": 0
+            },
+            "value": "id",
+            "optional": false
+          },
+          "value": null,
+          "typeAnnotation": {
+            "type": "TsTypeAnnotation",
+            "span": {
+              "start": 102,
+              "end": 110,
+              "ctxt": 0
+            },
+            "typeAnnotation": {
+              "type": "TsKeywordType",
+              "span": {
+                "start": 104,
+                "end": 110,
+                "ctxt": 0
+              },
+              "kind": "string"
+            }
+          },
+          "isStatic": false,
+          "decorators": [
+            {
+              "type": "Decorator",
+              "span": {
+                "start": 54,
+                "end": 88,
+                "ctxt": 0
+              },
+              "expression": {
+                "type": "CallExpression",
+                "span": {
+                  "start": 55,
+                  "end": 88,
+                  "ctxt": 0
+                },
+                "callee": {
+                  "type": "MemberExpression",
+                  "span": {
+                    "start": 55,
+                    "end": 86,
+                    "ctxt": 0
+                  },
+                  "object": {
+                    "type": "CallExpression",
+                    "span": {
+                      "start": 55,
+                      "end": 77,
+                      "ctxt": 0
+                    },
+                    "callee": {
+                      "type": "MemberExpression",
+                      "span": {
+                        "start": 55,
+                        "end": 75,
+                        "ctxt": 0
+                      },
+                      "object": {
+                        "type": "CallExpression",
+                        "span": {
+                          "start": 55,
+                          "end": 70,
+                          "ctxt": 0
+                        },
+                        "callee": {
+                          "type": "MemberExpression",
+                          "span": {
+                            "start": 55,
+                            "end": 68,
+                            "ctxt": 0
+                          },
+                          "object": {
+                            "type": "Identifier",
+                            "span": {
+                              "start": 55,
+                              "end": 61,
+                              "ctxt": 0
+                            },
+                            "value": "joiful",
+                            "optional": false
+                          },
+                          "property": {
+                            "type": "Identifier",
+                            "span": {
+                              "start": 62,
+                              "end": 68,
+                              "ctxt": 0
+                            },
+                            "value": "string",
+                            "optional": false
+                          }
+                        },
+                        "arguments": [],
+                        "typeArguments": null
+                      },
+                      "property": {
+                        "type": "Identifier",
+                        "span": {
+                          "start": 71,
+                          "end": 75,
+                          "ctxt": 0
+                        },
+                        "value": "guid",
+                        "optional": false
+                      }
+                    },
+                    "arguments": [],
+                    "typeArguments": null
+                  },
+                  "property": {
+                    "type": "Identifier",
+                    "span": {
+                      "start": 78,
+                      "end": 86,
+                      "ctxt": 0
+                    },
+                    "value": "required",
+                    "optional": false
+                  }
+                },
+                "arguments": [],
+                "typeArguments": null
+              }
+            }
+          ],
+          "accessibility": "public",
+          "isAbstract": false,
+          "isOptional": false,
+          "isOverride": false,
+          "readonly": false,
+          "declare": false,
+          "definite": false
+        }
+      ],
+      "superClass": null,
+      "isAbstract": false,
+      "typeParams": null,
+      "superTypeParams": null,
+      "implements": []
+    }
+  ],
+  "interpreter": null
+}
diff --git a/crates/swc_ecma_parser/tests/typescript/issue-913/input.ts.json b/crates/swc_ecma_parser/tests/typescript/issue-913/input.ts.json
index d0c03f723e..a4742cb239 100644
--- a/crates/swc_ecma_parser/tests/typescript/issue-913/input.ts.json
+++ b/crates/swc_ecma_parser/tests/typescript/issue-913/input.ts.json
@@ -9132,22 +9132,22 @@
           "expression": {
             "type": "CallExpression",
             "span": {
-              "start": 7761,
+              "start": 7762,
               "end": 7819,
               "ctxt": 0
             },
             "callee": {
               "type": "MemberExpression",
               "span": {
-                "start": 7761,
-                "end": 7767,
+                "start": 7762,
+                "end": 7783,
                 "ctxt": 0
               },
               "object": {
                 "type": "MemberExpression",
                 "span": {
-                  "start": 7761,
-                  "end": 7767,
+                  "start": 7762,
+                  "end": 7772,
                   "ctxt": 0
                 },
                 "object": {
@@ -9987,22 +9987,22 @@
           "expression": {
             "type": "CallExpression",
             "span": {
-              "start": 8295,
+              "start": 8296,
               "end": 8387,
               "ctxt": 0
             },
             "callee": {
               "type": "MemberExpression",
               "span": {
-                "start": 8295,
-                "end": 8301,
+                "start": 8296,
+                "end": 8317,
                 "ctxt": 0
               },
               "object": {
                 "type": "MemberExpression",
                 "span": {
-                  "start": 8295,
-                  "end": 8301,
+                  "start": 8296,
+                  "end": 8306,
                   "ctxt": 0
                 },
                 "object": {
@@ -10855,22 +10855,22 @@
           "expression": {
             "type": "CallExpression",
             "span": {
-              "start": 8871,
+              "start": 8872,
               "end": 8968,
               "ctxt": 0
             },
             "callee": {
               "type": "MemberExpression",
               "span": {
-                "start": 8871,
-                "end": 8877,
+                "start": 8872,
+                "end": 8893,
                 "ctxt": 0
               },
               "object": {
                 "type": "MemberExpression",
                 "span": {
-                  "start": 8871,
-                  "end": 8877,
+                  "start": 8872,
+                  "end": 8882,
                   "ctxt": 0
                 },
                 "object": {
@@ -11437,22 +11437,22 @@
           "expression": {
             "type": "CallExpression",
             "span": {
-              "start": 9268,
+              "start": 9269,
               "end": 9404,
               "ctxt": 0
             },
             "callee": {
               "type": "MemberExpression",
               "span": {
-                "start": 9268,
-                "end": 9274,
+                "start": 9269,
+                "end": 9290,
                 "ctxt": 0
               },
               "object": {
                 "type": "MemberExpression",
                 "span": {
-                  "start": 9268,
-                  "end": 9274,
+                  "start": 9269,
+                  "end": 9279,
                   "ctxt": 0
                 },
                 "object": {
@@ -12364,22 +12364,22 @@
                 "expression": {
                   "type": "CallExpression",
                   "span": {
-                    "start": 9930,
+                    "start": 9931,
                     "end": 9988,
                     "ctxt": 0
                   },
                   "callee": {
                     "type": "MemberExpression",
                     "span": {
-                      "start": 9930,
-                      "end": 9936,
+                      "start": 9931,
+                      "end": 9952,
                       "ctxt": 0
                     },
                     "object": {
                       "type": "MemberExpression",
                       "span": {
-                        "start": 9930,
-                        "end": 9936,
+                        "start": 9931,
+                        "end": 9941,
                         "ctxt": 0
                       },
                       "object": {
@@ -13219,22 +13219,22 @@
                 "expression": {
                   "type": "CallExpression",
                   "span": {
-                    "start": 10468,
+                    "start": 10469,
                     "end": 10531,
                     "ctxt": 0
                   },
                   "callee": {
                     "type": "MemberExpression",
                     "span": {
-                      "start": 10468,
-                      "end": 10474,
+                      "start": 10469,
+                      "end": 10490,
                       "ctxt": 0
                     },
                     "object": {
                       "type": "MemberExpression",
                       "span": {
-                        "start": 10468,
-                        "end": 10474,
+                        "start": 10469,
+                        "end": 10479,
                         "ctxt": 0
                       },
                       "object": {
@@ -13788,22 +13788,22 @@
                 "expression": {
                   "type": "CallExpression",
                   "span": {
-                    "start": 10837,
+                    "start": 10838,
                     "end": 10937,
                     "ctxt": 0
                   },
                   "callee": {
                     "type": "MemberExpression",
                     "span": {
-                      "start": 10837,
-                      "end": 10843,
+                      "start": 10838,
+                      "end": 10859,
                       "ctxt": 0
                     },
                     "object": {
                       "type": "MemberExpression",
                       "span": {
-                        "start": 10837,
-                        "end": 10843,
+                        "start": 10838,
+                        "end": 10848,
                         "ctxt": 0
                       },
                       "object": {
@@ -14656,22 +14656,22 @@
                 "expression": {
                   "type": "CallExpression",
                   "span": {
-                    "start": 11425,
+                    "start": 11426,
                     "end": 11530,
                     "ctxt": 0
                   },
                   "callee": {
                     "type": "MemberExpression",
                     "span": {
-                      "start": 11425,
-                      "end": 11431,
+                      "start": 11426,
+                      "end": 11447,
                       "ctxt": 0
                     },
                     "object": {
                       "type": "MemberExpression",
                       "span": {
-                        "start": 11425,
-                        "end": 11431,
+                        "start": 11426,
+                        "end": 11436,
                         "ctxt": 0
                       },
                       "object": {