Skip to content

Commit 7102b1d

Browse files
committed
emit publish of exported values in assignment expressions
1 parent 83fcca8 commit 7102b1d

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

src/compiler/checker.ts

+13
Original file line numberDiff line numberDiff line change
@@ -11803,6 +11803,18 @@ module ts {
1180311803
return !!resolveName(location, name, SymbolFlags.Value, /*nodeNotFoundMessage*/ undefined, /*nameArg*/ undefined);
1180411804
}
1180511805

11806+
function getReferencedValueDeclaration(reference: Identifier): Declaration {
11807+
Debug.assert(!nodeIsSynthesized(reference));
11808+
let symbol =
11809+
getNodeLinks(reference).resolvedSymbol ||
11810+
resolveName(reference, reference.text, SymbolFlags.Value | SymbolFlags.Alias, /*nodeNotFoundMessage*/ undefined, /*nameArg*/ undefined);
11811+
11812+
if (!symbol) {
11813+
return undefined;
11814+
}
11815+
return symbol.flags & SymbolFlags.Export ? symbol.exportSymbol.valueDeclaration : symbol.valueDeclaration
11816+
}
11817+
1180611818
function getBlockScopedVariableId(n: Identifier): number {
1180711819
Debug.assert(!nodeIsSynthesized(n));
1180811820

@@ -11861,6 +11873,7 @@ module ts {
1186111873
resolvesToSomeValue,
1186211874
collectLinkedAliases,
1186311875
getBlockScopedVariableId,
11876+
getReferencedValueDeclaration,
1186411877
serializeTypeOfNode,
1186511878
serializeParameterTypesOfNode,
1186611879
serializeReturnTypeOfNode,

src/compiler/emitter.ts

+21
Original file line numberDiff line numberDiff line change
@@ -1930,12 +1930,33 @@ var __param = this.__param || function(index, decorator) { return function (targ
19301930
emitDestructuring(node, node.parent.kind === SyntaxKind.ExpressionStatement);
19311931
}
19321932
else {
1933+
let emitPublishOfExportedValue = false;
1934+
1935+
if (currentFileIsEmittedAsSystemModule() &&
1936+
node.left.kind === SyntaxKind.Identifier &&
1937+
node.operatorToken.kind >= SyntaxKind.FirstAssignment &&
1938+
node.operatorToken.kind <= SyntaxKind.LastAssignment) {
1939+
1940+
let referencedDecl = resolver.getReferencedValueDeclaration(<Identifier>node.left);
1941+
if (referencedDecl && (getCombinedNodeFlags(referencedDecl) & NodeFlags.Export) && isSourceFileLevelDeclaration(referencedDecl)) {
1942+
emitPublishOfExportedValue = true;
1943+
}
1944+
}
1945+
1946+
if (emitPublishOfExportedValue) {
1947+
write(`${exportFunctionForFile}("`);
1948+
emitNodeWithoutSourceMap(node.left);
1949+
write(`", `);
1950+
}
19331951
emit(node.left);
19341952
let indentedBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== SyntaxKind.CommaToken ? " " : undefined);
19351953
write(tokenToString(node.operatorToken.kind));
19361954
let indentedAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " ");
19371955
emit(node.right);
19381956
decreaseIndentIf(indentedBeforeOperator, indentedAfterOperator);
1957+
if (emitPublishOfExportedValue) {
1958+
write(")");
1959+
}
19391960
}
19401961
}
19411962

src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1256,6 +1256,7 @@ module ts {
12561256
getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): number;
12571257
resolvesToSomeValue(location: Node, name: string): boolean;
12581258
getBlockScopedVariableId(node: Identifier): number;
1259+
getReferencedValueDeclaration(reference: Identifier): Node;
12591260
serializeTypeOfNode(node: Node, getGeneratedNameForNode: (Node: Node) => string): string | string[];
12601261
serializeParameterTypesOfNode(node: Node, getGeneratedNameForNode: (Node: Node) => string): (string | string[])[];
12611262
serializeReturnTypeOfNode(node: Node, getGeneratedNameForNode: (Node: Node) => string): string | string[];

0 commit comments

Comments
 (0)