private endVisitExpressionStatement()

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);
		}
	}