mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-30 11:24:49 -05:00
In isInPropertyInitializer, don't bail out at a PropertyAssignment (#18449)
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user