Skip to content

⬅️ Back to Table of Contents

📄 createParser

📊 Analysis Summary

Metric Count
🔧 Functions 9
📦 Imports 8

📚 Table of Contents

🛠️ File Location:

📂 packages/website/src/components/linter/createParser.ts

📦 Imports

Name Source
ParserOptions @typescript-eslint/types
Parser @typescript-eslint/utils/ts-eslint
ParseSettings ./types
PlaygroundSystem ./types
RegisterFile ./types
UpdateModel ./types
WebLinterModule ./types
defaultParseSettings ./config

Functions

createParser(…): { updateConfig: (compilerOptions: ts.CompilerOptions) => vo…

Parameters:

  • system PlaygroundSystem
  • compilerOptions ts.CompilerOptions
  • onUpdate (filename: string, model: UpdateModel) => void
  • utils WebLinterModule
  • vfs typeof tsvfs

Returns: { updateConfig: (compilerOptions: ts.CompilerOptions) => void; registerFile: RegisterFile; } & Parser.ParserModule

Calls:

  • vfs.createVirtualTypeScriptEnvironment
  • system.getScriptFileNames
  • createEnv
  • compilerHost.getSourceFile
  • compilerHost.updateFile
  • compilerHost.createFile
  • compilerHost.languageService.getProgram
  • program.getSourceFile
  • utils.astConverter
  • utils.analyze
  • program.getTypeChecker
  • program.getCompilerOptions
  • onUpdate
  • checker.getContextualType
  • converted.astMaps.esTreeNodeToTSNodeMap.get
  • checker.getResolvedSignature
  • checker.getSymbolAtLocation
  • checker.getTypeAtLocation
  • checker.getTypeFromTypeNode
  • checker.getTypeOfSymbolAtLocation

Internal Comments:

// if text is empty use empty line to avoid error (x2)
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion (x2)

Code
export function createParser(
  system: PlaygroundSystem,
  compilerOptions: ts.CompilerOptions,
  onUpdate: (filename: string, model: UpdateModel) => void,
  utils: WebLinterModule,
  vfs: typeof tsvfs,
): {
  updateConfig: (compilerOptions: ts.CompilerOptions) => void;
  registerFile: RegisterFile;
} & Parser.ParserModule {
  const createEnv = (
    compilerOptions: ts.CompilerOptions,
  ): tsvfs.VirtualTypeScriptEnvironment => {
    return vfs.createVirtualTypeScriptEnvironment(
      system,
      system.getScriptFileNames(),
      window.ts,
      compilerOptions,
    );
  };

  let compilerHost = createEnv(compilerOptions);

  return {
    parseForESLint: (
      text: string,
      options: ParserOptions = {},
    ): Parser.ParseResult => {
      const filePath = options.filePath ?? '/input.ts';

      // if text is empty use empty line to avoid error
      const code = text || '\n';

      if (compilerHost.getSourceFile(filePath)) {
        compilerHost.updateFile(filePath, code);
      } else {
        compilerHost.createFile(filePath, code);
      }

      const parseSettings: ParseSettings = {
        ...defaultParseSettings,
        code,
        codeFullText: code,
        filePath,
      };

      const program = compilerHost.languageService.getProgram();
      if (!program) {
        throw new Error('Failed to get program');
      }

      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
      const tsAst = program.getSourceFile(filePath)!;

      const converted = utils.astConverter(tsAst, parseSettings, true);

      const scopeManager = utils.analyze(converted.estree, {
        globalReturn: options.ecmaFeatures?.globalReturn ?? false,
        sourceType: options.sourceType ?? 'module',
      });

      const checker = program.getTypeChecker();
      const compilerOptions = program.getCompilerOptions();

      onUpdate(filePath, {
        storedAST: converted.estree,
        storedScope: scopeManager,
        storedTsAST: tsAst,
        typeChecker: checker,
      });

      return {
        ast: converted.estree,
        scopeManager,
        services: {
          emitDecoratorMetadata: compilerOptions.emitDecoratorMetadata ?? false,
          esTreeNodeToTSNodeMap: converted.astMaps.esTreeNodeToTSNodeMap,
          experimentalDecorators:
            compilerOptions.experimentalDecorators ?? false,
          getContextualType: node =>
            checker.getContextualType(
              converted.astMaps.esTreeNodeToTSNodeMap.get(
                node,
              ) as ts.Expression,
            ),
          getResolvedSignature: node =>
            checker.getResolvedSignature(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          getSymbolAtLocation: node =>
            checker.getSymbolAtLocation(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          getTypeAtLocation: node =>
            checker.getTypeAtLocation(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          getTypeFromTypeNode: node =>
            checker.getTypeFromTypeNode(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node) as ts.TypeNode,
            ),
          getTypeOfSymbolAtLocation: (symbol, node) =>
            checker.getTypeOfSymbolAtLocation(
              symbol,
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          isolatedDeclarations: compilerOptions.isolatedDeclarations ?? false,
          program,
          tsNodeToESTreeNodeMap: converted.astMaps.tsNodeToESTreeNodeMap,
        },
        visitorKeys: utils.visitorKeys,
      };
    },
    registerFile(filePath: string, code: string): void {
      compilerHost.createFile(filePath, code);
    },
    updateConfig(compilerOptions): void {
      compilerHost = createEnv(compilerOptions);
    },
  };
}

Internal helpers

Declared inside another function in this file.

createEnv(compilerOptions: ts.CompilerOptions): tsvfs.VirtualTypeScriptEnvironment

Parameters:

  • compilerOptions ts.CompilerOptions

Returns: tsvfs.VirtualTypeScriptEnvironment

Calls:

  • vfs.createVirtualTypeScriptEnvironment
  • system.getScriptFileNames
Code
(
    compilerOptions: ts.CompilerOptions,
  ): tsvfs.VirtualTypeScriptEnvironment => {
    return vfs.createVirtualTypeScriptEnvironment(
      system,
      system.getScriptFileNames(),
      window.ts,
      compilerOptions,
    );
  }

parseForESLint(text: string, options: ParserOptions): Parser.ParseResult

Parameters:

  • text string
  • options ParserOptions

Returns: Parser.ParseResult

Calls:

  • compilerHost.getSourceFile
  • compilerHost.updateFile
  • compilerHost.createFile
  • compilerHost.languageService.getProgram
  • program.getSourceFile
  • utils.astConverter
  • utils.analyze
  • program.getTypeChecker
  • program.getCompilerOptions
  • onUpdate
  • checker.getContextualType
  • converted.astMaps.esTreeNodeToTSNodeMap.get
  • checker.getResolvedSignature
  • checker.getSymbolAtLocation
  • checker.getTypeAtLocation
  • checker.getTypeFromTypeNode
  • checker.getTypeOfSymbolAtLocation

Internal Comments:

// if text is empty use empty line to avoid error (x2)
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion (x2)

Code
(
      text: string,
      options: ParserOptions = {},
    ): Parser.ParseResult => {
      const filePath = options.filePath ?? '/input.ts';

      // if text is empty use empty line to avoid error
      const code = text || '\n';

      if (compilerHost.getSourceFile(filePath)) {
        compilerHost.updateFile(filePath, code);
      } else {
        compilerHost.createFile(filePath, code);
      }

      const parseSettings: ParseSettings = {
        ...defaultParseSettings,
        code,
        codeFullText: code,
        filePath,
      };

      const program = compilerHost.languageService.getProgram();
      if (!program) {
        throw new Error('Failed to get program');
      }

      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
      const tsAst = program.getSourceFile(filePath)!;

      const converted = utils.astConverter(tsAst, parseSettings, true);

      const scopeManager = utils.analyze(converted.estree, {
        globalReturn: options.ecmaFeatures?.globalReturn ?? false,
        sourceType: options.sourceType ?? 'module',
      });

      const checker = program.getTypeChecker();
      const compilerOptions = program.getCompilerOptions();

      onUpdate(filePath, {
        storedAST: converted.estree,
        storedScope: scopeManager,
        storedTsAST: tsAst,
        typeChecker: checker,
      });

      return {
        ast: converted.estree,
        scopeManager,
        services: {
          emitDecoratorMetadata: compilerOptions.emitDecoratorMetadata ?? false,
          esTreeNodeToTSNodeMap: converted.astMaps.esTreeNodeToTSNodeMap,
          experimentalDecorators:
            compilerOptions.experimentalDecorators ?? false,
          getContextualType: node =>
            checker.getContextualType(
              converted.astMaps.esTreeNodeToTSNodeMap.get(
                node,
              ) as ts.Expression,
            ),
          getResolvedSignature: node =>
            checker.getResolvedSignature(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          getSymbolAtLocation: node =>
            checker.getSymbolAtLocation(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          getTypeAtLocation: node =>
            checker.getTypeAtLocation(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          getTypeFromTypeNode: node =>
            checker.getTypeFromTypeNode(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node) as ts.TypeNode,
            ),
          getTypeOfSymbolAtLocation: (symbol, node) =>
            checker.getTypeOfSymbolAtLocation(
              symbol,
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            ),
          isolatedDeclarations: compilerOptions.isolatedDeclarations ?? false,
          program,
          tsNodeToESTreeNodeMap: converted.astMaps.tsNodeToESTreeNodeMap,
        },
        visitorKeys: utils.visitorKeys,
      };
    }

getContextualType(node: any): any

Parameters:

  • node any

Returns: any

Calls:

  • checker.getContextualType
Code
node =>
            checker.getContextualType(
              converted.astMaps.esTreeNodeToTSNodeMap.get(
                node,
              ) as ts.Expression,
            )

getResolvedSignature(node: any): any

Parameters:

  • node any

Returns: any

Calls:

  • checker.getResolvedSignature
Code
node =>
            checker.getResolvedSignature(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            )

getSymbolAtLocation(node: any): any

Parameters:

  • node any

Returns: any

Calls:

  • checker.getSymbolAtLocation
Code
node =>
            checker.getSymbolAtLocation(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            )

getTypeAtLocation(node: any): any

Parameters:

  • node any

Returns: any

Calls:

  • checker.getTypeAtLocation
Code
node =>
            checker.getTypeAtLocation(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            )

getTypeFromTypeNode(node: any): any

Parameters:

  • node any

Returns: any

Calls:

  • checker.getTypeFromTypeNode
Code
node =>
            checker.getTypeFromTypeNode(
              converted.astMaps.esTreeNodeToTSNodeMap.get(node) as ts.TypeNode,
            )

getTypeOfSymbolAtLocation(symbol: any, node: any): any

Parameters:

  • symbol any
  • node any

Returns: any

Calls:

  • checker.getTypeOfSymbolAtLocation
Code
(symbol, node) =>
            checker.getTypeOfSymbolAtLocation(
              symbol,
              converted.astMaps.esTreeNodeToTSNodeMap.get(node),
            )

Generated by Syntax Scribe