Skip to content

Commit 833fd01

Browse files
committed
Static prop. inits can refer to later static methods
Static methods are created before static property initializers run, so static property initializers may refer to static methods. This was not allowed previously.
1 parent 1c64943 commit 833fd01

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/compiler/checker.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ namespace ts {
751751
// declaration is after usage, but it can still be legal if usage is deferred:
752752
// 1. inside a function
753753
// 2. inside an instance property initializer, a reference to a non-instance property
754+
// 3. inside a static property initializer, a reference to a static method in the same class
754755
const container = getEnclosingBlockScopeContainer(declaration);
755756
return isUsedInFunctionOrInstanceProperty(usage, declaration, container);
756757

@@ -792,14 +793,22 @@ namespace ts {
792793
return true;
793794
}
794795

795-
const initializerOfInstanceProperty = current.parent &&
796+
const initializerOfProperty = current.parent &&
796797
current.parent.kind === SyntaxKind.PropertyDeclaration &&
797-
(getModifierFlags(current.parent) & ModifierFlags.Static) === 0 &&
798798
(<PropertyDeclaration>current.parent).initializer === current;
799799

800-
if (initializerOfInstanceProperty) {
801-
const isDeclarationInstanceProperty = declaration.kind === SyntaxKind.PropertyDeclaration && !(getModifierFlags(declaration) & ModifierFlags.Static);
802-
return !isDeclarationInstanceProperty || getContainingClass(usage) !== getContainingClass(declaration);
800+
if (initializerOfProperty) {
801+
if (getModifierFlags(current.parent) & ModifierFlags.Static) {
802+
if (declaration.kind === SyntaxKind.MethodDeclaration) {
803+
return true;
804+
}
805+
}
806+
else {
807+
const isDeclarationInstanceProperty = declaration.kind === SyntaxKind.PropertyDeclaration && !(getModifierFlags(declaration) & ModifierFlags.Static);
808+
if(!isDeclarationInstanceProperty || getContainingClass(usage) !== getContainingClass(declaration)) {
809+
return true;
810+
}
811+
}
803812
}
804813

805814
current = current.parent;

0 commit comments

Comments
 (0)