microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
101.32k stars 12.53k forks source link

API about Identifier's scope #28026

Open xiaoxiangmoe opened 6 years ago

xiaoxiangmoe commented 6 years ago

I want to write a CustomTransformers for my webpack loader config.

Babel's visitors have API about scope If I get a path of ImportDeclaration import * as React from "react", I can using path.scope.getBinding('React').referencePaths to get all reference paths using React.

Is there any API in TypeScript to get identifier's scope or referenced nodes/identifiers?

Also, Is there any API in TypeScript to get ImportDeclaration's moduleSpecifier's resolved source file? for example import * as React from "react"'s resolved source file is /home/me/my-ts-project/node_modules/react/cjs/react.development.js

ajafff commented 6 years ago

I have written a utility function to get all references to a given declaration.

import {collectVariableUsage} from 'tsutils';

/** 
  *`identifier` needs to be the name of the declaration and be located within `sourceFile`.
  * Note that this only works on one source file at a time and can therefore not detect references to global variables in other files.
  */
function getUses(sourceFile: ts.SourceFile, identifier: ts.Identifier) {
  // you might want to cache the result of `collectVariableUsage`
  return collectVariableUsage(sourceFile).get(identifier)!.uses;
}

Currently you can only look up the uses of a declaration. A reverse lookup is not possible. It also doesn't tell if an identifier is in scope at a given location. Tough I'm planning on improving the API to make it more powerful and easier to use: https://github.com/ajafff/tsutils/issues/38

DanielRosenwasser commented 8 months ago

resolveName is now an API on TypeChecker: https://github.com/microsoft/TypeScript/blob/6ea273cdcca99db809074d2b2d38d0e5b59ee81b/lib/typescript.d.ts#L6884

Program has resolveModuleNames: https://github.com/microsoft/TypeScript/blob/6ea273cdcca99db809074d2b2d38d0e5b59ee81b/lib/typescript.d.ts#L10216

I think these are close enough to what you might be asking for - but not 100% certain.