don't throw classNameTDZError if referenced identifier is within a TypeAnnotation (#9190)

fix #9189

Obviously this code is intended to throw an error if someone tries to reference a class before it's defined, like:
```js
class Foo {
  someField = Foo;
}
```
But there's no problem with referencing the class in a type annotation before it's defined, and this is often necessary for tree structures:
```js
class Foo {
  [someSymbol]: Foo;
}
```
This commit is contained in:
Andy Edwards 2018-12-15 08:16:43 -06:00 committed by Nicolò Ribaudo
parent c1499b13ac
commit 3c8e15dbc1
7 changed files with 54 additions and 0 deletions

View File

@ -0,0 +1,7 @@
const sym = Symbol();
const sym1 = Symbol();
class A {
[sym]: A.B;
[sym1]: Array<A>;
}

View File

@ -0,0 +1,8 @@
{
"presets": [
"flow"
],
"plugins": [
"proposal-class-properties"
]
}

View File

@ -0,0 +1,13 @@
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const sym = Symbol();
const sym1 = Symbol();
class A {
constructor() {
_defineProperty(this, sym, void 0);
_defineProperty(this, sym1, void 0);
}
}

View File

@ -0,0 +1,5 @@
const sym = Symbol();
class A {
[sym]: A;
}

View File

@ -0,0 +1,8 @@
{
"presets": [
"flow"
],
"plugins": [
"proposal-class-properties"
]
}

View File

@ -0,0 +1,10 @@
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const sym = Symbol();
class A {
constructor() {
_defineProperty(this, sym, void 0);
}
}

View File

@ -40,6 +40,9 @@ function skipAllButComputedKey(path) {
}
export const environmentVisitor = {
TypeAnnotation(path) {
path.skip();
},
Function(path) {
// Methods will be handled by the Method visit
if (path.isMethod()) return;