@@ -8582,85 +8582,66 @@ parser_lex_magic_comment(pm_parser_t *parser, bool semantic_token_seen) {
85828582/* Context manipulations */
85838583/******************************************************************************/
85848584
8585- static bool
8586- context_terminator(pm_context_t context, pm_token_t *token) {
8587- switch (context) {
8588- case PM_CONTEXT_MAIN:
8589- case PM_CONTEXT_DEF_PARAMS:
8590- case PM_CONTEXT_DEFINED:
8591- case PM_CONTEXT_MULTI_TARGET:
8592- case PM_CONTEXT_TERNARY:
8593- case PM_CONTEXT_RESCUE_MODIFIER:
8594- return token->type == PM_TOKEN_EOF;
8595- case PM_CONTEXT_DEFAULT_PARAMS:
8596- return token->type == PM_TOKEN_COMMA || token->type == PM_TOKEN_PARENTHESIS_RIGHT;
8597- case PM_CONTEXT_PREEXE:
8598- case PM_CONTEXT_POSTEXE:
8599- return token->type == PM_TOKEN_BRACE_RIGHT;
8600- case PM_CONTEXT_MODULE:
8601- case PM_CONTEXT_CLASS:
8602- case PM_CONTEXT_SCLASS:
8603- case PM_CONTEXT_LAMBDA_DO_END:
8604- case PM_CONTEXT_DEF:
8605- case PM_CONTEXT_BLOCK_KEYWORDS:
8606- return token->type == PM_TOKEN_KEYWORD_END || token->type == PM_TOKEN_KEYWORD_RESCUE || token->type == PM_TOKEN_KEYWORD_ENSURE;
8607- case PM_CONTEXT_WHILE:
8608- case PM_CONTEXT_UNTIL:
8609- case PM_CONTEXT_ELSE:
8610- case PM_CONTEXT_FOR:
8611- case PM_CONTEXT_BEGIN_ENSURE:
8612- case PM_CONTEXT_BLOCK_ENSURE:
8613- case PM_CONTEXT_CLASS_ENSURE:
8614- case PM_CONTEXT_DEF_ENSURE:
8615- case PM_CONTEXT_LAMBDA_ENSURE:
8616- case PM_CONTEXT_MODULE_ENSURE:
8617- case PM_CONTEXT_SCLASS_ENSURE:
8618- return token->type == PM_TOKEN_KEYWORD_END;
8619- case PM_CONTEXT_LOOP_PREDICATE:
8620- return token->type == PM_TOKEN_KEYWORD_DO || token->type == PM_TOKEN_KEYWORD_THEN;
8621- case PM_CONTEXT_FOR_INDEX:
8622- return token->type == PM_TOKEN_KEYWORD_IN;
8623- case PM_CONTEXT_CASE_WHEN:
8624- return token->type == PM_TOKEN_KEYWORD_WHEN || token->type == PM_TOKEN_KEYWORD_END || token->type == PM_TOKEN_KEYWORD_ELSE;
8625- case PM_CONTEXT_CASE_IN:
8626- return token->type == PM_TOKEN_KEYWORD_IN || token->type == PM_TOKEN_KEYWORD_END || token->type == PM_TOKEN_KEYWORD_ELSE;
8627- case PM_CONTEXT_IF:
8628- case PM_CONTEXT_ELSIF:
8629- return token->type == PM_TOKEN_KEYWORD_ELSE || token->type == PM_TOKEN_KEYWORD_ELSIF || token->type == PM_TOKEN_KEYWORD_END;
8630- case PM_CONTEXT_UNLESS:
8631- return token->type == PM_TOKEN_KEYWORD_ELSE || token->type == PM_TOKEN_KEYWORD_END;
8632- case PM_CONTEXT_EMBEXPR:
8633- return token->type == PM_TOKEN_EMBEXPR_END;
8634- case PM_CONTEXT_BLOCK_BRACES:
8635- return token->type == PM_TOKEN_BRACE_RIGHT;
8636- case PM_CONTEXT_PARENS:
8637- return token->type == PM_TOKEN_PARENTHESIS_RIGHT;
8638- case PM_CONTEXT_BEGIN:
8639- case PM_CONTEXT_BEGIN_RESCUE:
8640- case PM_CONTEXT_BLOCK_RESCUE:
8641- case PM_CONTEXT_CLASS_RESCUE:
8642- case PM_CONTEXT_DEF_RESCUE:
8643- case PM_CONTEXT_LAMBDA_RESCUE:
8644- case PM_CONTEXT_MODULE_RESCUE:
8645- case PM_CONTEXT_SCLASS_RESCUE:
8646- return token->type == PM_TOKEN_KEYWORD_ENSURE || token->type == PM_TOKEN_KEYWORD_RESCUE || token->type == PM_TOKEN_KEYWORD_ELSE || token->type == PM_TOKEN_KEYWORD_END;
8647- case PM_CONTEXT_BEGIN_ELSE:
8648- case PM_CONTEXT_BLOCK_ELSE:
8649- case PM_CONTEXT_CLASS_ELSE:
8650- case PM_CONTEXT_DEF_ELSE:
8651- case PM_CONTEXT_LAMBDA_ELSE:
8652- case PM_CONTEXT_MODULE_ELSE:
8653- case PM_CONTEXT_SCLASS_ELSE:
8654- return token->type == PM_TOKEN_KEYWORD_ENSURE || token->type == PM_TOKEN_KEYWORD_END;
8655- case PM_CONTEXT_LAMBDA_BRACES:
8656- return token->type == PM_TOKEN_BRACE_RIGHT;
8657- case PM_CONTEXT_PREDICATE:
8658- return token->type == PM_TOKEN_KEYWORD_THEN || token->type == PM_TOKEN_NEWLINE || token->type == PM_TOKEN_SEMICOLON;
8659- case PM_CONTEXT_NONE:
8660- return false;
8661- }
8585+ static const uint32_t context_terminators[] = {
8586+ [PM_CONTEXT_NONE] = 0,
8587+ [PM_CONTEXT_BEGIN] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8588+ [PM_CONTEXT_BEGIN_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8589+ [PM_CONTEXT_BEGIN_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8590+ [PM_CONTEXT_BEGIN_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8591+ [PM_CONTEXT_BLOCK_BRACES] = (1 << PM_TOKEN_BRACE_RIGHT),
8592+ [PM_CONTEXT_BLOCK_KEYWORDS] = (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ENSURE),
8593+ [PM_CONTEXT_BLOCK_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8594+ [PM_CONTEXT_BLOCK_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8595+ [PM_CONTEXT_BLOCK_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8596+ [PM_CONTEXT_CASE_WHEN] = (1 << PM_TOKEN_KEYWORD_WHEN) | (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_ELSE),
8597+ [PM_CONTEXT_CASE_IN] = (1 << PM_TOKEN_KEYWORD_IN) | (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_ELSE),
8598+ [PM_CONTEXT_CLASS] = (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ENSURE),
8599+ [PM_CONTEXT_CLASS_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8600+ [PM_CONTEXT_CLASS_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8601+ [PM_CONTEXT_CLASS_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8602+ [PM_CONTEXT_DEF] = (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ENSURE),
8603+ [PM_CONTEXT_DEF_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8604+ [PM_CONTEXT_DEF_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8605+ [PM_CONTEXT_DEF_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8606+ [PM_CONTEXT_DEF_PARAMS] = (1 << PM_TOKEN_EOF),
8607+ [PM_CONTEXT_DEFINED] = (1 << PM_TOKEN_EOF),
8608+ [PM_CONTEXT_DEFAULT_PARAMS] = (1 << PM_TOKEN_COMMA) | (1 << PM_TOKEN_PARENTHESIS_RIGHT),
8609+ [PM_CONTEXT_ELSE] = (1 << PM_TOKEN_KEYWORD_END),
8610+ [PM_CONTEXT_ELSIF] = (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_ELSIF) | (1 << PM_TOKEN_KEYWORD_END),
8611+ [PM_CONTEXT_EMBEXPR] = (1 << PM_TOKEN_EMBEXPR_END),
8612+ [PM_CONTEXT_FOR] = (1 << PM_TOKEN_KEYWORD_END),
8613+ [PM_CONTEXT_FOR_INDEX] = (1 << PM_TOKEN_KEYWORD_IN),
8614+ [PM_CONTEXT_IF] = (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_ELSIF) | (1 << PM_TOKEN_KEYWORD_END),
8615+ [PM_CONTEXT_LAMBDA_BRACES] = (1 << PM_TOKEN_BRACE_RIGHT),
8616+ [PM_CONTEXT_LAMBDA_DO_END] = (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ENSURE),
8617+ [PM_CONTEXT_LAMBDA_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8618+ [PM_CONTEXT_LAMBDA_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8619+ [PM_CONTEXT_LAMBDA_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8620+ [PM_CONTEXT_LOOP_PREDICATE] = (1 << PM_TOKEN_KEYWORD_DO) | (1 << PM_TOKEN_KEYWORD_THEN),
8621+ [PM_CONTEXT_MAIN] = (1 << PM_TOKEN_EOF),
8622+ [PM_CONTEXT_MODULE] = (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ENSURE),
8623+ [PM_CONTEXT_MODULE_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8624+ [PM_CONTEXT_MODULE_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8625+ [PM_CONTEXT_MODULE_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8626+ [PM_CONTEXT_MULTI_TARGET] = (1 << PM_TOKEN_EOF),
8627+ [PM_CONTEXT_PARENS] = (1 << PM_TOKEN_PARENTHESIS_RIGHT),
8628+ [PM_CONTEXT_POSTEXE] = (1 << PM_TOKEN_BRACE_RIGHT),
8629+ [PM_CONTEXT_PREDICATE] = (1 << PM_TOKEN_KEYWORD_THEN) | (1 << PM_TOKEN_NEWLINE) | (1 << PM_TOKEN_SEMICOLON),
8630+ [PM_CONTEXT_PREEXE] = (1 << PM_TOKEN_BRACE_RIGHT),
8631+ [PM_CONTEXT_RESCUE_MODIFIER] = (1 << PM_TOKEN_EOF),
8632+ [PM_CONTEXT_SCLASS] = (1 << PM_TOKEN_KEYWORD_END) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ENSURE),
8633+ [PM_CONTEXT_SCLASS_ENSURE] = (1 << PM_TOKEN_KEYWORD_END),
8634+ [PM_CONTEXT_SCLASS_ELSE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_END),
8635+ [PM_CONTEXT_SCLASS_RESCUE] = (1 << PM_TOKEN_KEYWORD_ENSURE) | (1 << PM_TOKEN_KEYWORD_RESCUE) | (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8636+ [PM_CONTEXT_TERNARY] = (1 << PM_TOKEN_EOF),
8637+ [PM_CONTEXT_UNLESS] = (1 << PM_TOKEN_KEYWORD_ELSE) | (1 << PM_TOKEN_KEYWORD_END),
8638+ [PM_CONTEXT_UNTIL] = (1 << PM_TOKEN_KEYWORD_END),
8639+ [PM_CONTEXT_WHILE] = (1 << PM_TOKEN_KEYWORD_END),
8640+ };
86628641
8663- return false;
8642+ static inline bool
8643+ context_terminator(pm_context_t context, pm_token_t *token) {
8644+ return token->type < 32 && (context_terminators[context] & (1 << token->type));
86648645}
86658646
86668647/**
0 commit comments