In isInPropertyInitializer, don't bail out at a PropertyAssignment (#18449)

This commit is contained in:
Andy 2017-09-14 07:59:53 -07:00 committed by GitHub
parent be5c00f4c9
commit cf53743bd6
4 changed files with 48 additions and 1 deletions

View File

@ -14753,7 +14753,7 @@ namespace ts {
return;
}
if (findAncestor(node, node => node.kind === SyntaxKind.PropertyDeclaration ? true : isExpression(node) ? false : "quit") &&
if (isInPropertyInitializer(node) &&
!isBlockScopedNameDeclaredBeforeUse(valueDeclaration, right)
&& !isPropertyDeclaredInAncestorClass(prop)) {
error(right, Diagnostics.Block_scoped_variable_0_used_before_its_declaration, unescapeLeadingUnderscores(right.escapedText));
@ -14766,6 +14766,20 @@ namespace ts {
}
}
function isInPropertyInitializer(node: Node): boolean {
return !!findAncestor(node, node => {
switch (node.kind) {
case SyntaxKind.PropertyDeclaration:
return true;
case SyntaxKind.PropertyAssignment:
// We might be in `a = { b: this.b }`, so keep looking. See `tests/cases/compiler/useBeforeDeclaration_propertyAssignment.ts`.
return false;
default:
return isPartOfExpression(node) ? false : "quit";
}
});
}
/**
* It's possible that "prop.valueDeclaration" is a local declaration, but the property was also declared in a superclass.
* In that case we won't consider it used before its declaration, because it gets its value from the superclass' declaration.

View File

@ -0,0 +1,11 @@
tests/cases/compiler/useBeforeDeclaration_propertyAssignment.ts(2,27): error TS2448: Block-scoped variable 'b' used before its declaration.
==== tests/cases/compiler/useBeforeDeclaration_propertyAssignment.ts (1 errors) ====
export class C {
public a = { b: this.b };
~
!!! error TS2448: Block-scoped variable 'b' used before its declaration.
private b = 0;
}

View File

@ -0,0 +1,18 @@
//// [useBeforeDeclaration_propertyAssignment.ts]
export class C {
public a = { b: this.b };
private b = 0;
}
//// [useBeforeDeclaration_propertyAssignment.js]
"use strict";
exports.__esModule = true;
var C = /** @class */ (function () {
function C() {
this.a = { b: this.b };
this.b = 0;
}
return C;
}());
exports.C = C;

View File

@ -0,0 +1,4 @@
export class C {
public a = { b: this.b };
private b = 0;
}