"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
value: true
|
});
|
exports.default = exports.ExpressionErrors = void 0;
|
var _types = require("../tokenizer/types");
|
var _tokenizer = require("../tokenizer");
|
var _whitespace = require("../util/whitespace");
|
var _identifier = require("../util/identifier");
|
var _classScope = require("../util/class-scope");
|
var _expressionScope = require("../util/expression-scope");
|
var _scopeflags = require("../util/scopeflags");
|
var _productionParameter = require("../util/production-parameter");
|
var _parseError = require("../parse-error");
|
class UtilParser extends _tokenizer.default {
|
addExtra(node, key, value, enumerable = true) {
|
if (!node) return;
|
const extra = node.extra = node.extra || {};
|
if (enumerable) {
|
extra[key] = value;
|
} else {
|
Object.defineProperty(extra, key, {
|
enumerable,
|
value
|
});
|
}
|
}
|
isContextual(token) {
|
return this.state.type === token && !this.state.containsEsc;
|
}
|
isUnparsedContextual(nameStart, name) {
|
const nameEnd = nameStart + name.length;
|
if (this.input.slice(nameStart, nameEnd) === name) {
|
const nextCh = this.input.charCodeAt(nameEnd);
|
return !((0, _identifier.isIdentifierChar)(nextCh) || (nextCh & 0xfc00) === 0xd800);
|
}
|
return false;
|
}
|
isLookaheadContextual(name) {
|
const next = this.nextTokenStart();
|
return this.isUnparsedContextual(next, name);
|
}
|
eatContextual(token) {
|
if (this.isContextual(token)) {
|
this.next();
|
return true;
|
}
|
return false;
|
}
|
expectContextual(token, toParseError) {
|
if (!this.eatContextual(token)) {
|
if (toParseError != null) {
|
throw this.raise(toParseError, {
|
at: this.state.startLoc
|
});
|
}
|
this.unexpected(null, token);
|
}
|
}
|
canInsertSemicolon() {
|
return this.match(137) || this.match(8) || this.hasPrecedingLineBreak();
|
}
|
hasPrecedingLineBreak() {
|
return _whitespace.lineBreak.test(this.input.slice(this.state.lastTokEndLoc.index, this.state.start));
|
}
|
hasFollowingLineBreak() {
|
_whitespace.skipWhiteSpaceToLineBreak.lastIndex = this.state.end;
|
return _whitespace.skipWhiteSpaceToLineBreak.test(this.input);
|
}
|
isLineTerminator() {
|
return this.eat(13) || this.canInsertSemicolon();
|
}
|
semicolon(allowAsi = true) {
|
if (allowAsi ? this.isLineTerminator() : this.eat(13)) return;
|
this.raise(_parseError.Errors.MissingSemicolon, {
|
at: this.state.lastTokEndLoc
|
});
|
}
|
expect(type, loc) {
|
this.eat(type) || this.unexpected(loc, type);
|
}
|
tryParse(fn, oldState = this.state.clone()) {
|
const abortSignal = {
|
node: null
|
};
|
try {
|
const node = fn((node = null) => {
|
abortSignal.node = node;
|
throw abortSignal;
|
});
|
if (this.state.errors.length > oldState.errors.length) {
|
const failState = this.state;
|
this.state = oldState;
|
this.state.tokensLength = failState.tokensLength;
|
return {
|
node,
|
error: failState.errors[oldState.errors.length],
|
thrown: false,
|
aborted: false,
|
failState
|
};
|
}
|
return {
|
node,
|
error: null,
|
thrown: false,
|
aborted: false,
|
failState: null
|
};
|
} catch (error) {
|
const failState = this.state;
|
this.state = oldState;
|
if (error instanceof SyntaxError) {
|
return {
|
node: null,
|
error,
|
thrown: true,
|
aborted: false,
|
failState
|
};
|
}
|
if (error === abortSignal) {
|
return {
|
node: abortSignal.node,
|
error: null,
|
thrown: false,
|
aborted: true,
|
failState
|
};
|
}
|
throw error;
|
}
|
}
|
checkExpressionErrors(refExpressionErrors, andThrow) {
|
if (!refExpressionErrors) return false;
|
const {
|
shorthandAssignLoc,
|
doubleProtoLoc,
|
privateKeyLoc,
|
optionalParametersLoc
|
} = refExpressionErrors;
|
const hasErrors = !!shorthandAssignLoc || !!doubleProtoLoc || !!optionalParametersLoc || !!privateKeyLoc;
|
if (!andThrow) {
|
return hasErrors;
|
}
|
if (shorthandAssignLoc != null) {
|
this.raise(_parseError.Errors.InvalidCoverInitializedName, {
|
at: shorthandAssignLoc
|
});
|
}
|
if (doubleProtoLoc != null) {
|
this.raise(_parseError.Errors.DuplicateProto, {
|
at: doubleProtoLoc
|
});
|
}
|
if (privateKeyLoc != null) {
|
this.raise(_parseError.Errors.UnexpectedPrivateField, {
|
at: privateKeyLoc
|
});
|
}
|
if (optionalParametersLoc != null) {
|
this.unexpected(optionalParametersLoc);
|
}
|
}
|
isLiteralPropertyName() {
|
return (0, _types.tokenIsLiteralPropertyName)(this.state.type);
|
}
|
isPrivateName(node) {
|
return node.type === "PrivateName";
|
}
|
getPrivateNameSV(node) {
|
return node.id.name;
|
}
|
hasPropertyAsPrivateName(node) {
|
return (node.type === "MemberExpression" || node.type === "OptionalMemberExpression") && this.isPrivateName(node.property);
|
}
|
isObjectProperty(node) {
|
return node.type === "ObjectProperty";
|
}
|
isObjectMethod(node) {
|
return node.type === "ObjectMethod";
|
}
|
initializeScopes(inModule = this.options.sourceType === "module") {
|
const oldLabels = this.state.labels;
|
this.state.labels = [];
|
const oldExportedIdentifiers = this.exportedIdentifiers;
|
this.exportedIdentifiers = new Set();
|
const oldInModule = this.inModule;
|
this.inModule = inModule;
|
const oldScope = this.scope;
|
const ScopeHandler = this.getScopeHandler();
|
this.scope = new ScopeHandler(this, inModule);
|
const oldProdParam = this.prodParam;
|
this.prodParam = new _productionParameter.default();
|
const oldClassScope = this.classScope;
|
this.classScope = new _classScope.default(this);
|
const oldExpressionScope = this.expressionScope;
|
this.expressionScope = new _expressionScope.default(this);
|
return () => {
|
this.state.labels = oldLabels;
|
this.exportedIdentifiers = oldExportedIdentifiers;
|
this.inModule = oldInModule;
|
this.scope = oldScope;
|
this.prodParam = oldProdParam;
|
this.classScope = oldClassScope;
|
this.expressionScope = oldExpressionScope;
|
};
|
}
|
enterInitialScopes() {
|
let paramFlags = _productionParameter.PARAM;
|
if (this.inModule) {
|
paramFlags |= _productionParameter.PARAM_AWAIT;
|
}
|
this.scope.enter(_scopeflags.SCOPE_PROGRAM);
|
this.prodParam.enter(paramFlags);
|
}
|
checkDestructuringPrivate(refExpressionErrors) {
|
const {
|
privateKeyLoc
|
} = refExpressionErrors;
|
if (privateKeyLoc !== null) {
|
this.expectPlugin("destructuringPrivate", privateKeyLoc);
|
}
|
}
|
}
|
exports.default = UtilParser;
|
class ExpressionErrors {
|
constructor() {
|
this.shorthandAssignLoc = null;
|
this.doubleProtoLoc = null;
|
this.privateKeyLoc = null;
|
this.optionalParametersLoc = null;
|
}
|
}
|
exports.ExpressionErrors = ExpressionErrors;
|
|
//# sourceMappingURL=util.js.map
|