198 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			198 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = void 0;
							 | 
						||
| 
								 | 
							
								var _types = require("../tokenizer/types");
							 | 
						||
| 
								 | 
							
								var _parseError = require("../parse-error");
							 | 
						||
| 
								 | 
							
								const PlaceholderErrors = (0, _parseError.ParseErrorEnum)`placeholders`({
							 | 
						||
| 
								 | 
							
								  ClassNameIsRequired: "A class name is required.",
							 | 
						||
| 
								 | 
							
								  UnexpectedSpace: "Unexpected space in placeholder."
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								var _default = superClass => class PlaceholdersParserMixin extends superClass {
							 | 
						||
| 
								 | 
							
								  parsePlaceholder(expectedNode) {
							 | 
						||
| 
								 | 
							
								    if (this.match(142)) {
							 | 
						||
| 
								 | 
							
								      const node = this.startNode();
							 | 
						||
| 
								 | 
							
								      this.next();
							 | 
						||
| 
								 | 
							
								      this.assertNoSpace();
							 | 
						||
| 
								 | 
							
								      node.name = super.parseIdentifier(true);
							 | 
						||
| 
								 | 
							
								      this.assertNoSpace();
							 | 
						||
| 
								 | 
							
								      this.expect(142);
							 | 
						||
| 
								 | 
							
								      return this.finishPlaceholder(node, expectedNode);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  finishPlaceholder(node, expectedNode) {
							 | 
						||
| 
								 | 
							
								    const isFinished = !!(node.expectedNode && node.type === "Placeholder");
							 | 
						||
| 
								 | 
							
								    node.expectedNode = expectedNode;
							 | 
						||
| 
								 | 
							
								    return isFinished ? node : this.finishNode(node, "Placeholder");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getTokenFromCode(code) {
							 | 
						||
| 
								 | 
							
								    if (code === 37 && this.input.charCodeAt(this.state.pos + 1) === 37) {
							 | 
						||
| 
								 | 
							
								      this.finishOp(142, 2);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      super.getTokenFromCode(code);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseExprAtom(refExpressionErrors) {
							 | 
						||
| 
								 | 
							
								    return this.parsePlaceholder("Expression") || super.parseExprAtom(refExpressionErrors);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseIdentifier(liberal) {
							 | 
						||
| 
								 | 
							
								    return this.parsePlaceholder("Identifier") || super.parseIdentifier(liberal);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  checkReservedWord(word, startLoc, checkKeywords, isBinding) {
							 | 
						||
| 
								 | 
							
								    if (word !== undefined) {
							 | 
						||
| 
								 | 
							
								      super.checkReservedWord(word, startLoc, checkKeywords, isBinding);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseBindingAtom() {
							 | 
						||
| 
								 | 
							
								    return this.parsePlaceholder("Pattern") || super.parseBindingAtom();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  isValidLVal(type, isParenthesized, binding) {
							 | 
						||
| 
								 | 
							
								    return type === "Placeholder" || super.isValidLVal(type, isParenthesized, binding);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  toAssignable(node, isLHS) {
							 | 
						||
| 
								 | 
							
								    if (node && node.type === "Placeholder" && node.expectedNode === "Expression") {
							 | 
						||
| 
								 | 
							
								      node.expectedNode = "Pattern";
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      super.toAssignable(node, isLHS);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  chStartsBindingIdentifier(ch, pos) {
							 | 
						||
| 
								 | 
							
								    if (super.chStartsBindingIdentifier(ch, pos)) {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const nextToken = this.lookahead();
							 | 
						||
| 
								 | 
							
								    if (nextToken.type === 142) {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  verifyBreakContinue(node, isBreak) {
							 | 
						||
| 
								 | 
							
								    if (node.label && node.label.type === "Placeholder") return;
							 | 
						||
| 
								 | 
							
								    super.verifyBreakContinue(node, isBreak);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseExpressionStatement(node, expr) {
							 | 
						||
| 
								 | 
							
								    if (expr.type !== "Placeholder" || expr.extra && expr.extra.parenthesized) {
							 | 
						||
| 
								 | 
							
								      return super.parseExpressionStatement(node, expr);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (this.match(14)) {
							 | 
						||
| 
								 | 
							
								      const stmt = node;
							 | 
						||
| 
								 | 
							
								      stmt.label = this.finishPlaceholder(expr, "Identifier");
							 | 
						||
| 
								 | 
							
								      this.next();
							 | 
						||
| 
								 | 
							
								      stmt.body = super.parseStatementOrSloppyAnnexBFunctionDeclaration();
							 | 
						||
| 
								 | 
							
								      return this.finishNode(stmt, "LabeledStatement");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.semicolon();
							 | 
						||
| 
								 | 
							
								    node.name = expr.name;
							 | 
						||
| 
								 | 
							
								    return this.finishPlaceholder(node, "Statement");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseBlock(allowDirectives, createNewLexicalScope, afterBlockParse) {
							 | 
						||
| 
								 | 
							
								    return this.parsePlaceholder("BlockStatement") || super.parseBlock(allowDirectives, createNewLexicalScope, afterBlockParse);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseFunctionId(requireId) {
							 | 
						||
| 
								 | 
							
								    return this.parsePlaceholder("Identifier") || super.parseFunctionId(requireId);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseClass(node, isStatement, optionalId) {
							 | 
						||
| 
								 | 
							
								    const type = isStatement ? "ClassDeclaration" : "ClassExpression";
							 | 
						||
| 
								 | 
							
								    this.next();
							 | 
						||
| 
								 | 
							
								    const oldStrict = this.state.strict;
							 | 
						||
| 
								 | 
							
								    const placeholder = this.parsePlaceholder("Identifier");
							 | 
						||
| 
								 | 
							
								    if (placeholder) {
							 | 
						||
| 
								 | 
							
								      if (this.match(81) || this.match(142) || this.match(5)) {
							 | 
						||
| 
								 | 
							
								        node.id = placeholder;
							 | 
						||
| 
								 | 
							
								      } else if (optionalId || !isStatement) {
							 | 
						||
| 
								 | 
							
								        node.id = null;
							 | 
						||
| 
								 | 
							
								        node.body = this.finishPlaceholder(placeholder, "ClassBody");
							 | 
						||
| 
								 | 
							
								        return this.finishNode(node, type);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        throw this.raise(PlaceholderErrors.ClassNameIsRequired, {
							 | 
						||
| 
								 | 
							
								          at: this.state.startLoc
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this.parseClassId(node, isStatement, optionalId);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    super.parseClassSuper(node);
							 | 
						||
| 
								 | 
							
								    node.body = this.parsePlaceholder("ClassBody") || super.parseClassBody(!!node.superClass, oldStrict);
							 | 
						||
| 
								 | 
							
								    return this.finishNode(node, type);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseExport(node, decorators) {
							 | 
						||
| 
								 | 
							
								    const placeholder = this.parsePlaceholder("Identifier");
							 | 
						||
| 
								 | 
							
								    if (!placeholder) return super.parseExport(node, decorators);
							 | 
						||
| 
								 | 
							
								    if (!this.isContextual(97) && !this.match(12)) {
							 | 
						||
| 
								 | 
							
								      node.specifiers = [];
							 | 
						||
| 
								 | 
							
								      node.source = null;
							 | 
						||
| 
								 | 
							
								      node.declaration = this.finishPlaceholder(placeholder, "Declaration");
							 | 
						||
| 
								 | 
							
								      return this.finishNode(node, "ExportNamedDeclaration");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.expectPlugin("exportDefaultFrom");
							 | 
						||
| 
								 | 
							
								    const specifier = this.startNode();
							 | 
						||
| 
								 | 
							
								    specifier.exported = placeholder;
							 | 
						||
| 
								 | 
							
								    node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")];
							 | 
						||
| 
								 | 
							
								    return super.parseExport(node, decorators);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  isExportDefaultSpecifier() {
							 | 
						||
| 
								 | 
							
								    if (this.match(65)) {
							 | 
						||
| 
								 | 
							
								      const next = this.nextTokenStart();
							 | 
						||
| 
								 | 
							
								      if (this.isUnparsedContextual(next, "from")) {
							 | 
						||
| 
								 | 
							
								        if (this.input.startsWith((0, _types.tokenLabelName)(142), this.nextTokenStartSince(next + 4))) {
							 | 
						||
| 
								 | 
							
								          return true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return super.isExportDefaultSpecifier();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  maybeParseExportDefaultSpecifier(node, maybeDefaultIdentifier) {
							 | 
						||
| 
								 | 
							
								    var _specifiers;
							 | 
						||
| 
								 | 
							
								    if ((_specifiers = node.specifiers) != null && _specifiers.length) {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return super.maybeParseExportDefaultSpecifier(node, maybeDefaultIdentifier);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  checkExport(node) {
							 | 
						||
| 
								 | 
							
								    const {
							 | 
						||
| 
								 | 
							
								      specifiers
							 | 
						||
| 
								 | 
							
								    } = node;
							 | 
						||
| 
								 | 
							
								    if (specifiers != null && specifiers.length) {
							 | 
						||
| 
								 | 
							
								      node.specifiers = specifiers.filter(node => node.exported.type === "Placeholder");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    super.checkExport(node);
							 | 
						||
| 
								 | 
							
								    node.specifiers = specifiers;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseImport(node) {
							 | 
						||
| 
								 | 
							
								    const placeholder = this.parsePlaceholder("Identifier");
							 | 
						||
| 
								 | 
							
								    if (!placeholder) return super.parseImport(node);
							 | 
						||
| 
								 | 
							
								    node.specifiers = [];
							 | 
						||
| 
								 | 
							
								    if (!this.isContextual(97) && !this.match(12)) {
							 | 
						||
| 
								 | 
							
								      node.source = this.finishPlaceholder(placeholder, "StringLiteral");
							 | 
						||
| 
								 | 
							
								      this.semicolon();
							 | 
						||
| 
								 | 
							
								      return this.finishNode(node, "ImportDeclaration");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const specifier = this.startNodeAtNode(placeholder);
							 | 
						||
| 
								 | 
							
								    specifier.local = placeholder;
							 | 
						||
| 
								 | 
							
								    node.specifiers.push(this.finishNode(specifier, "ImportDefaultSpecifier"));
							 | 
						||
| 
								 | 
							
								    if (this.eat(12)) {
							 | 
						||
| 
								 | 
							
								      const hasStarImport = this.maybeParseStarImportSpecifier(node);
							 | 
						||
| 
								 | 
							
								      if (!hasStarImport) this.parseNamedImportSpecifiers(node);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.expectContextual(97);
							 | 
						||
| 
								 | 
							
								    node.source = this.parseImportSource();
							 | 
						||
| 
								 | 
							
								    this.semicolon();
							 | 
						||
| 
								 | 
							
								    return this.finishNode(node, "ImportDeclaration");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  parseImportSource() {
							 | 
						||
| 
								 | 
							
								    return this.parsePlaceholder("StringLiteral") || super.parseImportSource();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  assertNoSpace() {
							 | 
						||
| 
								 | 
							
								    if (this.state.start > this.state.lastTokEndLoc.index) {
							 | 
						||
| 
								 | 
							
								      this.raise(PlaceholderErrors.UnexpectedSpace, {
							 | 
						||
| 
								 | 
							
								        at: this.state.lastTokEndLoc
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								exports.default = _default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=placeholders.js.map
							 |