summaryrefslogtreecommitdiff
path: root/deps/acorn-plugins/acorn-class-fields/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/acorn-plugins/acorn-class-fields/index.js')
-rw-r--r--deps/acorn-plugins/acorn-class-fields/index.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/deps/acorn-plugins/acorn-class-fields/index.js b/deps/acorn-plugins/acorn-class-fields/index.js
new file mode 100644
index 0000000000..20348c80c6
--- /dev/null
+++ b/deps/acorn-plugins/acorn-class-fields/index.js
@@ -0,0 +1,59 @@
+"use strict"
+
+const acorn = require('internal/deps/acorn/acorn/dist/acorn')
+const tt = acorn.tokTypes
+const privateClassElements = require('internal/deps/acorn-plugins/acorn-private-class-elements/index')
+
+function maybeParseFieldValue(field) {
+ if (this.eat(tt.eq)) {
+ const oldInFieldValue = this._inFieldValue
+ this._inFieldValue = true
+ field.value = this.parseExpression()
+ this._inFieldValue = oldInFieldValue
+ } else field.value = null
+}
+
+module.exports = function(Parser) {
+ Parser = privateClassElements(Parser)
+ return class extends Parser {
+ // Parse fields
+ parseClassElement(_constructorAllowsSuper) {
+ if (this.options.ecmaVersion >= 8 && (this.type == tt.name || this.type == this.privateNameToken || this.type == tt.bracketL || this.type == tt.string)) {
+ const branch = this._branch()
+ if (branch.type == tt.bracketL) {
+ let count = 0
+ do {
+ if (branch.eat(tt.bracketL)) ++count
+ else if (branch.eat(tt.bracketR)) --count
+ else branch.next()
+ } while (count > 0)
+ } else branch.next()
+ if (branch.type == tt.eq || branch.canInsertSemicolon() || branch.type == tt.semi) {
+ const node = this.startNode()
+ if (this.type == this.privateNameToken) {
+ this.parsePrivateClassElementName(node)
+ } else {
+ this.parsePropertyName(node)
+ }
+ if ((node.key.type === "Identifier" && node.key.name === "constructor") ||
+ (node.key.type === "Literal" && node.key.value === "constructor")) {
+ this.raise(node.key.start, "Classes may not have a field called constructor")
+ }
+ maybeParseFieldValue.call(this, node)
+ this.finishNode(node, "FieldDefinition")
+ this.semicolon()
+ return node
+ }
+ }
+
+ return super.parseClassElement.apply(this, arguments)
+ }
+
+ // Prohibit arguments in class field initializers
+ parseIdent(liberal, isBinding) {
+ const ident = super.parseIdent(liberal, isBinding)
+ if (this._inFieldValue && ident.name == "arguments") this.raise(ident.start, "A class field initializer may not contain arguments")
+ return ident
+ }
+ }
+}