You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
6.9 KiB
198 lines
6.9 KiB
2 years ago
|
"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
|