From e49e55287a3b205ffa263b6fc58fa59fa8395e7b Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sat, 14 Nov 2015 12:08:47 -0800 Subject: [PATCH] do not crash when variable and function declarations collide --- src/compiler/checker.ts | 6 ++++-- .../reference/nonMergedOverloads.errors.txt | 20 +++++++++++++++++++ .../baselines/reference/nonMergedOverloads.js | 12 +++++++++++ tests/cases/compiler/nonMergedOverloads.ts | 5 +++++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/nonMergedOverloads.errors.txt create mode 100644 tests/baselines/reference/nonMergedOverloads.js create mode 100644 tests/cases/compiler/nonMergedOverloads.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7f5f73a58db..f975c110b03 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11360,12 +11360,14 @@ namespace ts { const errorNode: Node = (subsequentNode).name || subsequentNode; // TODO(jfreeman): These are methods, so handle computed name case if (node.name && (subsequentNode).name && (node.name).text === ((subsequentNode).name).text) { - Debug.assert(node.kind === SyntaxKind.MethodDeclaration || node.kind === SyntaxKind.MethodSignature); + const reportError = + (node.kind === SyntaxKind.MethodDeclaration || node.kind === SyntaxKind.MethodSignature) && + (node.flags & NodeFlags.Static) !== (subsequentNode.flags & NodeFlags.Static); // we can get here in two cases // 1. mixed static and instance class members // 2. something with the same name was defined before the set of overloads that prevents them from merging // here we'll report error only for the first case since for second we should already report error in binder - if ((node.flags & NodeFlags.Static) !== (subsequentNode.flags & NodeFlags.Static)) { + if (reportError) { const diagnostic = node.flags & NodeFlags.Static ? Diagnostics.Function_overload_must_be_static : Diagnostics.Function_overload_must_not_be_static; error(errorNode, diagnostic); } diff --git a/tests/baselines/reference/nonMergedOverloads.errors.txt b/tests/baselines/reference/nonMergedOverloads.errors.txt new file mode 100644 index 00000000000..9a38ebdc3b3 --- /dev/null +++ b/tests/baselines/reference/nonMergedOverloads.errors.txt @@ -0,0 +1,20 @@ +tests/cases/compiler/nonMergedOverloads.ts(1,5): error TS2300: Duplicate identifier 'f'. +tests/cases/compiler/nonMergedOverloads.ts(3,17): error TS1148: Cannot compile modules unless the '--module' flag is provided. +tests/cases/compiler/nonMergedOverloads.ts(3,17): error TS2300: Duplicate identifier 'f'. +tests/cases/compiler/nonMergedOverloads.ts(4,17): error TS2300: Duplicate identifier 'f'. + + +==== tests/cases/compiler/nonMergedOverloads.ts (4 errors) ==== + var f = 10; + ~ +!!! error TS2300: Duplicate identifier 'f'. + + export function f(); + ~ +!!! error TS1148: Cannot compile modules unless the '--module' flag is provided. + ~ +!!! error TS2300: Duplicate identifier 'f'. + export function f() { + ~ +!!! error TS2300: Duplicate identifier 'f'. + } \ No newline at end of file diff --git a/tests/baselines/reference/nonMergedOverloads.js b/tests/baselines/reference/nonMergedOverloads.js new file mode 100644 index 00000000000..2e7f7f67ee6 --- /dev/null +++ b/tests/baselines/reference/nonMergedOverloads.js @@ -0,0 +1,12 @@ +//// [nonMergedOverloads.ts] +var f = 10; + +export function f(); +export function f() { +} + +//// [nonMergedOverloads.js] +var f = 10; +function f() { +} +exports.f = f; diff --git a/tests/cases/compiler/nonMergedOverloads.ts b/tests/cases/compiler/nonMergedOverloads.ts new file mode 100644 index 00000000000..582cd72e1f4 --- /dev/null +++ b/tests/cases/compiler/nonMergedOverloads.ts @@ -0,0 +1,5 @@ +var f = 10; + +export function f(); +export function f() { +} \ No newline at end of file