Skip to content

⬅️ Back to Table of Contents

πŸ“„ getBaseTypesOfClassMember

πŸ“Š Analysis Summary

Metric Count
πŸ”§ Functions 1
πŸ“¦ Imports 2

πŸ“š Table of Contents

πŸ› οΈ File Location:

πŸ“‚ packages/eslint-plugin/src/util/getBaseTypesOfClassMember.ts

πŸ“¦ Imports

Name Source
TSESTree @typescript-eslint/utils
ParserServicesWithTypeInformation @typescript-eslint/utils

Functions

getBaseTypesOfClassMember(…): Generator<{ baseType: ts.Type; baseMemberType: ts.Type; her…

Given a member of a class which extends another class or implements an interface, yields the corresponding member type for each of the base class/interfaces.

Raw JSDoc
/**
 * Given a member of a class which extends another class or implements an interface,
 * yields the corresponding member type for each of the base class/interfaces.
 */

Calls:

  • services.esTreeNodeToTSNodeMap.get
  • services.program.getTypeChecker
  • checker.getSymbolAtLocation
  • checker.getTypeAtLocation
  • checker.getPropertyOfType
  • checker.getTypeOfSymbolAtLocation
Code
export function* getBaseTypesOfClassMember(
  services: ParserServicesWithTypeInformation,
  memberNode: TSESTree.MethodDefinition | TSESTree.PropertyDefinition,
): Generator<{
  baseType: ts.Type;
  baseMemberType: ts.Type;
  heritageToken: ts.SyntaxKind.ExtendsKeyword | ts.SyntaxKind.ImplementsKeyword;
}> {
  const memberTsNode = services.esTreeNodeToTSNodeMap.get(memberNode);
  if (memberTsNode.name == null) {
    return;
  }
  const checker = services.program.getTypeChecker();
  const memberSymbol = checker.getSymbolAtLocation(memberTsNode.name);
  if (memberSymbol == null) {
    return;
  }
  const classNode = memberTsNode.parent as ts.ClassLikeDeclaration;
  for (const clauseNode of classNode.heritageClauses ?? []) {
    for (const baseTypeNode of clauseNode.types) {
      const baseType = checker.getTypeAtLocation(baseTypeNode);
      const baseMemberSymbol = checker.getPropertyOfType(
        baseType,
        memberSymbol.name,
      );
      if (baseMemberSymbol == null) {
        continue;
      }
      const baseMemberType = checker.getTypeOfSymbolAtLocation(
        baseMemberSymbol,
        memberTsNode,
      );
      const heritageToken = clauseNode.token;
      yield { baseMemberType, baseType, heritageToken };
    }
  }
}

Generated by Syntax Scribe