Skip to content

⬅️ Back to Table of Contents

📄 needsPrecedingSemiColon.ts

📊 Analysis Summary

Metric Count
🔧 Functions 1
📦 Imports 6
📊 Variables & Constants 8

📚 Table of Contents

🛠️ File Location:

📂 packages/eslint-plugin/src/util/needsPrecedingSemiColon.ts

📦 Imports

Name Source
TSESTree @typescript-eslint/utils
SourceCode @typescript-eslint/utils/ts-eslint
AST_NODE_TYPES @typescript-eslint/utils
AST_TOKEN_TYPES @typescript-eslint/utils
isClosingBraceToken @typescript-eslint/utils/ast-utils
isClosingParenToken @typescript-eslint/utils/ast-utils

Variables & Constants

Name Type Kind Value Exported
BREAK_OR_CONTINUE Set<any> const `new Set([
AST_NODE_TYPES.BreakStatement,
AST_NODE_TYPES.ContinueStatement,
])`
DECLARATIONS Set<any> const `new Set([
AST_NODE_TYPES.ExportAllDeclaration,
AST_NODE_TYPES.ExportNamedDeclaration,
AST_NODE_TYPES.ImportDeclaration,
])`
IDENTIFIER_OR_KEYWORD Set<any> const `new Set([
AST_NODE_TYPES.Identifier,
AST_TOKEN_TYPES.Keyword,
])`
NODE_TYPES_BY_KEYWORD Record<string, TSESTree.AST_NODE_TYPES | null> const `{
proto: null,
break: AST_NODE_TYPES.BreakStatement,
continue: AST_NODE_TYPES.ContinueStatement,
debugger: AST_NODE_TYPES.DebuggerStatement,
do: AST_NODE_TYPES.DoWhileStatement,
else: AST_NODE_TYPES.IfStatement,
return: AST_NODE_TYPES.ReturnStatement,
yield: AST_NODE_TYPES.YieldExpression,
}`
PUNCTUATORS Set<string> const new Set(['--', ';', ':', '{', '++', '=>'])
STATEMENTS Set<any> const `new Set([
AST_NODE_TYPES.DoWhileStatement,
AST_NODE_TYPES.ForInStatement,
AST_NODE_TYPES.ForOfStatement,
AST_NODE_TYPES.ForStatement,
AST_NODE_TYPES.IfStatement,
AST_NODE_TYPES.WhileStatement,
AST_NODE_TYPES.WithStatement,
])`
keyword any const prevToken.value
nodeType any const NODE_TYPES_BY_KEYWORD[keyword]

Functions

needsPrecedingSemicolon(sourceCode: SourceCode, node: TSESTree.Node): boolean

Code
export function needsPrecedingSemicolon(
  sourceCode: SourceCode,
  node: TSESTree.Node,
): boolean {
  const prevToken = sourceCode.getTokenBefore(node);

  if (
    !prevToken ||
    (prevToken.type === AST_TOKEN_TYPES.Punctuator &&
      PUNCTUATORS.has(prevToken.value))
  ) {
    return false;
  }

  const prevNode = sourceCode.getNodeByRangeIndex(prevToken.range[0]);

  if (!prevNode) {
    return false;
  }

  if (isClosingParenToken(prevToken)) {
    return !STATEMENTS.has(prevNode.type);
  }

  if (isClosingBraceToken(prevToken)) {
    return (
      (prevNode.type === AST_NODE_TYPES.BlockStatement &&
        prevNode.parent.type === AST_NODE_TYPES.FunctionExpression &&
        prevNode.parent.parent.type !== AST_NODE_TYPES.MethodDefinition) ||
      (prevNode.type === AST_NODE_TYPES.ClassBody &&
        prevNode.parent.type === AST_NODE_TYPES.ClassExpression) ||
      prevNode.type === AST_NODE_TYPES.ObjectExpression
    );
  }

  if (!prevNode.parent) {
    return false;
  }

  if (IDENTIFIER_OR_KEYWORD.has(prevToken.type)) {
    if (BREAK_OR_CONTINUE.has(prevNode.parent.type)) {
      return false;
    }

    const keyword = prevToken.value;
    const nodeType = NODE_TYPES_BY_KEYWORD[keyword];

    return prevNode.type !== nodeType;
  }

  if (prevToken.type === AST_TOKEN_TYPES.String) {
    return !DECLARATIONS.has(prevNode.parent.type);
  }

  return true;
}
  • JSDoc:

    /**
     * Determines whether an opening parenthesis `(`, bracket `[` or backtick ``` ` ``` needs to be preceded by a semicolon.
     * This opening parenthesis or bracket should be at the start of an `ExpressionStatement`, a `MethodDefinition` or at
     * the start of the body of an `ArrowFunctionExpression`.
     * @param sourceCode The source code object.
     * @param node A node at the position where an opening parenthesis or bracket will be inserted.
     * @returns Whether a semicolon is required before the opening parenthesis or bracket.
     */
    

  • Parameters:

  • sourceCode: SourceCode
  • node: TSESTree.Node
  • Return Type: boolean
  • Calls:
  • sourceCode.getTokenBefore
  • PUNCTUATORS.has
  • sourceCode.getNodeByRangeIndex
  • isClosingParenToken (from @typescript-eslint/utils/ast-utils)
  • STATEMENTS.has
  • isClosingBraceToken (from @typescript-eslint/utils/ast-utils)
  • IDENTIFIER_OR_KEYWORD.has
  • BREAK_OR_CONTINUE.has
  • DECLARATIONS.has