in tsc/src/lsif.ts [3892:3925]
private endVisitExpressionStatement(node: ts.ExpressionStatement): void {
// we only need to handle `module.exports = `
if (!ts.isSourceFile(node.parent) || !ts.isBinaryExpression(node.expression) || !ts.isPropertyAccessExpression(node.expression.left)) {
return;
}
const left = node.expression.left;
const isModuleExport = ts.isIdentifier(left.expression) && left.expression.escapedText === 'module' && left.name.escapedText === 'exports';
const isExport = ts.isIdentifier(left.expression) && left.expression.escapedText === 'exports' && ts.isIdentifier(left.name);
if (isModuleExport || isExport) {
// First upgrade the aliased symbol even if we can't generate a moniker for it
const aliasedSymbol = this.tsProject.getSymbolAtLocation(node.expression.right);
if (aliasedSymbol === undefined) {
return;
}
const aliasedSymbolData = this.dataManager.getOrCreateSymbolData(aliasedSymbol);
if (aliasedSymbolData === undefined) {
return;
}
aliasedSymbolData.changeVisibility(SymbolDataVisibility.indirectExported);
const symbol = this.tsProject.getSymbolAtLocation(left);
if (symbol === undefined) {
return;
}
this.dataManager.getOrCreateSymbolData(symbol);
const monikerPath = this.currentDocumentData.monikerPath;
if (monikerPath === undefined) {
return;
}
this.tsProject.exportSymbol(aliasedSymbol, monikerPath, this.tsProject.getExportSymbolName(symbol), this.currentSourceFile);
}
}