1106 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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, );
 | |
|   }
 | |
| }
 | 
