You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1106 lines
38 KiB
JavaScript

"use strict";Object.defineProperty(exports, "__esModule", {value: true});/* eslint max-len: 0 */
var _index = require('../tokenizer/index');
var _keywords = require('../tokenizer/keywords');
var _types = require('../tokenizer/types');
var _base = require('../traverser/base');
var _expression = require('../traverser/expression');
var _statement = require('../traverser/statement');
var _util = require('../traverser/util');
function isMaybeDefaultImport(lookahead) {
return (
(lookahead.type === _types.TokenType.name || !!(lookahead.type & _types.TokenType.IS_KEYWORD)) &&
lookahead.contextualKeyword !== _keywords.ContextualKeyword._from
);
}
function flowParseTypeInitialiser(tok) {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
_util.expect.call(void 0, tok || _types.TokenType.colon);
flowParseType();
_index.popTypeContext.call(void 0, oldIsType);
}
function flowParsePredicate() {
_util.expect.call(void 0, _types.TokenType.modulo);
_util.expectContextual.call(void 0, _keywords.ContextualKeyword._checks);
if (_index.eat.call(void 0, _types.TokenType.parenL)) {
_expression.parseExpression.call(void 0, );
_util.expect.call(void 0, _types.TokenType.parenR);
}
}
function flowParseTypeAndPredicateInitialiser() {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
_util.expect.call(void 0, _types.TokenType.colon);
if (_index.match.call(void 0, _types.TokenType.modulo)) {
flowParsePredicate();
} else {
flowParseType();
if (_index.match.call(void 0, _types.TokenType.modulo)) {
flowParsePredicate();
}
}
_index.popTypeContext.call(void 0, oldIsType);
}
function flowParseDeclareClass() {
_index.next.call(void 0, );
flowParseInterfaceish(/* isClass */ true);
}
function flowParseDeclareFunction() {
_index.next.call(void 0, );
_expression.parseIdentifier.call(void 0, );
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterDeclaration();
}
_util.expect.call(void 0, _types.TokenType.parenL);
flowParseFunctionTypeParams();
_util.expect.call(void 0, _types.TokenType.parenR);
flowParseTypeAndPredicateInitialiser();
_util.semicolon.call(void 0, );
}
function flowParseDeclare() {
if (_index.match.call(void 0, _types.TokenType._class)) {
flowParseDeclareClass();
} else if (_index.match.call(void 0, _types.TokenType._function)) {
flowParseDeclareFunction();
} else if (_index.match.call(void 0, _types.TokenType._var)) {
flowParseDeclareVariable();
} else if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._module)) {
if (_index.eat.call(void 0, _types.TokenType.dot)) {
flowParseDeclareModuleExports();
} else {
flowParseDeclareModule();
}
} else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
flowParseDeclareTypeAlias();
} else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque)) {
flowParseDeclareOpaqueType();
} else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
flowParseDeclareInterface();
} else if (_index.match.call(void 0, _types.TokenType._export)) {
flowParseDeclareExportDeclaration();
} else {
_util.unexpected.call(void 0, );
}
}
function flowParseDeclareVariable() {
_index.next.call(void 0, );
flowParseTypeAnnotatableIdentifier();
_util.semicolon.call(void 0, );
}
function flowParseDeclareModule() {
if (_index.match.call(void 0, _types.TokenType.string)) {
_expression.parseExprAtom.call(void 0, );
} else {
_expression.parseIdentifier.call(void 0, );
}
_util.expect.call(void 0, _types.TokenType.braceL);
while (!_index.match.call(void 0, _types.TokenType.braceR) && !_base.state.error) {
if (_index.match.call(void 0, _types.TokenType._import)) {
_index.next.call(void 0, );
_statement.parseImport.call(void 0, );
} else {
_util.unexpected.call(void 0, );
}
}
_util.expect.call(void 0, _types.TokenType.braceR);
}
function flowParseDeclareExportDeclaration() {
_util.expect.call(void 0, _types.TokenType._export);
if (_index.eat.call(void 0, _types.TokenType._default)) {
if (_index.match.call(void 0, _types.TokenType._function) || _index.match.call(void 0, _types.TokenType._class)) {
// declare export default class ...
// declare export default function ...
flowParseDeclare();
} else {
// declare export default [type];
flowParseType();
_util.semicolon.call(void 0, );
}
} else if (
_index.match.call(void 0, _types.TokenType._var) || // declare export var ...
_index.match.call(void 0, _types.TokenType._function) || // declare export function ...
_index.match.call(void 0, _types.TokenType._class) || // declare export class ...
_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque) // declare export opaque ..
) {
flowParseDeclare();
} else if (
_index.match.call(void 0, _types.TokenType.star) || // declare export * from ''
_index.match.call(void 0, _types.TokenType.braceL) || // declare export {} ...
_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface) || // declare export interface ...
_util.isContextual.call(void 0, _keywords.ContextualKeyword._type) || // declare export type ...
_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque) // declare export opaque type ...
) {
_statement.parseExport.call(void 0, );
} else {
_util.unexpected.call(void 0, );
}
}
function flowParseDeclareModuleExports() {
_util.expectContextual.call(void 0, _keywords.ContextualKeyword._exports);
flowParseTypeAnnotation();
_util.semicolon.call(void 0, );
}
function flowParseDeclareTypeAlias() {
_index.next.call(void 0, );
flowParseTypeAlias();
}
function flowParseDeclareOpaqueType() {
_index.next.call(void 0, );
flowParseOpaqueType(true);
}
function flowParseDeclareInterface() {
_index.next.call(void 0, );
flowParseInterfaceish();
}
// Interfaces
function flowParseInterfaceish(isClass = false) {
flowParseRestrictedIdentifier();
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterDeclaration();
}
if (_index.eat.call(void 0, _types.TokenType._extends)) {
do {
flowParseInterfaceExtends();
} while (!isClass && _index.eat.call(void 0, _types.TokenType.comma));
}
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._mixins)) {
_index.next.call(void 0, );
do {
flowParseInterfaceExtends();
} while (_index.eat.call(void 0, _types.TokenType.comma));
}
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._implements)) {
_index.next.call(void 0, );
do {
flowParseInterfaceExtends();
} while (_index.eat.call(void 0, _types.TokenType.comma));
}
flowParseObjectType(isClass, false, isClass);
}
function flowParseInterfaceExtends() {
flowParseQualifiedTypeIdentifier(false);
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterInstantiation();
}
}
function flowParseInterface() {
flowParseInterfaceish();
}
function flowParseRestrictedIdentifier() {
_expression.parseIdentifier.call(void 0, );
}
function flowParseTypeAlias() {
flowParseRestrictedIdentifier();
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterDeclaration();
}
flowParseTypeInitialiser(_types.TokenType.eq);
_util.semicolon.call(void 0, );
}
function flowParseOpaqueType(declare) {
_util.expectContextual.call(void 0, _keywords.ContextualKeyword._type);
flowParseRestrictedIdentifier();
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterDeclaration();
}
// Parse the supertype
if (_index.match.call(void 0, _types.TokenType.colon)) {
flowParseTypeInitialiser(_types.TokenType.colon);
}
if (!declare) {
flowParseTypeInitialiser(_types.TokenType.eq);
}
_util.semicolon.call(void 0, );
}
function flowParseTypeParameter() {
flowParseVariance();
flowParseTypeAnnotatableIdentifier();
if (_index.eat.call(void 0, _types.TokenType.eq)) {
flowParseType();
}
}
function flowParseTypeParameterDeclaration() {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
// istanbul ignore else: this condition is already checked at all call sites
if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.typeParameterStart)) {
_index.next.call(void 0, );
} else {
_util.unexpected.call(void 0, );
}
do {
flowParseTypeParameter();
if (!_index.match.call(void 0, _types.TokenType.greaterThan)) {
_util.expect.call(void 0, _types.TokenType.comma);
}
} while (!_index.match.call(void 0, _types.TokenType.greaterThan) && !_base.state.error);
_util.expect.call(void 0, _types.TokenType.greaterThan);
_index.popTypeContext.call(void 0, oldIsType);
} exports.flowParseTypeParameterDeclaration = flowParseTypeParameterDeclaration;
function flowParseTypeParameterInstantiation() {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
_util.expect.call(void 0, _types.TokenType.lessThan);
while (!_index.match.call(void 0, _types.TokenType.greaterThan) && !_base.state.error) {
flowParseType();
if (!_index.match.call(void 0, _types.TokenType.greaterThan)) {
_util.expect.call(void 0, _types.TokenType.comma);
}
}
_util.expect.call(void 0, _types.TokenType.greaterThan);
_index.popTypeContext.call(void 0, oldIsType);
}
function flowParseInterfaceType() {
_util.expectContextual.call(void 0, _keywords.ContextualKeyword._interface);
if (_index.eat.call(void 0, _types.TokenType._extends)) {
do {
flowParseInterfaceExtends();
} while (_index.eat.call(void 0, _types.TokenType.comma));
}
flowParseObjectType(false, false, false);
}
function flowParseObjectPropertyKey() {
if (_index.match.call(void 0, _types.TokenType.num) || _index.match.call(void 0, _types.TokenType.string)) {
_expression.parseExprAtom.call(void 0, );
} else {
_expression.parseIdentifier.call(void 0, );
}
}
function flowParseObjectTypeIndexer() {
// Note: bracketL has already been consumed
if (_index.lookaheadType.call(void 0, ) === _types.TokenType.colon) {
flowParseObjectPropertyKey();
flowParseTypeInitialiser();
} else {
flowParseType();
}
_util.expect.call(void 0, _types.TokenType.bracketR);
flowParseTypeInitialiser();
}
function flowParseObjectTypeInternalSlot() {
// Note: both bracketL have already been consumed
flowParseObjectPropertyKey();
_util.expect.call(void 0, _types.TokenType.bracketR);
_util.expect.call(void 0, _types.TokenType.bracketR);
if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.parenL)) {
flowParseObjectTypeMethodish();
} else {
_index.eat.call(void 0, _types.TokenType.question);
flowParseTypeInitialiser();
}
}
function flowParseObjectTypeMethodish() {
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterDeclaration();
}
_util.expect.call(void 0, _types.TokenType.parenL);
while (!_index.match.call(void 0, _types.TokenType.parenR) && !_index.match.call(void 0, _types.TokenType.ellipsis) && !_base.state.error) {
flowParseFunctionTypeParam();
if (!_index.match.call(void 0, _types.TokenType.parenR)) {
_util.expect.call(void 0, _types.TokenType.comma);
}
}
if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
flowParseFunctionTypeParam();
}
_util.expect.call(void 0, _types.TokenType.parenR);
flowParseTypeInitialiser();
}
function flowParseObjectTypeCallProperty() {
flowParseObjectTypeMethodish();
}
function flowParseObjectType(allowStatic, allowExact, allowProto) {
let endDelim;
if (allowExact && _index.match.call(void 0, _types.TokenType.braceBarL)) {
_util.expect.call(void 0, _types.TokenType.braceBarL);
endDelim = _types.TokenType.braceBarR;
} else {
_util.expect.call(void 0, _types.TokenType.braceL);
endDelim = _types.TokenType.braceR;
}
while (!_index.match.call(void 0, endDelim) && !_base.state.error) {
if (allowProto && _util.isContextual.call(void 0, _keywords.ContextualKeyword._proto)) {
const lookahead = _index.lookaheadType.call(void 0, );
if (lookahead !== _types.TokenType.colon && lookahead !== _types.TokenType.question) {
_index.next.call(void 0, );
allowStatic = false;
}
}
if (allowStatic && _util.isContextual.call(void 0, _keywords.ContextualKeyword._static)) {
const lookahead = _index.lookaheadType.call(void 0, );
if (lookahead !== _types.TokenType.colon && lookahead !== _types.TokenType.question) {
_index.next.call(void 0, );
}
}
flowParseVariance();
if (_index.eat.call(void 0, _types.TokenType.bracketL)) {
if (_index.eat.call(void 0, _types.TokenType.bracketL)) {
flowParseObjectTypeInternalSlot();
} else {
flowParseObjectTypeIndexer();
}
} else if (_index.match.call(void 0, _types.TokenType.parenL) || _index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseObjectTypeCallProperty();
} else {
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._get) || _util.isContextual.call(void 0, _keywords.ContextualKeyword._set)) {
const lookahead = _index.lookaheadType.call(void 0, );
if (lookahead === _types.TokenType.name || lookahead === _types.TokenType.string || lookahead === _types.TokenType.num) {
_index.next.call(void 0, );
}
}
flowParseObjectTypeProperty();
}
flowObjectTypeSemicolon();
}
_util.expect.call(void 0, endDelim);
}
function flowParseObjectTypeProperty() {
if (_index.match.call(void 0, _types.TokenType.ellipsis)) {
_util.expect.call(void 0, _types.TokenType.ellipsis);
if (!_index.eat.call(void 0, _types.TokenType.comma)) {
_index.eat.call(void 0, _types.TokenType.semi);
}
// Explicit inexact object syntax.
if (_index.match.call(void 0, _types.TokenType.braceR)) {
return;
}
flowParseType();
} else {
flowParseObjectPropertyKey();
if (_index.match.call(void 0, _types.TokenType.lessThan) || _index.match.call(void 0, _types.TokenType.parenL)) {
// This is a method property
flowParseObjectTypeMethodish();
} else {
_index.eat.call(void 0, _types.TokenType.question);
flowParseTypeInitialiser();
}
}
}
function flowObjectTypeSemicolon() {
if (!_index.eat.call(void 0, _types.TokenType.semi) && !_index.eat.call(void 0, _types.TokenType.comma) && !_index.match.call(void 0, _types.TokenType.braceR) && !_index.match.call(void 0, _types.TokenType.braceBarR)) {
_util.unexpected.call(void 0, );
}
}
function flowParseQualifiedTypeIdentifier(initialIdAlreadyParsed) {
if (!initialIdAlreadyParsed) {
_expression.parseIdentifier.call(void 0, );
}
while (_index.eat.call(void 0, _types.TokenType.dot)) {
_expression.parseIdentifier.call(void 0, );
}
}
function flowParseGenericType() {
flowParseQualifiedTypeIdentifier(true);
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterInstantiation();
}
}
function flowParseTypeofType() {
_util.expect.call(void 0, _types.TokenType._typeof);
flowParsePrimaryType();
}
function flowParseTupleType() {
_util.expect.call(void 0, _types.TokenType.bracketL);
// We allow trailing commas
while (_base.state.pos < _base.input.length && !_index.match.call(void 0, _types.TokenType.bracketR)) {
flowParseType();
if (_index.match.call(void 0, _types.TokenType.bracketR)) {
break;
}
_util.expect.call(void 0, _types.TokenType.comma);
}
_util.expect.call(void 0, _types.TokenType.bracketR);
}
function flowParseFunctionTypeParam() {
const lookahead = _index.lookaheadType.call(void 0, );
if (lookahead === _types.TokenType.colon || lookahead === _types.TokenType.question) {
_expression.parseIdentifier.call(void 0, );
_index.eat.call(void 0, _types.TokenType.question);
flowParseTypeInitialiser();
} else {
flowParseType();
}
}
function flowParseFunctionTypeParams() {
while (!_index.match.call(void 0, _types.TokenType.parenR) && !_index.match.call(void 0, _types.TokenType.ellipsis) && !_base.state.error) {
flowParseFunctionTypeParam();
if (!_index.match.call(void 0, _types.TokenType.parenR)) {
_util.expect.call(void 0, _types.TokenType.comma);
}
}
if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
flowParseFunctionTypeParam();
}
}
// The parsing of types roughly parallels the parsing of expressions, and
// primary types are kind of like primary expressions...they're the
// primitives with which other types are constructed.
function flowParsePrimaryType() {
let isGroupedType = false;
const oldNoAnonFunctionType = _base.state.noAnonFunctionType;
switch (_base.state.type) {
case _types.TokenType.name: {
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
flowParseInterfaceType();
return;
}
_expression.parseIdentifier.call(void 0, );
flowParseGenericType();
return;
}
case _types.TokenType.braceL:
flowParseObjectType(false, false, false);
return;
case _types.TokenType.braceBarL:
flowParseObjectType(false, true, false);
return;
case _types.TokenType.bracketL:
flowParseTupleType();
return;
case _types.TokenType.lessThan:
flowParseTypeParameterDeclaration();
_util.expect.call(void 0, _types.TokenType.parenL);
flowParseFunctionTypeParams();
_util.expect.call(void 0, _types.TokenType.parenR);
_util.expect.call(void 0, _types.TokenType.arrow);
flowParseType();
return;
case _types.TokenType.parenL:
_index.next.call(void 0, );
// Check to see if this is actually a grouped type
if (!_index.match.call(void 0, _types.TokenType.parenR) && !_index.match.call(void 0, _types.TokenType.ellipsis)) {
if (_index.match.call(void 0, _types.TokenType.name)) {
const token = _index.lookaheadType.call(void 0, );
isGroupedType = token !== _types.TokenType.question && token !== _types.TokenType.colon;
} else {
isGroupedType = true;
}
}
if (isGroupedType) {
_base.state.noAnonFunctionType = false;
flowParseType();
_base.state.noAnonFunctionType = oldNoAnonFunctionType;
// A `,` or a `) =>` means this is an anonymous function type
if (
_base.state.noAnonFunctionType ||
!(_index.match.call(void 0, _types.TokenType.comma) || (_index.match.call(void 0, _types.TokenType.parenR) && _index.lookaheadType.call(void 0, ) === _types.TokenType.arrow))
) {
_util.expect.call(void 0, _types.TokenType.parenR);
return;
} else {
// Eat a comma if there is one
_index.eat.call(void 0, _types.TokenType.comma);
}
}
flowParseFunctionTypeParams();
_util.expect.call(void 0, _types.TokenType.parenR);
_util.expect.call(void 0, _types.TokenType.arrow);
flowParseType();
return;
case _types.TokenType.minus:
_index.next.call(void 0, );
_expression.parseLiteral.call(void 0, );
return;
case _types.TokenType.string:
case _types.TokenType.num:
case _types.TokenType._true:
case _types.TokenType._false:
case _types.TokenType._null:
case _types.TokenType._this:
case _types.TokenType._void:
case _types.TokenType.star:
_index.next.call(void 0, );
return;
default:
if (_base.state.type === _types.TokenType._typeof) {
flowParseTypeofType();
return;
} else if (_base.state.type & _types.TokenType.IS_KEYWORD) {
_index.next.call(void 0, );
_base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType.name;
return;
}
}
_util.unexpected.call(void 0, );
}
function flowParsePostfixType() {
flowParsePrimaryType();
while (!_util.canInsertSemicolon.call(void 0, ) && (_index.match.call(void 0, _types.TokenType.bracketL) || _index.match.call(void 0, _types.TokenType.questionDot))) {
_index.eat.call(void 0, _types.TokenType.questionDot);
_util.expect.call(void 0, _types.TokenType.bracketL);
if (_index.eat.call(void 0, _types.TokenType.bracketR)) {
// Array type
} else {
// Indexed access type
flowParseType();
_util.expect.call(void 0, _types.TokenType.bracketR);
}
}
}
function flowParsePrefixType() {
if (_index.eat.call(void 0, _types.TokenType.question)) {
flowParsePrefixType();
} else {
flowParsePostfixType();
}
}
function flowParseAnonFunctionWithoutParens() {
flowParsePrefixType();
if (!_base.state.noAnonFunctionType && _index.eat.call(void 0, _types.TokenType.arrow)) {
flowParseType();
}
}
function flowParseIntersectionType() {
_index.eat.call(void 0, _types.TokenType.bitwiseAND);
flowParseAnonFunctionWithoutParens();
while (_index.eat.call(void 0, _types.TokenType.bitwiseAND)) {
flowParseAnonFunctionWithoutParens();
}
}
function flowParseUnionType() {
_index.eat.call(void 0, _types.TokenType.bitwiseOR);
flowParseIntersectionType();
while (_index.eat.call(void 0, _types.TokenType.bitwiseOR)) {
flowParseIntersectionType();
}
}
function flowParseType() {
flowParseUnionType();
}
function flowParseTypeAnnotation() {
flowParseTypeInitialiser();
} exports.flowParseTypeAnnotation = flowParseTypeAnnotation;
function flowParseTypeAnnotatableIdentifier() {
_expression.parseIdentifier.call(void 0, );
if (_index.match.call(void 0, _types.TokenType.colon)) {
flowParseTypeAnnotation();
}
}
function flowParseVariance() {
if (_index.match.call(void 0, _types.TokenType.plus) || _index.match.call(void 0, _types.TokenType.minus)) {
_index.next.call(void 0, );
_base.state.tokens[_base.state.tokens.length - 1].isType = true;
}
} exports.flowParseVariance = flowParseVariance;
// ==================================
// Overrides
// ==================================
function flowParseFunctionBodyAndFinish(funcContextId) {
// For arrow functions, `parseArrow` handles the return type itself.
if (_index.match.call(void 0, _types.TokenType.colon)) {
flowParseTypeAndPredicateInitialiser();
}
_expression.parseFunctionBody.call(void 0, false, funcContextId);
} exports.flowParseFunctionBodyAndFinish = flowParseFunctionBodyAndFinish;
function flowParseSubscript(
startTokenIndex,
noCalls,
stopState,
) {
if (_index.match.call(void 0, _types.TokenType.questionDot) && _index.lookaheadType.call(void 0, ) === _types.TokenType.lessThan) {
if (noCalls) {
stopState.stop = true;
return;
}
_index.next.call(void 0, );
flowParseTypeParameterInstantiation();
_util.expect.call(void 0, _types.TokenType.parenL);
_expression.parseCallExpressionArguments.call(void 0, );
return;
} else if (!noCalls && _index.match.call(void 0, _types.TokenType.lessThan)) {
const snapshot = _base.state.snapshot();
flowParseTypeParameterInstantiation();
_util.expect.call(void 0, _types.TokenType.parenL);
_expression.parseCallExpressionArguments.call(void 0, );
if (_base.state.error) {
_base.state.restoreFromSnapshot(snapshot);
} else {
return;
}
}
_expression.baseParseSubscript.call(void 0, startTokenIndex, noCalls, stopState);
} exports.flowParseSubscript = flowParseSubscript;
function flowStartParseNewArguments() {
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
const snapshot = _base.state.snapshot();
flowParseTypeParameterInstantiation();
if (_base.state.error) {
_base.state.restoreFromSnapshot(snapshot);
}
}
} exports.flowStartParseNewArguments = flowStartParseNewArguments;
// interfaces
function flowTryParseStatement() {
if (_index.match.call(void 0, _types.TokenType.name) && _base.state.contextualKeyword === _keywords.ContextualKeyword._interface) {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
_index.next.call(void 0, );
flowParseInterface();
_index.popTypeContext.call(void 0, oldIsType);
return true;
} else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._enum)) {
flowParseEnumDeclaration();
return true;
}
return false;
} exports.flowTryParseStatement = flowTryParseStatement;
function flowTryParseExportDefaultExpression() {
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._enum)) {
flowParseEnumDeclaration();
return true;
}
return false;
} exports.flowTryParseExportDefaultExpression = flowTryParseExportDefaultExpression;
// declares, interfaces and type aliases
function flowParseIdentifierStatement(contextualKeyword) {
if (contextualKeyword === _keywords.ContextualKeyword._declare) {
if (
_index.match.call(void 0, _types.TokenType._class) ||
_index.match.call(void 0, _types.TokenType.name) ||
_index.match.call(void 0, _types.TokenType._function) ||
_index.match.call(void 0, _types.TokenType._var) ||
_index.match.call(void 0, _types.TokenType._export)
) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
flowParseDeclare();
_index.popTypeContext.call(void 0, oldIsType);
}
} else if (_index.match.call(void 0, _types.TokenType.name)) {
if (contextualKeyword === _keywords.ContextualKeyword._interface) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
flowParseInterface();
_index.popTypeContext.call(void 0, oldIsType);
} else if (contextualKeyword === _keywords.ContextualKeyword._type) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
flowParseTypeAlias();
_index.popTypeContext.call(void 0, oldIsType);
} else if (contextualKeyword === _keywords.ContextualKeyword._opaque) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
flowParseOpaqueType(false);
_index.popTypeContext.call(void 0, oldIsType);
}
}
_util.semicolon.call(void 0, );
} exports.flowParseIdentifierStatement = flowParseIdentifierStatement;
// export type
function flowShouldParseExportDeclaration() {
return (
_util.isContextual.call(void 0, _keywords.ContextualKeyword._type) ||
_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface) ||
_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque) ||
_util.isContextual.call(void 0, _keywords.ContextualKeyword._enum)
);
} exports.flowShouldParseExportDeclaration = flowShouldParseExportDeclaration;
function flowShouldDisallowExportDefaultSpecifier() {
return (
_index.match.call(void 0, _types.TokenType.name) &&
(_base.state.contextualKeyword === _keywords.ContextualKeyword._type ||
_base.state.contextualKeyword === _keywords.ContextualKeyword._interface ||
_base.state.contextualKeyword === _keywords.ContextualKeyword._opaque ||
_base.state.contextualKeyword === _keywords.ContextualKeyword._enum)
);
} exports.flowShouldDisallowExportDefaultSpecifier = flowShouldDisallowExportDefaultSpecifier;
function flowParseExportDeclaration() {
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
_index.next.call(void 0, );
if (_index.match.call(void 0, _types.TokenType.braceL)) {
// export type { foo, bar };
_statement.parseExportSpecifiers.call(void 0, );
_statement.parseExportFrom.call(void 0, );
} else {
// export type Foo = Bar;
flowParseTypeAlias();
}
_index.popTypeContext.call(void 0, oldIsType);
} else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._opaque)) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
_index.next.call(void 0, );
// export opaque type Foo = Bar;
flowParseOpaqueType(false);
_index.popTypeContext.call(void 0, oldIsType);
} else if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._interface)) {
const oldIsType = _index.pushTypeContext.call(void 0, 1);
_index.next.call(void 0, );
flowParseInterface();
_index.popTypeContext.call(void 0, oldIsType);
} else {
_statement.parseStatement.call(void 0, true);
}
} exports.flowParseExportDeclaration = flowParseExportDeclaration;
function flowShouldParseExportStar() {
return _index.match.call(void 0, _types.TokenType.star) || (_util.isContextual.call(void 0, _keywords.ContextualKeyword._type) && _index.lookaheadType.call(void 0, ) === _types.TokenType.star);
} exports.flowShouldParseExportStar = flowShouldParseExportStar;
function flowParseExportStar() {
if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._type)) {
const oldIsType = _index.pushTypeContext.call(void 0, 2);
_statement.baseParseExportStar.call(void 0, );
_index.popTypeContext.call(void 0, oldIsType);
} else {
_statement.baseParseExportStar.call(void 0, );
}
} exports.flowParseExportStar = flowParseExportStar;
// parse a the super class type parameters and implements
function flowAfterParseClassSuper(hasSuper) {
if (hasSuper && _index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterInstantiation();
}
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._implements)) {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
_index.next.call(void 0, );
_base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._implements;
do {
flowParseRestrictedIdentifier();
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterInstantiation();
}
} while (_index.eat.call(void 0, _types.TokenType.comma));
_index.popTypeContext.call(void 0, oldIsType);
}
} exports.flowAfterParseClassSuper = flowAfterParseClassSuper;
// parse type parameters for object method shorthand
function flowStartParseObjPropValue() {
// method shorthand
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
flowParseTypeParameterDeclaration();
if (!_index.match.call(void 0, _types.TokenType.parenL)) _util.unexpected.call(void 0, );
}
} exports.flowStartParseObjPropValue = flowStartParseObjPropValue;
function flowParseAssignableListItemTypes() {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
_index.eat.call(void 0, _types.TokenType.question);
if (_index.match.call(void 0, _types.TokenType.colon)) {
flowParseTypeAnnotation();
}
_index.popTypeContext.call(void 0, oldIsType);
} exports.flowParseAssignableListItemTypes = flowParseAssignableListItemTypes;
// parse typeof and type imports
function flowStartParseImportSpecifiers() {
if (_index.match.call(void 0, _types.TokenType._typeof) || _util.isContextual.call(void 0, _keywords.ContextualKeyword._type)) {
const lh = _index.lookaheadTypeAndKeyword.call(void 0, );
if (isMaybeDefaultImport(lh) || lh.type === _types.TokenType.braceL || lh.type === _types.TokenType.star) {
_index.next.call(void 0, );
}
}
} exports.flowStartParseImportSpecifiers = flowStartParseImportSpecifiers;
// parse import-type/typeof shorthand
function flowParseImportSpecifier() {
const isTypeKeyword =
_base.state.contextualKeyword === _keywords.ContextualKeyword._type || _base.state.type === _types.TokenType._typeof;
if (isTypeKeyword) {
_index.next.call(void 0, );
} else {
_expression.parseIdentifier.call(void 0, );
}
if (_util.isContextual.call(void 0, _keywords.ContextualKeyword._as) && !_util.isLookaheadContextual.call(void 0, _keywords.ContextualKeyword._as)) {
_expression.parseIdentifier.call(void 0, );
if (isTypeKeyword && !_index.match.call(void 0, _types.TokenType.name) && !(_base.state.type & _types.TokenType.IS_KEYWORD)) {
// `import {type as ,` or `import {type as }`
} else {
// `import {type as foo`
_expression.parseIdentifier.call(void 0, );
}
} else {
if (isTypeKeyword && (_index.match.call(void 0, _types.TokenType.name) || !!(_base.state.type & _types.TokenType.IS_KEYWORD))) {
// `import {type foo`
_expression.parseIdentifier.call(void 0, );
}
if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._as)) {
_expression.parseIdentifier.call(void 0, );
}
}
} exports.flowParseImportSpecifier = flowParseImportSpecifier;
// parse function type parameters - function foo<T>() {}
function flowStartParseFunctionParams() {
// Originally this checked if the method is a getter/setter, but if it was, we'd crash soon
// anyway, so don't try to propagate that information.
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
flowParseTypeParameterDeclaration();
_index.popTypeContext.call(void 0, oldIsType);
}
} exports.flowStartParseFunctionParams = flowStartParseFunctionParams;
// parse flow type annotations on variable declarator heads - let foo: string = bar
function flowAfterParseVarHead() {
if (_index.match.call(void 0, _types.TokenType.colon)) {
flowParseTypeAnnotation();
}
} exports.flowAfterParseVarHead = flowAfterParseVarHead;
// parse the return type of an async arrow function - let foo = (async (): number => {});
function flowStartParseAsyncArrowFromCallExpression() {
if (_index.match.call(void 0, _types.TokenType.colon)) {
const oldNoAnonFunctionType = _base.state.noAnonFunctionType;
_base.state.noAnonFunctionType = true;
flowParseTypeAnnotation();
_base.state.noAnonFunctionType = oldNoAnonFunctionType;
}
} exports.flowStartParseAsyncArrowFromCallExpression = flowStartParseAsyncArrowFromCallExpression;
// We need to support type parameter declarations for arrow functions. This
// is tricky. There are three situations we need to handle
//
// 1. This is either JSX or an arrow function. We'll try JSX first. If that
// fails, we'll try an arrow function. If that fails, we'll throw the JSX
// error.
// 2. This is an arrow function. We'll parse the type parameter declaration,
// parse the rest, make sure the rest is an arrow function, and go from
// there
// 3. This is neither. Just call the super method
function flowParseMaybeAssign(noIn, isWithinParens) {
if (_index.match.call(void 0, _types.TokenType.lessThan)) {
const snapshot = _base.state.snapshot();
let wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
if (_base.state.error) {
_base.state.restoreFromSnapshot(snapshot);
_base.state.type = _types.TokenType.typeParameterStart;
} else {
return wasArrow;
}
const oldIsType = _index.pushTypeContext.call(void 0, 0);
flowParseTypeParameterDeclaration();
_index.popTypeContext.call(void 0, oldIsType);
wasArrow = _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
if (wasArrow) {
return true;
}
_util.unexpected.call(void 0, );
}
return _expression.baseParseMaybeAssign.call(void 0, noIn, isWithinParens);
} exports.flowParseMaybeAssign = flowParseMaybeAssign;
// handle return types for arrow functions
function flowParseArrow() {
if (_index.match.call(void 0, _types.TokenType.colon)) {
const oldIsType = _index.pushTypeContext.call(void 0, 0);
const snapshot = _base.state.snapshot();
const oldNoAnonFunctionType = _base.state.noAnonFunctionType;
_base.state.noAnonFunctionType = true;
flowParseTypeAndPredicateInitialiser();
_base.state.noAnonFunctionType = oldNoAnonFunctionType;
if (_util.canInsertSemicolon.call(void 0, )) _util.unexpected.call(void 0, );
if (!_index.match.call(void 0, _types.TokenType.arrow)) _util.unexpected.call(void 0, );
if (_base.state.error) {
_base.state.restoreFromSnapshot(snapshot);
}
_index.popTypeContext.call(void 0, oldIsType);
}
return _index.eat.call(void 0, _types.TokenType.arrow);
} exports.flowParseArrow = flowParseArrow;
function flowParseSubscripts(startTokenIndex, noCalls = false) {
if (
_base.state.tokens[_base.state.tokens.length - 1].contextualKeyword === _keywords.ContextualKeyword._async &&
_index.match.call(void 0, _types.TokenType.lessThan)
) {
const snapshot = _base.state.snapshot();
const wasArrow = parseAsyncArrowWithTypeParameters();
if (wasArrow && !_base.state.error) {
return;
}
_base.state.restoreFromSnapshot(snapshot);
}
_expression.baseParseSubscripts.call(void 0, startTokenIndex, noCalls);
} exports.flowParseSubscripts = flowParseSubscripts;
// Returns true if there was an arrow function here.
function parseAsyncArrowWithTypeParameters() {
_base.state.scopeDepth++;
const startTokenIndex = _base.state.tokens.length;
_statement.parseFunctionParams.call(void 0, );
if (!_expression.parseArrow.call(void 0, )) {
return false;
}
_expression.parseArrowExpression.call(void 0, startTokenIndex);
return true;
}
function flowParseEnumDeclaration() {
_util.expectContextual.call(void 0, _keywords.ContextualKeyword._enum);
_base.state.tokens[_base.state.tokens.length - 1].type = _types.TokenType._enum;
_expression.parseIdentifier.call(void 0, );
flowParseEnumBody();
}
function flowParseEnumBody() {
if (_util.eatContextual.call(void 0, _keywords.ContextualKeyword._of)) {
_index.next.call(void 0, );
}
_util.expect.call(void 0, _types.TokenType.braceL);
flowParseEnumMembers();
_util.expect.call(void 0, _types.TokenType.braceR);
}
function flowParseEnumMembers() {
while (!_index.match.call(void 0, _types.TokenType.braceR) && !_base.state.error) {
if (_index.eat.call(void 0, _types.TokenType.ellipsis)) {
break;
}
flowParseEnumMember();
if (!_index.match.call(void 0, _types.TokenType.braceR)) {
_util.expect.call(void 0, _types.TokenType.comma);
}
}
}
function flowParseEnumMember() {
_expression.parseIdentifier.call(void 0, );
if (_index.eat.call(void 0, _types.TokenType.eq)) {
// Flow enum values are always just one token (a string, number, or boolean literal).
_index.next.call(void 0, );
}
}