diff options
Diffstat (limited to 'deps/acorn-plugins/acorn-class-fields/index.js')
-rw-r--r-- | deps/acorn-plugins/acorn-class-fields/index.js | 59 |
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 + } + } +} |