diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts
index ba62eb16d39..7440358709e 100644
--- a/src/compiler/commandLineParser.ts
+++ b/src/compiler/commandLineParser.ts
@@ -743,12 +743,15 @@ namespace ts {
{
name: "experimentalDecorators",
type: "boolean",
+ affectsSemanticDiagnostics: true,
category: Diagnostics.Experimental_Options,
description: Diagnostics.Enables_experimental_support_for_ES7_decorators
},
{
name: "emitDecoratorMetadata",
type: "boolean",
+ affectsSemanticDiagnostics: true,
+ affectsEmit: true,
category: Diagnostics.Experimental_Options,
description: Diagnostics.Enables_experimental_support_for_emitting_type_metadata_for_decorators
},
diff --git a/src/testRunner/unittests/tscWatch/programUpdates.ts b/src/testRunner/unittests/tscWatch/programUpdates.ts
index 82d61ae2557..b1074c7b9a2 100644
--- a/src/testRunner/unittests/tscWatch/programUpdates.ts
+++ b/src/testRunner/unittests/tscWatch/programUpdates.ts
@@ -243,6 +243,49 @@ namespace ts.tscWatch {
]
});
+ verifyTscWatch({
+ scenario,
+ subScenario: "updates diagnostics and emit for decorators",
+ commandLineArgs: ["-w"],
+ sys: () => {
+ const aTs: File = {
+ path: "/a.ts",
+ content: `import {B} from './b'
+@((_) => {})
+export class A {
+ constructor(p: B) {}
+}`,
+ };
+ const bTs: File = {
+ path: "/b.ts",
+ content: `export class B {}`,
+ };
+ const tsconfig: File = {
+ path: "/tsconfig.json",
+ content: JSON.stringify({
+ compilerOptions: { target: "es6", importsNotUsedAsValues: "error" }
+ })
+ };
+ return createWatchedSystem([libFile, aTs, bTs, tsconfig]);
+ },
+ changes: [
+ sys => {
+ sys.modifyFile("/tsconfig.json", JSON.stringify({
+ compilerOptions: { target: "es6", importsNotUsedAsValues: "error", experimentalDecorators: true }
+ }));
+ sys.checkTimeoutQueueLengthAndRun(1);
+ return "Enable experimentalDecorators";
+ },
+ sys => {
+ sys.modifyFile("/tsconfig.json", JSON.stringify({
+ compilerOptions: { target: "es6", importsNotUsedAsValues: "error", experimentalDecorators: true, emitDecoratorMetadata: true }
+ }));
+ sys.checkTimeoutQueueLengthAndRun(1);
+ return "Enable emitDecoratorMetadata";
+ }
+ ]
+ });
+
verifyTscWatch({
scenario,
subScenario: "files explicitly excluded in config file",
diff --git a/tests/baselines/reference/tscWatch/programUpdates/updates-diagnostics-and-emit-for-decorators.js b/tests/baselines/reference/tscWatch/programUpdates/updates-diagnostics-and-emit-for-decorators.js
new file mode 100644
index 00000000000..19025658a70
--- /dev/null
+++ b/tests/baselines/reference/tscWatch/programUpdates/updates-diagnostics-and-emit-for-decorators.js
@@ -0,0 +1,206 @@
+/a/lib/tsc.js -w
+//// [/a/lib/lib.d.ts]
+///
+interface Boolean {}
+interface Function {}
+interface CallableFunction {}
+interface NewableFunction {}
+interface IArguments {}
+interface Number { toExponential: any; }
+interface Object {}
+interface RegExp {}
+interface String { charAt: any; }
+interface Array { length: number; [n: number]: T; }
+
+//// [/a.ts]
+import {B} from './b'
+@((_) => {})
+export class A {
+ constructor(p: B) {}
+}
+
+//// [/b.ts]
+export class B {}
+
+//// [/tsconfig.json]
+{"compilerOptions":{"target":"es6","importsNotUsedAsValues":"error"}}
+
+//// [/b.js]
+export class B {
+}
+
+
+//// [/a.js]
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+import './b';
+let A = class A {
+ constructor(p) { }
+};
+A = __decorate([
+ ((_) => { })
+], A);
+export { A };
+
+
+
+Output::
+>> Screen clear
+12:00:15 AM - Starting compilation in watch mode...
+
+
+a.ts(1,1): error TS1371: This import is never used as a value and must use 'import type' because the 'importsNotUsedAsValues' is set to 'error'.
+
+a.ts(3,14): error TS1219: Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option in your 'tsconfig' or 'jsconfig' to remove this warning.
+
+
+12:00:20 AM - Found 2 errors. Watching for file changes.
+
+
+Program root files: ["/a.ts","/b.ts","/a/lib/lib.d.ts"]
+Program options: {"target":2,"importsNotUsedAsValues":2,"watch":true,"configFilePath":"/tsconfig.json"}
+Program files::
+/b.ts
+/a.ts
+/a/lib/lib.d.ts
+
+Semantic diagnostics in builder refreshed for::
+/b.ts
+/a.ts
+/a/lib/lib.d.ts
+
+WatchedFiles::
+/tsconfig.json:
+ {"pollingInterval":250}
+/a.ts:
+ {"pollingInterval":250}
+/b.ts:
+ {"pollingInterval":250}
+/a/lib/lib.d.ts:
+ {"pollingInterval":250}
+
+FsWatches::
+
+FsWatchesRecursive::
+/:
+ {"fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
+
+exitCode:: ExitStatus.undefined
+
+Change:: Enable experimentalDecorators
+
+//// [/tsconfig.json]
+{"compilerOptions":{"target":"es6","importsNotUsedAsValues":"error","experimentalDecorators":true}}
+
+
+Output::
+>> Screen clear
+12:00:23 AM - File change detected. Starting incremental compilation...
+
+
+a.ts(1,1): error TS1371: This import is never used as a value and must use 'import type' because the 'importsNotUsedAsValues' is set to 'error'.
+
+
+12:00:24 AM - Found 1 error. Watching for file changes.
+
+
+Program root files: ["/a.ts","/b.ts","/a/lib/lib.d.ts"]
+Program options: {"target":2,"importsNotUsedAsValues":2,"experimentalDecorators":true,"watch":true,"configFilePath":"/tsconfig.json"}
+Program files::
+/b.ts
+/a.ts
+/a/lib/lib.d.ts
+
+Semantic diagnostics in builder refreshed for::
+/b.ts
+/a.ts
+/a/lib/lib.d.ts
+
+WatchedFiles::
+/tsconfig.json:
+ {"pollingInterval":250}
+/a.ts:
+ {"pollingInterval":250}
+/b.ts:
+ {"pollingInterval":250}
+/a/lib/lib.d.ts:
+ {"pollingInterval":250}
+
+FsWatches::
+
+FsWatchesRecursive::
+/:
+ {"fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
+
+exitCode:: ExitStatus.undefined
+
+Change:: Enable emitDecoratorMetadata
+
+//// [/tsconfig.json]
+{"compilerOptions":{"target":"es6","importsNotUsedAsValues":"error","experimentalDecorators":true,"emitDecoratorMetadata":true}}
+
+//// [/b.js] file written with same contents
+//// [/a.js]
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __metadata = (this && this.__metadata) || function (k, v) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
+};
+import { B } from './b';
+let A = class A {
+ constructor(p) { }
+};
+A = __decorate([
+ ((_) => { }),
+ __metadata("design:paramtypes", [B])
+], A);
+export { A };
+
+
+
+Output::
+>> Screen clear
+12:00:27 AM - File change detected. Starting incremental compilation...
+
+
+
+12:00:34 AM - Found 0 errors. Watching for file changes.
+
+
+Program root files: ["/a.ts","/b.ts","/a/lib/lib.d.ts"]
+Program options: {"target":2,"importsNotUsedAsValues":2,"experimentalDecorators":true,"emitDecoratorMetadata":true,"watch":true,"configFilePath":"/tsconfig.json"}
+Program files::
+/b.ts
+/a.ts
+/a/lib/lib.d.ts
+
+Semantic diagnostics in builder refreshed for::
+/b.ts
+/a.ts
+/a/lib/lib.d.ts
+
+WatchedFiles::
+/tsconfig.json:
+ {"pollingInterval":250}
+/a.ts:
+ {"pollingInterval":250}
+/b.ts:
+ {"pollingInterval":250}
+/a/lib/lib.d.ts:
+ {"pollingInterval":250}
+
+FsWatches::
+
+FsWatchesRecursive::
+/:
+ {"fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
+
+exitCode:: ExitStatus.undefined