Skip to content

⬅️ Back to Table of Contents

πŸ“„ related-getter-setter-pairs

πŸ“Š Analysis Summary

Metric Count
πŸ”§ Functions 3
πŸ“¦ Imports 5
πŸ“ Interfaces 1
πŸ“‘ Type Aliases 4

πŸ“š Table of Contents

πŸ› οΈ File Location:

πŸ“‚ packages/eslint-plugin/src/rules/related-getter-setter-pairs.ts

πŸ“€ Default Export

export default createRule({ ... })
Property Value
name 'related-getter-setter-pairs'
meta.type 'problem'
meta.docs.description 'Enforce that get() types should be assignable to their equivalent set() type'
meta.docs.recommended 'strict'
meta.docs.requiresTypeChecking true
meta.messages.mismatch 'get() type should be assignable to its equivalent set() type.'
meta.schema []
defaultOptions []

Entry point: create β€” documented under Functions.


πŸ“¦ Imports

Name Source
TSESTree @typescript-eslint/utils
AST_NODE_TYPES @typescript-eslint/utils
createRule ../util
getNameFromMember ../util
getParserServices ../util

Functions

create(context: any): { ':matches(ClassBody, TSInterfaceBody, TSTypeLiteral):exit…

Parameters:

  • context any

Returns: { ':matches(ClassBody, TSInterfaceBody, TSTypeLiteral):exit'(): void; ':matches(MethodDefinition, TSMethodSignature)[kind=get]'(node: GetMethodRaw): void; ':matches(MethodDefinition, TSMethodSignature)[kind=set]'(node: SetMethod): void; 'ClassBody, TSInterfaceBody, TSTypeLiteral'(): void; }

Calls:

  • getParserServices (from ../util)
  • services.program.getTypeChecker
  • getNameFromMember (from ../util)
  • methodPairs.set
  • methodPairs.get
  • methodPairs.values
  • services.getTypeAtLocation
  • checker.isTypeAssignableTo
  • context.report
  • methodPairsStack.pop
  • getMethodFromNode
  • addPropertyNode
  • methodPairsStack.push
Code
create(context) {
    const services = getParserServices(context);
    const checker = services.program.getTypeChecker();
    const methodPairsStack: Map<string, MethodPair>[] = [];

    function addPropertyNode(
      member: GetMethod | SetMethod,
      inner: TSESTree.Node,
      kind: 'get' | 'set',
    ): void {
      const methodPairs = methodPairsStack[methodPairsStack.length - 1];
      const { name } = getNameFromMember(member, context.sourceCode);

      methodPairs.set(name, {
        ...methodPairs.get(name),
        [kind]: inner,
      });
    }

    return {
      ':matches(ClassBody, TSInterfaceBody, TSTypeLiteral):exit'(): void {
        const methodPairs = methodPairsStack[methodPairsStack.length - 1];

        for (const pair of methodPairs.values()) {
          if (!pair.get || !pair.set) {
            continue;
          }

          const getter = pair.get;

          const getType = services.getTypeAtLocation(getter);
          const setType = services.getTypeAtLocation(pair.set.params[0]);

          if (!checker.isTypeAssignableTo(getType, setType)) {
            context.report({
              node: getter.returnType.typeAnnotation,
              messageId: 'mismatch',
            });
          }
        }

        methodPairsStack.pop();
      },
      ':matches(MethodDefinition, TSMethodSignature)[kind=get]'(
        node: GetMethodRaw,
      ): void {
        const getter = getMethodFromNode(node);

        if (getter.returnType) {
          addPropertyNode(node, getter, 'get');
        }
      },
      ':matches(MethodDefinition, TSMethodSignature)[kind=set]'(
        node: SetMethod,
      ): void {
        const setter = getMethodFromNode(node);

        if (setter.params.length === 1) {
          addPropertyNode(node, setter, 'set');
        }
      },

      'ClassBody, TSInterfaceBody, TSTypeLiteral'(): void {
        methodPairsStack.push(new Map());
      },
    };
  }

getMethodFromNode(node: GetMethodRaw | SetMethod): any

Parameters:

  • node GetMethodRaw | SetMethod

Returns: any

Code
function getMethodFromNode(node: GetMethodRaw | SetMethod) {
  return node.type === AST_NODE_TYPES.TSMethodSignature ? node : node.value;
}

Internal helpers

Declared inside another function in this file.

addPropertyNode(member: GetMethod | SetMethod, inner: TSESTree.Node, kind: 'get' | 'set'): void

Parameters:

  • member GetMethod | SetMethod
  • inner TSESTree.Node
  • kind 'get' | 'set'

Returns: void

Calls:

  • getNameFromMember (from ../util)
  • methodPairs.set
  • methodPairs.get
Code
function addPropertyNode(
      member: GetMethod | SetMethod,
      inner: TSESTree.Node,
      kind: 'get' | 'set',
    ): void {
      const methodPairs = methodPairsStack[methodPairsStack.length - 1];
      const { name } = getNameFromMember(member, context.sourceCode);

      methodPairs.set(name, {
        ...methodPairs.get(name),
        [kind]: inner,
      });
    }

Interfaces

MethodPair

Interface Code
interface MethodPair {
  get?: GetMethod;
  set?: SetMethod;
}

Properties

Name Type Optional Description
get GetMethod βœ“ not shown
set SetMethod βœ“ not shown

Type Aliases

Method

type Method = TSESTree.MethodDefinition | TSESTree.TSMethodSignature;

GetMethod

type GetMethod = {
  kind: 'get';
  returnType: TSESTree.TSTypeAnnotation;
} & Method;

GetMethodRaw

type GetMethodRaw = {
  returnType: TSESTree.TSTypeAnnotation | undefined;
} & GetMethod;

SetMethod

type SetMethod = { kind: 'set'; params: [TSESTree.Node] } & Method;

Generated by Syntax Scribe