Packages
moon
2.90.3
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
assets/node_modules/sucrase/dist/parser/plugins/flow.js
"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, );
}
}