From 64563259733f5c611860a9ca88f99d8859a7b24e Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 8 Nov 2016 16:28:10 -0800 Subject: [PATCH] Handle abstract and const modifiers --- src/compiler/program.ts | 15 ++++++++++----- .../jsFileCompilationAbstractModifier.errors.txt | 14 ++++++++++++++ .../jsFileCompilationConstModifier.symbols | 4 ++++ .../jsFileCompilationConstModifier.types | 5 +++++ .../compiler/jsFileCompilationAbstractModifier.ts | 5 +++++ .../compiler/jsFileCompilationConstModifier.ts | 4 ++++ 6 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/jsFileCompilationAbstractModifier.errors.txt create mode 100644 tests/baselines/reference/jsFileCompilationConstModifier.symbols create mode 100644 tests/baselines/reference/jsFileCompilationConstModifier.types create mode 100644 tests/cases/compiler/jsFileCompilationAbstractModifier.ts create mode 100644 tests/cases/compiler/jsFileCompilationConstModifier.ts diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 06476d29fbe..0257ed6387b 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -870,11 +870,12 @@ namespace ts { diagnostics.push(createDiagnosticForNodeArray(nodes, Diagnostics.type_parameter_declarations_can_only_be_used_in_a_ts_file)); return; } - // pass through + // pass through + let isConstInvalid = true; case SyntaxKind.VariableStatement: // Check modifiers if (nodes === (parent).modifiers) { - return checkModifiers(>nodes); + return checkModifiers(>nodes, !isConstInvalid); } break; case SyntaxKind.PropertyDeclaration: @@ -911,23 +912,27 @@ namespace ts { } } - function checkModifiers(modifiers: NodeArray) { + function checkModifiers(modifiers: NodeArray, isConstValid: boolean) { for (const modifier of modifiers) { switch (modifier.kind) { + case SyntaxKind.ConstKeyword: + if (isConstValid) { + continue; + } + // Fallthrough to report error case SyntaxKind.PublicKeyword: case SyntaxKind.PrivateKeyword: case SyntaxKind.ProtectedKeyword: case SyntaxKind.ReadonlyKeyword: case SyntaxKind.DeclareKeyword: + case SyntaxKind.AbstractKeyword: diagnostics.push(createDiagnosticForNode(modifier, Diagnostics._0_can_only_be_used_in_a_ts_file, tokenToString(modifier.kind))); break; // These are all legal modifiers. case SyntaxKind.StaticKeyword: case SyntaxKind.ExportKeyword: - case SyntaxKind.ConstKeyword: case SyntaxKind.DefaultKeyword: - case SyntaxKind.AbstractKeyword: } } } diff --git a/tests/baselines/reference/jsFileCompilationAbstractModifier.errors.txt b/tests/baselines/reference/jsFileCompilationAbstractModifier.errors.txt new file mode 100644 index 00000000000..62fc2c3e854 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationAbstractModifier.errors.txt @@ -0,0 +1,14 @@ +error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file. +tests/cases/compiler/a.js(1,1): error TS8009: 'abstract' can only be used in a .ts file. +tests/cases/compiler/a.js(2,5): error TS8009: 'abstract' can only be used in a .ts file. + + +!!! error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file. +==== tests/cases/compiler/a.js (2 errors) ==== + abstract class c { + ~~~~~~~~ +!!! error TS8009: 'abstract' can only be used in a .ts file. + abstract x; + ~~~~~~~~ +!!! error TS8009: 'abstract' can only be used in a .ts file. + } \ No newline at end of file diff --git a/tests/baselines/reference/jsFileCompilationConstModifier.symbols b/tests/baselines/reference/jsFileCompilationConstModifier.symbols new file mode 100644 index 00000000000..137dafd3473 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationConstModifier.symbols @@ -0,0 +1,4 @@ +=== tests/cases/compiler/a.js === +const c = 10; +>c : Symbol(c, Decl(a.js, 0, 5)) + diff --git a/tests/baselines/reference/jsFileCompilationConstModifier.types b/tests/baselines/reference/jsFileCompilationConstModifier.types new file mode 100644 index 00000000000..8e74679f2a5 --- /dev/null +++ b/tests/baselines/reference/jsFileCompilationConstModifier.types @@ -0,0 +1,5 @@ +=== tests/cases/compiler/a.js === +const c = 10; +>c : 10 +>10 : 10 + diff --git a/tests/cases/compiler/jsFileCompilationAbstractModifier.ts b/tests/cases/compiler/jsFileCompilationAbstractModifier.ts new file mode 100644 index 00000000000..ebd021e05a1 --- /dev/null +++ b/tests/cases/compiler/jsFileCompilationAbstractModifier.ts @@ -0,0 +1,5 @@ +// @allowJs: true +// @filename: a.js +abstract class c { + abstract x; +} \ No newline at end of file diff --git a/tests/cases/compiler/jsFileCompilationConstModifier.ts b/tests/cases/compiler/jsFileCompilationConstModifier.ts new file mode 100644 index 00000000000..4ffa62bb6a2 --- /dev/null +++ b/tests/cases/compiler/jsFileCompilationConstModifier.ts @@ -0,0 +1,4 @@ +// @allowJs: true +// @filename: a.js +// @noEmit: true +const c = 10; \ No newline at end of file