From 72c7406e98737dac46ad431ddffc8cd8927ffdd9 Mon Sep 17 00:00:00 2001 From: Alexander T Date: Tue, 10 Mar 2020 17:03:05 +0200 Subject: [PATCH] fix(37287): check appropriate context with enabled useDefineForClassFields --- src/compiler/checker.ts | 2 +- .../defineVariables_useDefineForClassFields.js | 9 +++++++++ ...fineVariables_useDefineForClassFields.symbols | 11 +++++++++++ ...defineVariables_useDefineForClassFields.types | 16 ++++++++++++++++ .../defineVariables_useDefineForClassFields.ts | 6 ++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/defineVariables_useDefineForClassFields.js create mode 100644 tests/baselines/reference/defineVariables_useDefineForClassFields.symbols create mode 100644 tests/baselines/reference/defineVariables_useDefineForClassFields.types create mode 100644 tests/cases/compiler/defineVariables_useDefineForClassFields.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 645bf049f4e12..8eabad79e1c0b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1402,7 +1402,7 @@ namespace ts { return true; } if (isUsedInFunctionOrInstanceProperty(usage, declaration, container)) { - if (compilerOptions.target === ScriptTarget.ESNext && !!compilerOptions.useDefineForClassFields) { + if (compilerOptions.target === ScriptTarget.ESNext && !!compilerOptions.useDefineForClassFields && getContainingClass(declaration)) { return (isPropertyDeclaration(declaration) || isParameterPropertyDeclaration(declaration, declaration.parent)) && !isPropertyImmediatelyReferencedWithinDeclaration(declaration, usage, /*stopAtAnyPropertyDeclaration*/ true); } diff --git a/tests/baselines/reference/defineVariables_useDefineForClassFields.js b/tests/baselines/reference/defineVariables_useDefineForClassFields.js new file mode 100644 index 0000000000000..b9a177c59c11a --- /dev/null +++ b/tests/baselines/reference/defineVariables_useDefineForClassFields.js @@ -0,0 +1,9 @@ +//// [defineVariables_useDefineForClassFields.ts] +const a = () => b() +const b = () => null +a() + +//// [defineVariables_useDefineForClassFields.js] +const a = () => b(); +const b = () => null; +a(); diff --git a/tests/baselines/reference/defineVariables_useDefineForClassFields.symbols b/tests/baselines/reference/defineVariables_useDefineForClassFields.symbols new file mode 100644 index 0000000000000..bac64fc21b5b7 --- /dev/null +++ b/tests/baselines/reference/defineVariables_useDefineForClassFields.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/defineVariables_useDefineForClassFields.ts === +const a = () => b() +>a : Symbol(a, Decl(defineVariables_useDefineForClassFields.ts, 0, 5)) +>b : Symbol(b, Decl(defineVariables_useDefineForClassFields.ts, 1, 5)) + +const b = () => null +>b : Symbol(b, Decl(defineVariables_useDefineForClassFields.ts, 1, 5)) + +a() +>a : Symbol(a, Decl(defineVariables_useDefineForClassFields.ts, 0, 5)) + diff --git a/tests/baselines/reference/defineVariables_useDefineForClassFields.types b/tests/baselines/reference/defineVariables_useDefineForClassFields.types new file mode 100644 index 0000000000000..af82e8b286be1 --- /dev/null +++ b/tests/baselines/reference/defineVariables_useDefineForClassFields.types @@ -0,0 +1,16 @@ +=== tests/cases/compiler/defineVariables_useDefineForClassFields.ts === +const a = () => b() +>a : () => any +>() => b() : () => any +>b() : any +>b : () => any + +const b = () => null +>b : () => any +>() => null : () => any +>null : null + +a() +>a() : any +>a : () => any + diff --git a/tests/cases/compiler/defineVariables_useDefineForClassFields.ts b/tests/cases/compiler/defineVariables_useDefineForClassFields.ts new file mode 100644 index 0000000000000..4d161a5c9a0e6 --- /dev/null +++ b/tests/cases/compiler/defineVariables_useDefineForClassFields.ts @@ -0,0 +1,6 @@ +// @target: ESNext +// @useDefineForClassFields: true + +const a = () => b() +const b = () => null +a() \ No newline at end of file