Allow exporting a binding before its declaration

This commit is contained in:
Diogo Franco (Kovensky) 2017-03-17 10:25:37 +09:00
parent 595342615b
commit 61ebcb49c7
5 changed files with 60 additions and 0 deletions

View file

@ -742,6 +742,13 @@ namespace ts {
// declaration is after usage, but it can still be legal if usage is deferred:
// 1. inside a function
// 2. inside an instance property initializer, a reference to a non-instance property
// 3. inside an export specifier
if (usage.parent.kind === SyntaxKind.ExportSpecifier) {
// export specifiers do not use the variable, they only make it available for use
return true;
}
const container = getEnclosingBlockScopeContainer(declaration);
const isInstanceProperty = declaration.kind === SyntaxKind.PropertyDeclaration && !(getModifierFlags(declaration) & ModifierFlags.Static);
return isUsedInFunctionOrInstanceProperty(usage, isInstanceProperty, container);

View file

@ -0,0 +1,19 @@
//// [exportBinding.ts]
export { x }
const x = 'x'
export { Y as Z }
class Y {}
//// [exportBinding.js]
"use strict";
exports.__esModule = true;
var x = 'x';
exports.x = x;
var Y = (function () {
function Y() {
}
return Y;
}());
exports.Z = Y;

View file

@ -0,0 +1,14 @@
=== tests/cases/conformance/es6/modules/exportBinding.ts ===
export { x }
>x : Symbol(x, Decl(exportBinding.ts, 0, 8))
const x = 'x'
>x : Symbol(x, Decl(exportBinding.ts, 1, 5))
export { Y as Z }
>Y : Symbol(Z, Decl(exportBinding.ts, 3, 8))
>Z : Symbol(Z, Decl(exportBinding.ts, 3, 8))
class Y {}
>Y : Symbol(Y, Decl(exportBinding.ts, 3, 17))

View file

@ -0,0 +1,15 @@
=== tests/cases/conformance/es6/modules/exportBinding.ts ===
export { x }
>x : "x"
const x = 'x'
>x : "x"
>'x' : "x"
export { Y as Z }
>Y : typeof Y
>Z : typeof Y
class Y {}
>Y : Y

View file

@ -0,0 +1,5 @@
export { x }
const x = 'x'
export { Y as Z }
class Y {}