From e4cc532e145e8d410713ed96f9bd39771378be69 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Sat, 1 Jul 2023 07:53:51 +0800 Subject: [PATCH] Make bodiless declarations an error in JS (#54439) --- src/compiler/diagnosticMessages.json | 4 ++++ src/compiler/program.ts | 8 ++++++++ ...FileCompilationConstructorOverloadSyntax.errors.txt | 10 ++++++++++ .../jsFileCompilationConstructorOverloadSyntax.symbols | 9 +++++++++ .../jsFileCompilationConstructorOverloadSyntax.types | 9 +++++++++ .../jsFileCompilationFunctionOverloadSyntax.errors.txt | 8 ++++++++ .../jsFileCompilationFunctionOverloadSyntax.symbols | 6 ++++++ .../jsFileCompilationFunctionOverloadSyntax.types | 6 ++++++ .../jsFileCompilationMethodOverloadSyntax.errors.txt | 10 ++++++++++ .../jsFileCompilationMethodOverloadSyntax.symbols | 10 ++++++++++ .../jsFileCompilationMethodOverloadSyntax.types | 10 ++++++++++ .../jsFileCompilationConstructorOverloadSyntax.ts | 6 ++++++ .../jsFileCompilationFunctionOverloadSyntax.ts | 4 ++++ .../compiler/jsFileCompilationMethodOverloadSyntax.ts | 6 ++++++ 14 files changed, 106 insertions(+) create mode 100644 tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.errors.txt create mode 100644 tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.symbols create mode 100644 tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.types create mode 100644 tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.errors.txt create mode 100644 tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.symbols create mode 100644 tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.types create mode 100644 tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.errors.txt create mode 100644 tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.symbols create mode 100644 tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.types create mode 100644 tests/cases/compiler/jsFileCompilationConstructorOverloadSyntax.ts create mode 100644 tests/cases/compiler/jsFileCompilationFunctionOverloadSyntax.ts create mode 100644 tests/cases/compiler/jsFileCompilationMethodOverloadSyntax.ts diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 0d01c46edd7..e1519912716 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -6556,6 +6556,10 @@ "category": "Error", "code": 8016 }, + "Signature declarations can only be used in TypeScript files.": { + "category": "Error", + "code": 8017 + }, "Report errors in .js files.": { "category": "Message", "code": 8019 diff --git a/src/compiler/program.ts b/src/compiler/program.ts index a61e46e3565..0d8cdffe057 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -3022,6 +3022,14 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg case SyntaxKind.TypeAliasDeclaration: diagnostics.push(createDiagnosticForNode(node, Diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files)); return "skip"; + case SyntaxKind.Constructor: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.FunctionDeclaration: + if (!(node as FunctionLikeDeclaration).body) { + diagnostics.push(createDiagnosticForNode(node, Diagnostics.Signature_declarations_can_only_be_used_in_TypeScript_files)); + return "skip"; + } + return; case SyntaxKind.EnumDeclaration: const enumKeyword = Debug.checkDefined(tokenToString(SyntaxKind.EnumKeyword)); diagnostics.push(createDiagnosticForNode(node, Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, enumKeyword)); diff --git a/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.errors.txt b/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.errors.txt new file mode 100644 index 00000000000..0ff11a2b87a --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.errors.txt @@ -0,0 +1,10 @@ +a.js(2,3): error TS8017: Signature declarations can only be used in TypeScript files. + + +==== a.js (1 errors) ==== + class A { + constructor(); + ~~~~~~~~~~~~~~ +!!! error TS8017: Signature declarations can only be used in TypeScript files. + } + \ No newline at end of file diff --git a/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.symbols b/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.symbols new file mode 100644 index 00000000000..65e200e7257 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.symbols @@ -0,0 +1,9 @@ +//// [tests/cases/compiler/jsFileCompilationConstructorOverloadSyntax.ts] //// + +=== a.js === +class A { +>A : Symbol(A, Decl(a.js, 0, 0)) + + constructor(); +} + diff --git a/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.types b/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.types new file mode 100644 index 00000000000..4f5c7e5080c --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationConstructorOverloadSyntax.types @@ -0,0 +1,9 @@ +//// [tests/cases/compiler/jsFileCompilationConstructorOverloadSyntax.ts] //// + +=== a.js === +class A { +>A : A + + constructor(); +} + diff --git a/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.errors.txt b/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.errors.txt new file mode 100644 index 00000000000..1c10528f035 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.errors.txt @@ -0,0 +1,8 @@ +a.js(1,10): error TS8017: Signature declarations can only be used in TypeScript files. + + +==== a.js (1 errors) ==== + function foo(); + ~~~ +!!! error TS8017: Signature declarations can only be used in TypeScript files. + \ No newline at end of file diff --git a/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.symbols b/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.symbols new file mode 100644 index 00000000000..deb72043cf9 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.symbols @@ -0,0 +1,6 @@ +//// [tests/cases/compiler/jsFileCompilationFunctionOverloadSyntax.ts] //// + +=== a.js === +function foo(); +>foo : Symbol(foo, Decl(a.js, 0, 0)) + diff --git a/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.types b/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.types new file mode 100644 index 00000000000..d7a60a7b1ef --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationFunctionOverloadSyntax.types @@ -0,0 +1,6 @@ +//// [tests/cases/compiler/jsFileCompilationFunctionOverloadSyntax.ts] //// + +=== a.js === +function foo(); +>foo : () => any + diff --git a/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.errors.txt b/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.errors.txt new file mode 100644 index 00000000000..470da0781cc --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.errors.txt @@ -0,0 +1,10 @@ +a.js(2,3): error TS8017: Signature declarations can only be used in TypeScript files. + + +==== a.js (1 errors) ==== + class A { + foo(); + ~~~ +!!! error TS8017: Signature declarations can only be used in TypeScript files. + } + \ No newline at end of file diff --git a/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.symbols b/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.symbols new file mode 100644 index 00000000000..106a1596774 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.symbols @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/jsFileCompilationMethodOverloadSyntax.ts] //// + +=== a.js === +class A { +>A : Symbol(A, Decl(a.js, 0, 0)) + + foo(); +>foo : Symbol(A.foo, Decl(a.js, 0, 9)) +} + diff --git a/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.types b/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.types new file mode 100644 index 00000000000..6623e9a505a --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationMethodOverloadSyntax.types @@ -0,0 +1,10 @@ +//// [tests/cases/compiler/jsFileCompilationMethodOverloadSyntax.ts] //// + +=== a.js === +class A { +>A : A + + foo(); +>foo : () => any +} + diff --git a/tests/cases/compiler/jsFileCompilationConstructorOverloadSyntax.ts b/tests/cases/compiler/jsFileCompilationConstructorOverloadSyntax.ts new file mode 100644 index 00000000000..d04109f1e49 --- /dev/null +++ b/tests/cases/compiler/jsFileCompilationConstructorOverloadSyntax.ts @@ -0,0 +1,6 @@ +// @allowJs: true +// @noEmit: true +// @filename: a.js +class A { + constructor(); +} diff --git a/tests/cases/compiler/jsFileCompilationFunctionOverloadSyntax.ts b/tests/cases/compiler/jsFileCompilationFunctionOverloadSyntax.ts new file mode 100644 index 00000000000..0d8b8986482 --- /dev/null +++ b/tests/cases/compiler/jsFileCompilationFunctionOverloadSyntax.ts @@ -0,0 +1,4 @@ +// @allowJs: true +// @noEmit: true +// @filename: a.js +function foo(); diff --git a/tests/cases/compiler/jsFileCompilationMethodOverloadSyntax.ts b/tests/cases/compiler/jsFileCompilationMethodOverloadSyntax.ts new file mode 100644 index 00000000000..845b482ad59 --- /dev/null +++ b/tests/cases/compiler/jsFileCompilationMethodOverloadSyntax.ts @@ -0,0 +1,6 @@ +// @allowJs: true +// @noEmit: true +// @filename: a.js +class A { + foo(); +}