From cccf70b192778b9a473d11c5674afb15b194276e Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Thu, 23 Jun 2016 10:51:07 -0700 Subject: [PATCH 001/109] Add failing test --- .../reference/umdGlobalMerge.errors.txt | 20 +++++++++++++++++++ tests/cases/compiler/umdGlobalMerge.ts | 14 +++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 tests/baselines/reference/umdGlobalMerge.errors.txt create mode 100644 tests/cases/compiler/umdGlobalMerge.ts diff --git a/tests/baselines/reference/umdGlobalMerge.errors.txt b/tests/baselines/reference/umdGlobalMerge.errors.txt new file mode 100644 index 00000000000..eb4a116ef09 --- /dev/null +++ b/tests/baselines/reference/umdGlobalMerge.errors.txt @@ -0,0 +1,20 @@ +tests/cases/compiler/b.d.ts(2,20): error TS2305: Module '"tests/cases/compiler/a".ns' has no exported member 'IFoo'. + + +==== tests/cases/compiler/a.d.ts (0 errors) ==== + export = ns; + + export as namespace ns; + + declare namespace ns { + export var x: number; + export interface IFoo { } + } + +==== tests/cases/compiler/b.d.ts (1 errors) ==== + declare namespace ns.something { + export var p: ns.IFoo; + ~~~~ +!!! error TS2305: Module '"tests/cases/compiler/a".ns' has no exported member 'IFoo'. + } + \ No newline at end of file diff --git a/tests/cases/compiler/umdGlobalMerge.ts b/tests/cases/compiler/umdGlobalMerge.ts new file mode 100644 index 00000000000..1f42e2fda71 --- /dev/null +++ b/tests/cases/compiler/umdGlobalMerge.ts @@ -0,0 +1,14 @@ +// @filename: a.d.ts +export = ns; + +export as namespace ns; + +declare namespace ns { + export var x: number; + export interface IFoo { } +} + +// @filename: b.d.ts +declare namespace ns.something { + export var p: ns.IFoo; +} From c35e374ef4f9dd6d81e88646d77813cc67936b81 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 29 Jun 2016 13:17:31 -0700 Subject: [PATCH 002/109] runtests-parallel skips empty buckets Previously, it would enter them as buckets with no tests, which would make our test runners run *every* test. This was very obvious on machines with lots of cores. --- src/harness/runner.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/harness/runner.ts b/src/harness/runner.ts index 1c36614e61f..4b1945f5baa 100644 --- a/src/harness/runner.ts +++ b/src/harness/runner.ts @@ -193,7 +193,7 @@ if (taskConfigsFolder) { for (let i = 0; i < workerCount; i++) { const startPos = i * chunkSize; const len = Math.min(chunkSize, files.length - startPos); - if (len !== 0) { + if (len > 0) { workerConfigs[i].tasks.push({ runner: runner.kind(), files: files.slice(startPos, startPos + len) @@ -214,5 +214,5 @@ else { } if (!runUnitTests) { // patch `describe` to skip unit tests - describe = describe.skip; -} \ No newline at end of file + describe = (function () { }); +} From 4a77c97ae7e2917ca15e8e3c2d4d6524e947395d Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 17 Jun 2016 14:59:40 -0700 Subject: [PATCH 003/109] Create tokens using different constructor --- src/compiler/core.ts | 2 + src/compiler/parser.ts | 10 ++++- src/compiler/types.ts | 4 +- src/services/services.ts | 84 +++++++++++++++++++++++++++++++++++++--- 4 files changed, 92 insertions(+), 8 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index fe4731a1c91..07100a982e7 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1231,6 +1231,7 @@ namespace ts { export interface ObjectAllocator { getNodeConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Node; + getTokenConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Token; getSourceFileConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => SourceFile; getSymbolConstructor(): new (flags: SymbolFlags, name: string) => Symbol; getTypeConstructor(): new (checker: TypeChecker, flags: TypeFlags) => Type; @@ -1260,6 +1261,7 @@ namespace ts { export let objectAllocator: ObjectAllocator = { getNodeConstructor: () => Node, + getTokenConstructor: () => Node, getSourceFileConstructor: () => Node, getSymbolConstructor: () => Symbol, getTypeConstructor: () => Type, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d720cd0648f..9fc06dcba62 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -5,12 +5,16 @@ namespace ts { /* @internal */ export let parseTime = 0; let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node { if (kind === SyntaxKind.SourceFile) { return new (SourceFileConstructor || (SourceFileConstructor = objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind < SyntaxKind.FirstNode) { + return new (TokenConstructor || (TokenConstructor = objectAllocator.getTokenConstructor()))(kind, pos, end); + } else { return new (NodeConstructor || (NodeConstructor = objectAllocator.getNodeConstructor()))(kind, pos, end); } @@ -466,6 +470,7 @@ namespace ts { // capture constructors in 'initializeState' to avoid null checks let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let sourceFile: SourceFile; @@ -576,6 +581,7 @@ namespace ts { function initializeState(fileName: string, _sourceText: string, languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor, scriptKind: ScriptKind) { NodeConstructor = objectAllocator.getNodeConstructor(); + TokenConstructor = objectAllocator.getTokenConstructor(); SourceFileConstructor = objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; @@ -1024,7 +1030,9 @@ namespace ts { pos = scanner.getStartPos(); } - return new NodeConstructor(kind, pos, pos); + return kind >= SyntaxKind.FirstNode ? + new NodeConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node: T, end?: number): T { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 3a3a937ade7..cc10d9348fe 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -472,6 +472,8 @@ namespace ts { flags: NodeFlags; } + export interface Token extends Node { } + // @kind(SyntaxKind.AbstractKeyword) // @kind(SyntaxKind.AsyncKeyword) // @kind(SyntaxKind.ConstKeyword) @@ -482,7 +484,7 @@ namespace ts { // @kind(SyntaxKind.PrivateKeyword) // @kind(SyntaxKind.ProtectedKeyword) // @kind(SyntaxKind.StaticKeyword) - export interface Modifier extends Node { } + export interface Modifier extends Token { } // @kind(SyntaxKind.Identifier) export interface Identifier extends PrimaryExpression { diff --git a/src/services/services.ts b/src/services/services.ts index 529ce8a7bf7..b734bb7f063 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -180,9 +180,8 @@ namespace ts { ]; let jsDocCompletionEntries: CompletionEntry[]; - function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject { - const node = new NodeObject(kind, pos, end); - node.flags = flags; + function createNode(kind: SyntaxKind, pos: number, end: number, parent?: Node): NodeObject | TokenObject { + const node = kind >= SyntaxKind.FirstNode ? new NodeObject(kind, pos, end) : new TokenObject(kind, pos, end); node.parent = parent; return node; } @@ -200,7 +199,6 @@ namespace ts { this.kind = kind; this.pos = pos; this.end = end; - this.flags = NodeFlags.None; this.parent = undefined; } @@ -246,7 +244,7 @@ namespace ts { const token = useJSDocScanner ? scanner.scanJSDocToken() : scanner.scan(); const textPos = scanner.getTextPos(); if (textPos <= end) { - nodes.push(createNode(token, pos, textPos, 0, this)); + nodes.push(createNode(token, pos, textPos, this)); } pos = textPos; } @@ -254,7 +252,7 @@ namespace ts { } private createSyntaxList(nodes: NodeArray): Node { - const list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, 0, this); + const list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, this); list._children = []; let pos = nodes.pos; @@ -345,6 +343,79 @@ namespace ts { } } + class TokenObject implements Token { + public kind: SyntaxKind; + public pos: number; + public end: number; + public flags: NodeFlags; + public parent: Node; + public jsDocComments: JSDocComment[]; + + constructor(kind: SyntaxKind, pos: number, end: number) { + this.kind = kind; + this.pos = pos; + this.end = end; + this.flags = NodeFlags.None; + this.parent = undefined; + } + + public getSourceFile(): SourceFile { + return getSourceFileOfNode(this); + } + + public getStart(sourceFile?: SourceFile, includeJsDocComment?: boolean): number { + return getTokenPosOfNode(this, sourceFile, includeJsDocComment); + } + + public getFullStart(): number { + return this.pos; + } + + public getEnd(): number { + return this.end; + } + + public getWidth(sourceFile?: SourceFile): number { + return this.getEnd() - this.getStart(sourceFile); + } + + public getFullWidth(): number { + return this.end - this.pos; + } + + public getLeadingTriviaWidth(sourceFile?: SourceFile): number { + return this.getStart(sourceFile) - this.pos; + } + + public getFullText(sourceFile?: SourceFile): string { + return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end); + } + + public getText(sourceFile?: SourceFile): string { + return (sourceFile || this.getSourceFile()).text.substring(this.getStart(), this.getEnd()); + } + + public getChildCount(sourceFile?: SourceFile): number { + return 0; + } + + public getChildAt(index: number, sourceFile?: SourceFile): Node { + return undefined; + } + + public getChildren(sourceFile?: SourceFile): Node[] { + return emptyArray; + } + + public getFirstToken(sourceFile?: SourceFile): Node { + return undefined; + } + + public getLastToken(sourceFile?: SourceFile): Node { + return undefined; + } + } + class SymbolObject implements Symbol { flags: SymbolFlags; name: string; @@ -8696,6 +8767,7 @@ namespace ts { function initializeServices() { objectAllocator = { getNodeConstructor: () => NodeObject, + getTokenConstructor: () => TokenObject, getSourceFileConstructor: () => SourceFileObject, getSymbolConstructor: () => SymbolObject, getTypeConstructor: () => TypeObject, From a2ff4ea0f8ea189e0763b09094cbf875eada6ea8 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 9 Jun 2016 16:18:24 -0700 Subject: [PATCH 004/109] Identifier constructor --- src/compiler/core.ts | 2 ++ src/compiler/parser.ts | 12 +++++++++--- src/services/services.ts | 28 ++++++++++++++++++++++------ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 07100a982e7..9aa5741cc74 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1232,6 +1232,7 @@ namespace ts { export interface ObjectAllocator { getNodeConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Node; getTokenConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Token; + getIdentifierConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Token; getSourceFileConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => SourceFile; getSymbolConstructor(): new (flags: SymbolFlags, name: string) => Symbol; getTypeConstructor(): new (checker: TypeChecker, flags: TypeFlags) => Type; @@ -1262,6 +1263,7 @@ namespace ts { export let objectAllocator: ObjectAllocator = { getNodeConstructor: () => Node, getTokenConstructor: () => Node, + getIdentifierConstructor: () => Node, getSourceFileConstructor: () => Node, getSymbolConstructor: () => Symbol, getTypeConstructor: () => Type, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 9fc06dcba62..91097348589 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6,12 +6,16 @@ namespace ts { let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let IdentifierConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node { if (kind === SyntaxKind.SourceFile) { return new (SourceFileConstructor || (SourceFileConstructor = objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind === SyntaxKind.Identifier) { + return new (IdentifierConstructor || (IdentifierConstructor = objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } else if (kind < SyntaxKind.FirstNode) { return new (TokenConstructor || (TokenConstructor = objectAllocator.getTokenConstructor()))(kind, pos, end); } @@ -471,6 +475,7 @@ namespace ts { // capture constructors in 'initializeState' to avoid null checks let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; + let IdentifierConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let sourceFile: SourceFile; @@ -582,6 +587,7 @@ namespace ts { function initializeState(fileName: string, _sourceText: string, languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor, scriptKind: ScriptKind) { NodeConstructor = objectAllocator.getNodeConstructor(); TokenConstructor = objectAllocator.getTokenConstructor(); + IdentifierConstructor = objectAllocator.getIdentifierConstructor(); SourceFileConstructor = objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; @@ -1030,9 +1036,9 @@ namespace ts { pos = scanner.getStartPos(); } - return kind >= SyntaxKind.FirstNode ? - new NodeConstructor(kind, pos, pos) : - new TokenConstructor(kind, pos, pos); + return kind >= SyntaxKind.FirstNode ? new NodeConstructor(kind, pos, pos) : + kind === SyntaxKind.Identifier ? new IdentifierConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node: T, end?: number): T { diff --git a/src/services/services.ts b/src/services/services.ts index b734bb7f063..d519520540a 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -180,8 +180,10 @@ namespace ts { ]; let jsDocCompletionEntries: CompletionEntry[]; - function createNode(kind: SyntaxKind, pos: number, end: number, parent?: Node): NodeObject | TokenObject { - const node = kind >= SyntaxKind.FirstNode ? new NodeObject(kind, pos, end) : new TokenObject(kind, pos, end); + function createNode(kind: SyntaxKind, pos: number, end: number, parent?: Node): NodeObject | TokenObject | IdentifierObject { + const node = kind >= SyntaxKind.FirstNode ? new NodeObject(kind, pos, end) : + kind === SyntaxKind.Identifier ? new IdentifierObject(kind, pos, end) : + new TokenObject(kind, pos, end); node.parent = parent; return node; } @@ -343,7 +345,7 @@ namespace ts { } } - class TokenObject implements Token { + class TokenOrIdentifierObject implements Token { public kind: SyntaxKind; public pos: number; public end: number; @@ -351,11 +353,9 @@ namespace ts { public parent: Node; public jsDocComments: JSDocComment[]; - constructor(kind: SyntaxKind, pos: number, end: number) { - this.kind = kind; + constructor(pos: number, end: number) { this.pos = pos; this.end = end; - this.flags = NodeFlags.None; this.parent = undefined; } @@ -416,6 +416,21 @@ namespace ts { } } + class TokenObject extends TokenOrIdentifierObject { + constructor(kind: SyntaxKind, pos: number, end: number) { + super(pos, end); + this.kind = kind; + this.flags = NodeFlags.None; + } + } + + class IdentifierObject extends TokenOrIdentifierObject { + constructor(kind: SyntaxKind, pos: number, end: number) { + super(pos, end); + } + } + IdentifierObject.prototype.kind = SyntaxKind.Identifier; + class SymbolObject implements Symbol { flags: SymbolFlags; name: string; @@ -8768,6 +8783,7 @@ namespace ts { objectAllocator = { getNodeConstructor: () => NodeObject, getTokenConstructor: () => TokenObject, + getIdentifierConstructor: () => IdentifierObject, getSourceFileConstructor: () => SourceFileObject, getSymbolConstructor: () => SymbolObject, getTypeConstructor: () => TypeObject, From 8325565f0ac8783895b0f1b5a16273526326ae4a Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Tue, 5 Jul 2016 13:24:49 -0700 Subject: [PATCH 005/109] Add support for including dotted and .min.js files explicitly in include --- src/compiler/commandLineParser.ts | 7 -- src/compiler/core.ts | 40 +++++- tests/cases/unittests/matchFiles.ts | 186 ++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+), 12 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 7b2aedb5d3d..72fd5ff6fd7 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -689,9 +689,6 @@ namespace ts { return output; } - // Skip over any minified JavaScript files (ending in ".min.js") - // Skip over dotted files and folders as well - const ignoreFileNamePattern = /(\.min\.js$)|([\\/]\.[\w.])/; /** * Parse the contents of a config file (tsconfig.json). * @param json The contents of the config file to parse @@ -1003,10 +1000,6 @@ namespace ts { continue; } - if (ignoreFileNamePattern.test(file)) { - continue; - } - // We may have included a wildcard path with a lower priority // extension due to the user-defined order of entries in the // "include" array. If there is a lower priority extension in the diff --git a/src/compiler/core.ts b/src/compiler/core.ts index fe4731a1c91..3fda91303f9 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -927,6 +927,22 @@ namespace ts { return undefined; } + /** + * Regex for the * wildcard. Matches all characters except for directory seperators. When + * used for including files, also does not match the file extension .min.js + * + * Breakdown for the "files" version: + * [^./] # matches everything up to the first . character (excluding directory seperators) + * (\\.(?!min\\.js$))? # matches . characters but not if they are part of the .min.js file extension + */ + const singleAsteriskRegexFragment = usage === "files" ? "([^./]*(\\.(?!min\\.js$))?)*" : "[^/]*"; + + /** + * Regex for the ** wildcard. Matches any number of subdirectories. When used for including + * files or directories, does not match subdirectories that start with a . character + */ + const doubleAsteriskRegexFragment = usage === "exclude" ? "(/.+?)?" : "(/[^/.][^/]*)*?" + let pattern = ""; let hasWrittenSubpattern = false; spec: for (const spec of specs) { @@ -947,13 +963,13 @@ namespace ts { components[0] = removeTrailingDirectorySeparator(components[0]); let optionalCount = 0; - for (const component of components) { + for (let component of components) { if (component === "**") { if (hasRecursiveDirectoryWildcard) { continue spec; } - subpattern += "(/.+?)?"; + subpattern += doubleAsteriskRegexFragment; hasRecursiveDirectoryWildcard = true; hasWrittenComponent = true; } @@ -967,6 +983,20 @@ namespace ts { subpattern += directorySeparator; } + if (usage !== "exclude") { + // The * and ? wildcards should not match directories or files that start with . if they + // appear first in a component. Dotted directories and files can be included explicitly + // like so: **/.*/.* + if (startsWith(component, "*")) { + subpattern += "([^./]" + singleAsteriskRegexFragment + ")?"; + component = component.substr(1); + } + else if (startsWith(component, "?")) { + subpattern += "[^./]"; + component = component.substr(1); + } + } + subpattern += component.replace(reservedCharacterPattern, replaceWildcardCharacter); hasWrittenComponent = true; } @@ -990,10 +1020,10 @@ namespace ts { } return "^(" + pattern + (usage === "exclude" ? ")($|/)" : ")$"); - } - function replaceWildcardCharacter(match: string) { - return match === "*" ? "[^/]*" : match === "?" ? "[^/]" : "\\" + match; + function replaceWildcardCharacter(match: string) { + return match === "*" ? singleAsteriskRegexFragment : match === "?" ? "[^/]" : "\\" + match; + } } export interface FileSystemEntries { diff --git a/tests/cases/unittests/matchFiles.ts b/tests/cases/unittests/matchFiles.ts index d68fb9b2a7f..e862cdc379e 100644 --- a/tests/cases/unittests/matchFiles.ts +++ b/tests/cases/unittests/matchFiles.ts @@ -24,6 +24,8 @@ namespace ts { "c:/dev/x/y/b.ts", "c:/dev/js/a.js", "c:/dev/js/b.js", + "c:/dev/js/d.min.js", + "c:/dev/js/ab.min.js", "c:/ext/ext.ts", "c:/ext/b/a..b.ts" ]); @@ -76,6 +78,17 @@ namespace ts { "c:/dev/jspm_packages/a.ts" ]); + const caseInsensitiveDottedFoldersHost = new Utils.MockParseConfigHost(caseInsensitiveBasePath, /*useCaseSensitiveFileNames*/ false, [ + "c:/dev/x/d.ts", + "c:/dev/x/y/d.ts", + "c:/dev/x/y/.e.ts", + "c:/dev/x/.y/a.ts", + "c:/dev/.z/.b.ts", + "c:/dev/.z/c.ts", + "c:/dev/w/.u/e.ts", + "c:/dev/g.min.js/.g/g.ts" + ]); + describe("matchFiles", () => { describe("with literal file list", () => { it("without exclusions", () => { @@ -727,6 +740,33 @@ namespace ts { assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); assert.deepEqual(actual.errors, expected.errors); }); + it("include explicitly listed .min.js files when allowJs=true", () => { + const json = { + compilerOptions: { + allowJs: true + }, + include: [ + "js/*.min.js" + ] + }; + const expected: ts.ParsedCommandLine = { + options: { + allowJs: true + }, + errors: [], + fileNames: [ + "c:/dev/js/ab.min.js", + "c:/dev/js/d.min.js" + ], + wildcardDirectories: { + "c:/dev/js": ts.WatchDirectoryFlags.None + } + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); it("include paths outside of the project", () => { const json = { include: [ @@ -952,6 +992,35 @@ namespace ts { assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); assert.deepEqual(actual.errors, expected.errors); }); + it("exclude .min.js files using wildcards", () => { + const json = { + compilerOptions: { + allowJs: true + }, + include: [ + "js/*.min.js" + ], + exclude: [ + "js/a*" + ] + }; + const expected: ts.ParsedCommandLine = { + options: { + allowJs: true + }, + errors: [], + fileNames: [ + "c:/dev/js/d.min.js" + ], + wildcardDirectories: { + "c:/dev/js": ts.WatchDirectoryFlags.None + } + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); describe("with trailing recursive directory", () => { it("in includes", () => { const json = { @@ -1146,5 +1215,122 @@ namespace ts { }); }); }); + describe("with files or folders that begin with a .", () => { + it("that are not explicitly included", () => { + const json = { + include: [ + "x/**/*", + "w/*/*" + ] + }; + const expected: ts.ParsedCommandLine = { + options: {}, + errors: [], + fileNames: [ + "c:/dev/x/d.ts", + "c:/dev/x/y/d.ts", + ], + wildcardDirectories: { + "c:/dev/x": ts.WatchDirectoryFlags.Recursive, + "c:/dev/w": ts.WatchDirectoryFlags.Recursive + } + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); + describe("that are explicitly included", () => { + it("without wildcards", () => { + const json = { + include: [ + "x/.y/a.ts", + "c:/dev/.z/.b.ts" + ] + }; + const expected: ts.ParsedCommandLine = { + options: {}, + errors: [], + fileNames: [ + "c:/dev/.z/.b.ts", + "c:/dev/x/.y/a.ts" + ], + wildcardDirectories: {} + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); + it("with recursive wildcards that match directories", () => { + const json = { + include: [ + "**/.*/*" + ] + }; + const expected: ts.ParsedCommandLine = { + options: {}, + errors: [], + fileNames: [ + "c:/dev/.z/c.ts", + "c:/dev/g.min.js/.g/g.ts", + "c:/dev/w/.u/e.ts", + "c:/dev/x/.y/a.ts" + ], + wildcardDirectories: { + "c:/dev": ts.WatchDirectoryFlags.Recursive + } + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); + it("with recursive wildcards that match nothing", () => { + const json = { + include: [ + "x/**/.y/*", + ".z/**/.*" + ] + }; + const expected: ts.ParsedCommandLine = { + options: {}, + errors: [], + fileNames: [ + "c:/dev/.z/.b.ts", + "c:/dev/x/.y/a.ts" + ], + wildcardDirectories: { + "c:/dev/.z": ts.WatchDirectoryFlags.Recursive, + "c:/dev/x": ts.WatchDirectoryFlags.Recursive + } + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); + it("with wildcard excludes that implicitly exclude dotted files", () => { + const json = { + include: [ + "**/.*/*" + ], + exclude: [ + "**/*" + ] + }; + const expected: ts.ParsedCommandLine = { + options: {}, + errors: [], + fileNames: [], + wildcardDirectories: {} + }; + const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath); + assert.deepEqual(actual.fileNames, expected.fileNames); + assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories); + assert.deepEqual(actual.errors, expected.errors); + }); + }); + }); }); } \ No newline at end of file From 0966ebcffb51cda0e73657784a2aebaa9ca3f955 Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Tue, 5 Jul 2016 17:11:04 -0700 Subject: [PATCH 006/109] Removing startsWith reference and fixing linter error --- src/compiler/core.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 3fda91303f9..895a325cca6 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -941,7 +941,7 @@ namespace ts { * Regex for the ** wildcard. Matches any number of subdirectories. When used for including * files or directories, does not match subdirectories that start with a . character */ - const doubleAsteriskRegexFragment = usage === "exclude" ? "(/.+?)?" : "(/[^/.][^/]*)*?" + const doubleAsteriskRegexFragment = usage === "exclude" ? "(/.+?)?" : "(/[^/.][^/]*)*?"; let pattern = ""; let hasWrittenSubpattern = false; @@ -987,11 +987,11 @@ namespace ts { // The * and ? wildcards should not match directories or files that start with . if they // appear first in a component. Dotted directories and files can be included explicitly // like so: **/.*/.* - if (startsWith(component, "*")) { + if (component.indexOf("*") === 0) { subpattern += "([^./]" + singleAsteriskRegexFragment + ")?"; component = component.substr(1); } - else if (startsWith(component, "?")) { + else if (component.indexOf("?") === 0) { subpattern += "[^./]"; component = component.substr(1); } From 635826ff131c0de5bbb948806ef408d459945e79 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 6 Jul 2016 11:44:51 -0700 Subject: [PATCH 007/109] Remove the unused text buffer from ScriptInfo --- src/server/editorServices.ts | 2 +- tests/cases/unittests/cachingInServerLSHost.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 092450e526c..6a2beccc243 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -38,7 +38,7 @@ namespace ts.server { path: Path; scriptKind: ScriptKind; - constructor(private host: ServerHost, public fileName: string, public content: string, public isOpen = false) { + constructor(private host: ServerHost, public fileName: string, content: string, public isOpen = false) { this.path = toPath(fileName, host.getCurrentDirectory(), createGetCanonicalFileName(host.useCaseSensitiveFileNames)); this.svc = ScriptVersionCache.fromString(host, content); } diff --git a/tests/cases/unittests/cachingInServerLSHost.ts b/tests/cases/unittests/cachingInServerLSHost.ts index 2608a082d6d..9cd5e071b73 100644 --- a/tests/cases/unittests/cachingInServerLSHost.ts +++ b/tests/cases/unittests/cachingInServerLSHost.ts @@ -108,6 +108,8 @@ namespace ts { let diags = project.compilerService.languageService.getSemanticDiagnostics(imported.name); assert.equal(diags.length, 1); + let content = rootScriptInfo.getText(); + const originalFileExists = serverHost.fileExists; { // patch fileExists to make sure that disk is not touched @@ -118,7 +120,8 @@ namespace ts { const newContent = `import {x} from "f1" var x: string = 1;`; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, newContent); + rootScriptInfo.editContent(0, content.length, newContent); + content = newContent; // trigger synchronization to make sure that import will be fetched from the cache diags = project.compilerService.languageService.getSemanticDiagnostics(imported.name); // ensure file has correct number of errors after edit @@ -135,7 +138,8 @@ namespace ts { return originalFileExists.call(serverHost, fileName); }; const newContent = `import {x} from "f2"`; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, newContent); + rootScriptInfo.editContent(0, content.length, newContent); + content = newContent; try { // trigger synchronization to make sure that LSHost will try to find 'f2' module on disk @@ -160,7 +164,8 @@ namespace ts { }; const newContent = `import {x} from "f1"`; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, newContent); + rootScriptInfo.editContent(0, content.length, newContent); + content = newContent; project.compilerService.languageService.getSemanticDiagnostics(imported.name); assert.isTrue(fileExistsCalled); @@ -205,7 +210,7 @@ namespace ts { }; const { project, rootScriptInfo } = createProject(root.name, serverHost); - + const content = rootScriptInfo.getText(); let diags = project.compilerService.languageService.getSemanticDiagnostics(root.name); assert.isTrue(fileExistsCalledForBar, "'fileExists' should be called"); assert.isTrue(diags.length === 1, "one diagnostic expected"); @@ -214,7 +219,7 @@ namespace ts { // assert that import will success once file appear on disk fileMap[imported.name] = imported; fileExistsCalledForBar = false; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, `import {y} from "bar"`); + rootScriptInfo.editContent(0, content.length, `import {y} from "bar"`); diags = project.compilerService.languageService.getSemanticDiagnostics(root.name); assert.isTrue(fileExistsCalledForBar, "'fileExists' should be called"); From 08a0137bbe2b0d76e977d1ffd4cde94c178a48d5 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 6 Jul 2016 12:17:27 -0700 Subject: [PATCH 008/109] Set default flags on all nodes --- src/services/services.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index d519520540a..cd3e4a43415 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -201,6 +201,7 @@ namespace ts { this.kind = kind; this.pos = pos; this.end = end; + this.flags = NodeFlags.None; this.parent = undefined; } @@ -356,6 +357,7 @@ namespace ts { constructor(pos: number, end: number) { this.pos = pos; this.end = end; + this.flags = NodeFlags.None; this.parent = undefined; } @@ -420,7 +422,6 @@ namespace ts { constructor(kind: SyntaxKind, pos: number, end: number) { super(pos, end); this.kind = kind; - this.flags = NodeFlags.None; } } From 4b5f7e51db6558ac51ba71882d0e5346380918b0 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 7 Jul 2016 10:16:29 -0700 Subject: [PATCH 009/109] Swap q from a reference to an import --- Gulpfile.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Gulpfile.ts b/Gulpfile.ts index 3f9b2a66caa..1d77eba4e02 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -1,6 +1,4 @@ /// -/// - import * as cp from "child_process"; import * as path from "path"; import * as fs from "fs"; @@ -20,6 +18,7 @@ declare module "gulp-typescript" { } import * as insert from "gulp-insert"; import * as sourcemaps from "gulp-sourcemaps"; +import Q = require("q"); declare global { // This is silly. We include Q because orchestrator (a part of gulp) depends on it, but its not included. // `del` further depends on `Promise` (and is also not included), so we just, patch the global scope's Promise to Q's From 1ee3f99e5523fd89d8b327fa5662a0812b1966ed Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Fri, 8 Jul 2016 01:08:49 +0900 Subject: [PATCH 010/109] Fix #9550: exclude 'this' type parameters from unusedParameters checks. --- src/compiler/checker.ts | 5 + .../reference/unusedParametersThis.js | 67 +++++++++++++ .../reference/unusedParametersThis.symbols | 93 ++++++++++++++++++ .../reference/unusedParametersThis.types | 98 +++++++++++++++++++ tests/cases/compiler/unusedParametersThis.ts | 37 +++++++ 5 files changed, 300 insertions(+) create mode 100644 tests/baselines/reference/unusedParametersThis.js create mode 100644 tests/baselines/reference/unusedParametersThis.symbols create mode 100644 tests/baselines/reference/unusedParametersThis.types create mode 100644 tests/cases/compiler/unusedParametersThis.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6427b05c37a..d6db67d3fa8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14563,6 +14563,7 @@ namespace ts { const parameter = local.valueDeclaration; if (compilerOptions.noUnusedParameters && !isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local.valueDeclaration.name, Diagnostics._0_is_declared_but_never_used, local.name); } @@ -14576,6 +14577,10 @@ namespace ts { } } + function parameterIsThisKeyword(parameter: ParameterDeclaration) { + return parameter.name && (parameter.name).originalKeywordKind === SyntaxKind.ThisKeyword; + } + function parameterNameStartsWithUnderscore(parameter: ParameterDeclaration) { return parameter.name && parameter.name.kind === SyntaxKind.Identifier && (parameter.name).text.charCodeAt(0) === CharacterCodes._; } diff --git a/tests/baselines/reference/unusedParametersThis.js b/tests/baselines/reference/unusedParametersThis.js new file mode 100644 index 00000000000..8cf135bf71a --- /dev/null +++ b/tests/baselines/reference/unusedParametersThis.js @@ -0,0 +1,67 @@ +//// [unusedParametersThis.ts] + +class A { + public a: number; + + public method(this: this): number { + return this.a; + } + + public method2(this: A): number { + return this.a; + } + + public method3(this: this): number { + var fn = () => this.a; + return fn(); + } + + public method4(this: A): number { + var fn = () => this.a; + return fn(); + } + + static staticMethod(this: A): number { + return this.a; + } +} + +function f(this: A): number { + return this.a +} + +var f2 = function f2(this: A): number { + return this.a; +}; + +//// [unusedParametersThis.js] +var A = (function () { + function A() { + } + A.prototype.method = function () { + return this.a; + }; + A.prototype.method2 = function () { + return this.a; + }; + A.prototype.method3 = function () { + var _this = this; + var fn = function () { return _this.a; }; + return fn(); + }; + A.prototype.method4 = function () { + var _this = this; + var fn = function () { return _this.a; }; + return fn(); + }; + A.staticMethod = function () { + return this.a; + }; + return A; +}()); +function f() { + return this.a; +} +var f2 = function f2() { + return this.a; +}; diff --git a/tests/baselines/reference/unusedParametersThis.symbols b/tests/baselines/reference/unusedParametersThis.symbols new file mode 100644 index 00000000000..58f8856c281 --- /dev/null +++ b/tests/baselines/reference/unusedParametersThis.symbols @@ -0,0 +1,93 @@ +=== tests/cases/compiler/unusedParametersThis.ts === + +class A { +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + public a: number; +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + + public method(this: this): number { +>method : Symbol(A.method, Decl(unusedParametersThis.ts, 2, 21)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 4, 18)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 4, 18)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + } + + public method2(this: A): number { +>method2 : Symbol(A.method2, Decl(unusedParametersThis.ts, 6, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 8, 19)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 8, 19)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + } + + public method3(this: this): number { +>method3 : Symbol(A.method3, Decl(unusedParametersThis.ts, 10, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 12, 19)) + + var fn = () => this.a; +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 13, 11)) +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 12, 19)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + + return fn(); +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 13, 11)) + } + + public method4(this: A): number { +>method4 : Symbol(A.method4, Decl(unusedParametersThis.ts, 15, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 17, 19)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + var fn = () => this.a; +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 18, 11)) +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 17, 19)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + + return fn(); +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 18, 11)) + } + + static staticMethod(this: A): number { +>staticMethod : Symbol(A.staticMethod, Decl(unusedParametersThis.ts, 20, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 22, 24)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 22, 24)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + } +} + +function f(this: A): number { +>f : Symbol(f, Decl(unusedParametersThis.ts, 25, 1)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 27, 11)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 27, 11)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +} + +var f2 = function f2(this: A): number { +>f2 : Symbol(f2, Decl(unusedParametersThis.ts, 31, 3)) +>f2 : Symbol(f2, Decl(unusedParametersThis.ts, 31, 8)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 31, 21)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 31, 21)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + +}; diff --git a/tests/baselines/reference/unusedParametersThis.types b/tests/baselines/reference/unusedParametersThis.types new file mode 100644 index 00000000000..814f56be101 --- /dev/null +++ b/tests/baselines/reference/unusedParametersThis.types @@ -0,0 +1,98 @@ +=== tests/cases/compiler/unusedParametersThis.ts === + +class A { +>A : A + + public a: number; +>a : number + + public method(this: this): number { +>method : (this: this) => number +>this : this + + return this.a; +>this.a : number +>this : this +>a : number + } + + public method2(this: A): number { +>method2 : (this: A) => number +>this : A +>A : A + + return this.a; +>this.a : number +>this : A +>a : number + } + + public method3(this: this): number { +>method3 : (this: this) => number +>this : this + + var fn = () => this.a; +>fn : () => number +>() => this.a : () => number +>this.a : number +>this : this +>a : number + + return fn(); +>fn() : number +>fn : () => number + } + + public method4(this: A): number { +>method4 : (this: A) => number +>this : A +>A : A + + var fn = () => this.a; +>fn : () => number +>() => this.a : () => number +>this.a : number +>this : A +>a : number + + return fn(); +>fn() : number +>fn : () => number + } + + static staticMethod(this: A): number { +>staticMethod : (this: A) => number +>this : A +>A : A + + return this.a; +>this.a : number +>this : A +>a : number + } +} + +function f(this: A): number { +>f : (this: A) => number +>this : A +>A : A + + return this.a +>this.a : number +>this : A +>a : number +} + +var f2 = function f2(this: A): number { +>f2 : (this: A) => number +>function f2(this: A): number { return this.a;} : (this: A) => number +>f2 : (this: A) => number +>this : A +>A : A + + return this.a; +>this.a : number +>this : A +>a : number + +}; diff --git a/tests/cases/compiler/unusedParametersThis.ts b/tests/cases/compiler/unusedParametersThis.ts new file mode 100644 index 00000000000..800229fcdbc --- /dev/null +++ b/tests/cases/compiler/unusedParametersThis.ts @@ -0,0 +1,37 @@ +//@noImplicitThis:true +//@noUnusedLocals:true +//@noUnusedParameters:true + +class A { + public a: number; + + public method(this: this): number { + return this.a; + } + + public method2(this: A): number { + return this.a; + } + + public method3(this: this): number { + var fn = () => this.a; + return fn(); + } + + public method4(this: A): number { + var fn = () => this.a; + return fn(); + } + + static staticMethod(this: A): number { + return this.a; + } +} + +function f(this: A): number { + return this.a +} + +var f2 = function f2(this: A): number { + return this.a; +}; \ No newline at end of file From 28938fbc303b2cb2c44b417f8939403b07faf91b Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 6 Jul 2016 11:44:51 -0700 Subject: [PATCH 011/109] Remove the unused text buffer from ScriptInfo --- src/server/editorServices.ts | 2 +- tests/cases/unittests/cachingInServerLSHost.ts | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 092450e526c..6a2beccc243 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -38,7 +38,7 @@ namespace ts.server { path: Path; scriptKind: ScriptKind; - constructor(private host: ServerHost, public fileName: string, public content: string, public isOpen = false) { + constructor(private host: ServerHost, public fileName: string, content: string, public isOpen = false) { this.path = toPath(fileName, host.getCurrentDirectory(), createGetCanonicalFileName(host.useCaseSensitiveFileNames)); this.svc = ScriptVersionCache.fromString(host, content); } diff --git a/tests/cases/unittests/cachingInServerLSHost.ts b/tests/cases/unittests/cachingInServerLSHost.ts index 2608a082d6d..9cd5e071b73 100644 --- a/tests/cases/unittests/cachingInServerLSHost.ts +++ b/tests/cases/unittests/cachingInServerLSHost.ts @@ -108,6 +108,8 @@ namespace ts { let diags = project.compilerService.languageService.getSemanticDiagnostics(imported.name); assert.equal(diags.length, 1); + let content = rootScriptInfo.getText(); + const originalFileExists = serverHost.fileExists; { // patch fileExists to make sure that disk is not touched @@ -118,7 +120,8 @@ namespace ts { const newContent = `import {x} from "f1" var x: string = 1;`; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, newContent); + rootScriptInfo.editContent(0, content.length, newContent); + content = newContent; // trigger synchronization to make sure that import will be fetched from the cache diags = project.compilerService.languageService.getSemanticDiagnostics(imported.name); // ensure file has correct number of errors after edit @@ -135,7 +138,8 @@ namespace ts { return originalFileExists.call(serverHost, fileName); }; const newContent = `import {x} from "f2"`; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, newContent); + rootScriptInfo.editContent(0, content.length, newContent); + content = newContent; try { // trigger synchronization to make sure that LSHost will try to find 'f2' module on disk @@ -160,7 +164,8 @@ namespace ts { }; const newContent = `import {x} from "f1"`; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, newContent); + rootScriptInfo.editContent(0, content.length, newContent); + content = newContent; project.compilerService.languageService.getSemanticDiagnostics(imported.name); assert.isTrue(fileExistsCalled); @@ -205,7 +210,7 @@ namespace ts { }; const { project, rootScriptInfo } = createProject(root.name, serverHost); - + const content = rootScriptInfo.getText(); let diags = project.compilerService.languageService.getSemanticDiagnostics(root.name); assert.isTrue(fileExistsCalledForBar, "'fileExists' should be called"); assert.isTrue(diags.length === 1, "one diagnostic expected"); @@ -214,7 +219,7 @@ namespace ts { // assert that import will success once file appear on disk fileMap[imported.name] = imported; fileExistsCalledForBar = false; - rootScriptInfo.editContent(0, rootScriptInfo.content.length, `import {y} from "bar"`); + rootScriptInfo.editContent(0, content.length, `import {y} from "bar"`); diags = project.compilerService.languageService.getSemanticDiagnostics(root.name); assert.isTrue(fileExistsCalledForBar, "'fileExists' should be called"); From f9102d01230b1b7b9ab4e75d2f3d8dc4486b23cb Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 7 Jul 2016 10:31:42 -0700 Subject: [PATCH 012/109] Update comment to reflect new dependency --- Gulpfile.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Gulpfile.ts b/Gulpfile.ts index 1d77eba4e02..6f63fc23587 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -20,8 +20,7 @@ import * as insert from "gulp-insert"; import * as sourcemaps from "gulp-sourcemaps"; import Q = require("q"); declare global { - // This is silly. We include Q because orchestrator (a part of gulp) depends on it, but its not included. - // `del` further depends on `Promise` (and is also not included), so we just, patch the global scope's Promise to Q's + // `del` further depends on `Promise` (and is also not included), so we just, patch the global scope's Promise to Q's (which we already include in our deps because gulp depends on it) type Promise = Q.Promise; } import del = require("del"); From 78e9fe2838c3de234aeb08bca795e855ced668e8 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Fri, 8 Jul 2016 01:08:49 +0900 Subject: [PATCH 013/109] Fix #9550: exclude 'this' type parameters from unusedParameters checks. --- src/compiler/checker.ts | 5 + .../reference/unusedParametersThis.js | 67 +++++++++++++ .../reference/unusedParametersThis.symbols | 93 ++++++++++++++++++ .../reference/unusedParametersThis.types | 98 +++++++++++++++++++ tests/cases/compiler/unusedParametersThis.ts | 37 +++++++ 5 files changed, 300 insertions(+) create mode 100644 tests/baselines/reference/unusedParametersThis.js create mode 100644 tests/baselines/reference/unusedParametersThis.symbols create mode 100644 tests/baselines/reference/unusedParametersThis.types create mode 100644 tests/cases/compiler/unusedParametersThis.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6427b05c37a..d6db67d3fa8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14563,6 +14563,7 @@ namespace ts { const parameter = local.valueDeclaration; if (compilerOptions.noUnusedParameters && !isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local.valueDeclaration.name, Diagnostics._0_is_declared_but_never_used, local.name); } @@ -14576,6 +14577,10 @@ namespace ts { } } + function parameterIsThisKeyword(parameter: ParameterDeclaration) { + return parameter.name && (parameter.name).originalKeywordKind === SyntaxKind.ThisKeyword; + } + function parameterNameStartsWithUnderscore(parameter: ParameterDeclaration) { return parameter.name && parameter.name.kind === SyntaxKind.Identifier && (parameter.name).text.charCodeAt(0) === CharacterCodes._; } diff --git a/tests/baselines/reference/unusedParametersThis.js b/tests/baselines/reference/unusedParametersThis.js new file mode 100644 index 00000000000..8cf135bf71a --- /dev/null +++ b/tests/baselines/reference/unusedParametersThis.js @@ -0,0 +1,67 @@ +//// [unusedParametersThis.ts] + +class A { + public a: number; + + public method(this: this): number { + return this.a; + } + + public method2(this: A): number { + return this.a; + } + + public method3(this: this): number { + var fn = () => this.a; + return fn(); + } + + public method4(this: A): number { + var fn = () => this.a; + return fn(); + } + + static staticMethod(this: A): number { + return this.a; + } +} + +function f(this: A): number { + return this.a +} + +var f2 = function f2(this: A): number { + return this.a; +}; + +//// [unusedParametersThis.js] +var A = (function () { + function A() { + } + A.prototype.method = function () { + return this.a; + }; + A.prototype.method2 = function () { + return this.a; + }; + A.prototype.method3 = function () { + var _this = this; + var fn = function () { return _this.a; }; + return fn(); + }; + A.prototype.method4 = function () { + var _this = this; + var fn = function () { return _this.a; }; + return fn(); + }; + A.staticMethod = function () { + return this.a; + }; + return A; +}()); +function f() { + return this.a; +} +var f2 = function f2() { + return this.a; +}; diff --git a/tests/baselines/reference/unusedParametersThis.symbols b/tests/baselines/reference/unusedParametersThis.symbols new file mode 100644 index 00000000000..58f8856c281 --- /dev/null +++ b/tests/baselines/reference/unusedParametersThis.symbols @@ -0,0 +1,93 @@ +=== tests/cases/compiler/unusedParametersThis.ts === + +class A { +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + public a: number; +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + + public method(this: this): number { +>method : Symbol(A.method, Decl(unusedParametersThis.ts, 2, 21)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 4, 18)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 4, 18)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + } + + public method2(this: A): number { +>method2 : Symbol(A.method2, Decl(unusedParametersThis.ts, 6, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 8, 19)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 8, 19)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + } + + public method3(this: this): number { +>method3 : Symbol(A.method3, Decl(unusedParametersThis.ts, 10, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 12, 19)) + + var fn = () => this.a; +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 13, 11)) +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 12, 19)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + + return fn(); +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 13, 11)) + } + + public method4(this: A): number { +>method4 : Symbol(A.method4, Decl(unusedParametersThis.ts, 15, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 17, 19)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + var fn = () => this.a; +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 18, 11)) +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 17, 19)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + + return fn(); +>fn : Symbol(fn, Decl(unusedParametersThis.ts, 18, 11)) + } + + static staticMethod(this: A): number { +>staticMethod : Symbol(A.staticMethod, Decl(unusedParametersThis.ts, 20, 5)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 22, 24)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 22, 24)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + } +} + +function f(this: A): number { +>f : Symbol(f, Decl(unusedParametersThis.ts, 25, 1)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 27, 11)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 27, 11)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +} + +var f2 = function f2(this: A): number { +>f2 : Symbol(f2, Decl(unusedParametersThis.ts, 31, 3)) +>f2 : Symbol(f2, Decl(unusedParametersThis.ts, 31, 8)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 31, 21)) +>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0)) + + return this.a; +>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) +>this : Symbol(this, Decl(unusedParametersThis.ts, 31, 21)) +>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9)) + +}; diff --git a/tests/baselines/reference/unusedParametersThis.types b/tests/baselines/reference/unusedParametersThis.types new file mode 100644 index 00000000000..814f56be101 --- /dev/null +++ b/tests/baselines/reference/unusedParametersThis.types @@ -0,0 +1,98 @@ +=== tests/cases/compiler/unusedParametersThis.ts === + +class A { +>A : A + + public a: number; +>a : number + + public method(this: this): number { +>method : (this: this) => number +>this : this + + return this.a; +>this.a : number +>this : this +>a : number + } + + public method2(this: A): number { +>method2 : (this: A) => number +>this : A +>A : A + + return this.a; +>this.a : number +>this : A +>a : number + } + + public method3(this: this): number { +>method3 : (this: this) => number +>this : this + + var fn = () => this.a; +>fn : () => number +>() => this.a : () => number +>this.a : number +>this : this +>a : number + + return fn(); +>fn() : number +>fn : () => number + } + + public method4(this: A): number { +>method4 : (this: A) => number +>this : A +>A : A + + var fn = () => this.a; +>fn : () => number +>() => this.a : () => number +>this.a : number +>this : A +>a : number + + return fn(); +>fn() : number +>fn : () => number + } + + static staticMethod(this: A): number { +>staticMethod : (this: A) => number +>this : A +>A : A + + return this.a; +>this.a : number +>this : A +>a : number + } +} + +function f(this: A): number { +>f : (this: A) => number +>this : A +>A : A + + return this.a +>this.a : number +>this : A +>a : number +} + +var f2 = function f2(this: A): number { +>f2 : (this: A) => number +>function f2(this: A): number { return this.a;} : (this: A) => number +>f2 : (this: A) => number +>this : A +>A : A + + return this.a; +>this.a : number +>this : A +>a : number + +}; diff --git a/tests/cases/compiler/unusedParametersThis.ts b/tests/cases/compiler/unusedParametersThis.ts new file mode 100644 index 00000000000..800229fcdbc --- /dev/null +++ b/tests/cases/compiler/unusedParametersThis.ts @@ -0,0 +1,37 @@ +//@noImplicitThis:true +//@noUnusedLocals:true +//@noUnusedParameters:true + +class A { + public a: number; + + public method(this: this): number { + return this.a; + } + + public method2(this: A): number { + return this.a; + } + + public method3(this: this): number { + var fn = () => this.a; + return fn(); + } + + public method4(this: A): number { + var fn = () => this.a; + return fn(); + } + + static staticMethod(this: A): number { + return this.a; + } +} + +function f(this: A): number { + return this.a +} + +var f2 = function f2(this: A): number { + return this.a; +}; \ No newline at end of file From 4de0a05402e5e0b804edc7ec1998bd8ff9f9d1c0 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 7 Jul 2016 11:52:07 -0700 Subject: [PATCH 014/109] Make TemplateStringsArray completely immutable. --- src/lib/es5.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index 77b960409c2..6f017c8a343 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -513,8 +513,8 @@ interface NumberConstructor { /** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */ declare const Number: NumberConstructor; -interface TemplateStringsArray extends Array { - readonly raw: string[]; +interface TemplateStringsArray extends ReadonlyArray { + readonly raw: ReadonlyArray } interface Math { From 599b9b0e66d250894d8dabde391bfb9554936b8d Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 7 Jul 2016 12:02:47 -0700 Subject: [PATCH 015/109] Update LKG --- lib/tsc.js | 7 ++++++- lib/tsserver.js | 8 ++++++-- lib/tsserverlibrary.d.ts | 1 - lib/tsserverlibrary.js | 8 ++++++-- lib/typescript.js | 7 ++++++- lib/typescriptServices.js | 7 ++++++- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/tsc.js b/lib/tsc.js index 78f4fc3884b..69b9ab5e477 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -7235,7 +7235,8 @@ var ts; } function nextTokenIsClassOrFunctionOrAsync() { nextToken(); - return token === 73 || token === 87 || token === 118; + return token === 73 || token === 87 || + (token === 118 && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); } function isListElement(parsingContext, inErrorRecovery) { var node = currentNode(parsingContext); @@ -24050,6 +24051,7 @@ var ts; var parameter = local_1.valueDeclaration; if (compilerOptions.noUnusedParameters && !ts.isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local_1.valueDeclaration.name, ts.Diagnostics._0_is_declared_but_never_used, local_1.name); } @@ -24065,6 +24067,9 @@ var ts; } } } + function parameterIsThisKeyword(parameter) { + return parameter.name && parameter.name.originalKeywordKind === 97; + } function parameterNameStartsWithUnderscore(parameter) { return parameter.name && parameter.name.kind === 69 && parameter.name.text.charCodeAt(0) === 95; } diff --git a/lib/tsserver.js b/lib/tsserver.js index 1d0fbd864fa..2a22388b2be 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -8153,7 +8153,8 @@ var ts; } function nextTokenIsClassOrFunctionOrAsync() { nextToken(); - return token === 73 || token === 87 || token === 118; + return token === 73 || token === 87 || + (token === 118 && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); } function isListElement(parsingContext, inErrorRecovery) { var node = currentNode(parsingContext); @@ -24968,6 +24969,7 @@ var ts; var parameter = local_1.valueDeclaration; if (compilerOptions.noUnusedParameters && !ts.isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local_1.valueDeclaration.name, ts.Diagnostics._0_is_declared_but_never_used, local_1.name); } @@ -24983,6 +24985,9 @@ var ts; } } } + function parameterIsThisKeyword(parameter) { + return parameter.name && parameter.name.originalKeywordKind === 97; + } function parameterNameStartsWithUnderscore(parameter) { return parameter.name && parameter.name.kind === 69 && parameter.name.text.charCodeAt(0) === 95; } @@ -50792,7 +50797,6 @@ var ts; if (isOpen === void 0) { isOpen = false; } this.host = host; this.fileName = fileName; - this.content = content; this.isOpen = isOpen; this.children = []; this.formatCodeOptions = ts.clone(CompilerService.getDefaultFormatCodeOptions(this.host)); diff --git a/lib/tsserverlibrary.d.ts b/lib/tsserverlibrary.d.ts index 2c9fffcfcfb..df3e95e0788 100644 --- a/lib/tsserverlibrary.d.ts +++ b/lib/tsserverlibrary.d.ts @@ -8388,7 +8388,6 @@ declare namespace ts.server { class ScriptInfo { private host; fileName: string; - content: string; isOpen: boolean; svc: ScriptVersionCache; children: ScriptInfo[]; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index f92b06a1d73..d60d00e66b9 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -8153,7 +8153,8 @@ var ts; } function nextTokenIsClassOrFunctionOrAsync() { nextToken(); - return token === 73 || token === 87 || token === 118; + return token === 73 || token === 87 || + (token === 118 && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); } function isListElement(parsingContext, inErrorRecovery) { var node = currentNode(parsingContext); @@ -24968,6 +24969,7 @@ var ts; var parameter = local_1.valueDeclaration; if (compilerOptions.noUnusedParameters && !ts.isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local_1.valueDeclaration.name, ts.Diagnostics._0_is_declared_but_never_used, local_1.name); } @@ -24983,6 +24985,9 @@ var ts; } } } + function parameterIsThisKeyword(parameter) { + return parameter.name && parameter.name.originalKeywordKind === 97; + } function parameterNameStartsWithUnderscore(parameter) { return parameter.name && parameter.name.kind === 69 && parameter.name.text.charCodeAt(0) === 95; } @@ -50792,7 +50797,6 @@ var ts; if (isOpen === void 0) { isOpen = false; } this.host = host; this.fileName = fileName; - this.content = content; this.isOpen = isOpen; this.children = []; this.formatCodeOptions = ts.clone(CompilerService.getDefaultFormatCodeOptions(this.host)); diff --git a/lib/typescript.js b/lib/typescript.js index 58376b5ec95..5d8cc8951a0 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -8988,7 +8988,8 @@ var ts; } function nextTokenIsClassOrFunctionOrAsync() { nextToken(); - return token === 73 /* ClassKeyword */ || token === 87 /* FunctionKeyword */ || token === 118 /* AsyncKeyword */; + return token === 73 /* ClassKeyword */ || token === 87 /* FunctionKeyword */ || + (token === 118 /* AsyncKeyword */ && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); } // True if positioned at the start of a list element function isListElement(parsingContext, inErrorRecovery) { @@ -29340,6 +29341,7 @@ var ts; var parameter = local_1.valueDeclaration; if (compilerOptions.noUnusedParameters && !ts.isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local_1.valueDeclaration.name, ts.Diagnostics._0_is_declared_but_never_used, local_1.name); } @@ -29355,6 +29357,9 @@ var ts; } } } + function parameterIsThisKeyword(parameter) { + return parameter.name && parameter.name.originalKeywordKind === 97 /* ThisKeyword */; + } function parameterNameStartsWithUnderscore(parameter) { return parameter.name && parameter.name.kind === 69 /* Identifier */ && parameter.name.text.charCodeAt(0) === 95 /* _ */; } diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 58376b5ec95..5d8cc8951a0 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -8988,7 +8988,8 @@ var ts; } function nextTokenIsClassOrFunctionOrAsync() { nextToken(); - return token === 73 /* ClassKeyword */ || token === 87 /* FunctionKeyword */ || token === 118 /* AsyncKeyword */; + return token === 73 /* ClassKeyword */ || token === 87 /* FunctionKeyword */ || + (token === 118 /* AsyncKeyword */ && lookAhead(nextTokenIsFunctionKeywordOnSameLine)); } // True if positioned at the start of a list element function isListElement(parsingContext, inErrorRecovery) { @@ -29340,6 +29341,7 @@ var ts; var parameter = local_1.valueDeclaration; if (compilerOptions.noUnusedParameters && !ts.isParameterPropertyDeclaration(parameter) && + !parameterIsThisKeyword(parameter) && !parameterNameStartsWithUnderscore(parameter)) { error(local_1.valueDeclaration.name, ts.Diagnostics._0_is_declared_but_never_used, local_1.name); } @@ -29355,6 +29357,9 @@ var ts; } } } + function parameterIsThisKeyword(parameter) { + return parameter.name && parameter.name.originalKeywordKind === 97 /* ThisKeyword */; + } function parameterNameStartsWithUnderscore(parameter) { return parameter.name && parameter.name.kind === 69 /* Identifier */ && parameter.name.text.charCodeAt(0) === 95 /* _ */; } From fd6676049b43169de948d43f9f912bd5458518cf Mon Sep 17 00:00:00 2001 From: zhengbli Date: Thu, 7 Jul 2016 13:50:11 -0700 Subject: [PATCH 016/109] Avoid putting children tags in jsdoccomment --- src/compiler/parser.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index dc2e114977f..e12ff7c87dc 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6374,6 +6374,9 @@ namespace ts { case SyntaxKind.AtToken: if (canParseTag) { parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral); + if (!parentTagTerminated) { + resumePos = scanner.getStartPos(); + } } seenAsterisk = false; break; From bab06f119385fe6cb3fb757e149b93290842d64a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 7 Jul 2016 16:10:20 -0700 Subject: [PATCH 017/109] Parse the result of getDirectories call --- src/services/shims.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/shims.ts b/src/services/shims.ts index a233f99d03f..e8b9b59b3cd 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -61,7 +61,7 @@ namespace ts { getLocalizedDiagnosticMessages(): string; getCancellationToken(): HostCancellationToken; getCurrentDirectory(): string; - getDirectories(path: string): string[]; + getDirectories(path: string): string; getDefaultLibFileName(options: string): string; getNewLine?(): string; getProjectVersion?(): string; @@ -404,7 +404,7 @@ namespace ts { } public getDirectories(path: string): string[] { - return this.shimHost.getDirectories(path); + return JSON.parse(this.shimHost.getDirectories(path)); } public getDefaultLibFileName(options: CompilerOptions): string { From 028e2024e91007b9617e4d7d6219516eb08e7152 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 7 Jul 2016 16:26:19 -0700 Subject: [PATCH 018/109] Update LKG --- lib/tsserver.js | 2 +- lib/tsserverlibrary.d.ts | 2 +- lib/tsserverlibrary.js | 2 +- lib/typescript.js | 2 +- lib/typescriptServices.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/tsserver.js b/lib/tsserver.js index 2a22388b2be..68bceb54bb9 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -53200,7 +53200,7 @@ var ts; return this.shimHost.getCurrentDirectory(); }; LanguageServiceShimHostAdapter.prototype.getDirectories = function (path) { - return this.shimHost.getDirectories(path); + return JSON.parse(this.shimHost.getDirectories(path)); }; LanguageServiceShimHostAdapter.prototype.getDefaultLibFileName = function (options) { return this.shimHost.getDefaultLibFileName(JSON.stringify(options)); diff --git a/lib/tsserverlibrary.d.ts b/lib/tsserverlibrary.d.ts index df3e95e0788..1e0cefac78b 100644 --- a/lib/tsserverlibrary.d.ts +++ b/lib/tsserverlibrary.d.ts @@ -8728,7 +8728,7 @@ declare namespace ts { getLocalizedDiagnosticMessages(): string; getCancellationToken(): HostCancellationToken; getCurrentDirectory(): string; - getDirectories(path: string): string[]; + getDirectories(path: string): string; getDefaultLibFileName(options: string): string; getNewLine?(): string; getProjectVersion?(): string; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index d60d00e66b9..f0bfd0f4f3e 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -52966,7 +52966,7 @@ var ts; return this.shimHost.getCurrentDirectory(); }; LanguageServiceShimHostAdapter.prototype.getDirectories = function (path) { - return this.shimHost.getDirectories(path); + return JSON.parse(this.shimHost.getDirectories(path)); }; LanguageServiceShimHostAdapter.prototype.getDefaultLibFileName = function (options) { return this.shimHost.getDefaultLibFileName(JSON.stringify(options)); diff --git a/lib/typescript.js b/lib/typescript.js index 5d8cc8951a0..3b28d8f0e67 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -59705,7 +59705,7 @@ var ts; return this.shimHost.getCurrentDirectory(); }; LanguageServiceShimHostAdapter.prototype.getDirectories = function (path) { - return this.shimHost.getDirectories(path); + return JSON.parse(this.shimHost.getDirectories(path)); }; LanguageServiceShimHostAdapter.prototype.getDefaultLibFileName = function (options) { return this.shimHost.getDefaultLibFileName(JSON.stringify(options)); diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 5d8cc8951a0..3b28d8f0e67 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -59705,7 +59705,7 @@ var ts; return this.shimHost.getCurrentDirectory(); }; LanguageServiceShimHostAdapter.prototype.getDirectories = function (path) { - return this.shimHost.getDirectories(path); + return JSON.parse(this.shimHost.getDirectories(path)); }; LanguageServiceShimHostAdapter.prototype.getDefaultLibFileName = function (options) { return this.shimHost.getDefaultLibFileName(JSON.stringify(options)); From 87e95069fc6a5a46804f7328a8ef0d180e17734a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 7 Jul 2016 16:46:49 -0700 Subject: [PATCH 019/109] Update harness getDirectories implementation for shims --- src/harness/harnessLanguageService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index b40cbde73e7..d7ed04b627f 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -274,7 +274,7 @@ namespace Harness.LanguageService { getCompilationSettings(): string { return JSON.stringify(this.nativeHost.getCompilationSettings()); } getCancellationToken(): ts.HostCancellationToken { return this.nativeHost.getCancellationToken(); } getCurrentDirectory(): string { return this.nativeHost.getCurrentDirectory(); } - getDirectories(path: string) { return this.nativeHost.getDirectories(path); } + getDirectories(path: string): string { return JSON.stringify(this.nativeHost.getDirectories(path)); } getDefaultLibFileName(): string { return this.nativeHost.getDefaultLibFileName(); } getScriptFileNames(): string { return JSON.stringify(this.nativeHost.getScriptFileNames()); } getScriptSnapshot(fileName: string): ts.ScriptSnapshotShim { From 5c498cdc81c6c6362ff7892d673e6332a474224e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 7 Jul 2016 16:10:20 -0700 Subject: [PATCH 020/109] Parse the result of getDirectories call --- src/services/shims.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/shims.ts b/src/services/shims.ts index a233f99d03f..e8b9b59b3cd 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -61,7 +61,7 @@ namespace ts { getLocalizedDiagnosticMessages(): string; getCancellationToken(): HostCancellationToken; getCurrentDirectory(): string; - getDirectories(path: string): string[]; + getDirectories(path: string): string; getDefaultLibFileName(options: string): string; getNewLine?(): string; getProjectVersion?(): string; @@ -404,7 +404,7 @@ namespace ts { } public getDirectories(path: string): string[] { - return this.shimHost.getDirectories(path); + return JSON.parse(this.shimHost.getDirectories(path)); } public getDefaultLibFileName(options: CompilerOptions): string { From f0d5ff6c94fc46a2ba0ec9fac0706c0f337962ad Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 7 Jul 2016 16:46:49 -0700 Subject: [PATCH 021/109] Update harness getDirectories implementation for shims --- src/harness/harnessLanguageService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index b40cbde73e7..d7ed04b627f 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -274,7 +274,7 @@ namespace Harness.LanguageService { getCompilationSettings(): string { return JSON.stringify(this.nativeHost.getCompilationSettings()); } getCancellationToken(): ts.HostCancellationToken { return this.nativeHost.getCancellationToken(); } getCurrentDirectory(): string { return this.nativeHost.getCurrentDirectory(); } - getDirectories(path: string) { return this.nativeHost.getDirectories(path); } + getDirectories(path: string): string { return JSON.stringify(this.nativeHost.getDirectories(path)); } getDefaultLibFileName(): string { return this.nativeHost.getDefaultLibFileName(); } getScriptFileNames(): string { return JSON.stringify(this.nativeHost.getScriptFileNames()); } getScriptSnapshot(fileName: string): ts.ScriptSnapshotShim { From 4721b91527119e7985273f5dc2e904496754c12b Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 09:26:58 -0700 Subject: [PATCH 022/109] Fix multiple Salsa assignment-declarations Previously, all assignment-declarations needed to be of the same kind: either all `this.p = ...` assignments or `C.prototype.p = ...` assignments. --- src/compiler/checker.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d6db67d3fa8..8568f8cf4aa 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3166,17 +3166,17 @@ namespace ts { } let type: Type = undefined; - // Handle module.exports = expr or this.p = expr - if (declaration.kind === SyntaxKind.BinaryExpression) { - type = getUnionType(map(symbol.declarations, (decl: BinaryExpression) => checkExpressionCached(decl.right))); - } - else if (declaration.kind === SyntaxKind.PropertyAccessExpression) { - // Declarations only exist for property access expressions for certain - // special assignment kinds - if (declaration.parent.kind === SyntaxKind.BinaryExpression) { - // Handle exports.p = expr or className.prototype.method = expr - type = checkExpressionCached((declaration.parent).right); - } + // Handle certain special assignment kinds, which happen to union across multiple declarations: + // * module.exports = expr + // * exports.p = expr + // * this.p = expr + // * className.prototype.method = expr + if (declaration.kind === SyntaxKind.BinaryExpression || + declaration.kind === SyntaxKind.PropertyAccessExpression && declaration.parent.kind === SyntaxKind.BinaryExpression) { + type = getUnionType(map(symbol.declarations, + decl => decl.kind === SyntaxKind.BinaryExpression ? + checkExpressionCached((decl).right) : + checkExpressionCached((decl.parent).right))); } if (type === undefined) { From f84b7319110cb08a3778458f83f62e67687ed06b Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 09:40:54 -0700 Subject: [PATCH 023/109] Test for multiple salsa assignment-declarations --- .../reference/multipleDeclarations.js | 17 +++++++++++ .../reference/multipleDeclarations.symbols | 17 +++++++++++ .../reference/multipleDeclarations.types | 29 +++++++++++++++++++ .../conformance/salsa/multipleDeclarations.ts | 10 +++++++ 4 files changed, 73 insertions(+) create mode 100644 tests/baselines/reference/multipleDeclarations.js create mode 100644 tests/baselines/reference/multipleDeclarations.symbols create mode 100644 tests/baselines/reference/multipleDeclarations.types create mode 100644 tests/cases/conformance/salsa/multipleDeclarations.ts diff --git a/tests/baselines/reference/multipleDeclarations.js b/tests/baselines/reference/multipleDeclarations.js new file mode 100644 index 00000000000..5f5ac29e909 --- /dev/null +++ b/tests/baselines/reference/multipleDeclarations.js @@ -0,0 +1,17 @@ +//// [input.js] + +function C() { + this.m = null; +} +C.prototype.m = function() { + this.nothing(); +}; + + +//// [output.js] +function C() { + this.m = null; +} +C.prototype.m = function () { + this.nothing(); +}; diff --git a/tests/baselines/reference/multipleDeclarations.symbols b/tests/baselines/reference/multipleDeclarations.symbols new file mode 100644 index 00000000000..0c8569ab89e --- /dev/null +++ b/tests/baselines/reference/multipleDeclarations.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/salsa/input.js === + +function C() { +>C : Symbol(C, Decl(input.js, 0, 0)) + + this.m = null; +>m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) +} +C.prototype.m = function() { +>C.prototype : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) +>C : Symbol(C, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) + + this.nothing(); +}; + diff --git a/tests/baselines/reference/multipleDeclarations.types b/tests/baselines/reference/multipleDeclarations.types new file mode 100644 index 00000000000..7c0a3de70c9 --- /dev/null +++ b/tests/baselines/reference/multipleDeclarations.types @@ -0,0 +1,29 @@ +=== tests/cases/conformance/salsa/input.js === + +function C() { +>C : () => void + + this.m = null; +>this.m = null : null +>this.m : any +>this : any +>m : any +>null : null +} +C.prototype.m = function() { +>C.prototype.m = function() { this.nothing();} : () => void +>C.prototype.m : any +>C.prototype : any +>C : () => void +>prototype : any +>m : any +>function() { this.nothing();} : () => void + + this.nothing(); +>this.nothing() : any +>this.nothing : any +>this : { m: () => void; } +>nothing : any + +}; + diff --git a/tests/cases/conformance/salsa/multipleDeclarations.ts b/tests/cases/conformance/salsa/multipleDeclarations.ts new file mode 100644 index 00000000000..6899be2ec89 --- /dev/null +++ b/tests/cases/conformance/salsa/multipleDeclarations.ts @@ -0,0 +1,10 @@ +// @filename: input.js +// @out: output.js +// @allowJs: true + +function C() { + this.m = null; +} +C.prototype.m = function() { + this.nothing(); +}; From ebc75a251196176ad08ab20d5115e73476668a1a Mon Sep 17 00:00:00 2001 From: zhengbli Date: Thu, 7 Jul 2016 16:27:54 -0700 Subject: [PATCH 024/109] Add test for parsed @typedef tag node shape --- tests/cases/unittests/jsDocParsing.ts | 180 ++++++++++++++++++++++++-- 1 file changed, 171 insertions(+), 9 deletions(-) diff --git a/tests/cases/unittests/jsDocParsing.ts b/tests/cases/unittests/jsDocParsing.ts index fb75b4d4940..e6cf4ffff4f 100644 --- a/tests/cases/unittests/jsDocParsing.ts +++ b/tests/cases/unittests/jsDocParsing.ts @@ -986,7 +986,7 @@ namespace ts { }); describe("DocComments", () => { - function parsesCorrectly(content: string, expected: string) { + function parsesCorrectly(content: string, expected: string | {}) { const comment = parseIsolatedJSDocComment(content); if (!comment) { Debug.fail("Comment failed to parse entirely"); @@ -995,30 +995,46 @@ namespace ts { Debug.fail("Comment has at least one diagnostic: " + comment.diagnostics[0].messageText); } - const result = JSON.stringify(comment.jsDocComment, (k, v) => { - return v && v.pos !== undefined - ? JSON.parse(Utils.sourceFileToJSON(v)) - : v; - }, 4); + const result = toJsonString(comment.jsDocComment); - if (result !== expected) { + const expectedString = typeof expected === "string" + ? expected + : toJsonString(expected); + if (result !== expectedString) { // Turn on a human-readable diff if (typeof require !== "undefined") { const chai = require("chai"); chai.config.showDiff = true; - chai.expect(JSON.parse(result)).equal(JSON.parse(expected)); + // Use deep equal to compare key value data instead of the two objects + chai.expect(JSON.parse(result)).deep.equal(JSON.parse(expectedString)); } else { - assert.equal(result, expected); + assert.equal(result, expectedString); } } } + function toJsonString(obj: {}) { + return JSON.stringify(obj, (k, v) => { + return v && v.pos !== undefined + ? JSON.parse(Utils.sourceFileToJSON(v)) + : v; + }, 4); + } + function parsesIncorrectly(content: string) { const type = parseIsolatedJSDocComment(content); assert.isTrue(!type || type.diagnostics.length > 0); } + function reIndentJSDocComment(jsdocComment: string) { + const result = jsdocComment + .replace(/[\t ]*\/\*\*/, "/**") + .replace(/[\t ]*\*\s?@/g, " * @") + .replace(/[\t ]*\*\s?\//, " */"); + return result; + } + describe("parsesIncorrectly", () => { it("emptyComment", () => { parsesIncorrectly("/***/"); @@ -2216,6 +2232,152 @@ namespace ts { } }`); }); + + it("typedefTagWithChildrenTags", () => { + const content = + `/** + * @typedef People + * @type {Object} + * @property {number} age + * @property {string} name + */`; + const expected = { + "end": 102, + "kind": "JSDocComment", + "pos": 0, + "tags": { + "0": { + "atToken": { + "end": 9, + "kind": "AtToken", + "pos": 8 + }, + "end": 97, + "jsDocTypeLiteral": { + "end": 97, + "jsDocPropertyTags": [ + { + "atToken": { + "end": 48, + "kind": "AtToken", + "pos": 46 + }, + "end": 69, + "kind": "JSDocPropertyTag", + "name": { + "end": 69, + "kind": "Identifier", + "pos": 66, + "text": "age" + }, + "pos": 46, + "tagName": { + "end": 56, + "kind": "Identifier", + "pos": 48, + "text": "property" + }, + "typeExpression": { + "end": 65, + "kind": "JSDocTypeExpression", + "pos": 57, + "type": { + "end": 64, + "kind": "NumberKeyword", + "pos": 58 + } + } + }, + { + "atToken": { + "end": 75, + "kind": "AtToken", + "pos": 73 + }, + "end": 97, + "kind": "JSDocPropertyTag", + "name": { + "end": 97, + "kind": "Identifier", + "pos": 93, + "text": "name" + }, + "pos": 73, + "tagName": { + "end": 83, + "kind": "Identifier", + "pos": 75, + "text": "property" + }, + "typeExpression": { + "end": 92, + "kind": "JSDocTypeExpression", + "pos": 84, + "type": { + "end": 91, + "kind": "StringKeyword", + "pos": 85 + } + } + } + ], + "jsDocTypeTag": { + "atToken": { + "end": 29, + "kind": "AtToken", + "pos": 27 + }, + "end": 42, + "kind": "JSDocTypeTag", + "pos": 27, + "tagName": { + "end": 33, + "kind": "Identifier", + "pos": 29, + "text": "type" + }, + "typeExpression": { + "end": 42, + "kind": "JSDocTypeExpression", + "pos": 34, + "type": { + "end": 41, + "kind": "JSDocTypeReference", + "name": { + "end": 41, + "kind": "Identifier", + "pos": 35, + "text": "Object" + }, + "pos": 35 + } + } + }, + "kind": "JSDocTypeLiteral", + "pos": 23 + }, + "kind": "JSDocTypedefTag", + "name": { + "end": 23, + "kind": "Identifier", + "pos": 17, + "text": "People" + }, + "pos": 8, + "tagName": { + "end": 16, + "kind": "Identifier", + "pos": 9, + "text": "typedef" + } + }, + "end": 97, + "length": 1, + "pos": 8 + } + }; + parsesCorrectly(reIndentJSDocComment(content), expected); + }); }); }); }); From 3c1a69b637e5df598e4db0325a2b80b2e23944a3 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 12:52:54 -0700 Subject: [PATCH 025/109] Provide a symbol for salsa-inferred class types --- src/compiler/checker.ts | 2 +- .../reference/methodsReturningThis.js | 36 +++++ .../reference/methodsReturningThis.symbols | 101 +++++++++++++ .../reference/methodsReturningThis.types | 133 ++++++++++++++++++ ...turesUseJSDocForOptionalParameters.symbols | 2 + ...naturesUseJSDocForOptionalParameters.types | 18 +-- .../conformance/salsa/methodsReturningThis.ts | 21 +++ 7 files changed, 303 insertions(+), 10 deletions(-) create mode 100644 tests/baselines/reference/methodsReturningThis.js create mode 100644 tests/baselines/reference/methodsReturningThis.symbols create mode 100644 tests/baselines/reference/methodsReturningThis.types create mode 100644 tests/cases/conformance/salsa/methodsReturningThis.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d6db67d3fa8..04071f5087f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11673,7 +11673,7 @@ namespace ts { function getInferredClassType(symbol: Symbol) { const links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); } return links.inferredClassType; } diff --git a/tests/baselines/reference/methodsReturningThis.js b/tests/baselines/reference/methodsReturningThis.js new file mode 100644 index 00000000000..b0ebd84770d --- /dev/null +++ b/tests/baselines/reference/methodsReturningThis.js @@ -0,0 +1,36 @@ +//// [input.js] +function Class() +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +Class.prototype.m2 = function (x, y) { return this; }; +Class.prototype.m3 = function (x, y) { return this; }; +Class.prototype.m4 = function (angle) { return this; }; +Class.prototype.m5 = function (matrix) { return this; }; +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +Class.prototype.m7 = function(matrix) { return this; }; +Class.prototype.m8 = function() { return this; }; +Class.prototype.m9 = function () { return this; }; + + + +//// [output.js] +function Class() { +} +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +Class.prototype.m2 = function (x, y) { return this; }; +Class.prototype.m3 = function (x, y) { return this; }; +Class.prototype.m4 = function (angle) { return this; }; +Class.prototype.m5 = function (matrix) { return this; }; +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +Class.prototype.m7 = function (matrix) { return this; }; +Class.prototype.m8 = function () { return this; }; +Class.prototype.m9 = function () { return this; }; diff --git a/tests/baselines/reference/methodsReturningThis.symbols b/tests/baselines/reference/methodsReturningThis.symbols new file mode 100644 index 00000000000..eccb1a64f89 --- /dev/null +++ b/tests/baselines/reference/methodsReturningThis.symbols @@ -0,0 +1,101 @@ +=== tests/cases/conformance/salsa/input.js === +function Class() +>Class : Symbol(Class, Decl(input.js, 0, 0)) +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; +>Class.prototype : Symbol(Class.containsError, Decl(input.js, 2, 1)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>containsError : Symbol(Class.containsError, Decl(input.js, 2, 1)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +>Class.prototype : Symbol(Class.m1, Decl(input.js, 5, 72)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m1 : Symbol(Class.m1, Decl(input.js, 5, 72)) +>a : Symbol(a, Decl(input.js, 8, 31)) +>b : Symbol(b, Decl(input.js, 8, 33)) +>c : Symbol(c, Decl(input.js, 8, 36)) +>d : Symbol(d, Decl(input.js, 8, 39)) +>tx : Symbol(tx, Decl(input.js, 8, 42)) +>ty : Symbol(ty, Decl(input.js, 8, 46)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m2 = function (x, y) { return this; }; +>Class.prototype : Symbol(Class.m2, Decl(input.js, 8, 68)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m2 : Symbol(Class.m2, Decl(input.js, 8, 68)) +>x : Symbol(x, Decl(input.js, 9, 31)) +>y : Symbol(y, Decl(input.js, 9, 33)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m3 = function (x, y) { return this; }; +>Class.prototype : Symbol(Class.m3, Decl(input.js, 9, 54)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m3 : Symbol(Class.m3, Decl(input.js, 9, 54)) +>x : Symbol(x, Decl(input.js, 10, 31)) +>y : Symbol(y, Decl(input.js, 10, 33)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m4 = function (angle) { return this; }; +>Class.prototype : Symbol(Class.m4, Decl(input.js, 10, 54)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m4 : Symbol(Class.m4, Decl(input.js, 10, 54)) +>angle : Symbol(angle, Decl(input.js, 11, 31)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m5 = function (matrix) { return this; }; +>Class.prototype : Symbol(Class.m5, Decl(input.js, 11, 55)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m5 : Symbol(Class.m5, Decl(input.js, 11, 55)) +>matrix : Symbol(matrix, Decl(input.js, 12, 31)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +>Class.prototype : Symbol(Class.m6, Decl(input.js, 12, 56)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m6 : Symbol(Class.m6, Decl(input.js, 12, 56)) +>x : Symbol(x, Decl(input.js, 13, 31)) +>y : Symbol(y, Decl(input.js, 13, 33)) +>pivotX : Symbol(pivotX, Decl(input.js, 13, 36)) +>pivotY : Symbol(pivotY, Decl(input.js, 13, 44)) +>scaleX : Symbol(scaleX, Decl(input.js, 13, 52)) +>scaleY : Symbol(scaleY, Decl(input.js, 13, 60)) +>rotation : Symbol(rotation, Decl(input.js, 13, 68)) +>skewX : Symbol(skewX, Decl(input.js, 13, 78)) +>skewY : Symbol(skewY, Decl(input.js, 13, 85)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m7 = function(matrix) { return this; }; +>Class.prototype : Symbol(Class.m7, Decl(input.js, 13, 110)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m7 : Symbol(Class.m7, Decl(input.js, 13, 110)) +>matrix : Symbol(matrix, Decl(input.js, 14, 30)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m8 = function() { return this; }; +>Class.prototype : Symbol(Class.m8, Decl(input.js, 14, 55)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m8 : Symbol(Class.m8, Decl(input.js, 14, 55)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m9 = function () { return this; }; +>Class.prototype : Symbol(Class.m9, Decl(input.js, 15, 49)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m9 : Symbol(Class.m9, Decl(input.js, 15, 49)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + + diff --git a/tests/baselines/reference/methodsReturningThis.types b/tests/baselines/reference/methodsReturningThis.types new file mode 100644 index 00000000000..5bcaa992a71 --- /dev/null +++ b/tests/baselines/reference/methodsReturningThis.types @@ -0,0 +1,133 @@ +=== tests/cases/conformance/salsa/input.js === +function Class() +>Class : () => void +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; +>Class.prototype.containsError = function () { return this.notPresent; } : () => any +>Class.prototype.containsError : any +>Class.prototype : any +>Class : () => void +>prototype : any +>containsError : any +>function () { return this.notPresent; } : () => any +>this.notPresent : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>notPresent : any + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +>Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => { containsError: () => any; m1: any; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m1 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m1 : any +>function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => { containsError: () => any; m1: any; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>a : any +>b : any +>c : any +>d : any +>tx : any +>ty : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m2 = function (x, y) { return this; }; +>Class.prototype.m2 = function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: any; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m2 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m2 : any +>function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: any; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>x : any +>y : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m3 = function (x, y) { return this; }; +>Class.prototype.m3 = function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: any; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m3 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m3 : any +>function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: any; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>x : any +>y : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m4 = function (angle) { return this; }; +>Class.prototype.m4 = function (angle) { return this; } : (angle: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: any; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m4 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m4 : any +>function (angle) { return this; } : (angle: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: any; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>angle : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m5 = function (matrix) { return this; }; +>Class.prototype.m5 = function (matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: any; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m5 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m5 : any +>function (matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: any; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>matrix : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +>Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: any; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m6 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m6 : any +>function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: any; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>x : any +>y : any +>pivotX : any +>pivotY : any +>scaleX : any +>scaleY : any +>rotation : any +>skewX : any +>skewY : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m7 = function(matrix) { return this; }; +>Class.prototype.m7 = function(matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: any; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m7 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m7 : any +>function(matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: any; m8: () => typeof Class; m9: () => typeof Class; } +>matrix : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m8 = function() { return this; }; +>Class.prototype.m8 = function() { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: any; m9: () => typeof Class; } +>Class.prototype.m8 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m8 : any +>function() { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: any; m9: () => typeof Class; } +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m9 = function () { return this; }; +>Class.prototype.m9 = function () { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: any; } +>Class.prototype.m9 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m9 : any +>function () { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: any; } +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + + diff --git a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols index 5ea2756598e..52fc8b9a9a9 100644 --- a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols +++ b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols @@ -19,6 +19,8 @@ MyClass.prototype.optionalParam = function(required, notRequired) { >notRequired : Symbol(notRequired, Decl(jsDocOptionality.js, 8, 52)) return this; +>this : Symbol(MyClass, Decl(jsDocOptionality.js, 0, 0)) + }; let pInst = new MyClass(); >pInst : Symbol(pInst, Decl(jsDocOptionality.js, 11, 3)) diff --git a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types index 2dcaa37b947..48d44bb5406 100644 --- a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types +++ b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types @@ -26,27 +26,27 @@ MyClass.prototype.optionalParam = function(required, notRequired) { >notRequired : string return this; ->this : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>this : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } }; let pInst = new MyClass(); ->pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } ->new MyClass() : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } +>new MyClass() : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >MyClass : () => void let c1 = pInst.optionalParam('hello') ->c1 : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } ->pInst.optionalParam('hello') : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>c1 : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } +>pInst.optionalParam('hello') : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >pInst.optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } ->pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } >'hello' : string let c2 = pInst.optionalParam('hello', null) ->c2 : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } ->pInst.optionalParam('hello', null) : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>c2 : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } +>pInst.optionalParam('hello', null) : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >pInst.optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } ->pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } >'hello' : string >null : null diff --git a/tests/cases/conformance/salsa/methodsReturningThis.ts b/tests/cases/conformance/salsa/methodsReturningThis.ts new file mode 100644 index 00000000000..4c9f0d5cd0b --- /dev/null +++ b/tests/cases/conformance/salsa/methodsReturningThis.ts @@ -0,0 +1,21 @@ +// @filename: input.js +// @out: output.js +// @allowJs: true +function Class() +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +Class.prototype.m2 = function (x, y) { return this; }; +Class.prototype.m3 = function (x, y) { return this; }; +Class.prototype.m4 = function (angle) { return this; }; +Class.prototype.m5 = function (matrix) { return this; }; +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +Class.prototype.m7 = function(matrix) { return this; }; +Class.prototype.m8 = function() { return this; }; +Class.prototype.m9 = function () { return this; }; + From b543074861f71653eaef98d812708fe928398817 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 15:13:32 -0700 Subject: [PATCH 026/109] Compile with --noImplicitThis 1. Add to various tsconfig.json 2. Add to Jakefile 3. Add annotations where needed. 4. Add workaround to shims.ts, which uses toplevel `this`. --- Jakefile.js | 2 +- src/compiler/core.ts | 6 +++--- src/compiler/program.ts | 2 +- src/compiler/sys.ts | 4 ++-- src/compiler/tsconfig.json | 1 + src/server/editorServices.ts | 2 +- src/server/tsconfig.json | 1 + src/services/shims.ts | 2 +- src/services/tsconfig.json | 1 + 9 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index 828f4b084d1..0dd589f90e3 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -284,7 +284,7 @@ var builtLocalCompiler = path.join(builtLocalDirectory, compilerFilename); function compileFile(outFile, sources, prereqs, prefixes, useBuiltCompiler, opts, callback) { file(outFile, prereqs, function() { var compilerPath = useBuiltCompiler ? builtLocalCompiler : LKGCompiler; - var options = "--noImplicitAny --noEmitOnError --types --pretty"; + var options = "--noImplicitAny --noImplicitThis --noEmitOnError --types --pretty"; opts = opts || {}; // Keep comments when specifically requested // or when in debug mode. diff --git a/src/compiler/core.ts b/src/compiler/core.ts index fe4731a1c91..cc6a9e6db9a 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1237,20 +1237,20 @@ namespace ts { getSignatureConstructor(): new (checker: TypeChecker) => Signature; } - function Symbol(flags: SymbolFlags, name: string) { + function Symbol(this: Symbol, flags: SymbolFlags, name: string) { this.flags = flags; this.name = name; this.declarations = undefined; } - function Type(checker: TypeChecker, flags: TypeFlags) { + function Type(this: Type, checker: TypeChecker, flags: TypeFlags) { this.flags = flags; } function Signature(checker: TypeChecker) { } - function Node(kind: SyntaxKind, pos: number, end: number) { + function Node(this: Node, kind: SyntaxKind, pos: number, end: number) { this.kind = kind; this.pos = pos; this.end = end; diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 2e4492efa7b..31332a92b0a 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1398,7 +1398,7 @@ namespace ts { return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = createTypeChecker(program, /*produceDiagnostics:*/ false)); } - function emit(sourceFile?: SourceFile, writeFileCallback?: WriteFileCallback, cancellationToken?: CancellationToken): EmitResult { + function emit(this: Program, sourceFile?: SourceFile, writeFileCallback?: WriteFileCallback, cancellationToken?: CancellationToken): EmitResult { return runWithCancellationToken(() => emitWorker(this, sourceFile, writeFileCallback, cancellationToken)); } diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 338b6de1e63..5000be8a0ca 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -200,7 +200,7 @@ namespace ts { directoryExists(path: string) { return fso.FolderExists(path); }, - createDirectory(directoryName: string) { + createDirectory(this: System, directoryName: string) { if (!this.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } @@ -500,7 +500,7 @@ namespace ts { }, fileExists, directoryExists, - createDirectory(directoryName: string) { + createDirectory(this: System, directoryName: string) { if (!this.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } diff --git a/src/compiler/tsconfig.json b/src/compiler/tsconfig.json index 76308c2cba4..5418ca1abe7 100644 --- a/src/compiler/tsconfig.json +++ b/src/compiler/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "noImplicitAny": true, + "noImplicitThis": true, "removeComments": true, "preserveConstEnums": true, "outFile": "../../built/local/tsc.js", diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 6a2beccc243..fc2131d0922 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -2081,7 +2081,7 @@ namespace ts.server { const walkFns = { goSubtree: true, done: false, - leaf: function (relativeStart: number, relativeLength: number, ll: LineLeaf) { + leaf: function (this: ILineIndexWalker, relativeStart: number, relativeLength: number, ll: LineLeaf) { if (!f(ll, relativeStart, relativeLength)) { this.done = true; } diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json index 0a8cfb89ab3..57c54b47ad8 100644 --- a/src/server/tsconfig.json +++ b/src/server/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "noImplicitAny": true, + "noImplicitThis": true, "removeComments": true, "preserveConstEnums": true, "out": "../../built/local/tsserver.js", diff --git a/src/services/shims.ts b/src/services/shims.ts index e8b9b59b3cd..e85bf537d30 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -16,7 +16,7 @@ /// /* @internal */ -let debugObjectHost = (this); +let debugObjectHost = new Function("return this")(); // We need to use 'null' to interface with the managed side. /* tslint:disable:no-null-keyword */ diff --git a/src/services/tsconfig.json b/src/services/tsconfig.json index 4bf6e87d7a6..26903bf28ec 100644 --- a/src/services/tsconfig.json +++ b/src/services/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "noImplicitAny": true, + "noImplicitThis": true, "removeComments": false, "preserveConstEnums": true, "outFile": "../../built/local/typescriptServices.js", From 348a4e96893e35ab8794197dc0add2a36bcc28e7 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 8 Jul 2016 17:13:12 -0700 Subject: [PATCH 027/109] Fixed up tests that used 'string[]' instead of 'TemplateStringsArray'. --- ...gedTemplateStringsTypeArgumentInference.ts | 22 +++++++++---------- ...TemplateStringsTypeArgumentInferenceES6.ts | 22 +++++++++---------- ...emplateStringsWithIncompatibleTypedTags.ts | 2 +- ...lateStringsWithIncompatibleTypedTagsES6.ts | 2 +- ...StringsWithManyCallAndMemberExpressions.ts | 2 +- ...ingsWithManyCallAndMemberExpressionsES6.ts | 2 +- ...dTemplateStringsWithOverloadResolution1.ts | 8 +++---- ...plateStringsWithOverloadResolution1_ES6.ts | 8 +++---- ...dTemplateStringsWithOverloadResolution2.ts | 8 +++---- ...plateStringsWithOverloadResolution2_ES6.ts | 8 +++---- .../taggedTemplateStringsWithTypedTags.ts | 2 +- .../taggedTemplateStringsWithTypedTagsES6.ts | 2 +- ...eHelpTaggedTemplatesWithOverloadedTags3.ts | 8 +++---- ...eHelpTaggedTemplatesWithOverloadedTags7.ts | 8 +++---- 14 files changed, 52 insertions(+), 52 deletions(-) diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts index 961544f309a..17f2ea6b848 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts @@ -5,60 +5,60 @@ function noParams(n: T) { } noParams ``; // Generic tag with parameter which does not use type parameter -function noGenericParams(n: string[]) { } +function noGenericParams(n: TemplateStringsArray) { } noGenericParams ``; // Generic tag with multiple type parameters and only one used in parameter type annotation function someGenerics1a(n: T, m: number) { } someGenerics1a `${3}`; -function someGenerics1b(n: string[], m: U) { } +function someGenerics1b(n: TemplateStringsArray, m: U) { } someGenerics1b `${3}`; // Generic tag with argument of function type whose parameter is of type parameter type -function someGenerics2a(strs: string[], n: (x: T) => void) { } +function someGenerics2a(strs: TemplateStringsArray, n: (x: T) => void) { } someGenerics2a `${(n: string) => n}`; -function someGenerics2b(strs: string[], n: (x: T, y: U) => void) { } +function someGenerics2b(strs: TemplateStringsArray, n: (x: T, y: U) => void) { } someGenerics2b `${ (n: string, x: number) => n }`; // Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter -function someGenerics3(strs: string[], producer: () => T) { } +function someGenerics3(strs: TemplateStringsArray, producer: () => T) { } someGenerics3 `${() => ''}`; someGenerics3 `${() => undefined}`; someGenerics3 `${() => 3}`; // 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type -function someGenerics4(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics4(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics4 `${4}${ () => null }`; someGenerics4 `${''}${ () => 3 }`; someGenerics4 `${ null }${ null }`; // 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type -function someGenerics5(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics5(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics5 `${ 4 } ${ () => null }`; someGenerics5 `${ '' }${ () => 3 }`; someGenerics5 `${null}${null}`; // Generic tag with multiple arguments of function types that each have parameters of the same generic type -function someGenerics6(strs: string[], a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } +function someGenerics6(strs: TemplateStringsArray, a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ (n: number) => n }${ (n: number) => n }${ (n: number) => n }`; // Generic tag with multiple arguments of function types that each have parameters of different generic type -function someGenerics7(strs: string[], a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } +function someGenerics7(strs: TemplateStringsArray, a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${(n: number) => n}${ (n: string) => n}${ (n: number) => n}`; // Generic tag with argument of generic function type -function someGenerics8(strs: string[], n: T): T { return n; } +function someGenerics8(strs: TemplateStringsArray, n: T): T { return n; } var x = someGenerics8 `${ someGenerics7 }`; x `${null}${null}${null}`; // Generic tag with multiple parameters of generic type passed arguments with no best common type -function someGenerics9(strs: string[], a: T, b: T, c: T): T { +function someGenerics9(strs: TemplateStringsArray, a: T, b: T, c: T): T { return null; } var a9a = someGenerics9 `${ '' }${ 0 }${ [] }`; diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInferenceES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInferenceES6.ts index bc9fd75cac9..a0ca1aa67d6 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInferenceES6.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInferenceES6.ts @@ -5,60 +5,60 @@ function noParams(n: T) { } noParams ``; // Generic tag with parameter which does not use type parameter -function noGenericParams(n: string[]) { } +function noGenericParams(n: TemplateStringsArray) { } noGenericParams ``; // Generic tag with multiple type parameters and only one used in parameter type annotation function someGenerics1a(n: T, m: number) { } someGenerics1a `${3}`; -function someGenerics1b(n: string[], m: U) { } +function someGenerics1b(n: TemplateStringsArray, m: U) { } someGenerics1b `${3}`; // Generic tag with argument of function type whose parameter is of type parameter type -function someGenerics2a(strs: string[], n: (x: T) => void) { } +function someGenerics2a(strs: TemplateStringsArray, n: (x: T) => void) { } someGenerics2a `${(n: string) => n}`; -function someGenerics2b(strs: string[], n: (x: T, y: U) => void) { } +function someGenerics2b(strs: TemplateStringsArray, n: (x: T, y: U) => void) { } someGenerics2b `${ (n: string, x: number) => n }`; // Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter -function someGenerics3(strs: string[], producer: () => T) { } +function someGenerics3(strs: TemplateStringsArray, producer: () => T) { } someGenerics3 `${() => ''}`; someGenerics3 `${() => undefined}`; someGenerics3 `${() => 3}`; // 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type -function someGenerics4(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics4(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics4 `${4}${ () => null }`; someGenerics4 `${''}${ () => 3 }`; someGenerics4 `${ null }${ null }`; // 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type -function someGenerics5(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics5(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics5 `${ 4 } ${ () => null }`; someGenerics5 `${ '' }${ () => 3 }`; someGenerics5 `${null}${null}`; // Generic tag with multiple arguments of function types that each have parameters of the same generic type -function someGenerics6(strs: string[], a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } +function someGenerics6(strs: TemplateStringsArray, a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ (n: number) => n }${ (n: number) => n }${ (n: number) => n }`; // Generic tag with multiple arguments of function types that each have parameters of different generic type -function someGenerics7(strs: string[], a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } +function someGenerics7(strs: TemplateStringsArray, a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${(n: number) => n}${ (n: string) => n}${ (n: number) => n}`; // Generic tag with argument of generic function type -function someGenerics8(strs: string[], n: T): T { return n; } +function someGenerics8(strs: TemplateStringsArray, n: T): T { return n; } var x = someGenerics8 `${ someGenerics7 }`; x `${null}${null}${null}`; // Generic tag with multiple parameters of generic type passed arguments with no best common type -function someGenerics9(strs: string[], a: T, b: T, c: T): T { +function someGenerics9(strs: TemplateStringsArray, a: T, b: T, c: T): T { return null; } var a9a = someGenerics9 `${ '' }${ 0 }${ [] }`; diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTags.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTags.ts index 0f5d203d60b..d8be6cbd7c2 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTags.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTags.ts @@ -1,5 +1,5 @@ interface I { - (stringParts: string[], ...rest: boolean[]): I; + (stringParts: TemplateStringsArray, ...rest: boolean[]): I; g: I; h: I; member: I; diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTagsES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTagsES6.ts index 36dc249f672..dec483c1678 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTagsES6.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTagsES6.ts @@ -1,6 +1,6 @@ // @target: ES6 interface I { - (stringParts: string[], ...rest: boolean[]): I; + (stringParts: TemplateStringsArray, ...rest: boolean[]): I; g: I; h: I; member: I; diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressions.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressions.ts index d96196ee26e..f86353e7dda 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressions.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressions.ts @@ -1,5 +1,5 @@ interface I { - (strs: string[], ...subs: number[]): I; + (strs: TemplateStringsArray, ...subs: number[]): I; member: { new (s: string): { new (n: number): { diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts index d0d6604cfde..914f7ca809f 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts @@ -1,6 +1,6 @@ // @target: ES6 interface I { - (strs: string[], ...subs: number[]): I; + (strs: TemplateStringsArray, ...subs: number[]): I; member: { new (s: string): { new (n: number): { diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts index 5b29beddd48..3743c1a7710 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts @@ -1,7 +1,7 @@ -function foo(strs: string[]): number; -function foo(strs: string[], x: number): string; -function foo(strs: string[], x: number, y: number): boolean; -function foo(strs: string[], x: number, y: string): {}; +function foo(strs: TemplateStringsArray): number; +function foo(strs: TemplateStringsArray, x: number): string; +function foo(strs: TemplateStringsArray, x: number, y: number): boolean; +function foo(strs: TemplateStringsArray, x: number, y: string): {}; function foo(...stuff: any[]): any { return undefined; } diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts index f821d84fbdd..d681c6b98b0 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts @@ -1,8 +1,8 @@ //@target: es6 -function foo(strs: string[]): number; -function foo(strs: string[], x: number): string; -function foo(strs: string[], x: number, y: number): boolean; -function foo(strs: string[], x: number, y: string): {}; +function foo(strs: TemplateStringsArray): number; +function foo(strs: TemplateStringsArray, x: number): string; +function foo(strs: TemplateStringsArray, x: number, y: number): boolean; +function foo(strs: TemplateStringsArray, x: number, y: string): {}; function foo(...stuff: any[]): any { return undefined; } diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2.ts index 0ed9b86128b..98799dd92df 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2.ts @@ -5,8 +5,8 @@ function foo1(...stuff: any[]): any { return undefined; } -var a = foo1 `${1}`; // string -var b = foo1([], 1); // number +var a = foo1 `${1}`; +var b = foo1([], 1); function foo2(strs: string[], x: number): number; function foo2(strs: TemplateStringsArray, x: number): string; @@ -14,5 +14,5 @@ function foo2(...stuff: any[]): any { return undefined; } -var c = foo2 `${1}`; // number -var d = foo2([], 1); // number \ No newline at end of file +var c = foo2 `${1}`; +var d = foo2([], 1); \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2_ES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2_ES6.ts index 6c67de325e2..769c56e47a1 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2_ES6.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution2_ES6.ts @@ -5,8 +5,8 @@ function foo1(...stuff: any[]): any { return undefined; } -var a = foo1 `${1}`; // string -var b = foo1([], 1); // number +var a = foo1 `${1}`; +var b = foo1([], 1); function foo2(strs: string[], x: number): number; function foo2(strs: TemplateStringsArray, x: number): string; @@ -14,5 +14,5 @@ function foo2(...stuff: any[]): any { return undefined; } -var c = foo2 `${1}`; // number -var d = foo2([], 1); // number \ No newline at end of file +var c = foo2 `${1}`; +var d = foo2([], 1); \ No newline at end of file diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTags.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTags.ts index 9b3852c2ddb..60f97104be3 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTags.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTags.ts @@ -1,5 +1,5 @@ interface I { - (stringParts: string[], ...rest: number[]): I; + (stringParts: TemplateStringsArray, ...rest: number[]): I; g: I; h: I; member: I; diff --git a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTagsES6.ts b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTagsES6.ts index 0dc10820a98..19fb6a874cc 100644 --- a/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTagsES6.ts +++ b/tests/cases/conformance/es6/templates/taggedTemplateStringsWithTypedTagsES6.ts @@ -1,6 +1,6 @@ // @target: ES6 interface I { - (stringParts: string[], ...rest: number[]): I; + (stringParts: TemplateStringsArray, ...rest: number[]): I; g: I; h: I; member: I; diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags3.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags3.ts index 3843ed34b16..b919afc7703 100644 --- a/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags3.ts +++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags3.ts @@ -1,8 +1,8 @@ /// -//// function f(templateStrings: string[], p1_o1: string): number; -//// function f(templateStrings: string[], p1_o2: number, p2_o2: number, p3_o2: number): string; -//// function f(templateStrings: string[], p1_o3: string, p2_o3: boolean, p3_o3: number): boolean; +//// function f(templateStrings: TemplateStringsArray, p1_o1: string): number; +//// function f(templateStrings: TemplateStringsArray, p1_o2: number, p2_o2: number, p3_o2: number): string; +//// function f(templateStrings: TemplateStringsArray, p1_o3: string, p2_o3: boolean, p3_o3: number): boolean; //// function f(...foo[]: any) { return ""; } //// //// f `${/*1*/ "s/*2*/tring" /*3*/ } ${ @@ -14,7 +14,7 @@ test.markers().forEach(m => { verify.signatureHelpArgumentCountIs(3); verify.currentSignatureParameterCountIs(4); - verify.currentSignatureHelpIs('f(templateStrings: string[], p1_o3: string, p2_o3: boolean, p3_o3: number): boolean'); + verify.currentSignatureHelpIs('f(templateStrings: TemplateStringsArray, p1_o3: string, p2_o3: boolean, p3_o3: number): boolean'); verify.currentParameterHelpArgumentNameIs("p1_o3"); verify.currentParameterSpanIs("p1_o3: string"); }); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags7.ts b/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags7.ts index 9a24aacf86b..5f706b8c0fa 100644 --- a/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags7.ts +++ b/tests/cases/fourslash/signatureHelpTaggedTemplatesWithOverloadedTags7.ts @@ -1,8 +1,8 @@ /// -//// function f(templateStrings: string[], p1_o1: string): number; -//// function f(templateStrings: string[], p1_o2: number, p2_o2: number, p3_o2: number): string; -//// function f(templateStrings: string[], p1_o3: string, p2_o3: boolean, p3_o3: number): boolean; +//// function f(templateStrings: TemplateStringsArray, p1_o1: string): number; +//// function f(templateStrings: TemplateStringsArray, p1_o2: number, p2_o2: number, p3_o2: number): string; +//// function f(templateStrings: TemplateStringsArray, p1_o3: string, p2_o3: boolean, p3_o3: number): boolean; //// function f(...foo[]: any) { return ""; } //// //// f `${ } ${/*1*/ fa/*2*/lse /*3*/} @@ -14,7 +14,7 @@ test.markers().forEach(m => { verify.signatureHelpArgumentCountIs(3); verify.currentSignatureParameterCountIs(4); - verify.currentSignatureHelpIs('f(templateStrings: string[], p1_o3: string, p2_o3: boolean, p3_o3: number): boolean'); + verify.currentSignatureHelpIs('f(templateStrings: TemplateStringsArray, p1_o3: string, p2_o3: boolean, p3_o3: number): boolean'); verify.currentParameterHelpArgumentNameIs("p2_o3"); verify.currentParameterSpanIs("p2_o3: boolean"); }); \ No newline at end of file From 0961352facdd87c8454cbee00474541e08255d2d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 8 Jul 2016 17:50:01 -0700 Subject: [PATCH 028/109] Accepted baselines. --- ...ateStringsTypeArgumentInference.errors.txt | 22 +++++++------- ...gedTemplateStringsTypeArgumentInference.js | 22 +++++++------- ...StringsTypeArgumentInferenceES6.errors.txt | 22 +++++++------- ...TemplateStringsTypeArgumentInferenceES6.js | 22 +++++++------- ...tringsWithIncompatibleTypedTags.errors.txt | 2 +- ...emplateStringsWithIncompatibleTypedTags.js | 2 +- ...ngsWithIncompatibleTypedTagsES6.errors.txt | 2 +- ...lateStringsWithIncompatibleTypedTagsES6.js | 2 +- ...StringsWithManyCallAndMemberExpressions.js | 2 +- ...gsWithManyCallAndMemberExpressions.symbols | 11 +++---- ...ingsWithManyCallAndMemberExpressions.types | 5 ++-- ...ingsWithManyCallAndMemberExpressionsES6.js | 2 +- ...ithManyCallAndMemberExpressionsES6.symbols | 11 +++---- ...sWithManyCallAndMemberExpressionsES6.types | 5 ++-- ...eStringsWithOverloadResolution1.errors.txt | 30 ++++++++++++++----- ...dTemplateStringsWithOverloadResolution1.js | 8 ++--- ...ingsWithOverloadResolution1_ES6.errors.txt | 30 ++++++++++++++----- ...plateStringsWithOverloadResolution1_ES6.js | 8 ++--- ...dTemplateStringsWithOverloadResolution2.js | 16 +++++----- ...lateStringsWithOverloadResolution2.symbols | 8 ++--- ...mplateStringsWithOverloadResolution2.types | 12 ++++---- ...plateStringsWithOverloadResolution2_ES6.js | 16 +++++----- ...StringsWithOverloadResolution2_ES6.symbols | 8 ++--- ...teStringsWithOverloadResolution2_ES6.types | 12 ++++---- .../taggedTemplateStringsWithTypedTags.js | 2 +- ...taggedTemplateStringsWithTypedTags.symbols | 7 +++-- .../taggedTemplateStringsWithTypedTags.types | 5 ++-- .../taggedTemplateStringsWithTypedTagsES6.js | 2 +- ...gedTemplateStringsWithTypedTagsES6.symbols | 7 +++-- ...aggedTemplateStringsWithTypedTagsES6.types | 5 ++-- 30 files changed, 172 insertions(+), 136 deletions(-) diff --git a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt index be5c21f1a0b..b345e971ab2 100644 --- a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt @@ -13,60 +13,60 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference noParams ``; // Generic tag with parameter which does not use type parameter - function noGenericParams(n: string[]) { } + function noGenericParams(n: TemplateStringsArray) { } noGenericParams ``; // Generic tag with multiple type parameters and only one used in parameter type annotation function someGenerics1a(n: T, m: number) { } someGenerics1a `${3}`; - function someGenerics1b(n: string[], m: U) { } + function someGenerics1b(n: TemplateStringsArray, m: U) { } someGenerics1b `${3}`; // Generic tag with argument of function type whose parameter is of type parameter type - function someGenerics2a(strs: string[], n: (x: T) => void) { } + function someGenerics2a(strs: TemplateStringsArray, n: (x: T) => void) { } someGenerics2a `${(n: string) => n}`; - function someGenerics2b(strs: string[], n: (x: T, y: U) => void) { } + function someGenerics2b(strs: TemplateStringsArray, n: (x: T, y: U) => void) { } someGenerics2b `${ (n: string, x: number) => n }`; // Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter - function someGenerics3(strs: string[], producer: () => T) { } + function someGenerics3(strs: TemplateStringsArray, producer: () => T) { } someGenerics3 `${() => ''}`; someGenerics3 `${() => undefined}`; someGenerics3 `${() => 3}`; // 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type - function someGenerics4(strs: string[], n: T, f: (x: U) => void) { } + function someGenerics4(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics4 `${4}${ () => null }`; someGenerics4 `${''}${ () => 3 }`; someGenerics4 `${ null }${ null }`; // 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type - function someGenerics5(strs: string[], n: T, f: (x: U) => void) { } + function someGenerics5(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics5 `${ 4 } ${ () => null }`; someGenerics5 `${ '' }${ () => 3 }`; someGenerics5 `${null}${null}`; // Generic tag with multiple arguments of function types that each have parameters of the same generic type - function someGenerics6(strs: string[], a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } + function someGenerics6(strs: TemplateStringsArray, a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ (n: number) => n }${ (n: number) => n }${ (n: number) => n }`; // Generic tag with multiple arguments of function types that each have parameters of different generic type - function someGenerics7(strs: string[], a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } + function someGenerics7(strs: TemplateStringsArray, a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${(n: number) => n}${ (n: string) => n}${ (n: number) => n}`; // Generic tag with argument of generic function type - function someGenerics8(strs: string[], n: T): T { return n; } + function someGenerics8(strs: TemplateStringsArray, n: T): T { return n; } var x = someGenerics8 `${ someGenerics7 }`; x `${null}${null}${null}`; // Generic tag with multiple parameters of generic type passed arguments with no best common type - function someGenerics9(strs: string[], a: T, b: T, c: T): T { + function someGenerics9(strs: TemplateStringsArray, a: T, b: T, c: T): T { return null; } var a9a = someGenerics9 `${ '' }${ 0 }${ [] }`; diff --git a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.js b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.js index 1b6e3ab92c8..69dcd284183 100644 --- a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.js +++ b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.js @@ -6,60 +6,60 @@ function noParams(n: T) { } noParams ``; // Generic tag with parameter which does not use type parameter -function noGenericParams(n: string[]) { } +function noGenericParams(n: TemplateStringsArray) { } noGenericParams ``; // Generic tag with multiple type parameters and only one used in parameter type annotation function someGenerics1a(n: T, m: number) { } someGenerics1a `${3}`; -function someGenerics1b(n: string[], m: U) { } +function someGenerics1b(n: TemplateStringsArray, m: U) { } someGenerics1b `${3}`; // Generic tag with argument of function type whose parameter is of type parameter type -function someGenerics2a(strs: string[], n: (x: T) => void) { } +function someGenerics2a(strs: TemplateStringsArray, n: (x: T) => void) { } someGenerics2a `${(n: string) => n}`; -function someGenerics2b(strs: string[], n: (x: T, y: U) => void) { } +function someGenerics2b(strs: TemplateStringsArray, n: (x: T, y: U) => void) { } someGenerics2b `${ (n: string, x: number) => n }`; // Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter -function someGenerics3(strs: string[], producer: () => T) { } +function someGenerics3(strs: TemplateStringsArray, producer: () => T) { } someGenerics3 `${() => ''}`; someGenerics3 `${() => undefined}`; someGenerics3 `${() => 3}`; // 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type -function someGenerics4(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics4(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics4 `${4}${ () => null }`; someGenerics4 `${''}${ () => 3 }`; someGenerics4 `${ null }${ null }`; // 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type -function someGenerics5(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics5(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics5 `${ 4 } ${ () => null }`; someGenerics5 `${ '' }${ () => 3 }`; someGenerics5 `${null}${null}`; // Generic tag with multiple arguments of function types that each have parameters of the same generic type -function someGenerics6(strs: string[], a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } +function someGenerics6(strs: TemplateStringsArray, a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ (n: number) => n }${ (n: number) => n }${ (n: number) => n }`; // Generic tag with multiple arguments of function types that each have parameters of different generic type -function someGenerics7(strs: string[], a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } +function someGenerics7(strs: TemplateStringsArray, a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${(n: number) => n}${ (n: string) => n}${ (n: number) => n}`; // Generic tag with argument of generic function type -function someGenerics8(strs: string[], n: T): T { return n; } +function someGenerics8(strs: TemplateStringsArray, n: T): T { return n; } var x = someGenerics8 `${ someGenerics7 }`; x `${null}${null}${null}`; // Generic tag with multiple parameters of generic type passed arguments with no best common type -function someGenerics9(strs: string[], a: T, b: T, c: T): T { +function someGenerics9(strs: TemplateStringsArray, a: T, b: T, c: T): T { return null; } var a9a = someGenerics9 `${ '' }${ 0 }${ [] }`; diff --git a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt index 63d04a42b3b..619e5081a3b 100644 --- a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt @@ -12,60 +12,60 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference noParams ``; // Generic tag with parameter which does not use type parameter - function noGenericParams(n: string[]) { } + function noGenericParams(n: TemplateStringsArray) { } noGenericParams ``; // Generic tag with multiple type parameters and only one used in parameter type annotation function someGenerics1a(n: T, m: number) { } someGenerics1a `${3}`; - function someGenerics1b(n: string[], m: U) { } + function someGenerics1b(n: TemplateStringsArray, m: U) { } someGenerics1b `${3}`; // Generic tag with argument of function type whose parameter is of type parameter type - function someGenerics2a(strs: string[], n: (x: T) => void) { } + function someGenerics2a(strs: TemplateStringsArray, n: (x: T) => void) { } someGenerics2a `${(n: string) => n}`; - function someGenerics2b(strs: string[], n: (x: T, y: U) => void) { } + function someGenerics2b(strs: TemplateStringsArray, n: (x: T, y: U) => void) { } someGenerics2b `${ (n: string, x: number) => n }`; // Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter - function someGenerics3(strs: string[], producer: () => T) { } + function someGenerics3(strs: TemplateStringsArray, producer: () => T) { } someGenerics3 `${() => ''}`; someGenerics3 `${() => undefined}`; someGenerics3 `${() => 3}`; // 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type - function someGenerics4(strs: string[], n: T, f: (x: U) => void) { } + function someGenerics4(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics4 `${4}${ () => null }`; someGenerics4 `${''}${ () => 3 }`; someGenerics4 `${ null }${ null }`; // 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type - function someGenerics5(strs: string[], n: T, f: (x: U) => void) { } + function someGenerics5(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics5 `${ 4 } ${ () => null }`; someGenerics5 `${ '' }${ () => 3 }`; someGenerics5 `${null}${null}`; // Generic tag with multiple arguments of function types that each have parameters of the same generic type - function someGenerics6(strs: string[], a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } + function someGenerics6(strs: TemplateStringsArray, a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ (n: number) => n }${ (n: number) => n }${ (n: number) => n }`; // Generic tag with multiple arguments of function types that each have parameters of different generic type - function someGenerics7(strs: string[], a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } + function someGenerics7(strs: TemplateStringsArray, a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${(n: number) => n}${ (n: string) => n}${ (n: number) => n}`; // Generic tag with argument of generic function type - function someGenerics8(strs: string[], n: T): T { return n; } + function someGenerics8(strs: TemplateStringsArray, n: T): T { return n; } var x = someGenerics8 `${ someGenerics7 }`; x `${null}${null}${null}`; // Generic tag with multiple parameters of generic type passed arguments with no best common type - function someGenerics9(strs: string[], a: T, b: T, c: T): T { + function someGenerics9(strs: TemplateStringsArray, a: T, b: T, c: T): T { return null; } var a9a = someGenerics9 `${ '' }${ 0 }${ [] }`; diff --git a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.js b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.js index 2f57882b4b7..3097e40c9ad 100644 --- a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.js +++ b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.js @@ -5,60 +5,60 @@ function noParams(n: T) { } noParams ``; // Generic tag with parameter which does not use type parameter -function noGenericParams(n: string[]) { } +function noGenericParams(n: TemplateStringsArray) { } noGenericParams ``; // Generic tag with multiple type parameters and only one used in parameter type annotation function someGenerics1a(n: T, m: number) { } someGenerics1a `${3}`; -function someGenerics1b(n: string[], m: U) { } +function someGenerics1b(n: TemplateStringsArray, m: U) { } someGenerics1b `${3}`; // Generic tag with argument of function type whose parameter is of type parameter type -function someGenerics2a(strs: string[], n: (x: T) => void) { } +function someGenerics2a(strs: TemplateStringsArray, n: (x: T) => void) { } someGenerics2a `${(n: string) => n}`; -function someGenerics2b(strs: string[], n: (x: T, y: U) => void) { } +function someGenerics2b(strs: TemplateStringsArray, n: (x: T, y: U) => void) { } someGenerics2b `${ (n: string, x: number) => n }`; // Generic tag with argument of function type whose parameter is not of type parameter type but body/return type uses type parameter -function someGenerics3(strs: string[], producer: () => T) { } +function someGenerics3(strs: TemplateStringsArray, producer: () => T) { } someGenerics3 `${() => ''}`; someGenerics3 `${() => undefined}`; someGenerics3 `${() => 3}`; // 2 parameter generic tag with argument 1 of type parameter type and argument 2 of function type whose parameter is of type parameter type -function someGenerics4(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics4(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics4 `${4}${ () => null }`; someGenerics4 `${''}${ () => 3 }`; someGenerics4 `${ null }${ null }`; // 2 parameter generic tag with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type -function someGenerics5(strs: string[], n: T, f: (x: U) => void) { } +function someGenerics5(strs: TemplateStringsArray, n: T, f: (x: U) => void) { } someGenerics5 `${ 4 } ${ () => null }`; someGenerics5 `${ '' }${ () => 3 }`; someGenerics5 `${null}${null}`; // Generic tag with multiple arguments of function types that each have parameters of the same generic type -function someGenerics6(strs: string[], a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } +function someGenerics6(strs: TemplateStringsArray, a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ n => n }${ n => n}${ n => n}`; someGenerics6 `${ (n: number) => n }${ (n: number) => n }${ (n: number) => n }`; // Generic tag with multiple arguments of function types that each have parameters of different generic type -function someGenerics7(strs: string[], a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } +function someGenerics7(strs: TemplateStringsArray, a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) { } someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${ n => n }${ n => n }${ n => n }`; someGenerics7 `${(n: number) => n}${ (n: string) => n}${ (n: number) => n}`; // Generic tag with argument of generic function type -function someGenerics8(strs: string[], n: T): T { return n; } +function someGenerics8(strs: TemplateStringsArray, n: T): T { return n; } var x = someGenerics8 `${ someGenerics7 }`; x `${null}${null}${null}`; // Generic tag with multiple parameters of generic type passed arguments with no best common type -function someGenerics9(strs: string[], a: T, b: T, c: T): T { +function someGenerics9(strs: TemplateStringsArray, a: T, b: T, c: T): T { return null; } var a9a = someGenerics9 `${ '' }${ 0 }${ [] }`; diff --git a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.errors.txt b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.errors.txt index 166769fbbf5..44b30fb535f 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.errors.txt @@ -8,7 +8,7 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTyped ==== tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTags.ts (6 errors) ==== interface I { - (stringParts: string[], ...rest: boolean[]): I; + (stringParts: TemplateStringsArray, ...rest: boolean[]): I; g: I; h: I; member: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.js b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.js index 9d113793228..511928e1342 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.js +++ b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTags.js @@ -1,6 +1,6 @@ //// [taggedTemplateStringsWithIncompatibleTypedTags.ts] interface I { - (stringParts: string[], ...rest: boolean[]): I; + (stringParts: TemplateStringsArray, ...rest: boolean[]): I; g: I; h: I; member: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.errors.txt b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.errors.txt index 89b48b0193c..c2825c19e63 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.errors.txt @@ -8,7 +8,7 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTyped ==== tests/cases/conformance/es6/templates/taggedTemplateStringsWithIncompatibleTypedTagsES6.ts (6 errors) ==== interface I { - (stringParts: string[], ...rest: boolean[]): I; + (stringParts: TemplateStringsArray, ...rest: boolean[]): I; g: I; h: I; member: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.js b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.js index 8b636356068..99fa7c3d550 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.js +++ b/tests/baselines/reference/taggedTemplateStringsWithIncompatibleTypedTagsES6.js @@ -1,6 +1,6 @@ //// [taggedTemplateStringsWithIncompatibleTypedTagsES6.ts] interface I { - (stringParts: string[], ...rest: boolean[]): I; + (stringParts: TemplateStringsArray, ...rest: boolean[]): I; g: I; h: I; member: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.js b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.js index 1814816283b..a896a811ffb 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.js +++ b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.js @@ -1,6 +1,6 @@ //// [taggedTemplateStringsWithManyCallAndMemberExpressions.ts] interface I { - (strs: string[], ...subs: number[]): I; + (strs: TemplateStringsArray, ...subs: number[]): I; member: { new (s: string): { new (n: number): { diff --git a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.symbols b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.symbols index 226729907de..c8883fda4fe 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.symbols +++ b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.symbols @@ -2,13 +2,14 @@ interface I { >I : Symbol(I, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 0, 0)) - (strs: string[], ...subs: number[]): I; + (strs: TemplateStringsArray, ...subs: number[]): I; >strs : Symbol(strs, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 5)) ->subs : Symbol(subs, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 20)) +>TemplateStringsArray : Symbol(TemplateStringsArray, Decl(lib.d.ts, --, --)) +>subs : Symbol(subs, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 32)) >I : Symbol(I, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 0, 0)) member: { ->member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 43)) +>member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 55)) new (s: string): { >s : Symbol(s, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 3, 13)) @@ -27,8 +28,8 @@ var f: I; var x = new new new f `abc${ 0 }def`.member("hello")(42) === true; >x : Symbol(x, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 12, 3)) ->f `abc${ 0 }def`.member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 43)) +>f `abc${ 0 }def`.member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 55)) >f : Symbol(f, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 10, 3)) ->member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 43)) +>member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressions.ts, 1, 55)) diff --git a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.types b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.types index 83a0f2cf9f4..553cda2b2b9 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.types +++ b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressions.types @@ -2,8 +2,9 @@ interface I { >I : I - (strs: string[], ...subs: number[]): I; ->strs : string[] + (strs: TemplateStringsArray, ...subs: number[]): I; +>strs : TemplateStringsArray +>TemplateStringsArray : TemplateStringsArray >subs : number[] >I : I diff --git a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.js b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.js index b985860f065..f1acbaa1546 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.js +++ b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.js @@ -1,6 +1,6 @@ //// [taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts] interface I { - (strs: string[], ...subs: number[]): I; + (strs: TemplateStringsArray, ...subs: number[]): I; member: { new (s: string): { new (n: number): { diff --git a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.symbols b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.symbols index 6535e998808..0d163daa640 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.symbols +++ b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.symbols @@ -2,13 +2,14 @@ interface I { >I : Symbol(I, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 0, 0)) - (strs: string[], ...subs: number[]): I; + (strs: TemplateStringsArray, ...subs: number[]): I; >strs : Symbol(strs, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 5)) ->subs : Symbol(subs, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 20)) +>TemplateStringsArray : Symbol(TemplateStringsArray, Decl(lib.es5.d.ts, --, --)) +>subs : Symbol(subs, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 32)) >I : Symbol(I, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 0, 0)) member: { ->member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 43)) +>member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 55)) new (s: string): { >s : Symbol(s, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 3, 13)) @@ -27,8 +28,8 @@ var f: I; var x = new new new f `abc${ 0 }def`.member("hello")(42) === true; >x : Symbol(x, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 12, 3)) ->f `abc${ 0 }def`.member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 43)) +>f `abc${ 0 }def`.member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 55)) >f : Symbol(f, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 10, 3)) ->member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 43)) +>member : Symbol(I.member, Decl(taggedTemplateStringsWithManyCallAndMemberExpressionsES6.ts, 1, 55)) diff --git a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.types b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.types index c240b7ced11..f9d7c605f7f 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.types +++ b/tests/baselines/reference/taggedTemplateStringsWithManyCallAndMemberExpressionsES6.types @@ -2,8 +2,9 @@ interface I { >I : I - (strs: string[], ...subs: number[]): I; ->strs : string[] + (strs: TemplateStringsArray, ...subs: number[]): I; +>strs : TemplateStringsArray +>TemplateStringsArray : TemplateStringsArray >subs : number[] >I : I diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.errors.txt b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.errors.txt index 9e450cbb368..426eef8ce7f 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.errors.txt @@ -1,25 +1,39 @@ -tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(12,20): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(9,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. + Property 'raw' is missing in type 'undefined[]'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(10,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(11,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(12,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(13,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(14,9): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(19,20): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'. tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts(21,9): error TS2346: Supplied parameters do not match any signature of call target. -==== tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts (4 errors) ==== - function foo(strs: string[]): number; - function foo(strs: string[], x: number): string; - function foo(strs: string[], x: number, y: number): boolean; - function foo(strs: string[], x: number, y: string): {}; +==== tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1.ts (8 errors) ==== + function foo(strs: TemplateStringsArray): number; + function foo(strs: TemplateStringsArray, x: number): string; + function foo(strs: TemplateStringsArray, x: number, y: number): boolean; + function foo(strs: TemplateStringsArray, x: number, y: string): {}; function foo(...stuff: any[]): any { return undefined; } var a = foo([]); // number + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +!!! error TS2345: Property 'raw' is missing in type 'undefined[]'. var b = foo([], 1); // string + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var c = foo([], 1, 2); // boolean + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var d = foo([], 1, true); // boolean (with error) - ~~~~ -!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'. + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var e = foo([], 1, "2"); // {} + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var f = foo([], 1, 2, 3); // any (with error) ~~~~~~~~~~~~~~~~ !!! error TS2346: Supplied parameters do not match any signature of call target. diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.js b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.js index 431447df22e..4245b0cb0f4 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.js +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1.js @@ -1,8 +1,8 @@ //// [taggedTemplateStringsWithOverloadResolution1.ts] -function foo(strs: string[]): number; -function foo(strs: string[], x: number): string; -function foo(strs: string[], x: number, y: number): boolean; -function foo(strs: string[], x: number, y: string): {}; +function foo(strs: TemplateStringsArray): number; +function foo(strs: TemplateStringsArray, x: number): string; +function foo(strs: TemplateStringsArray, x: number, y: number): boolean; +function foo(strs: TemplateStringsArray, x: number, y: string): {}; function foo(...stuff: any[]): any { return undefined; } diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.errors.txt b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.errors.txt index 53361f2052d..73adc0c0302 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.errors.txt @@ -1,25 +1,39 @@ -tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(12,20): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(9,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. + Property 'raw' is missing in type 'undefined[]'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(10,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(11,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(12,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(13,13): error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(14,9): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(19,20): error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'. tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts(21,9): error TS2346: Supplied parameters do not match any signature of call target. -==== tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts (4 errors) ==== - function foo(strs: string[]): number; - function foo(strs: string[], x: number): string; - function foo(strs: string[], x: number, y: number): boolean; - function foo(strs: string[], x: number, y: string): {}; +==== tests/cases/conformance/es6/templates/taggedTemplateStringsWithOverloadResolution1_ES6.ts (8 errors) ==== + function foo(strs: TemplateStringsArray): number; + function foo(strs: TemplateStringsArray, x: number): string; + function foo(strs: TemplateStringsArray, x: number, y: number): boolean; + function foo(strs: TemplateStringsArray, x: number, y: string): {}; function foo(...stuff: any[]): any { return undefined; } var a = foo([]); // number + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. +!!! error TS2345: Property 'raw' is missing in type 'undefined[]'. var b = foo([], 1); // string + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var c = foo([], 1, 2); // boolean + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var d = foo([], 1, true); // boolean (with error) - ~~~~ -!!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type 'string'. + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var e = foo([], 1, "2"); // {} + ~~ +!!! error TS2345: Argument of type 'undefined[]' is not assignable to parameter of type 'TemplateStringsArray'. var f = foo([], 1, 2, 3); // any (with error) ~~~~~~~~~~~~~~~~ !!! error TS2346: Supplied parameters do not match any signature of call target. diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.js b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.js index bd121933b32..b62671d33ac 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.js +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution1_ES6.js @@ -1,8 +1,8 @@ //// [taggedTemplateStringsWithOverloadResolution1_ES6.ts] -function foo(strs: string[]): number; -function foo(strs: string[], x: number): string; -function foo(strs: string[], x: number, y: number): boolean; -function foo(strs: string[], x: number, y: string): {}; +function foo(strs: TemplateStringsArray): number; +function foo(strs: TemplateStringsArray, x: number): string; +function foo(strs: TemplateStringsArray, x: number, y: number): boolean; +function foo(strs: TemplateStringsArray, x: number, y: string): {}; function foo(...stuff: any[]): any { return undefined; } diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.js b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.js index f12008f9581..c16bfa5454f 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.js +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.js @@ -6,8 +6,8 @@ function foo1(...stuff: any[]): any { return undefined; } -var a = foo1 `${1}`; // string -var b = foo1([], 1); // number +var a = foo1 `${1}`; +var b = foo1([], 1); function foo2(strs: string[], x: number): number; function foo2(strs: TemplateStringsArray, x: number): string; @@ -15,8 +15,8 @@ function foo2(...stuff: any[]): any { return undefined; } -var c = foo2 `${1}`; // number -var d = foo2([], 1); // number +var c = foo2 `${1}`; +var d = foo2([], 1); //// [taggedTemplateStringsWithOverloadResolution2.js] function foo1() { @@ -26,8 +26,8 @@ function foo1() { } return undefined; } -var a = (_a = ["", ""], _a.raw = ["", ""], foo1(_a, 1)); // string -var b = foo1([], 1); // number +var a = (_a = ["", ""], _a.raw = ["", ""], foo1(_a, 1)); +var b = foo1([], 1); function foo2() { var stuff = []; for (var _i = 0; _i < arguments.length; _i++) { @@ -35,6 +35,6 @@ function foo2() { } return undefined; } -var c = (_b = ["", ""], _b.raw = ["", ""], foo2(_b, 1)); // number -var d = foo2([], 1); // number +var c = (_b = ["", ""], _b.raw = ["", ""], foo2(_b, 1)); +var d = foo2([], 1); var _a, _b; diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.symbols b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.symbols index 52b8f3ab6f0..241c43c4d78 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.symbols +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.symbols @@ -19,11 +19,11 @@ function foo1(...stuff: any[]): any { >undefined : Symbol(undefined) } -var a = foo1 `${1}`; // string +var a = foo1 `${1}`; >a : Symbol(a, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 7, 3)) >foo1 : Symbol(foo1, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 0, 0), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 1, 61), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 2, 49)) -var b = foo1([], 1); // number +var b = foo1([], 1); >b : Symbol(b, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 8, 3)) >foo1 : Symbol(foo1, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 0, 0), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 1, 61), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 2, 49)) @@ -46,11 +46,11 @@ function foo2(...stuff: any[]): any { >undefined : Symbol(undefined) } -var c = foo2 `${1}`; // number +var c = foo2 `${1}`; >c : Symbol(c, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 16, 3)) >foo2 : Symbol(foo2, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 8, 20), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 10, 49), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 11, 61)) -var d = foo2([], 1); // number +var d = foo2([], 1); >d : Symbol(d, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 17, 3)) >foo2 : Symbol(foo2, Decl(taggedTemplateStringsWithOverloadResolution2.ts, 8, 20), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 10, 49), Decl(taggedTemplateStringsWithOverloadResolution2.ts, 11, 61)) diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.types b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.types index 77353e9b3ce..3c35974ddec 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.types +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2.types @@ -19,14 +19,14 @@ function foo1(...stuff: any[]): any { >undefined : undefined } -var a = foo1 `${1}`; // string +var a = foo1 `${1}`; >a : string >foo1 `${1}` : string >foo1 : { (strs: TemplateStringsArray, x: number): string; (strs: string[], x: number): number; } >`${1}` : string >1 : number -var b = foo1([], 1); // number +var b = foo1([], 1); >b : number >foo1([], 1) : number >foo1 : { (strs: TemplateStringsArray, x: number): string; (strs: string[], x: number): number; } @@ -52,14 +52,14 @@ function foo2(...stuff: any[]): any { >undefined : undefined } -var c = foo2 `${1}`; // number ->c : number ->foo2 `${1}` : number +var c = foo2 `${1}`; +>c : string +>foo2 `${1}` : string >foo2 : { (strs: string[], x: number): number; (strs: TemplateStringsArray, x: number): string; } >`${1}` : string >1 : number -var d = foo2([], 1); // number +var d = foo2([], 1); >d : number >foo2([], 1) : number >foo2 : { (strs: string[], x: number): number; (strs: TemplateStringsArray, x: number): string; } diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.js b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.js index f208a63354d..502fa4552a3 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.js +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.js @@ -5,8 +5,8 @@ function foo1(...stuff: any[]): any { return undefined; } -var a = foo1 `${1}`; // string -var b = foo1([], 1); // number +var a = foo1 `${1}`; +var b = foo1([], 1); function foo2(strs: string[], x: number): number; function foo2(strs: TemplateStringsArray, x: number): string; @@ -14,17 +14,17 @@ function foo2(...stuff: any[]): any { return undefined; } -var c = foo2 `${1}`; // number -var d = foo2([], 1); // number +var c = foo2 `${1}`; +var d = foo2([], 1); //// [taggedTemplateStringsWithOverloadResolution2_ES6.js] function foo1(...stuff) { return undefined; } -var a = foo1 `${1}`; // string -var b = foo1([], 1); // number +var a = foo1 `${1}`; +var b = foo1([], 1); function foo2(...stuff) { return undefined; } -var c = foo2 `${1}`; // number -var d = foo2([], 1); // number +var c = foo2 `${1}`; +var d = foo2([], 1); diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.symbols b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.symbols index cadfa135202..9cc79f2596f 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.symbols +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.symbols @@ -18,11 +18,11 @@ function foo1(...stuff: any[]): any { >undefined : Symbol(undefined) } -var a = foo1 `${1}`; // string +var a = foo1 `${1}`; >a : Symbol(a, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 6, 3)) >foo1 : Symbol(foo1, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 0, 0), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 0, 61), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 1, 49)) -var b = foo1([], 1); // number +var b = foo1([], 1); >b : Symbol(b, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 7, 3)) >foo1 : Symbol(foo1, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 0, 0), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 0, 61), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 1, 49)) @@ -45,11 +45,11 @@ function foo2(...stuff: any[]): any { >undefined : Symbol(undefined) } -var c = foo2 `${1}`; // number +var c = foo2 `${1}`; >c : Symbol(c, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 15, 3)) >foo2 : Symbol(foo2, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 7, 20), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 9, 49), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 10, 61)) -var d = foo2([], 1); // number +var d = foo2([], 1); >d : Symbol(d, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 16, 3)) >foo2 : Symbol(foo2, Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 7, 20), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 9, 49), Decl(taggedTemplateStringsWithOverloadResolution2_ES6.ts, 10, 61)) diff --git a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.types b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.types index 306bf38cac4..7faeec19c4a 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.types +++ b/tests/baselines/reference/taggedTemplateStringsWithOverloadResolution2_ES6.types @@ -18,14 +18,14 @@ function foo1(...stuff: any[]): any { >undefined : undefined } -var a = foo1 `${1}`; // string +var a = foo1 `${1}`; >a : string >foo1 `${1}` : string >foo1 : { (strs: TemplateStringsArray, x: number): string; (strs: string[], x: number): number; } >`${1}` : string >1 : number -var b = foo1([], 1); // number +var b = foo1([], 1); >b : number >foo1([], 1) : number >foo1 : { (strs: TemplateStringsArray, x: number): string; (strs: string[], x: number): number; } @@ -51,14 +51,14 @@ function foo2(...stuff: any[]): any { >undefined : undefined } -var c = foo2 `${1}`; // number ->c : number ->foo2 `${1}` : number +var c = foo2 `${1}`; +>c : string +>foo2 `${1}` : string >foo2 : { (strs: string[], x: number): number; (strs: TemplateStringsArray, x: number): string; } >`${1}` : string >1 : number -var d = foo2([], 1); // number +var d = foo2([], 1); >d : number >foo2([], 1) : number >foo2 : { (strs: string[], x: number): number; (strs: TemplateStringsArray, x: number): string; } diff --git a/tests/baselines/reference/taggedTemplateStringsWithTypedTags.js b/tests/baselines/reference/taggedTemplateStringsWithTypedTags.js index fcc2cda86dc..d011c3048a7 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithTypedTags.js +++ b/tests/baselines/reference/taggedTemplateStringsWithTypedTags.js @@ -1,6 +1,6 @@ //// [taggedTemplateStringsWithTypedTags.ts] interface I { - (stringParts: string[], ...rest: number[]): I; + (stringParts: TemplateStringsArray, ...rest: number[]): I; g: I; h: I; member: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithTypedTags.symbols b/tests/baselines/reference/taggedTemplateStringsWithTypedTags.symbols index d3f85d8375a..cd28177f587 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithTypedTags.symbols +++ b/tests/baselines/reference/taggedTemplateStringsWithTypedTags.symbols @@ -2,13 +2,14 @@ interface I { >I : Symbol(I, Decl(taggedTemplateStringsWithTypedTags.ts, 0, 0)) - (stringParts: string[], ...rest: number[]): I; + (stringParts: TemplateStringsArray, ...rest: number[]): I; >stringParts : Symbol(stringParts, Decl(taggedTemplateStringsWithTypedTags.ts, 1, 5)) ->rest : Symbol(rest, Decl(taggedTemplateStringsWithTypedTags.ts, 1, 27)) +>TemplateStringsArray : Symbol(TemplateStringsArray, Decl(lib.d.ts, --, --)) +>rest : Symbol(rest, Decl(taggedTemplateStringsWithTypedTags.ts, 1, 39)) >I : Symbol(I, Decl(taggedTemplateStringsWithTypedTags.ts, 0, 0)) g: I; ->g : Symbol(I.g, Decl(taggedTemplateStringsWithTypedTags.ts, 1, 50)) +>g : Symbol(I.g, Decl(taggedTemplateStringsWithTypedTags.ts, 1, 62)) >I : Symbol(I, Decl(taggedTemplateStringsWithTypedTags.ts, 0, 0)) h: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithTypedTags.types b/tests/baselines/reference/taggedTemplateStringsWithTypedTags.types index 2c992a2d233..c7c521154c7 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithTypedTags.types +++ b/tests/baselines/reference/taggedTemplateStringsWithTypedTags.types @@ -2,8 +2,9 @@ interface I { >I : I - (stringParts: string[], ...rest: number[]): I; ->stringParts : string[] + (stringParts: TemplateStringsArray, ...rest: number[]): I; +>stringParts : TemplateStringsArray +>TemplateStringsArray : TemplateStringsArray >rest : number[] >I : I diff --git a/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.js b/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.js index 9eefc46ec30..35a616f05f4 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.js +++ b/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.js @@ -1,6 +1,6 @@ //// [taggedTemplateStringsWithTypedTagsES6.ts] interface I { - (stringParts: string[], ...rest: number[]): I; + (stringParts: TemplateStringsArray, ...rest: number[]): I; g: I; h: I; member: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.symbols b/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.symbols index f0b088bd6f6..f7f9c62d492 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.symbols +++ b/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.symbols @@ -2,13 +2,14 @@ interface I { >I : Symbol(I, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 0, 0)) - (stringParts: string[], ...rest: number[]): I; + (stringParts: TemplateStringsArray, ...rest: number[]): I; >stringParts : Symbol(stringParts, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 1, 5)) ->rest : Symbol(rest, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 1, 27)) +>TemplateStringsArray : Symbol(TemplateStringsArray, Decl(lib.es5.d.ts, --, --)) +>rest : Symbol(rest, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 1, 39)) >I : Symbol(I, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 0, 0)) g: I; ->g : Symbol(I.g, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 1, 50)) +>g : Symbol(I.g, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 1, 62)) >I : Symbol(I, Decl(taggedTemplateStringsWithTypedTagsES6.ts, 0, 0)) h: I; diff --git a/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.types b/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.types index 4bda0f3fbb0..bf45144c329 100644 --- a/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.types +++ b/tests/baselines/reference/taggedTemplateStringsWithTypedTagsES6.types @@ -2,8 +2,9 @@ interface I { >I : I - (stringParts: string[], ...rest: number[]): I; ->stringParts : string[] + (stringParts: TemplateStringsArray, ...rest: number[]): I; +>stringParts : TemplateStringsArray +>TemplateStringsArray : TemplateStringsArray >rest : number[] >I : I From 37eac5fb7f9d2484cfef3ae344d91aa622b9aa86 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sat, 9 Jul 2016 23:35:58 -0700 Subject: [PATCH 029/109] Update .mailmap --- .gitignore | 1 + .mailmap | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index bbb2e62c8bc..fc901fbb7a4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ tests/baselines/reference/projectOutput/* tests/baselines/local/projectOutput/* tests/services/baselines/prototyping/local/* tests/services/browser/typescriptServices.js +scripts/authors.js scripts/configureNightly.js scripts/processDiagnosticMessages.d.ts scripts/processDiagnosticMessages.js diff --git a/.mailmap b/.mailmap index 03c21f2cf91..e66f669b8ee 100644 --- a/.mailmap +++ b/.mailmap @@ -125,6 +125,7 @@ Stan Thomas Stanislav Sysoev Steve Lucco steveluc Tarik # Tarik Ozket +Tetsuharu OHZEKI # Tetsuharu Ohzeki Tien Nguyen tien unknown #Tien Hoanhtien Tim Perry Tim Viiding-Spader From ca874bdd17c0c5e5e8b70c0db7bb847e2711b8f3 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 16:11:42 -0700 Subject: [PATCH 030/109] Fix module tracking --- src/compiler/program.ts | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 2e4492efa7b..5d636847045 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1095,13 +1095,13 @@ namespace ts { // As all these operations happen - and are nested - within the createProgram call, they close over the below variables. // The current resolution depth is tracked by incrementing/decrementing as the depth first search progresses. const maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - let currentNodeModulesJsDepth = 0; + let currentNodeModulesDepth = 0; // If a module has some of its imports skipped due to being at the depth limit under node_modules, then track // this, as it may be imported at a shallower depth later, and then it will need its skipped imports processed. const modulesWithElidedImports: Map = {}; - // Track source files that are JavaScript files found by searching under node_modules, as these shouldn't be compiled. + // Track source files that are source files found by searching under node_modules, as these shouldn't be compiled. const sourceFilesFoundSearchingNodeModules: Map = {}; const start = new Date().getTime(); @@ -1918,9 +1918,20 @@ namespace ts { reportFileNamesDifferOnlyInCasingError(fileName, file.fileName, refFile, refPos, refEnd); } + // If the file was previously found via a node_modules search, but is now being processed as a root file, + // then everything it sucks in may also be marked incorrectly, and needs to be checked again. + if (file && lookUp(sourceFilesFoundSearchingNodeModules, file.path) && currentNodeModulesDepth == 0) { + if (!options.noResolve) { + processReferencedFiles(file, getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file); + } + + modulesWithElidedImports[file.path] = false; + processImportedModules(file, getDirectoryPath(fileName)); + } // See if we need to reprocess the imports due to prior skipped imports - if (file && lookUp(modulesWithElidedImports, file.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + else if (file && lookUp(modulesWithElidedImports, file.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file.path] = false; processImportedModules(file, getDirectoryPath(fileName)); } @@ -2075,13 +2086,17 @@ namespace ts { const isJsFileFromNodeModules = isFromNodeModulesSearch && hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; - } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; + currentNodeModulesDepth++; } - const elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + if (currentNodeModulesDepth > 0) { + // If its already present with false, its a root file also. Don't override this. + if (!hasProperty(sourceFilesFoundSearchingNodeModules, resolvedPath)) { + sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + } + } + + const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; const shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { @@ -2096,8 +2111,8 @@ namespace ts { file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } From db54bda17b86e3a81f2d45e57e4fca732d66725b Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 16:38:21 -0700 Subject: [PATCH 031/109] Updated test with relative import --- .../amd/maxDepthExceeded/root.js | 1 + .../amd/nodeModulesMaxDepthExceeded.errors.txt | 13 ++++++++++++- .../amd/nodeModulesMaxDepthExceeded.json | 1 + .../node/maxDepthExceeded/root.js | 1 + .../node/nodeModulesMaxDepthExceeded.errors.txt | 13 ++++++++++++- .../node/nodeModulesMaxDepthExceeded.json | 1 + .../maxDepthExceeded/node_modules/m1/index.js | 3 +++ .../maxDepthExceeded/node_modules/m1/relative.js | 1 + .../NodeModulesSearch/maxDepthExceeded/root.ts | 2 ++ 9 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js index 73cef6fc02c..5a3916f07d1 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js @@ -2,5 +2,6 @@ define(["require", "exports", "m1"], function (require, exports, m1) { "use strict"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number + m1.rel = 42; // Error: Should be boolean m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". }); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt index f03b958275b..52c3611ceda 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt @@ -1,4 +1,5 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to type 'boolean'. ==== entry.js (0 errors) ==== @@ -10,8 +11,12 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to "person": m3.person }; +==== relative.js (0 errors) ==== + exports.relativeProp = true; + ==== index.js (0 errors) ==== var m2 = require('m2'); + var rel = require('./relative'); /** * @param {string} p1 The first param @@ -22,11 +27,17 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to exports.f2 = m2; -==== maxDepthExceeded/root.ts (1 errors) ==== + exports.rel = rel.relativeProp; + +==== maxDepthExceeded/root.ts (2 errors) ==== import * as m1 from "m1"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number ~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. + m1.rel = 42; // Error: Should be boolean + ~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'boolean'. + m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json index 80a0a0fb93d..a4ac37bb2a3 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json @@ -8,6 +8,7 @@ "resolvedInputFiles": [ "lib.d.ts", "maxDepthExceeded/node_modules/m2/entry.js", + "maxDepthExceeded/node_modules/m1/relative.js", "maxDepthExceeded/node_modules/m1/index.js", "maxDepthExceeded/root.ts" ], diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js index 28f91fb9b91..fb4faf236b2 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js @@ -2,4 +2,5 @@ var m1 = require("m1"); m1.f1("test"); m1.f2.a = "10"; // Error: Should be number +m1.rel = 42; // Error: Should be boolean m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt index f03b958275b..52c3611ceda 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt @@ -1,4 +1,5 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to type 'boolean'. ==== entry.js (0 errors) ==== @@ -10,8 +11,12 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to "person": m3.person }; +==== relative.js (0 errors) ==== + exports.relativeProp = true; + ==== index.js (0 errors) ==== var m2 = require('m2'); + var rel = require('./relative'); /** * @param {string} p1 The first param @@ -22,11 +27,17 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to exports.f2 = m2; -==== maxDepthExceeded/root.ts (1 errors) ==== + exports.rel = rel.relativeProp; + +==== maxDepthExceeded/root.ts (2 errors) ==== import * as m1 from "m1"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number ~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. + m1.rel = 42; // Error: Should be boolean + ~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'boolean'. + m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json index 80a0a0fb93d..a4ac37bb2a3 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json @@ -8,6 +8,7 @@ "resolvedInputFiles": [ "lib.d.ts", "maxDepthExceeded/node_modules/m2/entry.js", + "maxDepthExceeded/node_modules/m1/relative.js", "maxDepthExceeded/node_modules/m1/index.js", "maxDepthExceeded/root.ts" ], diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js index 7ff454a2402..0433199ffd5 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js @@ -1,4 +1,5 @@ var m2 = require('m2'); +var rel = require('./relative'); /** * @param {string} p1 The first param @@ -8,3 +9,5 @@ exports.f1 = function(p1) { }; exports.f2 = m2; + +exports.rel = rel.relativeProp; diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js new file mode 100644 index 00000000000..8b051584b85 --- /dev/null +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js @@ -0,0 +1 @@ +exports.relativeProp = true; diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts index 62604408648..f847ea6048a 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts @@ -1,4 +1,6 @@ import * as m1 from "m1"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number +m1.rel = 42; // Error: Should be boolean + m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". From 2ab1143f1cb694f43cd2622fc3fddbbe304a805b Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 20:54:07 -0700 Subject: [PATCH 032/109] Fixed the node tracking and a harness bug --- src/compiler/program.ts | 2 ++ src/harness/projectsRunner.ts | 28 +++++++++++++------ .../moduleAugmentationInDependency2.js | 2 ++ tests/baselines/reference/nodeResolution6.js | 2 -- tests/baselines/reference/nodeResolution8.js | 2 -- .../pathMappingBasedModuleResolution5_node.js | 3 ++ .../amd/maxDepthExceeded/{ => built}/root.js | 0 .../nodeModulesMaxDepthExceeded.errors.txt | 2 +- .../amd/nodeModulesMaxDepthExceeded.json | 4 ++- .../node/maxDepthExceeded/{ => built}/root.js | 0 .../nodeModulesMaxDepthExceeded.errors.txt | 2 +- .../node/nodeModulesMaxDepthExceeded.json | 4 ++- .../maxDepthExceeded/tsconfig.json | 8 ++++-- 13 files changed, 40 insertions(+), 19 deletions(-) rename tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/{ => built}/root.js (100%) rename tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/{ => built}/root.js (100%) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 5d636847045..57bb3d6ae42 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1921,6 +1921,7 @@ namespace ts { // If the file was previously found via a node_modules search, but is now being processed as a root file, // then everything it sucks in may also be marked incorrectly, and needs to be checked again. if (file && lookUp(sourceFilesFoundSearchingNodeModules, file.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file.path] = false; if (!options.noResolve) { processReferencedFiles(file, getDirectoryPath(fileName), isDefaultLib); processTypeReferenceDirectives(file); @@ -1953,6 +1954,7 @@ namespace ts { filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index fb92ff4dfab..4baf423a7ba 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -479,17 +479,27 @@ class ProjectRunner extends RunnerBase { it("Baseline of emitted result (" + moduleNameToString(moduleKind) + "): " + testCaseFileName, () => { if (testCase.baselineCheck) { + let errs = []; ts.forEach(compilerResult.outputFiles, outputFile => { - - Harness.Baseline.runBaseline("Baseline of emitted result (" + moduleNameToString(compilerResult.moduleKind) + "): " + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + outputFile.fileName, () => { - try { - return Harness.IO.readFile(getProjectOutputFolder(outputFile.fileName, compilerResult.moduleKind)); - } - catch (e) { - return undefined; - } - }); + // There may be multiple files with different baselines. Run all and report at the end, else + // it stops copying the remaining emitted files from 'local/projectOutput' to 'local/project'. + try { + Harness.Baseline.runBaseline("Baseline of emitted result (" + moduleNameToString(compilerResult.moduleKind) + "): " + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + outputFile.fileName, () => { + try { + return Harness.IO.readFile(getProjectOutputFolder(outputFile.fileName, compilerResult.moduleKind)); + } + catch (e) { + return undefined; + } + }); + } + catch (e) { + errs.push(e); + } }); + if (errs.length) { + throw Error(errs.join("\n ")); + } } }); diff --git a/tests/baselines/reference/moduleAugmentationInDependency2.js b/tests/baselines/reference/moduleAugmentationInDependency2.js index 0a5d83695a3..381f1e72d8f 100644 --- a/tests/baselines/reference/moduleAugmentationInDependency2.js +++ b/tests/baselines/reference/moduleAugmentationInDependency2.js @@ -8,6 +8,8 @@ export {}; //// [app.ts] import "A" +//// [index.js] +"use strict"; //// [app.js] "use strict"; require("A"); diff --git a/tests/baselines/reference/nodeResolution6.js b/tests/baselines/reference/nodeResolution6.js index 58a9b907250..196e8ae57cf 100644 --- a/tests/baselines/reference/nodeResolution6.js +++ b/tests/baselines/reference/nodeResolution6.js @@ -13,7 +13,5 @@ export declare var y; import y = require("a"); -//// [ref.js] -var x = 1; //// [b.js] "use strict"; diff --git a/tests/baselines/reference/nodeResolution8.js b/tests/baselines/reference/nodeResolution8.js index 36b53eec553..1d90399ff70 100644 --- a/tests/baselines/reference/nodeResolution8.js +++ b/tests/baselines/reference/nodeResolution8.js @@ -12,7 +12,5 @@ export declare var y; //// [b.ts] import y = require("a"); -//// [ref.js] -var x = 1; //// [b.js] "use strict"; diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js b/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js index e4440299cc7..1958800f918 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js +++ b/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js @@ -31,6 +31,9 @@ exports.x = 1; //// [file2.js] "use strict"; exports.y = 1; +//// [file4.js] +"use strict"; +exports.z1 = 1; //// [file1.js] "use strict"; var file1_1 = require("folder2/file1"); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/root.js similarity index 100% rename from tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js rename to tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/root.js diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt index 52c3611ceda..7099c05d577 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt @@ -14,7 +14,7 @@ maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to ==== relative.js (0 errors) ==== exports.relativeProp = true; -==== index.js (0 errors) ==== +==== maxDepthExceeded/node_modules/m1/index.js (0 errors) ==== var m2 = require('m2'); var rel = require('./relative'); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json index a4ac37bb2a3..86e856dc7b8 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json @@ -13,6 +13,8 @@ "maxDepthExceeded/root.ts" ], "emittedFiles": [ - "maxDepthExceeded/root.js" + "maxDepthExceeded/built/node_modules/m1/relative.js", + "maxDepthExceeded/built/node_modules/m1/index.js", + "maxDepthExceeded/built/root.js" ] } \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/root.js similarity index 100% rename from tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js rename to tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/root.js diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt index 52c3611ceda..7099c05d577 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt @@ -14,7 +14,7 @@ maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to ==== relative.js (0 errors) ==== exports.relativeProp = true; -==== index.js (0 errors) ==== +==== maxDepthExceeded/node_modules/m1/index.js (0 errors) ==== var m2 = require('m2'); var rel = require('./relative'); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json index a4ac37bb2a3..86e856dc7b8 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json @@ -13,6 +13,8 @@ "maxDepthExceeded/root.ts" ], "emittedFiles": [ - "maxDepthExceeded/root.js" + "maxDepthExceeded/built/node_modules/m1/relative.js", + "maxDepthExceeded/built/node_modules/m1/index.js", + "maxDepthExceeded/built/root.js" ] } \ No newline at end of file diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json index 0aafe67d688..52633bb5a98 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json @@ -1,5 +1,9 @@ { "compilerOptions": { - "allowJs": true - } + "allowJs": true, + "maxNodeModuleJsDepth": 1, // Note: Module m1 is already included as a root file + "outDir": "built" + }, + "include": ["**/*"], + "exclude": ["node_modules/m2/**/*"] } From a7467a1d2b5795a1bae38885ee5127cce37a9682 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 21:40:38 -0700 Subject: [PATCH 033/109] fixed lint error --- src/harness/projectsRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index 4baf423a7ba..083f7a7bf39 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -479,7 +479,7 @@ class ProjectRunner extends RunnerBase { it("Baseline of emitted result (" + moduleNameToString(moduleKind) + "): " + testCaseFileName, () => { if (testCase.baselineCheck) { - let errs = []; + const errs = []; ts.forEach(compilerResult.outputFiles, outputFile => { // There may be multiple files with different baselines. Run all and report at the end, else // it stops copying the remaining emitted files from 'local/projectOutput' to 'local/project'. From b75053cae3733d0c402a36fab0d7fd2366ed9dc8 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 21:49:13 -0700 Subject: [PATCH 034/109] Fixed implicit any --- src/harness/projectsRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index 083f7a7bf39..cf3c78d8859 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -479,7 +479,7 @@ class ProjectRunner extends RunnerBase { it("Baseline of emitted result (" + moduleNameToString(moduleKind) + "): " + testCaseFileName, () => { if (testCase.baselineCheck) { - const errs = []; + const errs: Error[] = []; ts.forEach(compilerResult.outputFiles, outputFile => { // There may be multiple files with different baselines. Run all and report at the end, else // it stops copying the remaining emitted files from 'local/projectOutput' to 'local/project'. From 97025d026da460bd7dd76b2f175813fde2791f34 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 22:25:31 -0700 Subject: [PATCH 035/109] Added missing test files --- .gitignore | 1 + .../maxDepthExceeded/built/node_modules/m1/index.js | 10 ++++++++++ .../maxDepthExceeded/built/node_modules/m1/relative.js | 1 + .../maxDepthExceeded/built/node_modules/m1/index.js | 10 ++++++++++ .../maxDepthExceeded/built/node_modules/m1/relative.js | 1 + 5 files changed, 23 insertions(+) create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js diff --git a/.gitignore b/.gitignore index fc901fbb7a4..0badfe0cf61 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ internal/ !**/.vscode/tasks.json !tests/cases/projects/projectOption/**/node_modules !tests/cases/projects/NodeModulesSearch/**/* +!tests/baselines/reference/project/nodeModules*/**/* diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js new file mode 100644 index 00000000000..46d38afba6f --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js @@ -0,0 +1,10 @@ +var m2 = require('m2'); +var rel = require('./relative'); +/** + * @param {string} p1 The first param + */ +exports.f1 = function (p1) { + return 42; +}; +exports.f2 = m2; +exports.rel = rel.relativeProp; diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js new file mode 100644 index 00000000000..13432076541 --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js @@ -0,0 +1 @@ +exports.relativeProp = true; diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js new file mode 100644 index 00000000000..46d38afba6f --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js @@ -0,0 +1,10 @@ +var m2 = require('m2'); +var rel = require('./relative'); +/** + * @param {string} p1 The first param + */ +exports.f1 = function (p1) { + return 42; +}; +exports.f2 = m2; +exports.rel = rel.relativeProp; diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js new file mode 100644 index 00000000000..13432076541 --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js @@ -0,0 +1 @@ +exports.relativeProp = true; From 21bf801c6cd98063ebcbd7439a49c1152717188f Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 23:07:45 -0700 Subject: [PATCH 036/109] Removed duplicate logic --- src/compiler/program.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 57bb3d6ae42..670d30b7d33 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -2091,13 +2091,6 @@ namespace ts { currentNodeModulesDepth++; } - if (currentNodeModulesDepth > 0) { - // If its already present with false, its a root file also. Don't override this. - if (!hasProperty(sourceFilesFoundSearchingNodeModules, resolvedPath)) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; - } - } - const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; const shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; From b360ad5f3c8db53f397943999200cc39fcb993dd Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 16:11:42 -0700 Subject: [PATCH 037/109] Fix module tracking (cherry picked from commit ca874bdd17c0c5e5e8b70c0db7bb847e2711b8f3) --- src/compiler/program.ts | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 2e4492efa7b..5d636847045 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1095,13 +1095,13 @@ namespace ts { // As all these operations happen - and are nested - within the createProgram call, they close over the below variables. // The current resolution depth is tracked by incrementing/decrementing as the depth first search progresses. const maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - let currentNodeModulesJsDepth = 0; + let currentNodeModulesDepth = 0; // If a module has some of its imports skipped due to being at the depth limit under node_modules, then track // this, as it may be imported at a shallower depth later, and then it will need its skipped imports processed. const modulesWithElidedImports: Map = {}; - // Track source files that are JavaScript files found by searching under node_modules, as these shouldn't be compiled. + // Track source files that are source files found by searching under node_modules, as these shouldn't be compiled. const sourceFilesFoundSearchingNodeModules: Map = {}; const start = new Date().getTime(); @@ -1918,9 +1918,20 @@ namespace ts { reportFileNamesDifferOnlyInCasingError(fileName, file.fileName, refFile, refPos, refEnd); } + // If the file was previously found via a node_modules search, but is now being processed as a root file, + // then everything it sucks in may also be marked incorrectly, and needs to be checked again. + if (file && lookUp(sourceFilesFoundSearchingNodeModules, file.path) && currentNodeModulesDepth == 0) { + if (!options.noResolve) { + processReferencedFiles(file, getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file); + } + + modulesWithElidedImports[file.path] = false; + processImportedModules(file, getDirectoryPath(fileName)); + } // See if we need to reprocess the imports due to prior skipped imports - if (file && lookUp(modulesWithElidedImports, file.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + else if (file && lookUp(modulesWithElidedImports, file.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file.path] = false; processImportedModules(file, getDirectoryPath(fileName)); } @@ -2075,13 +2086,17 @@ namespace ts { const isJsFileFromNodeModules = isFromNodeModulesSearch && hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; - } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; + currentNodeModulesDepth++; } - const elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + if (currentNodeModulesDepth > 0) { + // If its already present with false, its a root file also. Don't override this. + if (!hasProperty(sourceFilesFoundSearchingNodeModules, resolvedPath)) { + sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + } + } + + const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; const shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { @@ -2096,8 +2111,8 @@ namespace ts { file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } From ab45a56eda597aea72d0f3ec92b6d812e2cf714f Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 16:38:21 -0700 Subject: [PATCH 038/109] Updated test with relative import (cherry picked from commit db54bda17b86e3a81f2d45e57e4fca732d66725b) --- .../amd/maxDepthExceeded/root.js | 1 + .../amd/nodeModulesMaxDepthExceeded.errors.txt | 13 ++++++++++++- .../amd/nodeModulesMaxDepthExceeded.json | 1 + .../node/maxDepthExceeded/root.js | 1 + .../node/nodeModulesMaxDepthExceeded.errors.txt | 13 ++++++++++++- .../node/nodeModulesMaxDepthExceeded.json | 1 + .../maxDepthExceeded/node_modules/m1/index.js | 3 +++ .../maxDepthExceeded/node_modules/m1/relative.js | 1 + .../NodeModulesSearch/maxDepthExceeded/root.ts | 2 ++ 9 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js index 73cef6fc02c..5a3916f07d1 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js @@ -2,5 +2,6 @@ define(["require", "exports", "m1"], function (require, exports, m1) { "use strict"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number + m1.rel = 42; // Error: Should be boolean m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". }); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt index f03b958275b..52c3611ceda 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt @@ -1,4 +1,5 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to type 'boolean'. ==== entry.js (0 errors) ==== @@ -10,8 +11,12 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to "person": m3.person }; +==== relative.js (0 errors) ==== + exports.relativeProp = true; + ==== index.js (0 errors) ==== var m2 = require('m2'); + var rel = require('./relative'); /** * @param {string} p1 The first param @@ -22,11 +27,17 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to exports.f2 = m2; -==== maxDepthExceeded/root.ts (1 errors) ==== + exports.rel = rel.relativeProp; + +==== maxDepthExceeded/root.ts (2 errors) ==== import * as m1 from "m1"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number ~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. + m1.rel = 42; // Error: Should be boolean + ~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'boolean'. + m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json index 80a0a0fb93d..a4ac37bb2a3 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json @@ -8,6 +8,7 @@ "resolvedInputFiles": [ "lib.d.ts", "maxDepthExceeded/node_modules/m2/entry.js", + "maxDepthExceeded/node_modules/m1/relative.js", "maxDepthExceeded/node_modules/m1/index.js", "maxDepthExceeded/root.ts" ], diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js index 28f91fb9b91..fb4faf236b2 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js @@ -2,4 +2,5 @@ var m1 = require("m1"); m1.f1("test"); m1.f2.a = "10"; // Error: Should be number +m1.rel = 42; // Error: Should be boolean m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt index f03b958275b..52c3611ceda 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt @@ -1,4 +1,5 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to type 'boolean'. ==== entry.js (0 errors) ==== @@ -10,8 +11,12 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to "person": m3.person }; +==== relative.js (0 errors) ==== + exports.relativeProp = true; + ==== index.js (0 errors) ==== var m2 = require('m2'); + var rel = require('./relative'); /** * @param {string} p1 The first param @@ -22,11 +27,17 @@ maxDepthExceeded/root.ts(3,1): error TS2322: Type 'string' is not assignable to exports.f2 = m2; -==== maxDepthExceeded/root.ts (1 errors) ==== + exports.rel = rel.relativeProp; + +==== maxDepthExceeded/root.ts (2 errors) ==== import * as m1 from "m1"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number ~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. + m1.rel = 42; // Error: Should be boolean + ~~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'boolean'. + m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json index 80a0a0fb93d..a4ac37bb2a3 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json @@ -8,6 +8,7 @@ "resolvedInputFiles": [ "lib.d.ts", "maxDepthExceeded/node_modules/m2/entry.js", + "maxDepthExceeded/node_modules/m1/relative.js", "maxDepthExceeded/node_modules/m1/index.js", "maxDepthExceeded/root.ts" ], diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js index 7ff454a2402..0433199ffd5 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/index.js @@ -1,4 +1,5 @@ var m2 = require('m2'); +var rel = require('./relative'); /** * @param {string} p1 The first param @@ -8,3 +9,5 @@ exports.f1 = function(p1) { }; exports.f2 = m2; + +exports.rel = rel.relativeProp; diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js new file mode 100644 index 00000000000..8b051584b85 --- /dev/null +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/node_modules/m1/relative.js @@ -0,0 +1 @@ +exports.relativeProp = true; diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts index 62604408648..f847ea6048a 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/root.ts @@ -1,4 +1,6 @@ import * as m1 from "m1"; m1.f1("test"); m1.f2.a = "10"; // Error: Should be number +m1.rel = 42; // Error: Should be boolean + m1.f2.person.age = "10"; // OK if stopped at 2 modules: person will be "any". From 5eba2e09fb8ab58be895e93c16daf2571ef14f65 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 20:54:07 -0700 Subject: [PATCH 039/109] Fixed the node tracking and a harness bug (cherry picked from commit 2ab1143f1cb694f43cd2622fc3fddbbe304a805b) --- src/compiler/program.ts | 2 ++ src/harness/projectsRunner.ts | 28 +++++++++++++------ .../moduleAugmentationInDependency2.js | 2 ++ tests/baselines/reference/nodeResolution6.js | 2 -- tests/baselines/reference/nodeResolution8.js | 2 -- .../pathMappingBasedModuleResolution5_node.js | 3 ++ .../amd/maxDepthExceeded/{ => built}/root.js | 0 .../nodeModulesMaxDepthExceeded.errors.txt | 2 +- .../amd/nodeModulesMaxDepthExceeded.json | 4 ++- .../node/maxDepthExceeded/{ => built}/root.js | 0 .../nodeModulesMaxDepthExceeded.errors.txt | 2 +- .../node/nodeModulesMaxDepthExceeded.json | 4 ++- .../maxDepthExceeded/tsconfig.json | 8 ++++-- 13 files changed, 40 insertions(+), 19 deletions(-) rename tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/{ => built}/root.js (100%) rename tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/{ => built}/root.js (100%) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 5d636847045..57bb3d6ae42 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1921,6 +1921,7 @@ namespace ts { // If the file was previously found via a node_modules search, but is now being processed as a root file, // then everything it sucks in may also be marked incorrectly, and needs to be checked again. if (file && lookUp(sourceFilesFoundSearchingNodeModules, file.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file.path] = false; if (!options.noResolve) { processReferencedFiles(file, getDirectoryPath(fileName), isDefaultLib); processTypeReferenceDirectives(file); @@ -1953,6 +1954,7 @@ namespace ts { filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index fb92ff4dfab..4baf423a7ba 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -479,17 +479,27 @@ class ProjectRunner extends RunnerBase { it("Baseline of emitted result (" + moduleNameToString(moduleKind) + "): " + testCaseFileName, () => { if (testCase.baselineCheck) { + let errs = []; ts.forEach(compilerResult.outputFiles, outputFile => { - - Harness.Baseline.runBaseline("Baseline of emitted result (" + moduleNameToString(compilerResult.moduleKind) + "): " + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + outputFile.fileName, () => { - try { - return Harness.IO.readFile(getProjectOutputFolder(outputFile.fileName, compilerResult.moduleKind)); - } - catch (e) { - return undefined; - } - }); + // There may be multiple files with different baselines. Run all and report at the end, else + // it stops copying the remaining emitted files from 'local/projectOutput' to 'local/project'. + try { + Harness.Baseline.runBaseline("Baseline of emitted result (" + moduleNameToString(compilerResult.moduleKind) + "): " + testCaseFileName, getBaselineFolder(compilerResult.moduleKind) + outputFile.fileName, () => { + try { + return Harness.IO.readFile(getProjectOutputFolder(outputFile.fileName, compilerResult.moduleKind)); + } + catch (e) { + return undefined; + } + }); + } + catch (e) { + errs.push(e); + } }); + if (errs.length) { + throw Error(errs.join("\n ")); + } } }); diff --git a/tests/baselines/reference/moduleAugmentationInDependency2.js b/tests/baselines/reference/moduleAugmentationInDependency2.js index 0a5d83695a3..381f1e72d8f 100644 --- a/tests/baselines/reference/moduleAugmentationInDependency2.js +++ b/tests/baselines/reference/moduleAugmentationInDependency2.js @@ -8,6 +8,8 @@ export {}; //// [app.ts] import "A" +//// [index.js] +"use strict"; //// [app.js] "use strict"; require("A"); diff --git a/tests/baselines/reference/nodeResolution6.js b/tests/baselines/reference/nodeResolution6.js index 58a9b907250..196e8ae57cf 100644 --- a/tests/baselines/reference/nodeResolution6.js +++ b/tests/baselines/reference/nodeResolution6.js @@ -13,7 +13,5 @@ export declare var y; import y = require("a"); -//// [ref.js] -var x = 1; //// [b.js] "use strict"; diff --git a/tests/baselines/reference/nodeResolution8.js b/tests/baselines/reference/nodeResolution8.js index 36b53eec553..1d90399ff70 100644 --- a/tests/baselines/reference/nodeResolution8.js +++ b/tests/baselines/reference/nodeResolution8.js @@ -12,7 +12,5 @@ export declare var y; //// [b.ts] import y = require("a"); -//// [ref.js] -var x = 1; //// [b.js] "use strict"; diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js b/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js index e4440299cc7..1958800f918 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js +++ b/tests/baselines/reference/pathMappingBasedModuleResolution5_node.js @@ -31,6 +31,9 @@ exports.x = 1; //// [file2.js] "use strict"; exports.y = 1; +//// [file4.js] +"use strict"; +exports.z1 = 1; //// [file1.js] "use strict"; var file1_1 = require("folder2/file1"); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/root.js similarity index 100% rename from tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/root.js rename to tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/root.js diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt index 52c3611ceda..7099c05d577 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.errors.txt @@ -14,7 +14,7 @@ maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to ==== relative.js (0 errors) ==== exports.relativeProp = true; -==== index.js (0 errors) ==== +==== maxDepthExceeded/node_modules/m1/index.js (0 errors) ==== var m2 = require('m2'); var rel = require('./relative'); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json index a4ac37bb2a3..86e856dc7b8 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/nodeModulesMaxDepthExceeded.json @@ -13,6 +13,8 @@ "maxDepthExceeded/root.ts" ], "emittedFiles": [ - "maxDepthExceeded/root.js" + "maxDepthExceeded/built/node_modules/m1/relative.js", + "maxDepthExceeded/built/node_modules/m1/index.js", + "maxDepthExceeded/built/root.js" ] } \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/root.js similarity index 100% rename from tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/root.js rename to tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/root.js diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt index 52c3611ceda..7099c05d577 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.errors.txt @@ -14,7 +14,7 @@ maxDepthExceeded/root.ts(4,1): error TS2322: Type 'number' is not assignable to ==== relative.js (0 errors) ==== exports.relativeProp = true; -==== index.js (0 errors) ==== +==== maxDepthExceeded/node_modules/m1/index.js (0 errors) ==== var m2 = require('m2'); var rel = require('./relative'); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json index a4ac37bb2a3..86e856dc7b8 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/nodeModulesMaxDepthExceeded.json @@ -13,6 +13,8 @@ "maxDepthExceeded/root.ts" ], "emittedFiles": [ - "maxDepthExceeded/root.js" + "maxDepthExceeded/built/node_modules/m1/relative.js", + "maxDepthExceeded/built/node_modules/m1/index.js", + "maxDepthExceeded/built/root.js" ] } \ No newline at end of file diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json index 0aafe67d688..52633bb5a98 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json +++ b/tests/cases/projects/NodeModulesSearch/maxDepthExceeded/tsconfig.json @@ -1,5 +1,9 @@ { "compilerOptions": { - "allowJs": true - } + "allowJs": true, + "maxNodeModuleJsDepth": 1, // Note: Module m1 is already included as a root file + "outDir": "built" + }, + "include": ["**/*"], + "exclude": ["node_modules/m2/**/*"] } From f8a92611eba079036501086aaa075a68c36320fc Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 21:40:38 -0700 Subject: [PATCH 040/109] fixed lint error (cherry picked from commit a7467a1d2b5795a1bae38885ee5127cce37a9682) --- src/harness/projectsRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index 4baf423a7ba..083f7a7bf39 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -479,7 +479,7 @@ class ProjectRunner extends RunnerBase { it("Baseline of emitted result (" + moduleNameToString(moduleKind) + "): " + testCaseFileName, () => { if (testCase.baselineCheck) { - let errs = []; + const errs = []; ts.forEach(compilerResult.outputFiles, outputFile => { // There may be multiple files with different baselines. Run all and report at the end, else // it stops copying the remaining emitted files from 'local/projectOutput' to 'local/project'. From f5769875e5f53a9379b2b882ff6f540dda927f40 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 21:49:13 -0700 Subject: [PATCH 041/109] Fixed implicit any (cherry picked from commit b75053cae3733d0c402a36fab0d7fd2366ed9dc8) --- src/harness/projectsRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index 083f7a7bf39..cf3c78d8859 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -479,7 +479,7 @@ class ProjectRunner extends RunnerBase { it("Baseline of emitted result (" + moduleNameToString(moduleKind) + "): " + testCaseFileName, () => { if (testCase.baselineCheck) { - const errs = []; + const errs: Error[] = []; ts.forEach(compilerResult.outputFiles, outputFile => { // There may be multiple files with different baselines. Run all and report at the end, else // it stops copying the remaining emitted files from 'local/projectOutput' to 'local/project'. From dd86be4e085095d6f6100f56f2693488f63f644c Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 22:25:31 -0700 Subject: [PATCH 042/109] Added missing test files (cherry picked from commit 97025d026da460bd7dd76b2f175813fde2791f34) --- .gitignore | 1 + .../maxDepthExceeded/built/node_modules/m1/index.js | 10 ++++++++++ .../maxDepthExceeded/built/node_modules/m1/relative.js | 1 + .../maxDepthExceeded/built/node_modules/m1/index.js | 10 ++++++++++ .../maxDepthExceeded/built/node_modules/m1/relative.js | 1 + 5 files changed, 23 insertions(+) create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js create mode 100644 tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js diff --git a/.gitignore b/.gitignore index bbb2e62c8bc..3d78e3b6411 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,4 @@ internal/ !**/.vscode/tasks.json !tests/cases/projects/projectOption/**/node_modules !tests/cases/projects/NodeModulesSearch/**/* +!tests/baselines/reference/project/nodeModules*/**/* diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js new file mode 100644 index 00000000000..46d38afba6f --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/index.js @@ -0,0 +1,10 @@ +var m2 = require('m2'); +var rel = require('./relative'); +/** + * @param {string} p1 The first param + */ +exports.f1 = function (p1) { + return 42; +}; +exports.f2 = m2; +exports.rel = rel.relativeProp; diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js new file mode 100644 index 00000000000..13432076541 --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/amd/maxDepthExceeded/built/node_modules/m1/relative.js @@ -0,0 +1 @@ +exports.relativeProp = true; diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js new file mode 100644 index 00000000000..46d38afba6f --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/index.js @@ -0,0 +1,10 @@ +var m2 = require('m2'); +var rel = require('./relative'); +/** + * @param {string} p1 The first param + */ +exports.f1 = function (p1) { + return 42; +}; +exports.f2 = m2; +exports.rel = rel.relativeProp; diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js new file mode 100644 index 00000000000..13432076541 --- /dev/null +++ b/tests/baselines/reference/project/nodeModulesMaxDepthExceeded/node/maxDepthExceeded/built/node_modules/m1/relative.js @@ -0,0 +1 @@ +exports.relativeProp = true; From 5f6eb5bb126e5a5cdbfe023604a4d769a8964b94 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Sun, 10 Jul 2016 23:07:45 -0700 Subject: [PATCH 043/109] Removed duplicate logic (cherry picked from commit 21bf801c6cd98063ebcbd7439a49c1152717188f) --- src/compiler/program.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 57bb3d6ae42..670d30b7d33 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -2091,13 +2091,6 @@ namespace ts { currentNodeModulesDepth++; } - if (currentNodeModulesDepth > 0) { - // If its already present with false, its a root file also. Don't override this. - if (!hasProperty(sourceFilesFoundSearchingNodeModules, resolvedPath)) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; - } - } - const elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; const shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; From cf15e825ee012cce09cff590510df7e0227b30d1 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 09:30:58 -0700 Subject: [PATCH 044/109] Fix `this` in harness and improve gulpfile defaults --- Gulpfile.ts | 3 +++ src/harness/harness.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Gulpfile.ts b/Gulpfile.ts index 6f63fc23587..739fc0d3720 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -306,6 +306,9 @@ function needsUpdate(source: string | string[], dest: string | string[]): boolea function getCompilerSettings(base: tsc.Settings, useBuiltCompiler?: boolean): tsc.Settings { const copy: tsc.Settings = {}; + // TODO: Add --noImplicitThis --types --pretty when gulp-typescript adds support for them + copy.noImplicitAny = true; + copy.noEmitOnError = true; for (const key in base) { copy[key] = base[key]; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 1977d95492c..985d00bcf63 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -127,7 +127,7 @@ namespace Utils { export function memoize(f: T): T { const cache: { [idx: string]: any } = {}; - return (function() { + return (function(this: any) { const key = Array.prototype.join.call(arguments); const cachedResult = cache[key]; if (cachedResult) { From 6d21cf6434fcb7009433928878911d5fac0d56eb Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 10:32:35 -0700 Subject: [PATCH 045/109] Add more default options to gulpfile --- Gulpfile.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Gulpfile.ts b/Gulpfile.ts index 739fc0d3720..f0757c89bba 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -11,8 +11,11 @@ import newer = require("gulp-newer"); import tsc = require("gulp-typescript"); declare module "gulp-typescript" { interface Settings { - stripInternal?: boolean; + pretty?: boolean; newLine?: string; + noImplicitThis?: boolean; + stripInternal?: boolean; + types?: string[]; } interface CompileStream extends NodeJS.ReadWriteStream {} // Either gulp or gulp-typescript has some odd typings which don't reflect reality, making this required } @@ -306,9 +309,11 @@ function needsUpdate(source: string | string[], dest: string | string[]): boolea function getCompilerSettings(base: tsc.Settings, useBuiltCompiler?: boolean): tsc.Settings { const copy: tsc.Settings = {}; - // TODO: Add --noImplicitThis --types --pretty when gulp-typescript adds support for them - copy.noImplicitAny = true; copy.noEmitOnError = true; + copy.noImplicitAny = true; + copy.noImplicitThis = true; + copy.pretty = true; + copy.types = []; for (const key in base) { copy[key] = base[key]; } From a3d9a855460eee7e902023a01c2271f6f2432743 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 11:00:06 -0700 Subject: [PATCH 046/109] Add --pretty to tsconfigs --- src/compiler/tsconfig.json | 1 + src/server/tsconfig.json | 1 + src/services/tsconfig.json | 1 + 3 files changed, 3 insertions(+) diff --git a/src/compiler/tsconfig.json b/src/compiler/tsconfig.json index 5418ca1abe7..827a9b81c4d 100644 --- a/src/compiler/tsconfig.json +++ b/src/compiler/tsconfig.json @@ -4,6 +4,7 @@ "noImplicitThis": true, "removeComments": true, "preserveConstEnums": true, + "pretty": true, "outFile": "../../built/local/tsc.js", "sourceMap": true, "declaration": true, diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json index 57c54b47ad8..df7dcdfe8ad 100644 --- a/src/server/tsconfig.json +++ b/src/server/tsconfig.json @@ -4,6 +4,7 @@ "noImplicitThis": true, "removeComments": true, "preserveConstEnums": true, + "pretty": true, "out": "../../built/local/tsserver.js", "sourceMap": true, "stripInternal": true diff --git a/src/services/tsconfig.json b/src/services/tsconfig.json index 26903bf28ec..86efd254937 100644 --- a/src/services/tsconfig.json +++ b/src/services/tsconfig.json @@ -4,6 +4,7 @@ "noImplicitThis": true, "removeComments": false, "preserveConstEnums": true, + "pretty": true, "outFile": "../../built/local/typescriptServices.js", "sourceMap": true, "stripInternal": true, From 076459069177e8b64692c8a4f3dcdb7086af9f96 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 11 Jul 2016 11:03:38 -0700 Subject: [PATCH 047/109] Make sure the order of setting pos, end, flags, parent, kind is consistent among nodes, tokens and identifiers --- src/services/services.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index cd3e4a43415..bffb44d9fb4 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -198,11 +198,11 @@ namespace ts { private _children: Node[]; constructor(kind: SyntaxKind, pos: number, end: number) { - this.kind = kind; this.pos = pos; this.end = end; this.flags = NodeFlags.None; this.parent = undefined; + this.kind = kind; } public getSourceFile(): SourceFile { @@ -348,15 +348,11 @@ namespace ts { class TokenOrIdentifierObject implements Token { public kind: SyntaxKind; - public pos: number; - public end: number; public flags: NodeFlags; public parent: Node; public jsDocComments: JSDocComment[]; - constructor(pos: number, end: number) { - this.pos = pos; - this.end = end; + constructor(public pos: number, public end: number) { this.flags = NodeFlags.None; this.parent = undefined; } @@ -419,9 +415,8 @@ namespace ts { } class TokenObject extends TokenOrIdentifierObject { - constructor(kind: SyntaxKind, pos: number, end: number) { + constructor(public kind: SyntaxKind, pos: number, end: number) { super(pos, end); - this.kind = kind; } } From 767da71cc13422c65a6369e26c3a6cfe894a05ef Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 11 Jul 2016 11:28:14 -0700 Subject: [PATCH 048/109] Add __tokentag to Token --- src/compiler/parser.ts | 6 +++--- src/compiler/types.ts | 4 +++- src/services/services.ts | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 91097348589..2cb1b35b798 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1030,7 +1030,7 @@ namespace ts { } // note: this function creates only node - function createNode(kind: SyntaxKind, pos?: number): Node { + function createNode(kind: SyntaxKind, pos?: number): Node | Token | Identifier { nodeCount++; if (!(pos >= 0)) { pos = scanner.getStartPos(); @@ -5109,7 +5109,7 @@ namespace ts { } flags |= modifierToFlag(modifierKind); - modifiers.push(finishNode(createNode(modifierKind, modifierStart))); + modifiers.push(finishNode(createNode(modifierKind, modifierStart))); } if (modifiers) { modifiers.flags = flags; @@ -5128,7 +5128,7 @@ namespace ts { modifiers = []; modifiers.pos = modifierStart; flags |= modifierToFlag(modifierKind); - modifiers.push(finishNode(createNode(modifierKind, modifierStart))); + modifiers.push(finishNode(createNode(modifierKind, modifierStart))); modifiers.flags = flags; modifiers.end = scanner.getStartPos(); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index cc10d9348fe..de4f6bc526c 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -472,7 +472,9 @@ namespace ts { flags: NodeFlags; } - export interface Token extends Node { } + export interface Token extends Node { + __tokenTag: any; + } // @kind(SyntaxKind.AbstractKeyword) // @kind(SyntaxKind.AsyncKeyword) diff --git a/src/services/services.ts b/src/services/services.ts index bffb44d9fb4..5fb4251e603 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -351,6 +351,7 @@ namespace ts { public flags: NodeFlags; public parent: Node; public jsDocComments: JSDocComment[]; + public __tokenTag: any; constructor(public pos: number, public end: number) { this.flags = NodeFlags.None; From a138e6307fa6e9d60e7179f4aa5e49617fd5fd9c Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 11:30:22 -0700 Subject: [PATCH 049/109] Avoid using `this` in object literals where possible --- src/compiler/sys.ts | 14 ++++++++------ src/server/editorServices.ts | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 5000be8a0ca..29ae2c60af1 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -182,7 +182,7 @@ namespace ts { return matchFiles(path, extensions, excludes, includes, /*useCaseSensitiveFileNames*/ false, shell.CurrentDirectory, getAccessibleFileSystemEntries); } - return { + const wscriptSystem: System = { args, newLine: "\r\n", useCaseSensitiveFileNames: false, @@ -200,8 +200,8 @@ namespace ts { directoryExists(path: string) { return fso.FolderExists(path); }, - createDirectory(this: System, directoryName: string) { - if (!this.directoryExists(directoryName)) { + createDirectory(directoryName: string) { + if (!wscriptSystem.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } }, @@ -221,6 +221,7 @@ namespace ts { } } }; + return wscriptSystem; } function getNodeSystem(): System { @@ -439,7 +440,7 @@ namespace ts { return filter(_fs.readdirSync(path), p => fileSystemEntryExists(combinePaths(path, p), FileSystemEntryKind.Directory)); } - return { + const nodeSystem: System = { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, @@ -500,8 +501,8 @@ namespace ts { }, fileExists, directoryExists, - createDirectory(this: System, directoryName: string) { - if (!this.directoryExists(directoryName)) { + createDirectory(directoryName: string) { + if (!nodeSystem.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } }, @@ -549,6 +550,7 @@ namespace ts { return _fs.realpathSync(path); } }; + return nodeSystem; } function getChakraSystem(): System { diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index fc2131d0922..8854ea9f432 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -2081,9 +2081,9 @@ namespace ts.server { const walkFns = { goSubtree: true, done: false, - leaf: function (this: ILineIndexWalker, relativeStart: number, relativeLength: number, ll: LineLeaf) { + leaf: function (relativeStart: number, relativeLength: number, ll: LineLeaf) { if (!f(ll, relativeStart, relativeLength)) { - this.done = true; + walkFns.done = true; } } }; From 2f8a5b34f6031b4538a8ca2f103c2d11cc250349 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 09:40:54 -0700 Subject: [PATCH 050/109] Test for multiple salsa assignment-declarations --- .../reference/multipleDeclarations.js | 17 +++++++++++ .../reference/multipleDeclarations.symbols | 17 +++++++++++ .../reference/multipleDeclarations.types | 29 +++++++++++++++++++ .../conformance/salsa/multipleDeclarations.ts | 10 +++++++ 4 files changed, 73 insertions(+) create mode 100644 tests/baselines/reference/multipleDeclarations.js create mode 100644 tests/baselines/reference/multipleDeclarations.symbols create mode 100644 tests/baselines/reference/multipleDeclarations.types create mode 100644 tests/cases/conformance/salsa/multipleDeclarations.ts diff --git a/tests/baselines/reference/multipleDeclarations.js b/tests/baselines/reference/multipleDeclarations.js new file mode 100644 index 00000000000..5f5ac29e909 --- /dev/null +++ b/tests/baselines/reference/multipleDeclarations.js @@ -0,0 +1,17 @@ +//// [input.js] + +function C() { + this.m = null; +} +C.prototype.m = function() { + this.nothing(); +}; + + +//// [output.js] +function C() { + this.m = null; +} +C.prototype.m = function () { + this.nothing(); +}; diff --git a/tests/baselines/reference/multipleDeclarations.symbols b/tests/baselines/reference/multipleDeclarations.symbols new file mode 100644 index 00000000000..0c8569ab89e --- /dev/null +++ b/tests/baselines/reference/multipleDeclarations.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/salsa/input.js === + +function C() { +>C : Symbol(C, Decl(input.js, 0, 0)) + + this.m = null; +>m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) +} +C.prototype.m = function() { +>C.prototype : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) +>C : Symbol(C, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) + + this.nothing(); +}; + diff --git a/tests/baselines/reference/multipleDeclarations.types b/tests/baselines/reference/multipleDeclarations.types new file mode 100644 index 00000000000..7c0a3de70c9 --- /dev/null +++ b/tests/baselines/reference/multipleDeclarations.types @@ -0,0 +1,29 @@ +=== tests/cases/conformance/salsa/input.js === + +function C() { +>C : () => void + + this.m = null; +>this.m = null : null +>this.m : any +>this : any +>m : any +>null : null +} +C.prototype.m = function() { +>C.prototype.m = function() { this.nothing();} : () => void +>C.prototype.m : any +>C.prototype : any +>C : () => void +>prototype : any +>m : any +>function() { this.nothing();} : () => void + + this.nothing(); +>this.nothing() : any +>this.nothing : any +>this : { m: () => void; } +>nothing : any + +}; + diff --git a/tests/cases/conformance/salsa/multipleDeclarations.ts b/tests/cases/conformance/salsa/multipleDeclarations.ts new file mode 100644 index 00000000000..6899be2ec89 --- /dev/null +++ b/tests/cases/conformance/salsa/multipleDeclarations.ts @@ -0,0 +1,10 @@ +// @filename: input.js +// @out: output.js +// @allowJs: true + +function C() { + this.m = null; +} +C.prototype.m = function() { + this.nothing(); +}; From 9ae04223e38ed236ccbe2cb24ee59bf6ab242c49 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 09:26:58 -0700 Subject: [PATCH 051/109] Fix multiple Salsa assignment-declarations Previously, all assignment-declarations needed to be of the same kind: either all `this.p = ...` assignments or `C.prototype.p = ...` assignments. --- src/compiler/checker.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d6db67d3fa8..8568f8cf4aa 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3166,17 +3166,17 @@ namespace ts { } let type: Type = undefined; - // Handle module.exports = expr or this.p = expr - if (declaration.kind === SyntaxKind.BinaryExpression) { - type = getUnionType(map(symbol.declarations, (decl: BinaryExpression) => checkExpressionCached(decl.right))); - } - else if (declaration.kind === SyntaxKind.PropertyAccessExpression) { - // Declarations only exist for property access expressions for certain - // special assignment kinds - if (declaration.parent.kind === SyntaxKind.BinaryExpression) { - // Handle exports.p = expr or className.prototype.method = expr - type = checkExpressionCached((declaration.parent).right); - } + // Handle certain special assignment kinds, which happen to union across multiple declarations: + // * module.exports = expr + // * exports.p = expr + // * this.p = expr + // * className.prototype.method = expr + if (declaration.kind === SyntaxKind.BinaryExpression || + declaration.kind === SyntaxKind.PropertyAccessExpression && declaration.parent.kind === SyntaxKind.BinaryExpression) { + type = getUnionType(map(symbol.declarations, + decl => decl.kind === SyntaxKind.BinaryExpression ? + checkExpressionCached((decl).right) : + checkExpressionCached((decl.parent).right))); } if (type === undefined) { From 4598c13eecd8512ca460b61db4d681f792e7be29 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 8 Jul 2016 12:52:54 -0700 Subject: [PATCH 052/109] Provide a symbol for salsa-inferred class types --- src/compiler/checker.ts | 2 +- .../reference/methodsReturningThis.js | 36 +++++ .../reference/methodsReturningThis.symbols | 101 +++++++++++++ .../reference/methodsReturningThis.types | 133 ++++++++++++++++++ ...turesUseJSDocForOptionalParameters.symbols | 2 + ...naturesUseJSDocForOptionalParameters.types | 18 +-- .../conformance/salsa/methodsReturningThis.ts | 21 +++ 7 files changed, 303 insertions(+), 10 deletions(-) create mode 100644 tests/baselines/reference/methodsReturningThis.js create mode 100644 tests/baselines/reference/methodsReturningThis.symbols create mode 100644 tests/baselines/reference/methodsReturningThis.types create mode 100644 tests/cases/conformance/salsa/methodsReturningThis.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8568f8cf4aa..aea8c982a95 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11673,7 +11673,7 @@ namespace ts { function getInferredClassType(symbol: Symbol) { const links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); } return links.inferredClassType; } diff --git a/tests/baselines/reference/methodsReturningThis.js b/tests/baselines/reference/methodsReturningThis.js new file mode 100644 index 00000000000..b0ebd84770d --- /dev/null +++ b/tests/baselines/reference/methodsReturningThis.js @@ -0,0 +1,36 @@ +//// [input.js] +function Class() +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +Class.prototype.m2 = function (x, y) { return this; }; +Class.prototype.m3 = function (x, y) { return this; }; +Class.prototype.m4 = function (angle) { return this; }; +Class.prototype.m5 = function (matrix) { return this; }; +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +Class.prototype.m7 = function(matrix) { return this; }; +Class.prototype.m8 = function() { return this; }; +Class.prototype.m9 = function () { return this; }; + + + +//// [output.js] +function Class() { +} +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +Class.prototype.m2 = function (x, y) { return this; }; +Class.prototype.m3 = function (x, y) { return this; }; +Class.prototype.m4 = function (angle) { return this; }; +Class.prototype.m5 = function (matrix) { return this; }; +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +Class.prototype.m7 = function (matrix) { return this; }; +Class.prototype.m8 = function () { return this; }; +Class.prototype.m9 = function () { return this; }; diff --git a/tests/baselines/reference/methodsReturningThis.symbols b/tests/baselines/reference/methodsReturningThis.symbols new file mode 100644 index 00000000000..eccb1a64f89 --- /dev/null +++ b/tests/baselines/reference/methodsReturningThis.symbols @@ -0,0 +1,101 @@ +=== tests/cases/conformance/salsa/input.js === +function Class() +>Class : Symbol(Class, Decl(input.js, 0, 0)) +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; +>Class.prototype : Symbol(Class.containsError, Decl(input.js, 2, 1)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>containsError : Symbol(Class.containsError, Decl(input.js, 2, 1)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +>Class.prototype : Symbol(Class.m1, Decl(input.js, 5, 72)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m1 : Symbol(Class.m1, Decl(input.js, 5, 72)) +>a : Symbol(a, Decl(input.js, 8, 31)) +>b : Symbol(b, Decl(input.js, 8, 33)) +>c : Symbol(c, Decl(input.js, 8, 36)) +>d : Symbol(d, Decl(input.js, 8, 39)) +>tx : Symbol(tx, Decl(input.js, 8, 42)) +>ty : Symbol(ty, Decl(input.js, 8, 46)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m2 = function (x, y) { return this; }; +>Class.prototype : Symbol(Class.m2, Decl(input.js, 8, 68)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m2 : Symbol(Class.m2, Decl(input.js, 8, 68)) +>x : Symbol(x, Decl(input.js, 9, 31)) +>y : Symbol(y, Decl(input.js, 9, 33)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m3 = function (x, y) { return this; }; +>Class.prototype : Symbol(Class.m3, Decl(input.js, 9, 54)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m3 : Symbol(Class.m3, Decl(input.js, 9, 54)) +>x : Symbol(x, Decl(input.js, 10, 31)) +>y : Symbol(y, Decl(input.js, 10, 33)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m4 = function (angle) { return this; }; +>Class.prototype : Symbol(Class.m4, Decl(input.js, 10, 54)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m4 : Symbol(Class.m4, Decl(input.js, 10, 54)) +>angle : Symbol(angle, Decl(input.js, 11, 31)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m5 = function (matrix) { return this; }; +>Class.prototype : Symbol(Class.m5, Decl(input.js, 11, 55)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m5 : Symbol(Class.m5, Decl(input.js, 11, 55)) +>matrix : Symbol(matrix, Decl(input.js, 12, 31)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +>Class.prototype : Symbol(Class.m6, Decl(input.js, 12, 56)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m6 : Symbol(Class.m6, Decl(input.js, 12, 56)) +>x : Symbol(x, Decl(input.js, 13, 31)) +>y : Symbol(y, Decl(input.js, 13, 33)) +>pivotX : Symbol(pivotX, Decl(input.js, 13, 36)) +>pivotY : Symbol(pivotY, Decl(input.js, 13, 44)) +>scaleX : Symbol(scaleX, Decl(input.js, 13, 52)) +>scaleY : Symbol(scaleY, Decl(input.js, 13, 60)) +>rotation : Symbol(rotation, Decl(input.js, 13, 68)) +>skewX : Symbol(skewX, Decl(input.js, 13, 78)) +>skewY : Symbol(skewY, Decl(input.js, 13, 85)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m7 = function(matrix) { return this; }; +>Class.prototype : Symbol(Class.m7, Decl(input.js, 13, 110)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m7 : Symbol(Class.m7, Decl(input.js, 13, 110)) +>matrix : Symbol(matrix, Decl(input.js, 14, 30)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m8 = function() { return this; }; +>Class.prototype : Symbol(Class.m8, Decl(input.js, 14, 55)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m8 : Symbol(Class.m8, Decl(input.js, 14, 55)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + +Class.prototype.m9 = function () { return this; }; +>Class.prototype : Symbol(Class.m9, Decl(input.js, 15, 49)) +>Class : Symbol(Class, Decl(input.js, 0, 0)) +>prototype : Symbol(Function.prototype, Decl(lib.d.ts, --, --)) +>m9 : Symbol(Class.m9, Decl(input.js, 15, 49)) +>this : Symbol(Class, Decl(input.js, 0, 0)) + + diff --git a/tests/baselines/reference/methodsReturningThis.types b/tests/baselines/reference/methodsReturningThis.types new file mode 100644 index 00000000000..5bcaa992a71 --- /dev/null +++ b/tests/baselines/reference/methodsReturningThis.types @@ -0,0 +1,133 @@ +=== tests/cases/conformance/salsa/input.js === +function Class() +>Class : () => void +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; +>Class.prototype.containsError = function () { return this.notPresent; } : () => any +>Class.prototype.containsError : any +>Class.prototype : any +>Class : () => void +>prototype : any +>containsError : any +>function () { return this.notPresent; } : () => any +>this.notPresent : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>notPresent : any + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +>Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => { containsError: () => any; m1: any; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m1 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m1 : any +>function (a, b, c, d, tx, ty) { return this; } : (a: any, b: any, c: any, d: any, tx: any, ty: any) => { containsError: () => any; m1: any; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>a : any +>b : any +>c : any +>d : any +>tx : any +>ty : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m2 = function (x, y) { return this; }; +>Class.prototype.m2 = function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: any; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m2 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m2 : any +>function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: any; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>x : any +>y : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m3 = function (x, y) { return this; }; +>Class.prototype.m3 = function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: any; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m3 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m3 : any +>function (x, y) { return this; } : (x: any, y: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: any; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>x : any +>y : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m4 = function (angle) { return this; }; +>Class.prototype.m4 = function (angle) { return this; } : (angle: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: any; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m4 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m4 : any +>function (angle) { return this; } : (angle: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: any; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>angle : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m5 = function (matrix) { return this; }; +>Class.prototype.m5 = function (matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: any; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m5 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m5 : any +>function (matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: any; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>matrix : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +>Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: any; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m6 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m6 : any +>function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; } : (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: any; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } +>x : any +>y : any +>pivotX : any +>pivotY : any +>scaleX : any +>scaleY : any +>rotation : any +>skewX : any +>skewY : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m7 = function(matrix) { return this; }; +>Class.prototype.m7 = function(matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: any; m8: () => typeof Class; m9: () => typeof Class; } +>Class.prototype.m7 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m7 : any +>function(matrix) { return this; } : (matrix: any) => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: any; m8: () => typeof Class; m9: () => typeof Class; } +>matrix : any +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m8 = function() { return this; }; +>Class.prototype.m8 = function() { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: any; m9: () => typeof Class; } +>Class.prototype.m8 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m8 : any +>function() { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: any; m9: () => typeof Class; } +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + +Class.prototype.m9 = function () { return this; }; +>Class.prototype.m9 = function () { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: any; } +>Class.prototype.m9 : any +>Class.prototype : any +>Class : () => void +>prototype : any +>m9 : any +>function () { return this; } : () => { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: any; } +>this : { containsError: () => any; m1: (a: any, b: any, c: any, d: any, tx: any, ty: any) => typeof Class; m2: (x: any, y: any) => typeof Class; m3: (x: any, y: any) => typeof Class; m4: (angle: any) => typeof Class; m5: (matrix: any) => typeof Class; m6: (x: any, y: any, pivotX: any, pivotY: any, scaleX: any, scaleY: any, rotation: any, skewX: any, skewY: any) => typeof Class; m7: (matrix: any) => typeof Class; m8: () => typeof Class; m9: () => typeof Class; } + + diff --git a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols index 5ea2756598e..52fc8b9a9a9 100644 --- a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols +++ b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.symbols @@ -19,6 +19,8 @@ MyClass.prototype.optionalParam = function(required, notRequired) { >notRequired : Symbol(notRequired, Decl(jsDocOptionality.js, 8, 52)) return this; +>this : Symbol(MyClass, Decl(jsDocOptionality.js, 0, 0)) + }; let pInst = new MyClass(); >pInst : Symbol(pInst, Decl(jsDocOptionality.js, 11, 3)) diff --git a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types index 2dcaa37b947..48d44bb5406 100644 --- a/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types +++ b/tests/baselines/reference/signaturesUseJSDocForOptionalParameters.types @@ -26,27 +26,27 @@ MyClass.prototype.optionalParam = function(required, notRequired) { >notRequired : string return this; ->this : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>this : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } }; let pInst = new MyClass(); ->pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } ->new MyClass() : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } +>new MyClass() : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >MyClass : () => void let c1 = pInst.optionalParam('hello') ->c1 : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } ->pInst.optionalParam('hello') : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>c1 : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } +>pInst.optionalParam('hello') : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >pInst.optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } ->pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } >'hello' : string let c2 = pInst.optionalParam('hello', null) ->c2 : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } ->pInst.optionalParam('hello', null) : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>c2 : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } +>pInst.optionalParam('hello', null) : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >pInst.optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } ->pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => { prop: null; optionalParam: any; }; } +>pInst : { prop: null; optionalParam: (required: string, notRequired?: string) => typeof MyClass; } >optionalParam : (required: string, notRequired?: string) => { prop: null; optionalParam: any; } >'hello' : string >null : null diff --git a/tests/cases/conformance/salsa/methodsReturningThis.ts b/tests/cases/conformance/salsa/methodsReturningThis.ts new file mode 100644 index 00000000000..4c9f0d5cd0b --- /dev/null +++ b/tests/cases/conformance/salsa/methodsReturningThis.ts @@ -0,0 +1,21 @@ +// @filename: input.js +// @out: output.js +// @allowJs: true +function Class() +{ +} + +// error: 'Class' doesn't have property 'notPresent' +Class.prototype.containsError = function () { return this.notPresent; }; + +// lots of methods that return this, which caused out-of-memory in #9527 +Class.prototype.m1 = function (a, b, c, d, tx, ty) { return this; }; +Class.prototype.m2 = function (x, y) { return this; }; +Class.prototype.m3 = function (x, y) { return this; }; +Class.prototype.m4 = function (angle) { return this; }; +Class.prototype.m5 = function (matrix) { return this; }; +Class.prototype.m6 = function (x, y, pivotX, pivotY, scaleX, scaleY, rotation, skewX, skewY) { return this; }; +Class.prototype.m7 = function(matrix) { return this; }; +Class.prototype.m8 = function() { return this; }; +Class.prototype.m9 = function () { return this; }; + From 73f741418f51147d190c24647e3fa8dc6c3a6905 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Mon, 11 Jul 2016 13:01:05 -0700 Subject: [PATCH 053/109] fix the issue that @property types are not recoganized --- src/compiler/checker.ts | 3 ++ .../cases/fourslash/server/jsdocTypedefTag.ts | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index aea8c982a95..abba2692865 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3160,6 +3160,9 @@ namespace ts { if (declaration.kind === SyntaxKind.ExportAssignment) { return links.type = checkExpression((declaration).expression); } + if (declaration.kind === SyntaxKind.JSDocPropertyTag && (declaration).typeExpression) { + return links.type = getTypeFromTypeNode((declaration).typeExpression.type); + } // Handle variable, parameter or property if (!pushTypeResolution(symbol, TypeSystemPropertyName.Type)) { return unknownType; diff --git a/tests/cases/fourslash/server/jsdocTypedefTag.ts b/tests/cases/fourslash/server/jsdocTypedefTag.ts index e645b518020..968e30a412d 100644 --- a/tests/cases/fourslash/server/jsdocTypedefTag.ts +++ b/tests/cases/fourslash/server/jsdocTypedefTag.ts @@ -32,16 +32,24 @@ //// var numberLike; numberLike./*numberLike*/ //// //// /** @type {Person} */ -//// var p;p./*person*/ +//// var p;p./*person*/; +//// p.personName./*personName*/; +//// p.personAge./*personAge*/; //// //// /** @type {Animal} */ -//// var a;a./*animal*/ +//// var a;a./*animal*/; +//// a.animalName./*animalName*/; +//// a.animalAge./*animalAge*/; //// //// /** @type {Cat} */ -//// var c;c./*cat*/ +//// var c;c./*cat*/; +//// c.catName./*catName*/; +//// c.catAge./*catAge*/; //// //// /** @type {Dog} */ -//// var d;d./*dog*/ +//// var d;d./*dog*/; +//// d.dogName./*dogName*/; +//// d.dogAge./*dogAge*/; goTo.marker('numberLike'); verify.memberListContains('charAt'); @@ -50,15 +58,31 @@ verify.memberListContains('toExponential'); goTo.marker('person'); verify.memberListContains('personName'); verify.memberListContains('personAge'); +goTo.marker('personName'); +verify.memberListContains('charAt'); +goTo.marker('personAge'); +verify.memberListContains('toExponential'); goTo.marker('animal'); verify.memberListContains('animalName'); verify.memberListContains('animalAge'); +goTo.marker('animalName'); +verify.memberListContains('charAt'); +goTo.marker('animalAge'); +verify.memberListContains('toExponential'); goTo.marker('dog'); verify.memberListContains('dogName'); verify.memberListContains('dogAge'); +goTo.marker('dogName'); +verify.memberListContains('charAt'); +goTo.marker('dogAge'); +verify.memberListContains('toExponential'); goTo.marker('cat'); verify.memberListContains('catName'); -verify.memberListContains('catAge'); \ No newline at end of file +verify.memberListContains('catAge'); +goTo.marker('catName'); +verify.memberListContains('charAt'); +goTo.marker('catAge'); +verify.memberListContains('toExponential'); \ No newline at end of file From 6ad4482bac5afcc3c6275aca04b01d9d3d5e4c1d Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 13:04:48 -0700 Subject: [PATCH 054/109] Update conflicting baseline. PR #9574 added a baseline that #9578 caused to be changed. The two PRs went in so close to each other that the CI build didn't catch the change to the new test's baseline. --- tests/baselines/reference/multipleDeclarations.symbols | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/baselines/reference/multipleDeclarations.symbols b/tests/baselines/reference/multipleDeclarations.symbols index 0c8569ab89e..a256943dd50 100644 --- a/tests/baselines/reference/multipleDeclarations.symbols +++ b/tests/baselines/reference/multipleDeclarations.symbols @@ -13,5 +13,7 @@ C.prototype.m = function() { >m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) this.nothing(); +>this : Symbol(C, Decl(input.js, 0, 0)) + }; From 4e02bc61a2551c883ba0beefc527fbcb5d156afe Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 13:04:48 -0700 Subject: [PATCH 055/109] Update conflicting baseline. PR #9574 added a baseline that #9578 caused to be changed. The two PRs went in so close to each other that the CI build didn't catch the change to the new test's baseline. --- tests/baselines/reference/multipleDeclarations.symbols | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/baselines/reference/multipleDeclarations.symbols b/tests/baselines/reference/multipleDeclarations.symbols index 0c8569ab89e..a256943dd50 100644 --- a/tests/baselines/reference/multipleDeclarations.symbols +++ b/tests/baselines/reference/multipleDeclarations.symbols @@ -13,5 +13,7 @@ C.prototype.m = function() { >m : Symbol(C.m, Decl(input.js, 1, 14), Decl(input.js, 3, 1)) this.nothing(); +>this : Symbol(C, Decl(input.js, 0, 0)) + }; From 6414a5721c833148d646b91b6f68ee0ea1c265aa Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 11 Jul 2016 13:49:36 -0700 Subject: [PATCH 056/109] Remove another use of `this`, in program.ts --- src/compiler/program.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 31332a92b0a..af0a13d640b 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1398,8 +1398,8 @@ namespace ts { return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = createTypeChecker(program, /*produceDiagnostics:*/ false)); } - function emit(this: Program, sourceFile?: SourceFile, writeFileCallback?: WriteFileCallback, cancellationToken?: CancellationToken): EmitResult { - return runWithCancellationToken(() => emitWorker(this, sourceFile, writeFileCallback, cancellationToken)); + function emit(sourceFile?: SourceFile, writeFileCallback?: WriteFileCallback, cancellationToken?: CancellationToken): EmitResult { + return runWithCancellationToken(() => emitWorker(program, sourceFile, writeFileCallback, cancellationToken)); } function isEmitBlocked(emitFileName: string): boolean { From 78a1ca7d5009b3d361df7822971bf546827e7718 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 11 Jul 2016 14:02:23 -0700 Subject: [PATCH 057/109] Make setting properties explicit instead of using parameter properties --- src/services/services.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 5fb4251e603..56f2a87509a 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -348,12 +348,17 @@ namespace ts { class TokenOrIdentifierObject implements Token { public kind: SyntaxKind; + public pos: number; + public end: number; public flags: NodeFlags; public parent: Node; public jsDocComments: JSDocComment[]; public __tokenTag: any; - constructor(public pos: number, public end: number) { + constructor(pos: number, end: number) { + // Set properties in same order as NodeObject + this.pos = pos; + this.end = end; this.flags = NodeFlags.None; this.parent = undefined; } @@ -416,8 +421,10 @@ namespace ts { } class TokenObject extends TokenOrIdentifierObject { - constructor(public kind: SyntaxKind, pos: number, end: number) { + public kind: SyntaxKind; + constructor(kind: SyntaxKind, pos: number, end: number) { super(pos, end); + this.kind = kind; } } From c19512edb564d5502d0de86e23e4b108941d0174 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Mon, 11 Jul 2016 14:57:54 -0700 Subject: [PATCH 058/109] Add node flag check --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index abba2692865..e842f008bbe 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3160,7 +3160,7 @@ namespace ts { if (declaration.kind === SyntaxKind.ExportAssignment) { return links.type = checkExpression((declaration).expression); } - if (declaration.kind === SyntaxKind.JSDocPropertyTag && (declaration).typeExpression) { + if (declaration.flags & NodeFlags.JavaScriptFile && declaration.kind === SyntaxKind.JSDocPropertyTag && (declaration).typeExpression) { return links.type = getTypeFromTypeNode((declaration).typeExpression.type); } // Handle variable, parameter or property From fb20df0568a8f82868edee4335da03771f738245 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Mon, 11 Jul 2016 16:00:16 -0700 Subject: [PATCH 059/109] Have tsconfig for harness --- Gulpfile.ts | 141 +- Jakefile.js | 15 +- package.json | 2 + src/harness/external/chai.d.ts | 179 --- src/harness/external/mocha.d.ts | 45 - src/harness/external/node.d.ts | 1296 ----------------- src/harness/harness.ts | 17 +- src/harness/tsconfig.json | 93 ++ src/server/node.d.ts | 682 --------- src/server/server.ts | 54 +- src/server/tsconfig.json | 6 +- src/server/tsconfig.library.json | 17 + tests/cases/unittests/incrementalParser.ts | 2 +- tests/cases/unittests/jsDocParsing.ts | 2 - tests/cases/unittests/matchFiles.ts | 1 - tests/cases/unittests/moduleResolution.ts | 7 - .../cases/unittests/reuseProgramStructure.ts | 1 - .../cases/unittests/services/colorization.ts | 3 +- .../unittests/services/patternMatcher.ts | 1 - .../unittests/services/preProcessFile.ts | 9 +- 20 files changed, 226 insertions(+), 2347 deletions(-) delete mode 100644 src/harness/external/chai.d.ts delete mode 100644 src/harness/external/mocha.d.ts delete mode 100644 src/harness/external/node.d.ts create mode 100644 src/harness/tsconfig.json delete mode 100644 src/server/node.d.ts create mode 100644 src/server/tsconfig.library.json diff --git a/Gulpfile.ts b/Gulpfile.ts index f0757c89bba..4ad06faf6cb 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -85,12 +85,9 @@ let host = cmdLineOptions["host"]; // Constants const compilerDirectory = "src/compiler/"; -const servicesDirectory = "src/services/"; -const serverDirectory = "src/server/"; const harnessDirectory = "src/harness/"; const libraryDirectory = "src/lib/"; const scriptsDirectory = "scripts/"; -const unittestsDirectory = "tests/cases/unittests/"; const docDirectory = "doc/"; const builtDirectory = "built/"; @@ -107,69 +104,6 @@ const nodeModulesPathPrefix = path.resolve("./node_modules/.bin/"); const isWin = /^win/.test(process.platform); const mocha = path.join(nodeModulesPathPrefix, "mocha") + (isWin ? ".cmd" : ""); -const compilerSources = require("./src/compiler/tsconfig.json").files.map((file) => path.join(compilerDirectory, file)); - -const servicesSources = require("./src/services/tsconfig.json").files.map((file) => path.join(servicesDirectory, file)); - -const serverCoreSources = require("./src/server/tsconfig.json").files.map((file) => path.join(serverDirectory, file)); - -const languageServiceLibrarySources = [ - "editorServices.ts", - "protocol.d.ts", - "session.ts" -].map(function (f) { - return path.join(serverDirectory, f); -}).concat(servicesSources); - -const harnessCoreSources = [ - "harness.ts", - "sourceMapRecorder.ts", - "harnessLanguageService.ts", - "fourslash.ts", - "runnerbase.ts", - "compilerRunner.ts", - "typeWriter.ts", - "fourslashRunner.ts", - "projectsRunner.ts", - "loggedIO.ts", - "rwcRunner.ts", - "test262Runner.ts", - "runner.ts" -].map(function (f) { - return path.join(harnessDirectory, f); -}); - -const harnessSources = harnessCoreSources.concat([ - "incrementalParser.ts", - "jsDocParsing.ts", - "services/colorization.ts", - "services/documentRegistry.ts", - "services/preProcessFile.ts", - "services/patternMatcher.ts", - "session.ts", - "versionCache.ts", - "convertToBase64.ts", - "transpile.ts", - "reuseProgramStructure.ts", - "cachingInServerLSHost.ts", - "moduleResolution.ts", - "tsconfigParsing.ts", - "commandLineParsing.ts", - "convertCompilerOptionsFromJson.ts", - "convertTypingOptionsFromJson.ts", - "tsserverProjectSystem.ts", - "matchFiles.ts", -].map(function (f) { - return path.join(unittestsDirectory, f); -})).concat([ - "protocol.d.ts", - "session.ts", - "client.ts", - "editorServices.ts" -].map(function (f) { - return path.join(serverDirectory, f); -})); - const es2015LibrarySources = [ "es2015.core.d.ts", "es2015.collection.d.ts", @@ -500,21 +434,18 @@ const tsserverLibraryFile = path.join(builtLocalDirectory, "tsserverlibrary.js") const tsserverLibraryDefinitionFile = path.join(builtLocalDirectory, "tsserverlibrary.d.ts"); gulp.task(tsserverLibraryFile, false, [servicesFile], (done) => { - const settings: tsc.Settings = getCompilerSettings({ - declaration: true, - outFile: tsserverLibraryFile - }, /*useBuiltCompiler*/ true); - const {js, dts}: {js: NodeJS.ReadableStream, dts: NodeJS.ReadableStream} = gulp.src(languageServiceLibrarySources) + const serverLibraryProject = tsc.createProject("src/server/tsconfig.library.json", getCompilerSettings({}, /*useBuiltCompiler*/ true)); + const {js, dts}: {js: NodeJS.ReadableStream, dts: NodeJS.ReadableStream} = serverLibraryProject.src() .pipe(sourcemaps.init()) .pipe(newer(tsserverLibraryFile)) - .pipe(tsc(settings)); + .pipe(tsc(serverLibraryProject)); return merge2([ js.pipe(prependCopyright()) .pipe(sourcemaps.write(".")) - .pipe(gulp.dest(".")), + .pipe(gulp.dest(builtLocalDirectory)), dts.pipe(prependCopyright()) - .pipe(gulp.dest(".")) + .pipe(gulp.dest(builtLocalDirectory)) ]); }); @@ -583,15 +514,13 @@ gulp.task("LKG", "Makes a new LKG out of the built js files", ["clean", "dontUse // Task to build the tests infrastructure using the built compiler const run = path.join(builtLocalDirectory, "run.js"); gulp.task(run, false, [servicesFile], () => { - const settings: tsc.Settings = getCompilerSettings({ - outFile: run - }, /*useBuiltCompiler*/ true); - return gulp.src(harnessSources) + const testProject = tsc.createProject("src/harness/tsconfig.json", getCompilerSettings({}, /*useBuiltCompiler*/true)); + return testProject.src() .pipe(newer(run)) .pipe(sourcemaps.init()) - .pipe(tsc(settings)) + .pipe(tsc(testProject)) .pipe(sourcemaps.write(".", { includeContent: false, sourceRoot: "../../" })) - .pipe(gulp.dest(".")); + .pipe(gulp.dest(builtLocalDirectory)); }); const internalTests = "internal/"; @@ -766,13 +695,11 @@ gulp.task(nodeServerOutFile, false, [servicesFile], () => { }); gulp.task("browserify", "Runs browserify on run.js to produce a file suitable for running tests in the browser", [servicesFile], (done) => { - const settings: tsc.Settings = getCompilerSettings({ - outFile: "built/local/bundle.js" - }, /*useBuiltCompiler*/ true); - return gulp.src(harnessSources) + const testProject = tsc.createProject("src/harness/tsconfig.json", getCompilerSettings({ outFile: "built/local/bundle.js" }, /*useBuiltCompiler*/ true)); + return testProject.src() .pipe(newer("built/local/bundle.js")) .pipe(sourcemaps.init()) - .pipe(tsc(settings)) + .pipe(tsc(testProject)) .pipe(through2.obj((file, enc, next) => { browserify(intoStream(file.contents)) .bundle((err, res) => { @@ -1013,36 +940,38 @@ function lintFile(options, path) { return lintFileContents(options, path, contents); } -const lintTargets = ["Gulpfile.ts"] - .concat(compilerSources) - .concat(harnessSources) - // Other harness sources - .concat(["instrumenter.ts"].map(function(f) { return path.join(harnessDirectory, f); })) - .concat(serverCoreSources) - .concat(tslintRulesFiles) - .concat(servicesSources); +const lintTargets = [ + "Gulpfile.ts", + "src/compiler/**/*.ts", + "src/harness/**/*.ts", + "tests/cases/unittests/**/*.ts", + "!tests/cases/unittests/services/formatting/**/*.ts", + "src/server/**/*.ts", + "scripts/tslint/**/*.ts", + "src/services/**/*.ts", +]; gulp.task("lint", "Runs tslint on the compiler sources. Optional arguments are: --f[iles]=regex", ["build-rules"], () => { + const fileMatcher = RegExp(cmdLineOptions["files"]); const lintOptions = getLinterOptions(); let failed = 0; - const fileMatcher = RegExp(cmdLineOptions["files"]); - const done = {}; - for (const i in lintTargets) { - const target = lintTargets[i]; - if (!done[target] && fileMatcher.test(target)) { - const result = lintFile(lintOptions, target); + return gulp.src(lintTargets) + .pipe(insert.transform((contents, file) => { + if (!fileMatcher.test(file.path)) return contents; + const result = lintFile(lintOptions, file.path); if (result.failureCount > 0) { console.log(result.output); failed += result.failureCount; } - done[target] = true; - } - } - if (failed > 0) { - console.error("Linter errors."); - process.exit(1); - } + return contents; // TODO (weswig): Automatically apply fixes? :3 + })) + .on("end", () => { + if (failed > 0) { + console.error("Linter errors."); + process.exit(1); + } + }); }); diff --git a/Jakefile.js b/Jakefile.js index 0dd589f90e3..3eb3520fafb 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -100,7 +100,6 @@ var servicesSources = [ })); var serverCoreSources = [ - "node.d.ts", "editorServices.ts", "protocol.d.ts", "session.ts", @@ -279,13 +278,18 @@ var builtLocalCompiler = path.join(builtLocalDirectory, compilerFilename); * @param {boolean} opts.stripInternal: true if compiler should remove declarations marked as @internal * @param {boolean} opts.noMapRoot: true if compiler omit mapRoot option * @param {boolean} opts.inlineSourceMap: true if compiler should inline sourceMap + * @param {Array} opts.types: array of types to include in compilation * @param callback: a function to execute after the compilation process ends */ function compileFile(outFile, sources, prereqs, prefixes, useBuiltCompiler, opts, callback) { file(outFile, prereqs, function() { - var compilerPath = useBuiltCompiler ? builtLocalCompiler : LKGCompiler; - var options = "--noImplicitAny --noImplicitThis --noEmitOnError --types --pretty"; opts = opts || {}; + var compilerPath = useBuiltCompiler ? builtLocalCompiler : LKGCompiler; + var options = "--noImplicitAny --noImplicitThis --noEmitOnError --types " + if (opts.types) { + options += opts.types.join(","); + } + options += " --pretty"; // Keep comments when specifically requested // or when in debug mode. if (!(opts.keepComments || useDebugMode)) { @@ -548,8 +552,7 @@ compileFile( }); var serverFile = path.join(builtLocalDirectory, "tsserver.js"); -compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true); - +compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"] }); var tsserverLibraryFile = path.join(builtLocalDirectory, "tsserverlibrary.js"); var tsserverLibraryDefinitionFile = path.join(builtLocalDirectory, "tsserverlibrary.d.ts"); compileFile( @@ -652,7 +655,7 @@ compileFile( /*prereqs*/ [builtLocalDirectory, tscFile].concat(libraryTargets).concat(harnessSources), /*prefixes*/ [], /*useBuiltCompiler:*/ true, - /*opts*/ { inlineSourceMap: true }); + /*opts*/ { inlineSourceMap: true, types: ["node", "mocha", "chai"] }); var internalTests = "internal/"; diff --git a/package.json b/package.json index 29871e77f70..72a220f53b1 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "devDependencies": { "@types/browserify": "latest", + "@types/chai": "latest", "@types/del": "latest", "@types/glob": "latest", "@types/gulp": "latest", @@ -42,6 +43,7 @@ "@types/minimatch": "latest", "@types/minimist": "latest", "@types/mkdirp": "latest", + "@types/mocha": "latest", "@types/node": "latest", "@types/q": "latest", "@types/run-sequence": "latest", diff --git a/src/harness/external/chai.d.ts b/src/harness/external/chai.d.ts deleted file mode 100644 index 5e4e6e7d000..00000000000 --- a/src/harness/external/chai.d.ts +++ /dev/null @@ -1,179 +0,0 @@ -// Type definitions for chai 1.7.2 -// Project: http://chaijs.com/ -// Definitions by: Jed Hunsaker -// DefinitelyTyped: https://github.com/borisyankov/DefinitelyTyped - - -declare module chai { - - function expect(target: any, message?: string): Expect; - - // Provides a way to extend the internals of Chai - function use(fn: (chai: any, utils: any) => void): any; - - interface ExpectStatic { - (target: any): Expect; - } - - interface Assertions { - attr(name: string, value?: string): any; - css(name: string, value?: string): any; - data(name: string, value?: string): any; - class(className: string): any; - id(id: string): any; - html(html: string): any; - text(text: string): any; - value(value: string): any; - visible: any; - hidden: any; - selected: any; - checked: any; - disabled: any; - empty: any; - exist: any; - } - - interface Expect extends LanguageChains, NumericComparison, TypeComparison, Assertions { - not: Expect; - deep: Deep; - a: TypeComparison; - an: TypeComparison; - include: Include; - contain: Include; - ok: Expect; - true: Expect; - false: Expect; - null: Expect; - undefined: Expect; - exist: Expect; - empty: Expect; - arguments: Expect; - Arguments: Expect; - equal: Equal; - equals: Equal; - eq: Equal; - eql: Equal; - eqls: Equal; - property: Property; - ownProperty: OwnProperty; - haveOwnProperty: OwnProperty; - length: Length; - lengthOf: Length; - match(RegularExpression: RegExp, message?: string): Expect; - string(string: string, message?: string): Expect; - keys: Keys; - key(string: string): Expect; - throw: Throw; - throws: Throw; - Throw: Throw; - respondTo(method: string, message?: string): Expect; - itself: Expect; - satisfy(matcher: Function, message?: string): Expect; - closeTo(expected: number, delta: number, message?: string): Expect; - members: Members; - } - - interface LanguageChains { - to: Expect; - be: Expect; - been: Expect; - is: Expect; - that: Expect; - and: Expect; - have: Expect; - with: Expect; - at: Expect; - of: Expect; - same: Expect; - } - - interface NumericComparison { - above: NumberComparer; - gt: NumberComparer; - greaterThan: NumberComparer; - least: NumberComparer; - gte: NumberComparer; - below: NumberComparer; - lt: NumberComparer; - lessThan: NumberComparer; - most: NumberComparer; - lte: NumberComparer; - within(start: number, finish: number, message?: string): Expect; - } - - interface NumberComparer { - (value: number, message?: string): Expect; - } - - interface TypeComparison { - (type: string, message?: string): Expect; - instanceof: InstanceOf; - instanceOf: InstanceOf; - } - - interface InstanceOf { - (constructor: Object, message?: string): Expect; - } - - interface Deep { - equal: Equal; - property: Property; - } - - interface Equal { - (value: any, message?: string): Expect; - } - - interface Property { - (name: string, value?: any, message?: string): Expect; - } - - interface OwnProperty { - (name: string, message?: string): Expect; - } - - interface Length extends LanguageChains, NumericComparison { - (length: number, message?: string): Expect; - } - - interface Include { - (value: Object, message?: string): Expect; - (value: string, message?: string): Expect; - (value: number, message?: string): Expect; - keys: Keys; - members: Members; - } - - interface Keys { - (...keys: string[]): Expect; - (keys: any[]): Expect; - } - - interface Members { - (set: any[], message?: string): Expect; - } - - interface Throw { - (): Expect; - (expected: string, message?: string): Expect; - (expected: RegExp, message?: string): Expect; - (constructor: Error, expected?: string, message?: string): Expect; - (constructor: Error, expected?: RegExp, message?: string): Expect; - (constructor: Function, expected?: string, message?: string): Expect; - (constructor: Function, expected?: RegExp, message?: string): Expect; - } - - function assert(expression: any, message?: string): void; - module assert { - function equal(actual: any, expected: any, message?: string): void; - function notEqual(actual: any, expected: any, message?: string): void; - function deepEqual(actual: T, expected: T, message?: string): void; - function notDeepEqual(actual: T, expected: T, message?: string): void; - function lengthOf(object: any[], length: number, message?: string): void; - function isTrue(value: any, message?: string): void; - function isFalse(value: any, message?: string): void; - function isOk(actual: any, message?: string): void; - function isUndefined(value: any, message?: string): void; - function isDefined(value: any, message?: string): void; - } -} \ No newline at end of file diff --git a/src/harness/external/mocha.d.ts b/src/harness/external/mocha.d.ts deleted file mode 100644 index c498eb080b6..00000000000 --- a/src/harness/external/mocha.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -// Type definitions for mocha 1.9.0 -// Project: http://visionmedia.github.io/mocha/ -// Definitions by: Kazi Manzur Rashid -// DefinitelyTyped: https://github.com/borisyankov/DefinitelyTyped - -declare var describe : { - (description: string, spec: () => void): void; - only(description: string, spec: () => void): void; - skip(description: string, spec: () => void): void; - timeout(ms: number): void; -} - -declare var it: { - (expectation: string, assertion?: () => void): void; - (expectation: string, assertion?: (done: () => void) => void): void; - only(expectation: string, assertion?: () => void): void; - only(expectation: string, assertion?: (done: () => void) => void): void; - skip(expectation: string, assertion?: () => void): void; - skip(expectation: string, assertion?: (done: () => void) => void): void; - timeout(ms: number): void; -}; - -/** Runs once before any 'it' blocks in the current 'describe' are run */ -declare function before(action: () => void): void; - -/** Runs once before any 'it' blocks in the current 'describe' are run */ -declare function before(action: (done: () => void) => void): void; - -/** Runs once after all 'it' blocks in the current 'describe' are run */ -declare function after(action: () => void): void; - -/** Runs once after all 'it' blocks in the current 'describe' are run */ -declare function after(action: (done: () => void) => void): void; - -/** Runs before each individual 'it' block in the current 'describe' is run */ -declare function beforeEach(action: () => void): void; - -/** Runs before each individual 'it' block in the current 'describe' is run */ -declare function beforeEach(action: (done: () => void) => void): void; - -/** Runs after each individual 'it' block in the current 'describe' is run */ -declare function afterEach(action: () => void): void; - -/** Runs after each individual 'it' block in the current 'describe' is run */ -declare function afterEach(action: (done: () => void) => void): void; \ No newline at end of file diff --git a/src/harness/external/node.d.ts b/src/harness/external/node.d.ts deleted file mode 100644 index b89174cef7c..00000000000 --- a/src/harness/external/node.d.ts +++ /dev/null @@ -1,1296 +0,0 @@ -// Type definitions for Node.js v0.10.1 -// Project: http://nodejs.org/ -// Definitions by: Microsoft TypeScript , DefinitelyTyped -// Definitions: https://github.com/borisyankov/DefinitelyTyped - -/************************************************ -* * -* Node.js v0.10.1 API * -* * -************************************************/ - -/************************************************ -* * -* GLOBAL * -* * -************************************************/ -declare var process: NodeJS.Process; -declare var global: any; - -declare var __filename: string; -declare var __dirname: string; - -declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -declare function clearTimeout(timeoutId: NodeJS.Timer): void; -declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -declare function clearInterval(intervalId: NodeJS.Timer): void; -declare function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; -declare function clearImmediate(immediateId: any): void; - -declare var require: { - (id: string): any; - resolve(id:string): string; - cache: any; - extensions: any; - main: any; -}; - -declare var module: { - exports: any; - require(id: string): any; - id: string; - filename: string; - loaded: boolean; - parent: any; - children: any[]; -}; - -// Same as module.exports -declare var exports: any; -declare var SlowBuffer: { - new (str: string, encoding?: string): Buffer; - new (size: number): Buffer; - new (array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; -}; - - -// Buffer class -interface Buffer extends NodeBuffer {} -declare var Buffer: { - new (str: string, encoding?: string): Buffer; - new (size: number): Buffer; - new (array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; -}; - -/************************************************ -* * -* GLOBAL INTERFACES * -* * -************************************************/ -declare module NodeJS { - export interface ErrnoException extends Error { - errno?: any; - code?: string; - path?: string; - syscall?: string; - } - - export interface EventEmitter { - addListener(event: string, listener: Function): EventEmitter; - on(event: string, listener: Function): EventEmitter; - once(event: string, listener: Function): EventEmitter; - removeListener(event: string, listener: Function): EventEmitter; - removeAllListeners(event?: string): EventEmitter; - setMaxListeners(n: number): void; - listeners(event: string): Function[]; - emit(event: string, ...args: any[]): boolean; - } - - export interface ReadableStream extends EventEmitter { - readable: boolean; - read(size?: number): any; - setEncoding(encoding: string): void; - pause(): void; - resume(): void; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): void; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: ReadableStream): ReadableStream; - } - - export interface WritableStream extends EventEmitter { - writable: boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface ReadWriteStream extends ReadableStream, WritableStream {} - - export interface Process extends EventEmitter { - stdout: WritableStream; - stderr: WritableStream; - stdin: ReadableStream; - argv: string[]; - execPath: string; - abort(): void; - chdir(directory: string): void; - cwd(): string; - env: any; - exit(code?: number): void; - getgid(): number; - setgid(id: number): void; - setgid(id: string): void; - getuid(): number; - setuid(id: number): void; - setuid(id: string): void; - version: string; - versions: { - http_parser: string; - node: string; - v8: string; - ares: string; - uv: string; - zlib: string; - openssl: string; - }; - config: { - target_defaults: { - cflags: any[]; - default_configuration: string; - defines: string[]; - include_dirs: string[]; - libraries: string[]; - }; - variables: { - clang: number; - host_arch: string; - node_install_npm: boolean; - node_install_waf: boolean; - node_prefix: string; - node_shared_openssl: boolean; - node_shared_v8: boolean; - node_shared_zlib: boolean; - node_use_dtrace: boolean; - node_use_etw: boolean; - node_use_openssl: boolean; - target_arch: string; - v8_no_strict_aliasing: number; - v8_use_snapshot: boolean; - visibility: string; - }; - }; - kill(pid: number, signal?: string): void; - pid: number; - title: string; - arch: string; - platform: string; - memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; }; - nextTick(callback: Function): void; - umask(mask?: number): number; - uptime(): number; - hrtime(time?:number[]): number[]; - - // Worker - send?(message: any, sendHandle?: any): void; - } - - export interface Timer { - ref() : void; - unref() : void; - } -} - -/** - * @deprecated - */ -interface NodeBuffer { - [index: number]: number; - write(string: string, offset?: number, length?: number, encoding?: string): number; - toString(encoding?: string, start?: number, end?: number): string; - toJSON(): any; - length: number; - copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; - slice(start?: number, end?: number): Buffer; - readUInt8(offset: number, noAsset?: boolean): number; - readUInt16LE(offset: number, noAssert?: boolean): number; - readUInt16BE(offset: number, noAssert?: boolean): number; - readUInt32LE(offset: number, noAssert?: boolean): number; - readUInt32BE(offset: number, noAssert?: boolean): number; - readInt8(offset: number, noAssert?: boolean): number; - readInt16LE(offset: number, noAssert?: boolean): number; - readInt16BE(offset: number, noAssert?: boolean): number; - readInt32LE(offset: number, noAssert?: boolean): number; - readInt32BE(offset: number, noAssert?: boolean): number; - readFloatLE(offset: number, noAssert?: boolean): number; - readFloatBE(offset: number, noAssert?: boolean): number; - readDoubleLE(offset: number, noAssert?: boolean): number; - readDoubleBE(offset: number, noAssert?: boolean): number; - writeUInt8(value: number, offset: number, noAssert?: boolean): void; - writeUInt16LE(value: number, offset: number, noAssert?: boolean): void; - writeUInt16BE(value: number, offset: number, noAssert?: boolean): void; - writeUInt32LE(value: number, offset: number, noAssert?: boolean): void; - writeUInt32BE(value: number, offset: number, noAssert?: boolean): void; - writeInt8(value: number, offset: number, noAssert?: boolean): void; - writeInt16LE(value: number, offset: number, noAssert?: boolean): void; - writeInt16BE(value: number, offset: number, noAssert?: boolean): void; - writeInt32LE(value: number, offset: number, noAssert?: boolean): void; - writeInt32BE(value: number, offset: number, noAssert?: boolean): void; - writeFloatLE(value: number, offset: number, noAssert?: boolean): void; - writeFloatBE(value: number, offset: number, noAssert?: boolean): void; - writeDoubleLE(value: number, offset: number, noAssert?: boolean): void; - writeDoubleBE(value: number, offset: number, noAssert?: boolean): void; - fill(value: any, offset?: number, end?: number): void; -} - -/************************************************ -* * -* MODULES * -* * -************************************************/ -declare module "buffer" { - export var INSPECT_MAX_BYTES: number; -} - -declare module "querystring" { - export function stringify(obj: any, sep?: string, eq?: string): string; - export function parse(str: string, sep?: string, eq?: string, options?: { maxKeys?: number; }): any; - export function escape(): any; - export function unescape(): any; -} - -declare module "events" { - export class EventEmitter implements NodeJS.EventEmitter { - static listenerCount(emitter: EventEmitter, event: string): number; - - addListener(event: string, listener: Function): EventEmitter; - on(event: string, listener: Function): EventEmitter; - once(event: string, listener: Function): EventEmitter; - removeListener(event: string, listener: Function): EventEmitter; - removeAllListeners(event?: string): EventEmitter; - setMaxListeners(n: number): void; - listeners(event: string): Function[]; - emit(event: string, ...args: any[]): boolean; - } -} - -declare module "http" { - import events = require("events"); - import net = require("net"); - import stream = require("stream"); - - export interface Server extends events.EventEmitter { - listen(port: number, hostname?: string, backlog?: number, callback?: Function): Server; - listen(path: string, callback?: Function): Server; - listen(handle: any, listeningListener?: Function): Server; - close(cb?: any): Server; - address(): { port: number; family: string; address: string; }; - maxHeadersCount: number; - } - export interface ServerRequest extends events.EventEmitter, stream.Readable { - method: string; - url: string; - headers: any; - trailers: string; - httpVersion: string; - setEncoding(encoding?: string): void; - pause(): void; - resume(): void; - connection: net.Socket; - } - export interface ServerResponse extends events.EventEmitter, stream.Writable { - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; - - writeContinue(): void; - writeHead(statusCode: number, reasonPhrase?: string, headers?: any): void; - writeHead(statusCode: number, headers?: any): void; - statusCode: number; - setHeader(name: string, value: string): void; - sendDate: boolean; - getHeader(name: string): string; - removeHeader(name: string): void; - write(chunk: any, encoding?: string): any; - addTrailers(headers: any): void; - - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; - } - export interface ClientRequest extends events.EventEmitter, stream.Writable { - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; - - write(chunk: any, encoding?: string): void; - abort(): void; - setTimeout(timeout: number, callback?: Function): void; - setNoDelay(noDelay?: boolean): void; - setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; - - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; - } - export interface ClientResponse extends events.EventEmitter, stream.Readable { - statusCode: number; - httpVersion: string; - headers: any; - trailers: any; - setEncoding(encoding?: string): void; - pause(): void; - resume(): void; - } - export interface Agent { maxSockets: number; sockets: any; requests: any; } - - export var STATUS_CODES: { - [errorCode: number]: string; - [errorCode: string]: string; - }; - export function createServer(requestListener?: (request: ServerRequest, response: ServerResponse) =>void ): Server; - export function createClient(port?: number, host?: string): any; - export function request(options: any, callback?: Function): ClientRequest; - export function get(options: any, callback?: Function): ClientRequest; - export var globalAgent: Agent; -} - -declare module "cluster" { - import child = require("child_process"); - import events = require("events"); - - export interface ClusterSettings { - exec?: string; - args?: string[]; - silent?: boolean; - } - - export class Worker extends events.EventEmitter { - id: string; - process: child.ChildProcess; - suicide: boolean; - send(message: any, sendHandle?: any): void; - kill(signal?: string): void; - destroy(signal?: string): void; - disconnect(): void; - } - - export var settings: ClusterSettings; - export var isMaster: boolean; - export var isWorker: boolean; - export function setupMaster(settings?: ClusterSettings): void; - export function fork(env?: any): Worker; - export function disconnect(callback?: Function): void; - export var worker: Worker; - export var workers: Worker[]; - - // Event emitter - export function addListener(event: string, listener: Function): void; - export function on(event: string, listener: Function): any; - export function once(event: string, listener: Function): void; - export function removeListener(event: string, listener: Function): void; - export function removeAllListeners(event?: string): void; - export function setMaxListeners(n: number): void; - export function listeners(event: string): Function[]; - export function emit(event: string, ...args: any[]): boolean; -} - -declare module "zlib" { - import stream = require("stream"); - export interface ZlibOptions { chunkSize?: number; windowBits?: number; level?: number; memLevel?: number; strategy?: number; dictionary?: any; } - - export interface Gzip extends stream.Transform { } - export interface Gunzip extends stream.Transform { } - export interface Deflate extends stream.Transform { } - export interface Inflate extends stream.Transform { } - export interface DeflateRaw extends stream.Transform { } - export interface InflateRaw extends stream.Transform { } - export interface Unzip extends stream.Transform { } - - export function createGzip(options?: ZlibOptions): Gzip; - export function createGunzip(options?: ZlibOptions): Gunzip; - export function createDeflate(options?: ZlibOptions): Deflate; - export function createInflate(options?: ZlibOptions): Inflate; - export function createDeflateRaw(options?: ZlibOptions): DeflateRaw; - export function createInflateRaw(options?: ZlibOptions): InflateRaw; - export function createUnzip(options?: ZlibOptions): Unzip; - - export function deflate(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - export function deflateRaw(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - export function gzip(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - export function gunzip(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - export function inflate(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - export function inflateRaw(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - export function unzip(buf: Buffer, callback: (error: Error, result: any) =>void ): void; - - // Constants - export var Z_NO_FLUSH: number; - export var Z_PARTIAL_FLUSH: number; - export var Z_SYNC_FLUSH: number; - export var Z_FULL_FLUSH: number; - export var Z_FINISH: number; - export var Z_BLOCK: number; - export var Z_TREES: number; - export var Z_OK: number; - export var Z_STREAM_END: number; - export var Z_NEED_DICT: number; - export var Z_ERRNO: number; - export var Z_STREAM_ERROR: number; - export var Z_DATA_ERROR: number; - export var Z_MEM_ERROR: number; - export var Z_BUF_ERROR: number; - export var Z_VERSION_ERROR: number; - export var Z_NO_COMPRESSION: number; - export var Z_BEST_SPEED: number; - export var Z_BEST_COMPRESSION: number; - export var Z_DEFAULT_COMPRESSION: number; - export var Z_FILTERED: number; - export var Z_HUFFMAN_ONLY: number; - export var Z_RLE: number; - export var Z_FIXED: number; - export var Z_DEFAULT_STRATEGY: number; - export var Z_BINARY: number; - export var Z_TEXT: number; - export var Z_ASCII: number; - export var Z_UNKNOWN: number; - export var Z_DEFLATED: number; - export var Z_NULL: number; -} - -declare module "os" { - export function tmpDir(): string; - export function hostname(): string; - export function type(): string; - export function platform(): string; - export function arch(): string; - export function release(): string; - export function uptime(): number; - export function loadavg(): number[]; - export function totalmem(): number; - export function freemem(): number; - export function cpus(): { model: string; speed: number; times: { user: number; nice: number; sys: number; idle: number; irq: number; }; }[]; - export function networkInterfaces(): any; - export var EOL: string; -} - -declare module "https" { - import tls = require("tls"); - import events = require("events"); - import http = require("http"); - - export interface ServerOptions { - pfx?: any; - key?: any; - passphrase?: string; - cert?: any; - ca?: any; - crl?: any; - ciphers?: string; - honorCipherOrder?: boolean; - requestCert?: boolean; - rejectUnauthorized?: boolean; - NPNProtocols?: any; - SNICallback?: (servername: string) => any; - } - - export interface RequestOptions { - host?: string; - hostname?: string; - port?: number; - path?: string; - method?: string; - headers?: any; - auth?: string; - agent?: any; - pfx?: any; - key?: any; - passphrase?: string; - cert?: any; - ca?: any; - ciphers?: string; - rejectUnauthorized?: boolean; - } - - export interface Agent { - maxSockets: number; - sockets: any; - requests: any; - } - export var Agent: { - new (options?: RequestOptions): Agent; - }; - export interface Server extends tls.Server { } - export function createServer(options: ServerOptions, requestListener?: Function): Server; - export function request(options: RequestOptions, callback?: (res: events.EventEmitter) =>void ): http.ClientRequest; - export function get(options: RequestOptions, callback?: (res: events.EventEmitter) =>void ): http.ClientRequest; - export var globalAgent: Agent; -} - -declare module "punycode" { - export function decode(string: string): string; - export function encode(string: string): string; - export function toUnicode(domain: string): string; - export function toASCII(domain: string): string; - export var ucs2: ucs2; - interface ucs2 { - decode(string: string): string; - encode(codePoints: number[]): string; - } - export var version: any; -} - -declare module "repl" { - import stream = require("stream"); - import events = require("events"); - - export interface ReplOptions { - prompt?: string; - input?: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - terminal?: boolean; - eval?: Function; - useColors?: boolean; - useGlobal?: boolean; - ignoreUndefined?: boolean; - writer?: Function; - } - export function start(options: ReplOptions): events.EventEmitter; -} - -declare module "readline" { - import events = require("events"); - import stream = require("stream"); - - export interface ReadLine extends events.EventEmitter { - setPrompt(prompt: string, length: number): void; - prompt(preserveCursor?: boolean): void; - question(query: string, callback: Function): void; - pause(): void; - resume(): void; - close(): void; - write(data: any, key?: any): void; - } - export interface ReadLineOptions { - input: NodeJS.ReadableStream; - output: NodeJS.WritableStream; - completer?: Function; - terminal?: boolean; - } - export function createInterface(options: ReadLineOptions): ReadLine; -} - -declare module "vm" { - export interface Context { } - export interface Script { - runInThisContext(): void; - runInNewContext(sandbox?: Context): void; - } - export function runInThisContext(code: string, filename?: string): void; - export function runInNewContext(code: string, sandbox?: Context, filename?: string): void; - export function runInContext(code: string, context: Context, filename?: string): void; - export function createContext(initSandbox?: Context): Context; - export function createScript(code: string, filename?: string): Script; -} - -declare module "child_process" { - import events = require("events"); - import stream = require("stream"); - - export interface ChildProcess extends events.EventEmitter { - stdin: stream.Writable; - stdout: stream.Readable; - stderr: stream.Readable; - pid: number; - kill(signal?: string): void; - send(message: any, sendHandle: any): void; - disconnect(): void; - } - - export function spawn(command: string, args?: string[], options?: { - cwd?: string; - stdio?: any; - custom?: any; - env?: any; - detached?: boolean; - }): ChildProcess; - export function exec(command: string, options: { - cwd?: string; - stdio?: any; - customFds?: any; - env?: any; - encoding?: string; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - }, callback: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; - export function exec(command: string, callback: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; - export function execFile(file: string, args: string[], options: { - cwd?: string; - stdio?: any; - customFds?: any; - env?: any; - encoding?: string; - timeout?: number; - maxBuffer?: string; - killSignal?: string; - }, callback: (error: Error, stdout: Buffer, stderr: Buffer) =>void ): ChildProcess; - export function fork(modulePath: string, args?: string[], options?: { - cwd?: string; - env?: any; - encoding?: string; - }): ChildProcess; -} - -declare module "url" { - export interface Url { - href: string; - protocol: string; - auth: string; - hostname: string; - port: string; - host: string; - pathname: string; - search: string; - query: string; - slashes: boolean; - hash?: string; - path?: string; - } - - export interface UrlOptions { - protocol?: string; - auth?: string; - hostname?: string; - port?: string; - host?: string; - pathname?: string; - search?: string; - query?: any; - hash?: string; - path?: string; - } - - export function parse(urlStr: string, parseQueryString?: boolean , slashesDenoteHost?: boolean ): Url; - export function format(url: UrlOptions): string; - export function resolve(from: string, to: string): string; -} - -declare module "dns" { - export function lookup(domain: string, family: number, callback: (err: Error, address: string, family: number) =>void ): string; - export function lookup(domain: string, callback: (err: Error, address: string, family: number) =>void ): string; - export function resolve(domain: string, rrtype: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolve(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolve4(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolve6(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolveMx(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolveTxt(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolveSrv(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolveNs(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function resolveCname(domain: string, callback: (err: Error, addresses: string[]) =>void ): string[]; - export function reverse(ip: string, callback: (err: Error, domains: string[]) =>void ): string[]; -} - -declare module "net" { - import stream = require("stream"); - - export interface Socket extends stream.Duplex { - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; - - connect(port: number, host?: string, connectionListener?: Function): void; - connect(path: string, connectionListener?: Function): void; - bufferSize: number; - setEncoding(encoding?: string): void; - write(data: any, encoding?: string, callback?: Function): void; - destroy(): void; - pause(): void; - resume(): void; - setTimeout(timeout: number, callback?: Function): void; - setNoDelay(noDelay?: boolean): void; - setKeepAlive(enable?: boolean, initialDelay?: number): void; - address(): { port: number; family: string; address: string; }; - remoteAddress: string; - remotePort: number; - bytesRead: number; - bytesWritten: number; - - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; - } - - export var Socket: { - new (options?: { fd?: string; type?: string; allowHalfOpen?: boolean; }): Socket; - }; - - export interface Server extends Socket { - listen(port: number, host?: string, backlog?: number, listeningListener?: Function): Server; - listen(path: string, listeningListener?: Function): Server; - listen(handle: any, listeningListener?: Function): Server; - close(callback?: Function): Server; - address(): { port: number; family: string; address: string; }; - maxConnections: number; - connections: number; - } - export function createServer(connectionListener?: (socket: Socket) =>void ): Server; - export function createServer(options?: { allowHalfOpen?: boolean; }, connectionListener?: (socket: Socket) =>void ): Server; - export function connect(options: { allowHalfOpen?: boolean; }, connectionListener?: Function): Socket; - export function connect(port: number, host?: string, connectionListener?: Function): Socket; - export function connect(path: string, connectionListener?: Function): Socket; - export function createConnection(options: { allowHalfOpen?: boolean; }, connectionListener?: Function): Socket; - export function createConnection(port: number, host?: string, connectionListener?: Function): Socket; - export function createConnection(path: string, connectionListener?: Function): Socket; - export function isIP(input: string): number; - export function isIPv4(input: string): boolean; - export function isIPv6(input: string): boolean; -} - -declare module "dgram" { - import events = require("events"); - - export function createSocket(type: string, callback?: Function): Socket; - - interface Socket extends events.EventEmitter { - send(buf: Buffer, offset: number, length: number, port: number, address: string, callback?: Function): void; - bind(port: number, address?: string): void; - close(): void; - address: { address: string; family: string; port: number; }; - setBroadcast(flag: boolean): void; - setMulticastTTL(ttl: number): void; - setMulticastLoopback(flag: boolean): void; - addMembership(multicastAddress: string, multicastInterface?: string): void; - dropMembership(multicastAddress: string, multicastInterface?: string): void; - } -} - -declare module "fs" { - import stream = require("stream"); - import events = require("events"); - - interface Stats { - isFile(): boolean; - isDirectory(): boolean; - isBlockDevice(): boolean; - isCharacterDevice(): boolean; - isSymbolicLink(): boolean; - isFIFO(): boolean; - isSocket(): boolean; - dev: number; - ino: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - size: number; - blksize: number; - blocks: number; - atime: Date; - mtime: Date; - ctime: Date; - } - - interface FSWatcher extends events.EventEmitter { - close(): void; - } - - export interface ReadStream extends stream.Readable {} - export interface WriteStream extends stream.Writable {} - - export function rename(oldPath: string, newPath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function renameSync(oldPath: string, newPath: string): void; - export function truncate(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function truncate(path: string, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function truncateSync(path: string, len?: number): void; - export function ftruncate(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function ftruncate(fd: number, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function ftruncateSync(fd: number, len?: number): void; - export function chown(path: string, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chownSync(path: string, uid: number, gid: number): void; - export function fchown(fd: number, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchownSync(fd: number, uid: number, gid: number): void; - export function lchown(path: string, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchownSync(path: string, uid: number, gid: number): void; - export function chmod(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chmod(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chmodSync(path: string, mode: number): void; - export function chmodSync(path: string, mode: string): void; - export function fchmod(fd: number, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchmod(fd: number, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchmodSync(fd: number, mode: number): void; - export function fchmodSync(fd: number, mode: string): void; - export function lchmod(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchmod(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchmodSync(path: string, mode: number): void; - export function lchmodSync(path: string, mode: string): void; - export function stat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function lstat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function fstat(fd: number, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function statSync(path: string): Stats; - export function lstatSync(path: string): Stats; - export function fstatSync(fd: number): Stats; - export function link(srcpath: string, dstpath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function linkSync(srcpath: string, dstpath: string): void; - export function symlink(srcpath: string, dstpath: string, type?: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function symlinkSync(srcpath: string, dstpath: string, type?: string): void; - export function readlink(path: string, callback?: (err: NodeJS.ErrnoException, linkString: string) => any): void; - export function readlinkSync(path: string): string; - export function realpath(path: string, callback?: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; - export function realpath(path: string, cache: {[path: string]: string}, callback: (err: NodeJS.ErrnoException, resolvedPath: string) =>any): void; - export function realpathSync(path: string, cache?: {[path: string]: string}): string; - export function unlink(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function unlinkSync(path: string): void; - export function rmdir(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function rmdirSync(path: string): void; - export function mkdir(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function mkdir(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function mkdir(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function mkdirSync(path: string, mode?: number): void; - export function mkdirSync(path: string, mode?: string): void; - export function readdir(path: string, callback?: (err: NodeJS.ErrnoException, files: string[]) => void): void; - export function readdirSync(path: string): string[]; - export function close(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function closeSync(fd: number): void; - export function open(path: string, flags: string, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; - export function open(path: string, flags: string, mode: number, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; - export function open(path: string, flags: string, mode: string, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; - export function openSync(path: string, flags: string, mode?: number): number; - export function openSync(path: string, flags: string, mode?: string): number; - export function utimes(path: string, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function utimes(path: string, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function utimesSync(path: string, atime: number, mtime: number): void; - export function utimesSync(path: string, atime: Date, mtime: Date): void; - export function futimes(fd: number, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function futimesSync(fd: number, atime: number, mtime: number): void; - export function futimesSync(fd: number, atime: Date, mtime: Date): void; - export function fsync(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fsyncSync(fd: number): void; - export function write(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; - export function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number; - export function read(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: Buffer) => void): void; - export function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number; - export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void ): void; - export function readFileSync(filename: string, encoding: string): string; - export function readFileSync(filename: string, options: { encoding: string; flag?: string; }): string; - export function readFileSync(filename: string, options?: { flag?: string; }): Buffer; - export function writeFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; - export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; - export function watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void; - export function watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void; - export function unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void; - export function watch(filename: string, listener?: (event: string, filename: string) => any): FSWatcher; - export function watch(filename: string, options: { persistent?: boolean; }, listener?: (event: string, filename: string) => any): FSWatcher; - export function exists(path: string, callback?: (exists: boolean) => void): void; - export function existsSync(path: string): boolean; - export function createReadStream(path: string, options?: { - flags?: string; - encoding?: string; - fd?: string; - mode?: number; - bufferSize?: number; - }): ReadStream; - export function createReadStream(path: string, options?: { - flags?: string; - encoding?: string; - fd?: string; - mode?: string; - bufferSize?: number; - }): ReadStream; - export function createWriteStream(path: string, options?: { - flags?: string; - encoding?: string; - string?: string; - }): WriteStream; -} - -declare module "path" { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; -} - -declare module "string_decoder" { - export interface NodeStringDecoder { - write(buffer: Buffer): string; - detectIncompleteChar(buffer: Buffer): number; - } - export var StringDecoder: { - new (encoding: string): NodeStringDecoder; - }; -} - -declare module "tls" { - import crypto = require("crypto"); - import net = require("net"); - import stream = require("stream"); - - var CLIENT_RENEG_LIMIT: number; - var CLIENT_RENEG_WINDOW: number; - - export interface TlsOptions { - pfx?: any; //string or buffer - key?: any; //string or buffer - passphrase?: string; - cert?: any; - ca?: any; //string or buffer - crl?: any; //string or string array - ciphers?: string; - honorCipherOrder?: any; - requestCert?: boolean; - rejectUnauthorized?: boolean; - NPNProtocols?: any; //array or Buffer; - SNICallback?: (servername: string) => any; - } - - export interface ConnectionOptions { - host?: string; - port?: number; - socket?: net.Socket; - pfx?: any; //string | Buffer - key?: any; //string | Buffer - passphrase?: string; - cert?: any; //string | Buffer - ca?: any; //Array of string | Buffer - rejectUnauthorized?: boolean; - NPNProtocols?: any; //Array of string | Buffer - servername?: string; - } - - export interface Server extends net.Server { - // Extended base methods - listen(port: number, host?: string, backlog?: number, listeningListener?: Function): Server; - listen(path: string, listeningListener?: Function): Server; - listen(handle: any, listeningListener?: Function): Server; - - listen(port: number, host?: string, callback?: Function): Server; - close(): Server; - address(): { port: number; family: string; address: string; }; - addContext(hostName: string, credentials: { - key: string; - cert: string; - ca: string; - }): void; - maxConnections: number; - connections: number; - } - - export interface ClearTextStream extends stream.Duplex { - authorized: boolean; - authorizationError: Error; - getPeerCertificate(): any; - getCipher: { - name: string; - version: string; - }; - address: { - port: number; - family: string; - address: string; - }; - remoteAddress: string; - remotePort: number; - } - - export interface SecurePair { - encrypted: any; - cleartext: any; - } - - export function createServer(options: TlsOptions, secureConnectionListener?: (cleartextStream: ClearTextStream) =>void ): Server; - export function connect(options: TlsOptions, secureConnectionListener?: () =>void ): ClearTextStream; - export function connect(port: number, host?: string, options?: ConnectionOptions, secureConnectListener?: () =>void ): ClearTextStream; - export function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () =>void ): ClearTextStream; - export function createSecurePair(credentials?: crypto.Credentials, isServer?: boolean, requestCert?: boolean, rejectUnauthorized?: boolean): SecurePair; -} - -declare module "crypto" { - export interface CredentialDetails { - pfx: string; - key: string; - passphrase: string; - cert: string; - ca: any; //string | string array - crl: any; //string | string array - ciphers: string; - } - export interface Credentials { context?: any; } - export function createCredentials(details: CredentialDetails): Credentials; - export function createHash(algorithm: string): Hash; - export function createHmac(algorithm: string, key: string): Hmac; - interface Hash { - update(data: any, input_encoding?: string): Hash; - digest(encoding?: string): string; - } - interface Hmac { - update(data: any, input_encoding?: string): Hmac; - digest(encoding?: string): string; - } - export function createCipher(algorithm: string, password: any): Cipher; - export function createCipheriv(algorithm: string, key: any, iv: any): Cipher; - interface Cipher { - update(data: any, input_encoding?: string, output_encoding?: string): string; - final(output_encoding?: string): string; - setAutoPadding(auto_padding: boolean): void; - createDecipher(algorithm: string, password: any): Decipher; - createDecipheriv(algorithm: string, key: any, iv: any): Decipher; - } - interface Decipher { - update(data: any, input_encoding?: string, output_encoding?: string): void; - final(output_encoding?: string): string; - setAutoPadding(auto_padding: boolean): void; - } - export function createSign(algorithm: string): Signer; - interface Signer { - update(data: any): void; - sign(private_key: string, output_format: string): string; - } - export function createVerify(algorithm: string): Verify; - interface Verify { - update(data: any): void; - verify(object: string, signature: string, signature_format?: string): boolean; - } - export function createDiffieHellman(prime_length: number): DiffieHellman; - export function createDiffieHellman(prime: number, encoding?: string): DiffieHellman; - interface DiffieHellman { - generateKeys(encoding?: string): string; - computeSecret(other_public_key: string, input_encoding?: string, output_encoding?: string): string; - getPrime(encoding?: string): string; - getGenerator(encoding: string): string; - getPublicKey(encoding?: string): string; - getPrivateKey(encoding?: string): string; - setPublicKey(public_key: string, encoding?: string): void; - setPrivateKey(public_key: string, encoding?: string): void; - } - export function getDiffieHellman(group_name: string): DiffieHellman; - export function pbkdf2(password: string, salt: string, iterations: number, keylen: number, callback: (err: Error, derivedKey: string) => any): void; - export function pbkdf2Sync(password: string, salt: string, iterations: number, keylen: number) : Buffer; - export function randomBytes(size: number): Buffer; - export function randomBytes(size: number, callback: (err: Error, buf: Buffer) =>void ): void; - export function pseudoRandomBytes(size: number): Buffer; - export function pseudoRandomBytes(size: number, callback: (err: Error, buf: Buffer) =>void ): void; -} - -declare module "stream" { - import events = require("events"); - - export interface ReadableOptions { - highWaterMark?: number; - encoding?: string; - objectMode?: boolean; - } - - export class Readable extends events.EventEmitter implements NodeJS.ReadableStream { - readable: boolean; - constructor(opts?: ReadableOptions); - _read(size: number): void; - read(size?: number): any; - setEncoding(encoding: string): void; - pause(): void; - resume(): void; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): void; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: NodeJS.ReadableStream): NodeJS.ReadableStream; - push(chunk: any, encoding?: string): boolean; - } - - export interface WritableOptions { - highWaterMark?: number; - decodeStrings?: boolean; - } - - export class Writable extends events.EventEmitter implements NodeJS.WritableStream { - writable: boolean; - constructor(opts?: WritableOptions); - _write(data: Buffer, encoding: string, callback: Function): void; - _write(data: string, encoding: string, callback: Function): void; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface DuplexOptions extends ReadableOptions, WritableOptions { - allowHalfOpen?: boolean; - } - - // Note: Duplex extends both Readable and Writable. - export class Duplex extends Readable implements NodeJS.ReadWriteStream { - writable: boolean; - constructor(opts?: DuplexOptions); - _write(data: Buffer, encoding: string, callback: Function): void; - _write(data: string, encoding: string, callback: Function): void; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface TransformOptions extends ReadableOptions, WritableOptions {} - - // Note: Transform lacks the _read and _write methods of Readable/Writable. - export class Transform extends events.EventEmitter implements NodeJS.ReadWriteStream { - readable: boolean; - writable: boolean; - constructor(opts?: TransformOptions); - _transform(chunk: Buffer, encoding: string, callback: Function): void; - _transform(chunk: string, encoding: string, callback: Function): void; - _flush(callback: Function): void; - read(size?: number): any; - setEncoding(encoding: string): void; - pause(): void; - resume(): void; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): void; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: NodeJS.ReadableStream): NodeJS.ReadableStream; - push(chunk: any, encoding?: string): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export class PassThrough extends Transform {} -} - -declare module "util" { - export interface InspectOptions { - showHidden?: boolean; - depth?: number; - colors?: boolean; - customInspect?: boolean; - } - - export function format(format: any, ...param: any[]): string; - export function debug(string: string): void; - export function error(...param: any[]): void; - export function puts(...param: any[]): void; - export function print(...param: any[]): void; - export function log(string: string): void; - export function inspect(object: any, showHidden?: boolean, depth?: number, color?: boolean): string; - export function inspect(object: any, options: InspectOptions): string; - export function isArray(object: any): boolean; - export function isRegExp(object: any): boolean; - export function isDate(object: any): boolean; - export function isError(object: any): boolean; - export function inherits(constructor: any, superConstructor: any): void; -} - -declare module "assert" { - function internal (value: any, message?: string): void; - module internal { - export class AssertionError implements Error { - name: string; - message: string; - actual: any; - expected: any; - operator: string; - generatedMessage: boolean; - - constructor(options?: {message?: string; actual?: any; expected?: any; - operator?: string; stackStartFunction?: Function}); - } - - export function fail(actual?: any, expected?: any, message?: string, operator?: string): void; - export function ok(value: any, message?: string): void; - export function equal(actual: any, expected: any, message?: string): void; - export function notEqual(actual: any, expected: any, message?: string): void; - export function deepEqual(actual: any, expected: any, message?: string): void; - export function notDeepEqual(actual: any, expected: any, message?: string): void; - export function strictEqual(actual: any, expected: any, message?: string): void; - export function notStrictEqual(actual: any, expected: any, message?: string): void; - export var throws: { - (block: Function, message?: string): void; - (block: Function, error: Function, message?: string): void; - (block: Function, error: RegExp, message?: string): void; - (block: Function, error: (err: any) => boolean, message?: string): void; - }; - - export var doesNotThrow: { - (block: Function, message?: string): void; - (block: Function, error: Function, message?: string): void; - (block: Function, error: RegExp, message?: string): void; - (block: Function, error: (err: any) => boolean, message?: string): void; - }; - - export function ifError(value: any): void; - } - - export = internal; -} - -declare module "tty" { - import net = require("net"); - - export function isatty(fd: number): boolean; - export interface ReadStream extends net.Socket { - isRaw: boolean; - setRawMode(mode: boolean): void; - } - export interface WriteStream extends net.Socket { - columns: number; - rows: number; - } -} - -declare module "domain" { - import events = require("events"); - - export class Domain extends events.EventEmitter { - run(fn: Function): void; - add(emitter: events.EventEmitter): void; - remove(emitter: events.EventEmitter): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - dispose(): void; - - addListener(event: string, listener: Function): Domain; - on(event: string, listener: Function): Domain; - once(event: string, listener: Function): Domain; - removeListener(event: string, listener: Function): Domain; - removeAllListeners(event?: string): Domain; - } - - export function create(): Domain; -} \ No newline at end of file diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 985d00bcf63..6afb0cfccdb 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -18,12 +18,13 @@ /// /// /// -/// -/// -/// /// /// /// +/// +/// +/// + // Block scoped definitions work poorly for global variables, temporarily enable var /* tslint:disable:no-var-keyword */ @@ -32,7 +33,13 @@ var _chai: typeof chai = require("chai"); var assert: typeof _chai.assert = _chai.assert; declare var __dirname: string; // Node-specific -var global = Function("return this").call(undefined); +var global: NodeJS.Global = Function("return this").call(undefined); +declare namespace NodeJS { + export interface Global { + WScript: typeof WScript; + ActiveXObject: typeof ActiveXObject; + } +} /* tslint:enable:no-var-keyword */ namespace Utils { @@ -57,7 +64,7 @@ namespace Utils { export let currentExecutionEnvironment = getExecutionEnvironment(); - const Buffer: BufferConstructor = currentExecutionEnvironment !== ExecutionEnvironment.Browser + const Buffer: typeof global.Buffer = currentExecutionEnvironment !== ExecutionEnvironment.Browser ? require("buffer").Buffer : undefined; diff --git a/src/harness/tsconfig.json b/src/harness/tsconfig.json new file mode 100644 index 00000000000..ee6a4ebe866 --- /dev/null +++ b/src/harness/tsconfig.json @@ -0,0 +1,93 @@ +{ + "compilerOptions": { + "noImplicitAny": true, + "pretty": true, + "removeComments": false, + "preserveConstEnums": true, + "outFile": "../../built/local/run.js", + "sourceMap": true, + "declaration": false, + "stripInternal": true, + "types": [ + "node", "mocha", "chai" + ] + }, + "files": [ + "../compiler/core.ts", + "../compiler/sys.ts", + "../compiler/types.ts", + "../compiler/scanner.ts", + "../compiler/parser.ts", + "../compiler/utilities.ts", + "../compiler/binder.ts", + "../compiler/checker.ts", + "../compiler/sourcemap.ts", + "../compiler/declarationEmitter.ts", + "../compiler/emitter.ts", + "../compiler/program.ts", + "../compiler/commandLineParser.ts", + "../compiler/diagnosticInformationMap.generated.ts", + "../services/breakpoints.ts", + "../services/navigateTo.ts", + "../services/navigationBar.ts", + "../services/outliningElementsCollector.ts", + "../services/patternMatcher.ts", + "../services/services.ts", + "../services/shims.ts", + "../services/signatureHelp.ts", + "../services/utilities.ts", + "../services/jsTyping.ts", + "../services/formatting/formatting.ts", + "../services/formatting/formattingContext.ts", + "../services/formatting/formattingRequestKind.ts", + "../services/formatting/formattingScanner.ts", + "../services/formatting/references.ts", + "../services/formatting/rule.ts", + "../services/formatting/ruleAction.ts", + "../services/formatting/ruleDescriptor.ts", + "../services/formatting/ruleFlag.ts", + "../services/formatting/ruleOperation.ts", + "../services/formatting/ruleOperationContext.ts", + "../services/formatting/rules.ts", + "../services/formatting/rulesMap.ts", + "../services/formatting/rulesProvider.ts", + "../services/formatting/smartIndenter.ts", + "../services/formatting/tokenRange.ts", + "harness.ts", + "sourceMapRecorder.ts", + "harnessLanguageService.ts", + "fourslash.ts", + "runnerbase.ts", + "compilerRunner.ts", + "typeWriter.ts", + "fourslashRunner.ts", + "projectsRunner.ts", + "loggedIO.ts", + "rwcRunner.ts", + "test262Runner.ts", + "runner.ts", + "../server/protocol.d.ts", + "../server/session.ts", + "../server/client.ts", + "../server/editorServices.ts", + "../../tests/cases/unittests/incrementalParser.ts", + "../../tests/cases/unittests/jsDocParsing.ts", + "../../tests/cases/unittests/services/colorization.ts", + "../../tests/cases/unittests/services/documentRegistry.ts", + "../../tests/cases/unittests/services/preProcessFile.ts", + "../../tests/cases/unittests/services/patternMatcher.ts", + "../../tests/cases/unittests/session.ts", + "../../tests/cases/unittests/versionCache.ts", + "../../tests/cases/unittests/convertToBase64.ts", + "../../tests/cases/unittests/transpile.ts", + "../../tests/cases/unittests/reuseProgramStructure.ts", + "../../tests/cases/unittests/cachingInServerLSHost.ts", + "../../tests/cases/unittests/moduleResolution.ts", + "../../tests/cases/unittests/tsconfigParsing.ts", + "../../tests/cases/unittests/commandLineParsing.ts", + "../../tests/cases/unittests/convertCompilerOptionsFromJson.ts", + "../../tests/cases/unittests/convertTypingOptionsFromJson.ts", + "../../tests/cases/unittests/tsserverProjectSystem.ts", + "../../tests/cases/unittests/matchFiles.ts" + ] +} diff --git a/src/server/node.d.ts b/src/server/node.d.ts deleted file mode 100644 index 0bde0bb6602..00000000000 --- a/src/server/node.d.ts +++ /dev/null @@ -1,682 +0,0 @@ -// Type definitions for Node.js v0.10.1 -// Project: http://nodejs.org/ -// Definitions by: Microsoft TypeScript , DefinitelyTyped -// Definitions: https://github.com/borisyankov/DefinitelyTyped - -/************************************************ -* * -* Node.js v0.10.1 API * -* * -************************************************/ - -/************************************************ -* * -* GLOBAL * -* * -************************************************/ -declare var process: NodeJS.Process; -declare var global: any; - -declare var __filename: string; -declare var __dirname: string; - -declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -declare function clearTimeout(timeoutId: NodeJS.Timer): void; -declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -declare function clearInterval(intervalId: NodeJS.Timer): void; -declare function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; -declare function clearImmediate(immediateId: any): void; - -declare var require: { - (id: string): any; - resolve(id: string): string; - cache: any; - extensions: any; - main: any; -}; - -declare var module: { - exports: any; - require(id: string): any; - id: string; - filename: string; - loaded: boolean; - parent: any; - children: any[]; -}; - -// Same as module.exports -declare var exports: any; -declare var SlowBuffer: { - new (str: string, encoding?: string): Buffer; - new (size: number): Buffer; - new (size: Uint8Array): Buffer; - new (array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; -}; - - -// Buffer class -interface Buffer extends NodeBuffer { } -interface BufferConstructor { - new (str: string, encoding?: string): Buffer; - new (size: number): Buffer; - new (size: Uint8Array): Buffer; - new (array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; -} -declare var Buffer: BufferConstructor; - -/************************************************ -* * -* GLOBAL INTERFACES * -* * -************************************************/ -declare namespace NodeJS { - export interface ErrnoException extends Error { - errno?: any; - code?: string; - path?: string; - syscall?: string; - } - - export interface EventEmitter { - addListener(event: string, listener: Function): EventEmitter; - on(event: string, listener: Function): EventEmitter; - once(event: string, listener: Function): EventEmitter; - removeListener(event: string, listener: Function): EventEmitter; - removeAllListeners(event?: string): EventEmitter; - setMaxListeners(n: number): void; - listeners(event: string): Function[]; - emit(event: string, ...args: any[]): boolean; - } - - export interface ReadableStream extends EventEmitter { - readable: boolean; - read(size?: number): any; - setEncoding(encoding: string): void; - pause(): void; - resume(): void; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): void; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: ReadableStream): ReadableStream; - } - - export interface WritableStream extends EventEmitter { - writable: boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface ReadWriteStream extends ReadableStream, WritableStream { } - - interface WindowSize { - columns: number; - rows: number; - } - - export interface Process extends EventEmitter { - stdout: WritableStream & WindowSize; - stderr: WritableStream & WindowSize; - stdin: ReadableStream; - argv: string[]; - execPath: string; - abort(): void; - chdir(directory: string): void; - cwd(): string; - env: any; - exit(code?: number): void; - getgid(): number; - setgid(id: number): void; - setgid(id: string): void; - getuid(): number; - setuid(id: number): void; - setuid(id: string): void; - version: string; - versions: { - http_parser: string; - node: string; - v8: string; - ares: string; - uv: string; - zlib: string; - openssl: string; - }; - config: { - target_defaults: { - cflags: any[]; - default_configuration: string; - defines: string[]; - include_dirs: string[]; - libraries: string[]; - }; - variables: { - clang: number; - host_arch: string; - node_install_npm: boolean; - node_install_waf: boolean; - node_prefix: string; - node_shared_openssl: boolean; - node_shared_v8: boolean; - node_shared_zlib: boolean; - node_use_dtrace: boolean; - node_use_etw: boolean; - node_use_openssl: boolean; - target_arch: string; - v8_no_strict_aliasing: number; - v8_use_snapshot: boolean; - visibility: string; - }; - }; - kill(pid: number, signal?: string): void; - pid: number; - title: string; - arch: string; - platform: string; - memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; }; - nextTick(callback: Function): void; - umask(mask?: number): number; - uptime(): number; - hrtime(time?: number[]): number[]; - - // Worker - send? (message: any, sendHandle?: any): void; - } - - export interface Timer { - ref(): void; - unref(): void; - } -} - - -/** - * @deprecated - */ -interface NodeBuffer { - [index: number]: number; - write(string: string, offset?: number, length?: number, encoding?: string): number; - toString(encoding?: string, start?: number, end?: number): string; - toJSON(): any; - length: number; - copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; - slice(start?: number, end?: number): Buffer; - readUInt8(offset: number, noAsset?: boolean): number; - readUInt16LE(offset: number, noAssert?: boolean): number; - readUInt16BE(offset: number, noAssert?: boolean): number; - readUInt32LE(offset: number, noAssert?: boolean): number; - readUInt32BE(offset: number, noAssert?: boolean): number; - readInt8(offset: number, noAssert?: boolean): number; - readInt16LE(offset: number, noAssert?: boolean): number; - readInt16BE(offset: number, noAssert?: boolean): number; - readInt32LE(offset: number, noAssert?: boolean): number; - readInt32BE(offset: number, noAssert?: boolean): number; - readFloatLE(offset: number, noAssert?: boolean): number; - readFloatBE(offset: number, noAssert?: boolean): number; - readDoubleLE(offset: number, noAssert?: boolean): number; - readDoubleBE(offset: number, noAssert?: boolean): number; - writeUInt8(value: number, offset: number, noAssert?: boolean): void; - writeUInt16LE(value: number, offset: number, noAssert?: boolean): void; - writeUInt16BE(value: number, offset: number, noAssert?: boolean): void; - writeUInt32LE(value: number, offset: number, noAssert?: boolean): void; - writeUInt32BE(value: number, offset: number, noAssert?: boolean): void; - writeInt8(value: number, offset: number, noAssert?: boolean): void; - writeInt16LE(value: number, offset: number, noAssert?: boolean): void; - writeInt16BE(value: number, offset: number, noAssert?: boolean): void; - writeInt32LE(value: number, offset: number, noAssert?: boolean): void; - writeInt32BE(value: number, offset: number, noAssert?: boolean): void; - writeFloatLE(value: number, offset: number, noAssert?: boolean): void; - writeFloatBE(value: number, offset: number, noAssert?: boolean): void; - writeDoubleLE(value: number, offset: number, noAssert?: boolean): void; - writeDoubleBE(value: number, offset: number, noAssert?: boolean): void; - fill(value: any, offset?: number, end?: number): void; -} - -declare namespace NodeJS { - export interface Path { - normalize(p: string): string; - join(...paths: any[]): string; - resolve(...pathSegments: any[]): string; - relative(from: string, to: string): string; - dirname(p: string): string; - basename(p: string, ext?: string): string; - extname(p: string): string; - sep: string; - } -} - -declare namespace NodeJS { - export interface ReadLineInstance extends EventEmitter { - setPrompt(prompt: string, length: number): void; - prompt(preserveCursor?: boolean): void; - question(query: string, callback: Function): void; - pause(): void; - resume(): void; - close(): void; - write(data: any, key?: any): void; - } - export interface ReadLineOptions { - input: NodeJS.ReadableStream; - output: NodeJS.WritableStream; - completer?: Function; - terminal?: boolean; - } - - export interface ReadLine { - createInterface(options: ReadLineOptions): ReadLineInstance; - } -} - -declare namespace NodeJS { - namespace events { - export class EventEmitter implements NodeJS.EventEmitter { - static listenerCount(emitter: EventEmitter, event: string): number; - - addListener(event: string, listener: Function): EventEmitter; - on(event: string, listener: Function): EventEmitter; - once(event: string, listener: Function): EventEmitter; - removeListener(event: string, listener: Function): EventEmitter; - removeAllListeners(event?: string): EventEmitter; - setMaxListeners(n: number): void; - listeners(event: string): Function[]; - emit(event: string, ...args: any[]): boolean; - } - } -} - -declare namespace NodeJS { - namespace stream { - - export interface Stream extends events.EventEmitter { - pipe(destination: T, options?: { end?: boolean; }): T; - } - - export interface ReadableOptions { - highWaterMark?: number; - encoding?: string; - objectMode?: boolean; - } - - export class Readable extends events.EventEmitter implements NodeJS.ReadableStream { - readable: boolean; - constructor(opts?: ReadableOptions); - _read(size: number): void; - read(size?: number): any; - setEncoding(encoding: string): void; - pause(): void; - resume(): void; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): void; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: NodeJS.ReadableStream): NodeJS.ReadableStream; - push(chunk: any, encoding?: string): boolean; - } - - export interface WritableOptions { - highWaterMark?: number; - decodeStrings?: boolean; - } - - export class Writable extends events.EventEmitter implements NodeJS.WritableStream { - writable: boolean; - constructor(opts?: WritableOptions); - _write(data: Buffer, encoding: string, callback: Function): void; - _write(data: string, encoding: string, callback: Function): void; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface DuplexOptions extends ReadableOptions, WritableOptions { - allowHalfOpen?: boolean; - } - - // Note: Duplex extends both Readable and Writable. - export class Duplex extends Readable implements NodeJS.ReadWriteStream { - writable: boolean; - constructor(opts?: DuplexOptions); - _write(data: Buffer, encoding: string, callback: Function): void; - _write(data: string, encoding: string, callback: Function): void; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export interface TransformOptions extends ReadableOptions, WritableOptions { } - - // Note: Transform lacks the _read and _write methods of Readable/Writable. - export class Transform extends events.EventEmitter implements NodeJS.ReadWriteStream { - readable: boolean; - writable: boolean; - constructor(opts?: TransformOptions); - _transform(chunk: Buffer, encoding: string, callback: Function): void; - _transform(chunk: string, encoding: string, callback: Function): void; - _flush(callback: Function): void; - read(size?: number): any; - setEncoding(encoding: string): void; - pause(): void; - resume(): void; - pipe(destination: T, options?: { end?: boolean; }): T; - unpipe(destination?: T): void; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: NodeJS.ReadableStream): NodeJS.ReadableStream; - push(chunk: any, encoding?: string): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } - - export class PassThrough extends Transform { } - } -} - -declare namespace NodeJS { - namespace fs { - interface Stats { - isFile(): boolean; - isDirectory(): boolean; - isBlockDevice(): boolean; - isCharacterDevice(): boolean; - isSymbolicLink(): boolean; - isFIFO(): boolean; - isSocket(): boolean; - dev: number; - ino: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - size: number; - blksize: number; - blocks: number; - atime: Date; - mtime: Date; - ctime: Date; - } - interface FSWatcher extends events.EventEmitter { - close(): void; - } - - export interface ReadStream extends stream.Readable { } - export interface WriteStream extends stream.Writable { } - - export function rename(oldPath: string, newPath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function renameSync(oldPath: string, newPath: string): void; - export function truncate(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function truncate(path: string, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function truncateSync(path: string, len?: number): void; - export function ftruncate(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function ftruncate(fd: number, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function ftruncateSync(fd: number, len?: number): void; - export function chown(path: string, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chownSync(path: string, uid: number, gid: number): void; - export function fchown(fd: number, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchownSync(fd: number, uid: number, gid: number): void; - export function lchown(path: string, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchownSync(path: string, uid: number, gid: number): void; - export function chmod(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chmod(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function chmodSync(path: string, mode: number): void; - export function chmodSync(path: string, mode: string): void; - export function fchmod(fd: number, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchmod(fd: number, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fchmodSync(fd: number, mode: number): void; - export function fchmodSync(fd: number, mode: string): void; - export function lchmod(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchmod(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function lchmodSync(path: string, mode: number): void; - export function lchmodSync(path: string, mode: string): void; - export function stat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function lstat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function fstat(fd: number, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; - export function statSync(path: string): Stats; - export function lstatSync(path: string): Stats; - export function fstatSync(fd: number): Stats; - export function link(srcpath: string, dstpath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function linkSync(srcpath: string, dstpath: string): void; - export function symlink(srcpath: string, dstpath: string, type?: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function symlinkSync(srcpath: string, dstpath: string, type?: string): void; - export function readlink(path: string, callback?: (err: NodeJS.ErrnoException, linkString: string) => any): void; - export function readlinkSync(path: string): string; - export function realpath(path: string, callback?: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; - export function realpath(path: string, cache: { [path: string]: string }, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; - export function realpathSync(path: string, cache?: { [path: string]: string }): string; - export function unlink(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function unlinkSync(path: string): void; - export function rmdir(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function rmdirSync(path: string): void; - export function mkdir(path: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function mkdir(path: string, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function mkdir(path: string, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function mkdirSync(path: string, mode?: number): void; - export function mkdirSync(path: string, mode?: string): void; - export function readdir(path: string, callback?: (err: NodeJS.ErrnoException, files: string[]) => void): void; - export function readdirSync(path: string): string[]; - export function close(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function closeSync(fd: number): void; - export function open(path: string, flags: string, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; - export function open(path: string, flags: string, mode: number, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; - export function open(path: string, flags: string, mode: string, callback?: (err: NodeJS.ErrnoException, fd: number) => any): void; - export function openSync(path: string, flags: string, mode?: number): number; - export function openSync(path: string, flags: string, mode?: string): number; - export function utimes(path: string, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function utimes(path: string, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function utimesSync(path: string, atime: number, mtime: number): void; - export function utimesSync(path: string, atime: Date, mtime: Date): void; - export function futimes(fd: number, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function futimesSync(fd: number, atime: number, mtime: number): void; - export function futimesSync(fd: number, atime: Date, mtime: Date): void; - export function fsync(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; - export function fsyncSync(fd: number): void; - export function write(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; - export function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number; - export function read(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: Buffer) => void): void; - export function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number; - export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - export function readFileSync(filename: string, encoding: string): string; - export function readFileSync(filename: string, options: { encoding: string; flag?: string; }): string; - export function readFileSync(filename: string, options?: { flag?: string; }): Buffer; - export function writeFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; - export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; - export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; - export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; - export function watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void; - export function watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void; - export function unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void; - export function watch(filename: string, listener?: (event: string, filename: string) => any): FSWatcher; - export function watch(filename: string, options: { persistent?: boolean; }, listener?: (event: string, filename: string) => any): FSWatcher; - export function exists(path: string, callback?: (exists: boolean) => void): void; - export function existsSync(path: string): boolean; - export function createReadStream(path: string, options?: { - flags?: string; - encoding?: string; - fd?: string; - mode?: number; - bufferSize?: number; - }): ReadStream; - export function createReadStream(path: string, options?: { - flags?: string; - encoding?: string; - fd?: string; - mode?: string; - bufferSize?: number; - }): ReadStream; - export function createWriteStream(path: string, options?: { - flags?: string; - encoding?: string; - string?: string; - }): WriteStream; - } -} - -declare namespace NodeJS { - namespace path { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - } -} - -declare namespace NodeJS { - namespace _debugger { - export interface Packet { - raw: string; - headers: string[]; - body: Message; - } - - export interface Message { - seq: number; - type: string; - } - - export interface RequestInfo { - command: string; - arguments: any; - } - - export interface Request extends Message, RequestInfo { - } - - export interface Event extends Message { - event: string; - body?: any; - } - - export interface Response extends Message { - request_seq: number; - success: boolean; - /** Contains error message if success === false. */ - message?: string; - /** Contains message body if success === true. */ - body?: any; - } - - export interface BreakpointMessageBody { - type: string; - target: number; - line: number; - } - - export class Protocol { - res: Packet; - state: string; - execute(data: string): void; - serialize(rq: Request): string; - onResponse: (pkt: Packet) => void; - } - - export var NO_FRAME: number; - export var port: number; - - export interface ScriptDesc { - name: string; - id: number; - isNative?: boolean; - handle?: number; - type: string; - lineOffset?: number; - columnOffset?: number; - lineCount?: number; - } - - export interface Breakpoint { - id: number; - scriptId: number; - script: ScriptDesc; - line: number; - condition?: string; - scriptReq?: string; - } - - export interface RequestHandler { - (err: boolean, body: Message, res: Packet): void; - request_seq?: number; - } - - export interface ResponseBodyHandler { - (err: boolean, body?: any): void; - request_seq?: number; - } - - export interface ExceptionInfo { - text: string; - } - - export interface BreakResponse { - script?: ScriptDesc; - exception?: ExceptionInfo; - sourceLine: number; - sourceLineText: string; - sourceColumn: number; - } - - export function SourceInfo(body: BreakResponse): string; - - export class Client extends events.EventEmitter { - protocol: Protocol; - scripts: ScriptDesc[]; - handles: ScriptDesc[]; - breakpoints: Breakpoint[]; - currentSourceLine: number; - currentSourceColumn: number; - currentSourceLineText: string; - currentFrame: number; - currentScript: string; - - connect(port: number, host: string): void; - req(req: any, cb: RequestHandler): void; - reqFrameEval(code: string, frame: number, cb: RequestHandler): void; - mirrorObject(obj: any, depth: number, cb: ResponseBodyHandler): void; - setBreakpoint(rq: BreakpointMessageBody, cb: RequestHandler): void; - clearBreakpoint(rq: Request, cb: RequestHandler): void; - listbreakpoints(cb: RequestHandler): void; - reqSource(from: number, to: number, cb: RequestHandler): void; - reqScripts(cb: any): void; - reqContinue(cb: RequestHandler): void; - } - } -} \ No newline at end of file diff --git a/src/server/server.ts b/src/server/server.ts index 767793024c2..17ecfdaa1c9 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1,11 +1,59 @@ -/// +/// /// // used in fs.writeSync /* tslint:disable:no-null-keyword */ namespace ts.server { - const readline: NodeJS.ReadLine = require("readline"); - const fs: typeof NodeJS.fs = require("fs"); + interface ReadLineOptions { + input: NodeJS.ReadableStream; + output?: NodeJS.WritableStream; + terminal?: boolean; + historySize?: number; + } + + interface Key { + sequence?: string; + name?: string; + ctrl?: boolean; + meta?: boolean; + shift?: boolean; + } + + interface Stats { + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + } + + const readline: { + createInterface(options: ReadLineOptions): NodeJS.EventEmitter; + } = require("readline"); + const fs: { + openSync(path: string, options: string): number; + close(fd: number): void; + writeSync(fd: number, buffer: Buffer, offset: number, length: number, position?: number): number; + writeSync(fd: number, data: any, position?: number, enconding?: string): number; + statSync(path: string): Stats; + stat(path: string, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + } = require("fs"); const rl = readline.createInterface({ input: process.stdin, diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json index df7dcdfe8ad..e14478c40f4 100644 --- a/src/server/tsconfig.json +++ b/src/server/tsconfig.json @@ -7,12 +7,14 @@ "pretty": true, "out": "../../built/local/tsserver.js", "sourceMap": true, - "stripInternal": true + "stripInternal": true, + "types": [ + "node" + ] }, "files": [ "../services/shims.ts", "../services/utilities.ts", - "node.d.ts", "editorServices.ts", "protocol.d.ts", "session.ts", diff --git a/src/server/tsconfig.library.json b/src/server/tsconfig.library.json new file mode 100644 index 00000000000..746283720bf --- /dev/null +++ b/src/server/tsconfig.library.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "out": "../../built/local/tsserverlibrary.js", + "sourceMap": true, + "stripInternal": true, + "declaration": true, + "types": [] + }, + "files": [ + "editorServices.ts", + "protocol.d.ts", + "session.ts" + ] +} diff --git a/tests/cases/unittests/incrementalParser.ts b/tests/cases/unittests/incrementalParser.ts index 741c9e54cad..106368effdd 100644 --- a/tests/cases/unittests/incrementalParser.ts +++ b/tests/cases/unittests/incrementalParser.ts @@ -1,4 +1,4 @@ -/// +/// /// namespace ts { diff --git a/tests/cases/unittests/jsDocParsing.ts b/tests/cases/unittests/jsDocParsing.ts index e6cf4ffff4f..37d34f85b8f 100644 --- a/tests/cases/unittests/jsDocParsing.ts +++ b/tests/cases/unittests/jsDocParsing.ts @@ -1,5 +1,3 @@ -/// -/// /// /// diff --git a/tests/cases/unittests/matchFiles.ts b/tests/cases/unittests/matchFiles.ts index d68fb9b2a7f..a5eeae49a9e 100644 --- a/tests/cases/unittests/matchFiles.ts +++ b/tests/cases/unittests/matchFiles.ts @@ -1,4 +1,3 @@ -/// /// /// diff --git a/tests/cases/unittests/moduleResolution.ts b/tests/cases/unittests/moduleResolution.ts index 70cb4715c48..d93731fd7c6 100644 --- a/tests/cases/unittests/moduleResolution.ts +++ b/tests/cases/unittests/moduleResolution.ts @@ -1,12 +1,5 @@ -/// /// -declare namespace chai.assert { - /* tslint:disable no-unused-variable */ - function deepEqual(actual: any, expected: any): void; - /* tslint:enable no-unused-variable */ -} - namespace ts { function diagnosticToString(diagnostic: Diagnostic) { let output = ""; diff --git a/tests/cases/unittests/reuseProgramStructure.ts b/tests/cases/unittests/reuseProgramStructure.ts index b8a36baf824..bdc4765be7d 100644 --- a/tests/cases/unittests/reuseProgramStructure.ts +++ b/tests/cases/unittests/reuseProgramStructure.ts @@ -1,4 +1,3 @@ -/// /// /// diff --git a/tests/cases/unittests/services/colorization.ts b/tests/cases/unittests/services/colorization.ts index ab927ebe23a..be3096592a9 100644 --- a/tests/cases/unittests/services/colorization.ts +++ b/tests/cases/unittests/services/colorization.ts @@ -1,5 +1,4 @@ -/// -/// +/// interface ClassificationEntry { value: any; diff --git a/tests/cases/unittests/services/patternMatcher.ts b/tests/cases/unittests/services/patternMatcher.ts index 5fbe0ea1588..f1ed400f228 100644 --- a/tests/cases/unittests/services/patternMatcher.ts +++ b/tests/cases/unittests/services/patternMatcher.ts @@ -1,4 +1,3 @@ -/// /// describe("PatternMatcher", function () { diff --git a/tests/cases/unittests/services/preProcessFile.ts b/tests/cases/unittests/services/preProcessFile.ts index 22a911b1601..a37c9ca706d 100644 --- a/tests/cases/unittests/services/preProcessFile.ts +++ b/tests/cases/unittests/services/preProcessFile.ts @@ -1,11 +1,4 @@ -/// -/// - -declare namespace chai.assert { - /* tslint:disable no-unused-variable */ - function deepEqual(actual: any, expected: any): void; - /* tslint:enable no-unused-variable */ -} +/// describe("PreProcessFile:", function () { function test(sourceText: string, readImportFile: boolean, detectJavaScriptImports: boolean, expectedPreProcess: ts.PreProcessedFileInfo): void { From cfe3aadeb34e535564796f719d8841ab82886538 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Mon, 11 Jul 2016 17:42:52 -0700 Subject: [PATCH 060/109] Move unittests into harness --- Gulpfile.ts | 3 +- Jakefile.js | 2 +- src/harness/tsconfig.json | 38 +++++++++---------- .../unittests/cachingInServerLSHost.ts | 2 +- .../harness}/unittests/commandLineParsing.ts | 4 +- .../convertCompilerOptionsFromJson.ts | 4 +- .../harness}/unittests/convertToBase64.ts | 2 +- .../unittests/convertTypingOptionsFromJson.ts | 4 +- .../harness}/unittests/incrementalParser.ts | 4 +- .../harness}/unittests/jsDocParsing.ts | 4 +- .../harness}/unittests/matchFiles.ts | 4 +- .../harness}/unittests/moduleResolution.ts | 2 +- .../unittests/reuseProgramStructure.ts | 4 +- .../unittests/services/colorization.ts | 2 +- .../unittests/services/documentRegistry.ts | 2 +- .../formatting/documentFormattingTests.json | 0 .../formatting/formatDiffTemplate.html | 0 .../formatting/getFormattingEditsForRange.ts | 0 .../formatting/getSmartIndentAtLineNumber.ts | 0 .../importedJavaScriptFormatting.ts | 0 .../formatting/ruleFormattingTests.json | 0 .../formatting/testCode/formatting/classes.ts | 0 .../testCode/formatting/classesBaseline.ts | 0 .../testCode/formatting/colonAndQMark.ts | 0 .../formatting/colonAndQMarkBaseline.ts | 0 .../formatting/documentReadyFunction.ts | 0 .../documentReadyFunctionBaseLine.ts | 0 .../testCode/formatting/emptyBlock.ts | 0 .../testCode/formatting/emptyBlockBaseline.ts | 0 .../formatting/emptyInterfaceLiteral.ts | 0 .../emptyInterfaceLiteralBaseLine.ts | 0 .../testCode/formatting/fatArrowFunctions.ts | 0 .../formatting/fatArrowFunctionsBaseline.ts | 0 .../formatting/formatDebuggerStatement.ts | 0 .../formatDebuggerStatementBaseline.ts | 0 .../formatvariableDeclarationList.ts | 0 .../formatvariableDeclarationListBaseline.ts | 0 .../testCode/formatting/implicitModule.ts | 0 .../formatting/implicitModuleBaseline.ts | 0 .../testCode/formatting/importDeclaration.ts | 0 .../formatting/importDeclarationBaseline.ts | 0 .../formatting/testCode/formatting/main.ts | 0 .../testCode/formatting/mainBaseline.ts | 0 .../testCode/formatting/moduleIndentation.ts | 0 .../formatting/moduleIndentationBaseline.ts | 0 .../formatting/testCode/formatting/modules.ts | 0 .../testCode/formatting/modulesBaseline.ts | 0 .../testCode/formatting/objectLiteral.ts | 0 .../formatting/objectLiteralBaseline.ts | 0 .../testCode/formatting/onClosingBracket.ts | 0 .../formatting/onClosingBracketBaseLine.ts | 0 .../testCode/formatting/onSemiColon.ts | 0 .../formatting/onSemiColonBaseline.ts | 0 .../formatting/spaceAfterConstructor.ts | 0 .../spaceAfterConstructorBaseline.ts | 0 .../testCode/formatting/tabAfterCloseCurly.ts | 0 .../formatting/tabAfterCloseCurlyBaseline.ts | 0 .../formatting/typescriptConstructs.ts | 0 .../typescriptConstructsBaseline.ts | 0 .../formatting/testCode/formatting/various.ts | 0 .../testCode/formatting/variousBaseline.ts | 0 .../testCode/formatting/withStatement.ts | 0 .../formatting/withStatementBaseline.ts | 0 .../testCode/testCode/formatting/classes.ts | 0 .../testCode/formatting/classesBaseline.ts | 0 .../testCode/formatting/colonAndQMark.ts | 0 .../formatting/colonAndQMarkBaseline.ts | 0 .../formatting/documentReadyFunction.ts | 0 .../documentReadyFunctionBaseLine.ts | 0 .../testCode/formatting/emptyBlock.ts | 0 .../testCode/formatting/emptyBlockBaseline.ts | 0 .../formatting/emptyInterfaceLiteral.ts | 0 .../emptyInterfaceLiteralBaseLine.ts | 0 .../testCode/formatting/fatArrowFunctions.ts | 0 .../formatting/fatArrowFunctionsBaseline.ts | 0 .../formatting/formatDebuggerStatement.ts | 0 .../formatDebuggerStatementBaseline.ts | 0 .../formatvariableDeclarationList.ts | 0 .../formatvariableDeclarationListBaseline.ts | 0 .../testCode/formatting/implicitModule.ts | 0 .../formatting/implicitModuleBaseline.ts | 0 .../testCode/formatting/importDeclaration.ts | 0 .../formatting/importDeclarationBaseline.ts | 0 .../testCode/testCode/formatting/main.ts | 0 .../testCode/formatting/mainBaseline.ts | 0 .../testCode/formatting/moduleIndentation.ts | 0 .../formatting/moduleIndentationBaseline.ts | 0 .../testCode/testCode/formatting/modules.ts | 0 .../testCode/formatting/modulesBaseline.ts | 0 .../testCode/formatting/objectLiteral.ts | 0 .../formatting/objectLiteralBaseline.ts | 0 .../testCode/formatting/onClosingBracket.ts | 0 .../formatting/onClosingBracketBaseLine.ts | 0 .../testCode/formatting/onSemiColon.ts | 0 .../formatting/onSemiColonBaseline.ts | 0 .../formatting/spaceAfterConstructor.ts | 0 .../spaceAfterConstructorBaseline.ts | 0 .../testCode/formatting/tabAfterCloseCurly.ts | 0 .../formatting/tabAfterCloseCurlyBaseline.ts | 0 .../formatting/typescriptConstructs.ts | 0 .../typescriptConstructsBaseline.ts | 0 .../testCode/testCode/formatting/various.ts | 0 .../testCode/formatting/variousBaseline.ts | 0 .../testCode/formatting/withStatement.ts | 0 .../formatting/withStatementBaseline.ts | 0 .../unittests/services/patternMatcher.ts | 2 +- .../unittests/services/preProcessFile.ts | 2 +- .../harness}/unittests/session.ts | 2 +- .../harness}/unittests/transpile.ts | 2 +- .../harness}/unittests/tsconfigParsing.ts | 4 +- .../unittests/tsserverProjectSystem.ts | 2 +- .../harness}/unittests/versionCache.ts | 4 +- 112 files changed, 49 insertions(+), 50 deletions(-) rename {tests/cases => src/harness}/unittests/cachingInServerLSHost.ts (97%) rename {tests/cases => src/harness}/unittests/commandLineParsing.ts (97%) rename {tests/cases => src/harness}/unittests/convertCompilerOptionsFromJson.ts (97%) rename {tests/cases => src/harness}/unittests/convertToBase64.ts (93%) rename {tests/cases => src/harness}/unittests/convertTypingOptionsFromJson.ts (95%) rename {tests/cases => src/harness}/unittests/incrementalParser.ts (97%) rename {tests/cases => src/harness}/unittests/jsDocParsing.ts (96%) rename {tests/cases => src/harness}/unittests/matchFiles.ts (97%) rename {tests/cases => src/harness}/unittests/moduleResolution.ts (98%) rename {tests/cases => src/harness}/unittests/reuseProgramStructure.ts (97%) rename {tests/cases => src/harness}/unittests/services/colorization.ts (97%) rename {tests/cases => src/harness}/unittests/services/documentRegistry.ts (96%) rename {tests/cases => src/harness}/unittests/services/formatting/documentFormattingTests.json (100%) rename {tests/cases => src/harness}/unittests/services/formatting/formatDiffTemplate.html (100%) rename {tests/cases => src/harness}/unittests/services/formatting/getFormattingEditsForRange.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/getSmartIndentAtLineNumber.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/importedJavaScriptFormatting.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/ruleFormattingTests.json (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/classes.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/classesBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/colonAndQMark.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/colonAndQMarkBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/documentReadyFunction.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/documentReadyFunctionBaseLine.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/emptyBlock.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/emptyBlockBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteral.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteralBaseLine.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/fatArrowFunctions.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/fatArrowFunctionsBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/formatDebuggerStatement.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/formatDebuggerStatementBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/formatvariableDeclarationList.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/formatvariableDeclarationListBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/implicitModule.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/implicitModuleBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/importDeclaration.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/importDeclarationBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/main.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/mainBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/moduleIndentation.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/moduleIndentationBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/modules.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/modulesBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/objectLiteral.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/objectLiteralBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/onClosingBracket.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/onClosingBracketBaseLine.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/onSemiColon.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/onSemiColonBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/spaceAfterConstructor.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/spaceAfterConstructorBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/tabAfterCloseCurly.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/tabAfterCloseCurlyBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/typescriptConstructs.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/typescriptConstructsBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/various.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/variousBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/withStatement.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/formatting/withStatementBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/classes.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/classesBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/colonAndQMark.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/colonAndQMarkBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunction.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunctionBaseLine.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/emptyBlock.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/emptyBlockBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteral.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteralBaseLine.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctions.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctionsBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatement.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatementBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationList.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationListBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/implicitModule.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/implicitModuleBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/importDeclaration.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/importDeclarationBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/main.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/mainBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/moduleIndentation.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/moduleIndentationBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/modules.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/modulesBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/objectLiteral.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/objectLiteralBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/onClosingBracket.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/onClosingBracketBaseLine.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/onSemiColon.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/onSemiColonBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructor.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructorBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurly.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurlyBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructs.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructsBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/various.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/variousBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/withStatement.ts (100%) rename {tests/cases => src/harness}/unittests/services/formatting/testCode/testCode/formatting/withStatementBaseline.ts (100%) rename {tests/cases => src/harness}/unittests/services/patternMatcher.ts (96%) rename {tests/cases => src/harness}/unittests/services/preProcessFile.ts (97%) rename {tests/cases => src/harness}/unittests/session.ts (96%) rename {tests/cases => src/harness}/unittests/transpile.ts (97%) rename {tests/cases => src/harness}/unittests/tsconfigParsing.ts (98%) rename {tests/cases => src/harness}/unittests/tsserverProjectSystem.ts (97%) rename {tests/cases => src/harness}/unittests/versionCache.ts (96%) diff --git a/Gulpfile.ts b/Gulpfile.ts index 4ad06faf6cb..0305f754111 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -944,8 +944,7 @@ const lintTargets = [ "Gulpfile.ts", "src/compiler/**/*.ts", "src/harness/**/*.ts", - "tests/cases/unittests/**/*.ts", - "!tests/cases/unittests/services/formatting/**/*.ts", + "!src/harness/unittests/services/formatting/**/*.ts", "src/server/**/*.ts", "scripts/tslint/**/*.ts", "src/services/**/*.ts", diff --git a/Jakefile.js b/Jakefile.js index 3eb3520fafb..eee9fe1370e 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -14,7 +14,7 @@ var serverDirectory = "src/server/"; var harnessDirectory = "src/harness/"; var libraryDirectory = "src/lib/"; var scriptsDirectory = "scripts/"; -var unittestsDirectory = "tests/cases/unittests/"; +var unittestsDirectory = "src/harness/unittests/"; var docDirectory = "doc/"; var builtDirectory = "built/"; diff --git a/src/harness/tsconfig.json b/src/harness/tsconfig.json index ee6a4ebe866..5853bee3274 100644 --- a/src/harness/tsconfig.json +++ b/src/harness/tsconfig.json @@ -70,24 +70,24 @@ "../server/session.ts", "../server/client.ts", "../server/editorServices.ts", - "../../tests/cases/unittests/incrementalParser.ts", - "../../tests/cases/unittests/jsDocParsing.ts", - "../../tests/cases/unittests/services/colorization.ts", - "../../tests/cases/unittests/services/documentRegistry.ts", - "../../tests/cases/unittests/services/preProcessFile.ts", - "../../tests/cases/unittests/services/patternMatcher.ts", - "../../tests/cases/unittests/session.ts", - "../../tests/cases/unittests/versionCache.ts", - "../../tests/cases/unittests/convertToBase64.ts", - "../../tests/cases/unittests/transpile.ts", - "../../tests/cases/unittests/reuseProgramStructure.ts", - "../../tests/cases/unittests/cachingInServerLSHost.ts", - "../../tests/cases/unittests/moduleResolution.ts", - "../../tests/cases/unittests/tsconfigParsing.ts", - "../../tests/cases/unittests/commandLineParsing.ts", - "../../tests/cases/unittests/convertCompilerOptionsFromJson.ts", - "../../tests/cases/unittests/convertTypingOptionsFromJson.ts", - "../../tests/cases/unittests/tsserverProjectSystem.ts", - "../../tests/cases/unittests/matchFiles.ts" + "./unittests/incrementalParser.ts", + "./unittests/jsDocParsing.ts", + "./unittests/services/colorization.ts", + "./unittests/services/documentRegistry.ts", + "./unittests/services/preProcessFile.ts", + "./unittests/services/patternMatcher.ts", + "./unittests/session.ts", + "./unittests/versionCache.ts", + "./unittests/convertToBase64.ts", + "./unittests/transpile.ts", + "./unittests/reuseProgramStructure.ts", + "./unittests/cachingInServerLSHost.ts", + "./unittests/moduleResolution.ts", + "./unittests/tsconfigParsing.ts", + "./unittests/commandLineParsing.ts", + "./unittests/convertCompilerOptionsFromJson.ts", + "./unittests/convertTypingOptionsFromJson.ts", + "./unittests/tsserverProjectSystem.ts", + "./unittests/matchFiles.ts" ] } diff --git a/tests/cases/unittests/cachingInServerLSHost.ts b/src/harness/unittests/cachingInServerLSHost.ts similarity index 97% rename from tests/cases/unittests/cachingInServerLSHost.ts rename to src/harness/unittests/cachingInServerLSHost.ts index 9cd5e071b73..e0ce09391fb 100644 --- a/tests/cases/unittests/cachingInServerLSHost.ts +++ b/src/harness/unittests/cachingInServerLSHost.ts @@ -1,4 +1,4 @@ -/// +/// namespace ts { interface File { diff --git a/tests/cases/unittests/commandLineParsing.ts b/src/harness/unittests/commandLineParsing.ts similarity index 97% rename from tests/cases/unittests/commandLineParsing.ts rename to src/harness/unittests/commandLineParsing.ts index 095f912ac1c..afd0ff6f0ea 100644 --- a/tests/cases/unittests/commandLineParsing.ts +++ b/src/harness/unittests/commandLineParsing.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { describe("parseCommandLine", () => { diff --git a/tests/cases/unittests/convertCompilerOptionsFromJson.ts b/src/harness/unittests/convertCompilerOptionsFromJson.ts similarity index 97% rename from tests/cases/unittests/convertCompilerOptionsFromJson.ts rename to src/harness/unittests/convertCompilerOptionsFromJson.ts index b2d6c7d8fb6..d308bb2a6e6 100644 --- a/tests/cases/unittests/convertCompilerOptionsFromJson.ts +++ b/src/harness/unittests/convertCompilerOptionsFromJson.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { describe("convertCompilerOptionsFromJson", () => { diff --git a/tests/cases/unittests/convertToBase64.ts b/src/harness/unittests/convertToBase64.ts similarity index 93% rename from tests/cases/unittests/convertToBase64.ts rename to src/harness/unittests/convertToBase64.ts index 40fd98dd332..09e38bdf674 100644 --- a/tests/cases/unittests/convertToBase64.ts +++ b/src/harness/unittests/convertToBase64.ts @@ -1,4 +1,4 @@ -/// +/// namespace ts { describe("convertToBase64", () => { diff --git a/tests/cases/unittests/convertTypingOptionsFromJson.ts b/src/harness/unittests/convertTypingOptionsFromJson.ts similarity index 95% rename from tests/cases/unittests/convertTypingOptionsFromJson.ts rename to src/harness/unittests/convertTypingOptionsFromJson.ts index 6462794b127..439409b24b7 100644 --- a/tests/cases/unittests/convertTypingOptionsFromJson.ts +++ b/src/harness/unittests/convertTypingOptionsFromJson.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { describe("convertTypingOptionsFromJson", () => { diff --git a/tests/cases/unittests/incrementalParser.ts b/src/harness/unittests/incrementalParser.ts similarity index 97% rename from tests/cases/unittests/incrementalParser.ts rename to src/harness/unittests/incrementalParser.ts index 106368effdd..0082207e699 100644 --- a/tests/cases/unittests/incrementalParser.ts +++ b/src/harness/unittests/incrementalParser.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { ts.disableIncrementalParsing = false; diff --git a/tests/cases/unittests/jsDocParsing.ts b/src/harness/unittests/jsDocParsing.ts similarity index 96% rename from tests/cases/unittests/jsDocParsing.ts rename to src/harness/unittests/jsDocParsing.ts index 37d34f85b8f..d1ca42f3861 100644 --- a/tests/cases/unittests/jsDocParsing.ts +++ b/src/harness/unittests/jsDocParsing.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { describe("JSDocParsing", () => { diff --git a/tests/cases/unittests/matchFiles.ts b/src/harness/unittests/matchFiles.ts similarity index 97% rename from tests/cases/unittests/matchFiles.ts rename to src/harness/unittests/matchFiles.ts index a5eeae49a9e..ae856f40c17 100644 --- a/tests/cases/unittests/matchFiles.ts +++ b/src/harness/unittests/matchFiles.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { const caseInsensitiveBasePath = "c:/dev/"; diff --git a/tests/cases/unittests/moduleResolution.ts b/src/harness/unittests/moduleResolution.ts similarity index 98% rename from tests/cases/unittests/moduleResolution.ts rename to src/harness/unittests/moduleResolution.ts index d93731fd7c6..b3f2102d903 100644 --- a/tests/cases/unittests/moduleResolution.ts +++ b/src/harness/unittests/moduleResolution.ts @@ -1,4 +1,4 @@ -/// +/// namespace ts { function diagnosticToString(diagnostic: Diagnostic) { diff --git a/tests/cases/unittests/reuseProgramStructure.ts b/src/harness/unittests/reuseProgramStructure.ts similarity index 97% rename from tests/cases/unittests/reuseProgramStructure.ts rename to src/harness/unittests/reuseProgramStructure.ts index bdc4765be7d..8b2b15c15b3 100644 --- a/tests/cases/unittests/reuseProgramStructure.ts +++ b/src/harness/unittests/reuseProgramStructure.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { diff --git a/tests/cases/unittests/services/colorization.ts b/src/harness/unittests/services/colorization.ts similarity index 97% rename from tests/cases/unittests/services/colorization.ts rename to src/harness/unittests/services/colorization.ts index be3096592a9..0fe63f4ff07 100644 --- a/tests/cases/unittests/services/colorization.ts +++ b/src/harness/unittests/services/colorization.ts @@ -1,4 +1,4 @@ -/// +/// interface ClassificationEntry { value: any; diff --git a/tests/cases/unittests/services/documentRegistry.ts b/src/harness/unittests/services/documentRegistry.ts similarity index 96% rename from tests/cases/unittests/services/documentRegistry.ts rename to src/harness/unittests/services/documentRegistry.ts index 942408c535f..09e95db6c76 100644 --- a/tests/cases/unittests/services/documentRegistry.ts +++ b/src/harness/unittests/services/documentRegistry.ts @@ -1,4 +1,4 @@ -/// +/// describe("DocumentRegistry", () => { it("documents are shared between projects", () => { diff --git a/tests/cases/unittests/services/formatting/documentFormattingTests.json b/src/harness/unittests/services/formatting/documentFormattingTests.json similarity index 100% rename from tests/cases/unittests/services/formatting/documentFormattingTests.json rename to src/harness/unittests/services/formatting/documentFormattingTests.json diff --git a/tests/cases/unittests/services/formatting/formatDiffTemplate.html b/src/harness/unittests/services/formatting/formatDiffTemplate.html similarity index 100% rename from tests/cases/unittests/services/formatting/formatDiffTemplate.html rename to src/harness/unittests/services/formatting/formatDiffTemplate.html diff --git a/tests/cases/unittests/services/formatting/getFormattingEditsForRange.ts b/src/harness/unittests/services/formatting/getFormattingEditsForRange.ts similarity index 100% rename from tests/cases/unittests/services/formatting/getFormattingEditsForRange.ts rename to src/harness/unittests/services/formatting/getFormattingEditsForRange.ts diff --git a/tests/cases/unittests/services/formatting/getSmartIndentAtLineNumber.ts b/src/harness/unittests/services/formatting/getSmartIndentAtLineNumber.ts similarity index 100% rename from tests/cases/unittests/services/formatting/getSmartIndentAtLineNumber.ts rename to src/harness/unittests/services/formatting/getSmartIndentAtLineNumber.ts diff --git a/tests/cases/unittests/services/formatting/importedJavaScriptFormatting.ts b/src/harness/unittests/services/formatting/importedJavaScriptFormatting.ts similarity index 100% rename from tests/cases/unittests/services/formatting/importedJavaScriptFormatting.ts rename to src/harness/unittests/services/formatting/importedJavaScriptFormatting.ts diff --git a/tests/cases/unittests/services/formatting/ruleFormattingTests.json b/src/harness/unittests/services/formatting/ruleFormattingTests.json similarity index 100% rename from tests/cases/unittests/services/formatting/ruleFormattingTests.json rename to src/harness/unittests/services/formatting/ruleFormattingTests.json diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/classes.ts b/src/harness/unittests/services/formatting/testCode/formatting/classes.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/classes.ts rename to src/harness/unittests/services/formatting/testCode/formatting/classes.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/classesBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/classesBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/classesBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/classesBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/colonAndQMark.ts b/src/harness/unittests/services/formatting/testCode/formatting/colonAndQMark.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/colonAndQMark.ts rename to src/harness/unittests/services/formatting/testCode/formatting/colonAndQMark.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/colonAndQMarkBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/colonAndQMarkBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/colonAndQMarkBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/colonAndQMarkBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/documentReadyFunction.ts b/src/harness/unittests/services/formatting/testCode/formatting/documentReadyFunction.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/documentReadyFunction.ts rename to src/harness/unittests/services/formatting/testCode/formatting/documentReadyFunction.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/documentReadyFunctionBaseLine.ts b/src/harness/unittests/services/formatting/testCode/formatting/documentReadyFunctionBaseLine.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/documentReadyFunctionBaseLine.ts rename to src/harness/unittests/services/formatting/testCode/formatting/documentReadyFunctionBaseLine.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/emptyBlock.ts b/src/harness/unittests/services/formatting/testCode/formatting/emptyBlock.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/emptyBlock.ts rename to src/harness/unittests/services/formatting/testCode/formatting/emptyBlock.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/emptyBlockBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/emptyBlockBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/emptyBlockBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/emptyBlockBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteral.ts b/src/harness/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteral.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteral.ts rename to src/harness/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteral.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteralBaseLine.ts b/src/harness/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteralBaseLine.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteralBaseLine.ts rename to src/harness/unittests/services/formatting/testCode/formatting/emptyInterfaceLiteralBaseLine.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/fatArrowFunctions.ts b/src/harness/unittests/services/formatting/testCode/formatting/fatArrowFunctions.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/fatArrowFunctions.ts rename to src/harness/unittests/services/formatting/testCode/formatting/fatArrowFunctions.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/fatArrowFunctionsBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/fatArrowFunctionsBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/fatArrowFunctionsBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/fatArrowFunctionsBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/formatDebuggerStatement.ts b/src/harness/unittests/services/formatting/testCode/formatting/formatDebuggerStatement.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/formatDebuggerStatement.ts rename to src/harness/unittests/services/formatting/testCode/formatting/formatDebuggerStatement.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/formatDebuggerStatementBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/formatDebuggerStatementBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/formatDebuggerStatementBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/formatDebuggerStatementBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/formatvariableDeclarationList.ts b/src/harness/unittests/services/formatting/testCode/formatting/formatvariableDeclarationList.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/formatvariableDeclarationList.ts rename to src/harness/unittests/services/formatting/testCode/formatting/formatvariableDeclarationList.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/formatvariableDeclarationListBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/formatvariableDeclarationListBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/formatvariableDeclarationListBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/formatvariableDeclarationListBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/implicitModule.ts b/src/harness/unittests/services/formatting/testCode/formatting/implicitModule.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/implicitModule.ts rename to src/harness/unittests/services/formatting/testCode/formatting/implicitModule.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/implicitModuleBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/implicitModuleBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/implicitModuleBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/implicitModuleBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/importDeclaration.ts b/src/harness/unittests/services/formatting/testCode/formatting/importDeclaration.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/importDeclaration.ts rename to src/harness/unittests/services/formatting/testCode/formatting/importDeclaration.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/importDeclarationBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/importDeclarationBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/importDeclarationBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/importDeclarationBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/main.ts b/src/harness/unittests/services/formatting/testCode/formatting/main.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/main.ts rename to src/harness/unittests/services/formatting/testCode/formatting/main.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/mainBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/mainBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/mainBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/mainBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/moduleIndentation.ts b/src/harness/unittests/services/formatting/testCode/formatting/moduleIndentation.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/moduleIndentation.ts rename to src/harness/unittests/services/formatting/testCode/formatting/moduleIndentation.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/moduleIndentationBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/moduleIndentationBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/moduleIndentationBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/moduleIndentationBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/modules.ts b/src/harness/unittests/services/formatting/testCode/formatting/modules.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/modules.ts rename to src/harness/unittests/services/formatting/testCode/formatting/modules.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/modulesBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/modulesBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/modulesBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/modulesBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/objectLiteral.ts b/src/harness/unittests/services/formatting/testCode/formatting/objectLiteral.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/objectLiteral.ts rename to src/harness/unittests/services/formatting/testCode/formatting/objectLiteral.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/objectLiteralBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/objectLiteralBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/objectLiteralBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/objectLiteralBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/onClosingBracket.ts b/src/harness/unittests/services/formatting/testCode/formatting/onClosingBracket.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/onClosingBracket.ts rename to src/harness/unittests/services/formatting/testCode/formatting/onClosingBracket.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/onClosingBracketBaseLine.ts b/src/harness/unittests/services/formatting/testCode/formatting/onClosingBracketBaseLine.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/onClosingBracketBaseLine.ts rename to src/harness/unittests/services/formatting/testCode/formatting/onClosingBracketBaseLine.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/onSemiColon.ts b/src/harness/unittests/services/formatting/testCode/formatting/onSemiColon.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/onSemiColon.ts rename to src/harness/unittests/services/formatting/testCode/formatting/onSemiColon.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/onSemiColonBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/onSemiColonBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/onSemiColonBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/onSemiColonBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/spaceAfterConstructor.ts b/src/harness/unittests/services/formatting/testCode/formatting/spaceAfterConstructor.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/spaceAfterConstructor.ts rename to src/harness/unittests/services/formatting/testCode/formatting/spaceAfterConstructor.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/spaceAfterConstructorBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/spaceAfterConstructorBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/spaceAfterConstructorBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/spaceAfterConstructorBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/tabAfterCloseCurly.ts b/src/harness/unittests/services/formatting/testCode/formatting/tabAfterCloseCurly.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/tabAfterCloseCurly.ts rename to src/harness/unittests/services/formatting/testCode/formatting/tabAfterCloseCurly.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/tabAfterCloseCurlyBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/tabAfterCloseCurlyBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/tabAfterCloseCurlyBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/tabAfterCloseCurlyBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/typescriptConstructs.ts b/src/harness/unittests/services/formatting/testCode/formatting/typescriptConstructs.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/typescriptConstructs.ts rename to src/harness/unittests/services/formatting/testCode/formatting/typescriptConstructs.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/typescriptConstructsBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/typescriptConstructsBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/typescriptConstructsBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/typescriptConstructsBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/various.ts b/src/harness/unittests/services/formatting/testCode/formatting/various.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/various.ts rename to src/harness/unittests/services/formatting/testCode/formatting/various.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/variousBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/variousBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/variousBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/variousBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/withStatement.ts b/src/harness/unittests/services/formatting/testCode/formatting/withStatement.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/withStatement.ts rename to src/harness/unittests/services/formatting/testCode/formatting/withStatement.ts diff --git a/tests/cases/unittests/services/formatting/testCode/formatting/withStatementBaseline.ts b/src/harness/unittests/services/formatting/testCode/formatting/withStatementBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/formatting/withStatementBaseline.ts rename to src/harness/unittests/services/formatting/testCode/formatting/withStatementBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/classes.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/classes.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/classes.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/classes.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/classesBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/classesBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/classesBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/classesBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/colonAndQMark.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/colonAndQMark.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/colonAndQMark.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/colonAndQMark.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/colonAndQMarkBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/colonAndQMarkBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/colonAndQMarkBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/colonAndQMarkBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunction.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunction.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunction.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunction.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunctionBaseLine.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunctionBaseLine.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunctionBaseLine.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/documentReadyFunctionBaseLine.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyBlock.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyBlock.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyBlock.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyBlock.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyBlockBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyBlockBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyBlockBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyBlockBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteral.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteral.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteral.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteral.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteralBaseLine.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteralBaseLine.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteralBaseLine.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/emptyInterfaceLiteralBaseLine.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctions.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctions.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctions.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctions.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctionsBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctionsBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctionsBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/fatArrowFunctionsBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatement.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatement.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatement.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatement.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatementBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatementBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatementBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/formatDebuggerStatementBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationList.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationList.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationList.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationList.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationListBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationListBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationListBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/formatvariableDeclarationListBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/implicitModule.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/implicitModule.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/implicitModule.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/implicitModule.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/implicitModuleBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/implicitModuleBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/implicitModuleBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/implicitModuleBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/importDeclaration.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/importDeclaration.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/importDeclaration.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/importDeclaration.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/importDeclarationBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/importDeclarationBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/importDeclarationBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/importDeclarationBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/main.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/main.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/main.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/main.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/mainBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/mainBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/mainBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/mainBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/moduleIndentation.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/moduleIndentation.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/moduleIndentation.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/moduleIndentation.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/moduleIndentationBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/moduleIndentationBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/moduleIndentationBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/moduleIndentationBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/modules.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/modules.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/modules.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/modules.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/modulesBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/modulesBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/modulesBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/modulesBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/objectLiteral.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/objectLiteral.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/objectLiteral.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/objectLiteral.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/objectLiteralBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/objectLiteralBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/objectLiteralBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/objectLiteralBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/onClosingBracket.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/onClosingBracket.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/onClosingBracket.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/onClosingBracket.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/onClosingBracketBaseLine.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/onClosingBracketBaseLine.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/onClosingBracketBaseLine.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/onClosingBracketBaseLine.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/onSemiColon.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/onSemiColon.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/onSemiColon.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/onSemiColon.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/onSemiColonBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/onSemiColonBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/onSemiColonBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/onSemiColonBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructor.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructor.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructor.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructor.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructorBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructorBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructorBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/spaceAfterConstructorBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurly.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurly.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurly.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurly.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurlyBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurlyBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurlyBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/tabAfterCloseCurlyBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructs.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructs.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructs.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructs.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructsBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructsBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructsBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/typescriptConstructsBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/various.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/various.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/various.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/various.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/variousBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/variousBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/variousBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/variousBaseline.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/withStatement.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/withStatement.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/withStatement.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/withStatement.ts diff --git a/tests/cases/unittests/services/formatting/testCode/testCode/formatting/withStatementBaseline.ts b/src/harness/unittests/services/formatting/testCode/testCode/formatting/withStatementBaseline.ts similarity index 100% rename from tests/cases/unittests/services/formatting/testCode/testCode/formatting/withStatementBaseline.ts rename to src/harness/unittests/services/formatting/testCode/testCode/formatting/withStatementBaseline.ts diff --git a/tests/cases/unittests/services/patternMatcher.ts b/src/harness/unittests/services/patternMatcher.ts similarity index 96% rename from tests/cases/unittests/services/patternMatcher.ts rename to src/harness/unittests/services/patternMatcher.ts index f1ed400f228..8a70b38ab5e 100644 --- a/tests/cases/unittests/services/patternMatcher.ts +++ b/src/harness/unittests/services/patternMatcher.ts @@ -1,4 +1,4 @@ -/// +/// describe("PatternMatcher", function () { describe("BreakIntoCharacterSpans", function () { diff --git a/tests/cases/unittests/services/preProcessFile.ts b/src/harness/unittests/services/preProcessFile.ts similarity index 97% rename from tests/cases/unittests/services/preProcessFile.ts rename to src/harness/unittests/services/preProcessFile.ts index a37c9ca706d..403cccc8cf3 100644 --- a/tests/cases/unittests/services/preProcessFile.ts +++ b/src/harness/unittests/services/preProcessFile.ts @@ -1,4 +1,4 @@ -/// +/// describe("PreProcessFile:", function () { function test(sourceText: string, readImportFile: boolean, detectJavaScriptImports: boolean, expectedPreProcess: ts.PreProcessedFileInfo): void { diff --git a/tests/cases/unittests/session.ts b/src/harness/unittests/session.ts similarity index 96% rename from tests/cases/unittests/session.ts rename to src/harness/unittests/session.ts index b9073365d91..c5285544329 100644 --- a/tests/cases/unittests/session.ts +++ b/src/harness/unittests/session.ts @@ -1,4 +1,4 @@ -/// +/// const expect: typeof _chai.expect = _chai.expect; diff --git a/tests/cases/unittests/transpile.ts b/src/harness/unittests/transpile.ts similarity index 97% rename from tests/cases/unittests/transpile.ts rename to src/harness/unittests/transpile.ts index 1766e3280d4..547d10b9fbc 100644 --- a/tests/cases/unittests/transpile.ts +++ b/src/harness/unittests/transpile.ts @@ -1,4 +1,4 @@ -/// +/// namespace ts { describe("Transpile", () => { diff --git a/tests/cases/unittests/tsconfigParsing.ts b/src/harness/unittests/tsconfigParsing.ts similarity index 98% rename from tests/cases/unittests/tsconfigParsing.ts rename to src/harness/unittests/tsconfigParsing.ts index 17ccf6bff89..736d567a33a 100644 --- a/tests/cases/unittests/tsconfigParsing.ts +++ b/src/harness/unittests/tsconfigParsing.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { describe("parseConfigFileTextToJson", () => { diff --git a/tests/cases/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts similarity index 97% rename from tests/cases/unittests/tsserverProjectSystem.ts rename to src/harness/unittests/tsserverProjectSystem.ts index 308aa82f85f..7a375c50b8a 100644 --- a/tests/cases/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -1,4 +1,4 @@ -/// +/// namespace ts { function notImplemented(): any { diff --git a/tests/cases/unittests/versionCache.ts b/src/harness/unittests/versionCache.ts similarity index 96% rename from tests/cases/unittests/versionCache.ts rename to src/harness/unittests/versionCache.ts index 63a2924dbc3..7fb01ee770a 100644 --- a/tests/cases/unittests/versionCache.ts +++ b/src/harness/unittests/versionCache.ts @@ -1,5 +1,5 @@ -/// -/// +/// +/// namespace ts { function editFlat(position: number, deletedLength: number, newText: string, source: string) { From 48ab0ce07fa72bb5bd66a571026f8af1839027c3 Mon Sep 17 00:00:00 2001 From: Yui Date: Mon, 11 Jul 2016 20:53:12 -0700 Subject: [PATCH 061/109] Change version to 2.1.0 (#9615) --- package.json | 2 +- src/compiler/program.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 72a220f53b1..3bbb96ee468 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "typescript", "author": "Microsoft Corp.", "homepage": "http://typescriptlang.org/", - "version": "2.0.0", + "version": "2.1.0", "license": "Apache-2.0", "description": "TypeScript is a language for application scale JavaScript development", "keywords": [ diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 10ce47fbb9d..320b628c31a 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -9,7 +9,7 @@ namespace ts { /* @internal */ export let ioWriteTime = 0; /** The version of the TypeScript compiler release */ - export const version = "2.0.0"; + export const version = "2.1.0"; const emptyArray: any[] = []; From 5d37c29dbb30514b5a51a7637d0af74315ee44a7 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 8 Jul 2016 12:39:36 -0700 Subject: [PATCH 062/109] Handle JSX bodies in formatter --- src/services/formatting/formattingScanner.ts | 13 ++++++++++++- tests/cases/fourslash/formatTsx.ts | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/formatTsx.ts diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 401794a077b..7822e4a72fc 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -26,7 +26,8 @@ namespace ts.formatting { RescanGreaterThanToken, RescanSlashToken, RescanTemplateToken, - RescanJsxIdentifier + RescanJsxIdentifier, + RescanJsxText, } export function getFormattingScanner(sourceFile: SourceFile, startPos: number, endPos: number): FormattingScanner { @@ -140,6 +141,10 @@ namespace ts.formatting { return false; } + function shouldRescanJsxText(node: Node): boolean { + return node && node.kind === SyntaxKind.JsxText; + } + function shouldRescanSlashToken(container: Node): boolean { return container.kind === SyntaxKind.RegularExpressionLiteral; } @@ -176,6 +181,8 @@ namespace ts.formatting { ? ScanAction.RescanTemplateToken : shouldRescanJsxIdentifier(n) ? ScanAction.RescanJsxIdentifier + : shouldRescanJsxText(n) + ? ScanAction.RescanJsxText : ScanAction.Scan; if (lastTokenInfo && expectedScanAction === lastScanAction) { @@ -215,6 +222,10 @@ namespace ts.formatting { currentToken = scanner.scanJsxIdentifier(); lastScanAction = ScanAction.RescanJsxIdentifier; } + else if (expectedScanAction === ScanAction.RescanJsxText) { + currentToken = scanner.reScanJsxToken(); + lastScanAction = ScanAction.RescanJsxText; + } else { lastScanAction = ScanAction.Scan; } diff --git a/tests/cases/fourslash/formatTsx.ts b/tests/cases/fourslash/formatTsx.ts new file mode 100644 index 00000000000..1472351fe40 --- /dev/null +++ b/tests/cases/fourslash/formatTsx.ts @@ -0,0 +1,18 @@ +/// + +// @Filename: foo.tsx +////

'

{function(){return 1;}]}

+ +format.document(); +verify.currentFileContentIs("

'

{function() { return 1; }]}

"); + +/* +< 0 +p 1 +> 2 +' 3 +< 4 +/ 5 +p 6 +> 7 +*/ From e0aca418bc0ae395c84ab770c33a7c019ced27cc Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Tue, 12 Jul 2016 11:13:35 -0700 Subject: [PATCH 063/109] Responding to PR feedback --- src/compiler/core.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 895a325cca6..f913e6f9664 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -987,17 +987,17 @@ namespace ts { // The * and ? wildcards should not match directories or files that start with . if they // appear first in a component. Dotted directories and files can be included explicitly // like so: **/.*/.* - if (component.indexOf("*") === 0) { + if (component.charCodeAt(0) === CharacterCodes.asterisk) { subpattern += "([^./]" + singleAsteriskRegexFragment + ")?"; component = component.substr(1); } - else if (component.indexOf("?") === 0) { + else if (component.charCodeAt(0) === CharacterCodes.question) { subpattern += "[^./]"; component = component.substr(1); } } - subpattern += component.replace(reservedCharacterPattern, replaceWildcardCharacter); + subpattern += replaceWildcardCharacters(component, singleAsteriskRegexFragment); hasWrittenComponent = true; } } @@ -1020,6 +1020,10 @@ namespace ts { } return "^(" + pattern + (usage === "exclude" ? ")($|/)" : ")$"); + } + + function replaceWildcardCharacters(component: string, singleAsteriskRegexFragment: string) { + return component.replace(reservedCharacterPattern, replaceWildcardCharacter); function replaceWildcardCharacter(match: string) { return match === "*" ? singleAsteriskRegexFragment : match === "?" ? "[^/]" : "\\" + match; From c90897ccdddfd35b119de9472980a65efec40071 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 12 Jul 2016 14:54:06 -0700 Subject: [PATCH 064/109] Treat "." and ".." as relative module names --- src/compiler/core.ts | 15 ++++++++--- src/compiler/program.ts | 8 +----- src/compiler/utilities.ts | 18 ++++++++++++- .../reference/relativeModuleWithoutSlash.js | 27 +++++++++++++++++++ .../relativeModuleWithoutSlash.symbols | 17 ++++++++++++ .../relativeModuleWithoutSlash.types | 18 +++++++++++++ .../compiler/relativeModuleWithoutSlash.ts | 10 +++++++ 7 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 tests/baselines/reference/relativeModuleWithoutSlash.js create mode 100644 tests/baselines/reference/relativeModuleWithoutSlash.symbols create mode 100644 tests/baselines/reference/relativeModuleWithoutSlash.types create mode 100644 tests/cases/compiler/relativeModuleWithoutSlash.ts diff --git a/src/compiler/core.ts b/src/compiler/core.ts index cc6a9e6db9a..3a7765094a1 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -900,9 +900,7 @@ namespace ts { } export function fileExtensionIs(path: string, extension: string): boolean { - const pathLen = path.length; - const extLen = extension.length; - return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; + return stringEndsWith(path, extension); } export function fileExtensionIsAny(path: string, extensions: string[]): boolean { @@ -915,6 +913,17 @@ namespace ts { return false; } + // Should act like String.prototype.startsWith + export function stringStartsWith(s: string, start: string): boolean { + return s.length > start.length && s.substr(0, start.length) === start; + } + + // Should act like String.prototype.endsWith + export function stringEndsWith(s: string, end: string): boolean { + const sLen = s.length; + const endLen = end.length; + return sLen > endLen && s.substr(sLen - endLen, endLen) === end; + } // Reserved characters, forces escaping of any non-word (or digit), non-whitespace character. // It may be inefficient (we could just match (/[-[\]{}()*+?.,\\^$|#\s]/g), but this is future diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 320b628c31a..3f36ea8b1c1 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -112,13 +112,7 @@ namespace ts { } function moduleHasNonRelativeName(moduleName: string): boolean { - if (isRootedDiskPath(moduleName)) { - return false; - } - - const i = moduleName.lastIndexOf("./", 1); - const startsWithDotSlashOrDotDotSlash = i === 0 || (i === 1 && moduleName.charCodeAt(0) === CharacterCodes.dot); - return !startsWithDotSlashOrDotDotSlash; + return !(isRootedDiskPath(moduleName) || isExternalModuleNameRelative(moduleName)); } interface ModuleResolutionState { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6f3a1d6d813..8dbc052ddcf 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1218,7 +1218,23 @@ namespace ts { export function isExternalModuleNameRelative(moduleName: string): boolean { // TypeScript 1.0 spec (April 2014): 11.2.1 // An external module name is "relative" if the first term is "." or "..". - return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\"; + if (moduleName.charCodeAt(0) === CharacterCodes.dot) { + if (moduleName.length === 1) { + return true; + } + switch (moduleName.charCodeAt(1)) { + case CharacterCodes.slash: + case CharacterCodes.backslash: + return true; + case CharacterCodes.dot: + if (moduleName.length === 2) { + return true; + } + const ch2 = moduleName.charCodeAt(2); + return ch2 === CharacterCodes.slash || ch2 === CharacterCodes.backslash; + } + } + return false; } export function isInstantiatedModule(node: ModuleDeclaration, preserveConstEnums: boolean) { diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.js b/tests/baselines/reference/relativeModuleWithoutSlash.js new file mode 100644 index 00000000000..de0a03c7923 --- /dev/null +++ b/tests/baselines/reference/relativeModuleWithoutSlash.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/relativeModuleWithoutSlash.ts] //// + +//// [index.ts] +export default 0; + +//// [index.ts] +export default 1; + +//// [a.ts] +import parent from ".."; +import here from "."; +parent + here; + + +//// [index.js] +"use strict"; +exports.__esModule = true; +exports["default"] = 0; +//// [index.js] +"use strict"; +exports.__esModule = true; +exports["default"] = 1; +//// [a.js] +"use strict"; +var __1 = require(".."); +var _1 = require("."); +__1["default"] + _1["default"]; diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.symbols b/tests/baselines/reference/relativeModuleWithoutSlash.symbols new file mode 100644 index 00000000000..280a844f2f7 --- /dev/null +++ b/tests/baselines/reference/relativeModuleWithoutSlash.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/index.ts === +export default 0; +No type information for this code. +No type information for this code.=== tests/cases/compiler/a/index.ts === +export default 1; +No type information for this code. +No type information for this code.=== tests/cases/compiler/a/a.ts === +import parent from ".."; +>parent : Symbol(parent, Decl(a.ts, 0, 6)) + +import here from "."; +>here : Symbol(here, Decl(a.ts, 1, 6)) + +parent + here; +>parent : Symbol(parent, Decl(a.ts, 0, 6)) +>here : Symbol(here, Decl(a.ts, 1, 6)) + diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.types b/tests/baselines/reference/relativeModuleWithoutSlash.types new file mode 100644 index 00000000000..3093aa2e7c6 --- /dev/null +++ b/tests/baselines/reference/relativeModuleWithoutSlash.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/index.ts === +export default 0; +No type information for this code. +No type information for this code.=== tests/cases/compiler/a/index.ts === +export default 1; +No type information for this code. +No type information for this code.=== tests/cases/compiler/a/a.ts === +import parent from ".."; +>parent : number + +import here from "."; +>here : number + +parent + here; +>parent + here : number +>parent : number +>here : number + diff --git a/tests/cases/compiler/relativeModuleWithoutSlash.ts b/tests/cases/compiler/relativeModuleWithoutSlash.ts new file mode 100644 index 00000000000..35ad2ae9c6a --- /dev/null +++ b/tests/cases/compiler/relativeModuleWithoutSlash.ts @@ -0,0 +1,10 @@ +// @Filename: index.ts +export default 0; + +// @Filename: a/index.ts +export default 1; + +// @Filename: a/a.ts +import parent from ".."; +import here from "."; +parent + here; From 122c47c0350d8142900315778c438e5cbab76155 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Wed, 13 Jul 2016 08:15:55 -0700 Subject: [PATCH 065/109] Handle JSX bodies in formatter --- src/services/formatting/formattingScanner.ts | 13 ++++++++++++- tests/cases/fourslash/formatTsx.ts | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/formatTsx.ts diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 401794a077b..7822e4a72fc 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -26,7 +26,8 @@ namespace ts.formatting { RescanGreaterThanToken, RescanSlashToken, RescanTemplateToken, - RescanJsxIdentifier + RescanJsxIdentifier, + RescanJsxText, } export function getFormattingScanner(sourceFile: SourceFile, startPos: number, endPos: number): FormattingScanner { @@ -140,6 +141,10 @@ namespace ts.formatting { return false; } + function shouldRescanJsxText(node: Node): boolean { + return node && node.kind === SyntaxKind.JsxText; + } + function shouldRescanSlashToken(container: Node): boolean { return container.kind === SyntaxKind.RegularExpressionLiteral; } @@ -176,6 +181,8 @@ namespace ts.formatting { ? ScanAction.RescanTemplateToken : shouldRescanJsxIdentifier(n) ? ScanAction.RescanJsxIdentifier + : shouldRescanJsxText(n) + ? ScanAction.RescanJsxText : ScanAction.Scan; if (lastTokenInfo && expectedScanAction === lastScanAction) { @@ -215,6 +222,10 @@ namespace ts.formatting { currentToken = scanner.scanJsxIdentifier(); lastScanAction = ScanAction.RescanJsxIdentifier; } + else if (expectedScanAction === ScanAction.RescanJsxText) { + currentToken = scanner.reScanJsxToken(); + lastScanAction = ScanAction.RescanJsxText; + } else { lastScanAction = ScanAction.Scan; } diff --git a/tests/cases/fourslash/formatTsx.ts b/tests/cases/fourslash/formatTsx.ts new file mode 100644 index 00000000000..1472351fe40 --- /dev/null +++ b/tests/cases/fourslash/formatTsx.ts @@ -0,0 +1,18 @@ +/// + +// @Filename: foo.tsx +////

'

{function(){return 1;}]}

+ +format.document(); +verify.currentFileContentIs("

'

{function() { return 1; }]}

"); + +/* +< 0 +p 1 +> 2 +' 3 +< 4 +/ 5 +p 6 +> 7 +*/ From e6e6a8b1102d1ee5aca429350d5c22e6c0ddd1c9 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Wed, 13 Jul 2016 09:55:57 -0700 Subject: [PATCH 066/109] Use regex --- src/compiler/utilities.ts | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 8dbc052ddcf..4a8391338c3 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1218,23 +1218,7 @@ namespace ts { export function isExternalModuleNameRelative(moduleName: string): boolean { // TypeScript 1.0 spec (April 2014): 11.2.1 // An external module name is "relative" if the first term is "." or "..". - if (moduleName.charCodeAt(0) === CharacterCodes.dot) { - if (moduleName.length === 1) { - return true; - } - switch (moduleName.charCodeAt(1)) { - case CharacterCodes.slash: - case CharacterCodes.backslash: - return true; - case CharacterCodes.dot: - if (moduleName.length === 2) { - return true; - } - const ch2 = moduleName.charCodeAt(2); - return ch2 === CharacterCodes.slash || ch2 === CharacterCodes.backslash; - } - } - return false; + return /^\.\.?($|[\\/])/.test(moduleName); } export function isInstantiatedModule(node: ModuleDeclaration, preserveConstEnums: boolean) { From 8e679b7021ba0b1b078826647dc86fe5b676b322 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Wed, 13 Jul 2016 10:00:34 -0700 Subject: [PATCH 067/109] Remove duplicate startsWith and endsWith functions --- src/compiler/core.ts | 14 +------------- src/harness/harness.ts | 16 ++++++---------- src/services/patternMatcher.ts | 10 ---------- 3 files changed, 7 insertions(+), 33 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 3a7765094a1..7c125d72e99 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -900,7 +900,7 @@ namespace ts { } export function fileExtensionIs(path: string, extension: string): boolean { - return stringEndsWith(path, extension); + return path.length > extension.length && endsWith(path, extension); } export function fileExtensionIsAny(path: string, extensions: string[]): boolean { @@ -913,18 +913,6 @@ namespace ts { return false; } - // Should act like String.prototype.startsWith - export function stringStartsWith(s: string, start: string): boolean { - return s.length > start.length && s.substr(0, start.length) === start; - } - - // Should act like String.prototype.endsWith - export function stringEndsWith(s: string, end: string): boolean { - const sLen = s.length; - const endLen = end.length; - return sLen > endLen && s.substr(sLen - endLen, endLen) === end; - } - // Reserved characters, forces escaping of any non-word (or digit), non-whitespace character. // It may be inefficient (we could just match (/[-[\]{}()*+?.,\\^$|#\s]/g), but this is future // proof. diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 6afb0cfccdb..534778fdab8 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1377,31 +1377,27 @@ namespace Harness { writeByteOrderMark: boolean; } - function stringEndsWith(str: string, end: string) { - return str.substr(str.length - end.length) === end; - } - export function isTS(fileName: string) { - return stringEndsWith(fileName, ".ts"); + return ts.endsWith(fileName, ".ts"); } export function isTSX(fileName: string) { - return stringEndsWith(fileName, ".tsx"); + return ts.endsWith(fileName, ".tsx"); } export function isDTS(fileName: string) { - return stringEndsWith(fileName, ".d.ts"); + return ts.endsWith(fileName, ".d.ts"); } export function isJS(fileName: string) { - return stringEndsWith(fileName, ".js"); + return ts.endsWith(fileName, ".js"); } export function isJSX(fileName: string) { - return stringEndsWith(fileName, ".jsx"); + return ts.endsWith(fileName, ".jsx"); } export function isJSMap(fileName: string) { - return stringEndsWith(fileName, ".js.map") || stringEndsWith(fileName, ".jsx.map"); + return ts.endsWith(fileName, ".js.map") || ts.endsWith(fileName, ".jsx.map"); } /** Contains the code and errors of a compilation and some helper methods to check its status. */ diff --git a/src/services/patternMatcher.ts b/src/services/patternMatcher.ts index 93cc5130d72..3d20337eca7 100644 --- a/src/services/patternMatcher.ts +++ b/src/services/patternMatcher.ts @@ -514,16 +514,6 @@ namespace ts { return str === str.toLowerCase(); } - function startsWith(string: string, search: string) { - for (let i = 0, n = search.length; i < n; i++) { - if (string.charCodeAt(i) !== search.charCodeAt(i)) { - return false; - } - } - - return true; - } - // Assumes 'value' is already lowercase. function indexOfIgnoringCase(string: string, value: string): number { for (let i = 0, n = string.length - value.length; i <= n; i++) { From 574851f526d65d139ccc1d32f0b1c66634d47ed9 Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Wed, 13 Jul 2016 11:00:54 -0700 Subject: [PATCH 068/109] More PR feedback --- src/compiler/core.ts | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index dca1487e1fa..5157f3e0b04 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -922,20 +922,22 @@ namespace ts { const reservedCharacterPattern = /[^\w\s\/]/g; const wildcardCharCodes = [CharacterCodes.asterisk, CharacterCodes.question]; + /** + * Matches any single directory segment unless it is the last segment and a .min.js file + * Breakdown: + * [^./] # matches everything up to the first . character (excluding directory seperators) + * (\\.(?!min\\.js$))? # matches . characters but not if they are part of the .min.js file extension + */ + const singleAsteriskRegexFragmentFiles = "([^./]*(\\.(?!min\\.js$))?)*"; + const singleAsteriskRegexFragmentOther = "[^/]*"; + export function getRegularExpressionForWildcard(specs: string[], basePath: string, usage: "files" | "directories" | "exclude") { if (specs === undefined || specs.length === 0) { return undefined; } - /** - * Regex for the * wildcard. Matches all characters except for directory seperators. When - * used for including files, also does not match the file extension .min.js - * - * Breakdown for the "files" version: - * [^./] # matches everything up to the first . character (excluding directory seperators) - * (\\.(?!min\\.js$))? # matches . characters but not if they are part of the .min.js file extension - */ - const singleAsteriskRegexFragment = usage === "files" ? "([^./]*(\\.(?!min\\.js$))?)*" : "[^/]*"; + const replaceWildcardCharacter = usage === "files" ? replaceWildCardCharacterFiles : replaceWildCardCharacterOther; + const singleAsteriskRegexFragment = usage === "files" ? singleAsteriskRegexFragmentFiles : singleAsteriskRegexFragmentOther; /** * Regex for the ** wildcard. Matches any number of subdirectories. When used for including @@ -997,7 +999,7 @@ namespace ts { } } - subpattern += replaceWildcardCharacters(component, singleAsteriskRegexFragment); + subpattern += component.replace(reservedCharacterPattern, replaceWildcardCharacter); hasWrittenComponent = true; } } @@ -1022,12 +1024,16 @@ namespace ts { return "^(" + pattern + (usage === "exclude" ? ")($|/)" : ")$"); } - function replaceWildcardCharacters(component: string, singleAsteriskRegexFragment: string) { - return component.replace(reservedCharacterPattern, replaceWildcardCharacter); + function replaceWildCardCharacterFiles(match: string) { + return replaceWildcardCharacter(match, singleAsteriskRegexFragmentFiles); + } - function replaceWildcardCharacter(match: string) { - return match === "*" ? singleAsteriskRegexFragment : match === "?" ? "[^/]" : "\\" + match; - } + function replaceWildCardCharacterOther(match: string) { + return replaceWildcardCharacter(match, singleAsteriskRegexFragmentOther); + } + + function replaceWildcardCharacter(match: string, singleAsteriskRegexFragment: string) { + return match === "*" ? singleAsteriskRegexFragment : match === "?" ? "[^/]" : "\\" + match; } export interface FileSystemEntries { From 34e81f2805fd57616c65efa607dcdced47a0161e Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 13 Jul 2016 09:13:55 -0700 Subject: [PATCH 069/109] Add formatDiagnostics utility --- src/compiler/program.ts | 17 +++++++++++++++++ src/compiler/tsc.ts | 19 ++----------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 320b628c31a..151bac9ed62 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -997,6 +997,23 @@ namespace ts { return sortAndDeduplicateDiagnostics(diagnostics); } + export function formatDiagnostics(diagnostics: Diagnostic[], host: CompilerHost): string { + let output = ""; + + for (const diagnostic of diagnostics) { + if (diagnostic.file) { + const { line, character } = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); + const fileName = diagnostic.file.fileName; + const relativeFileName = convertToRelativePath(fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)); + output += `${ relativeFileName }(${ line + 1 },${ character + 1 }): `; + } + + const category = DiagnosticCategory[diagnostic.category].toLowerCase(); + output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; + } + return output; + } + export function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain, newLine: string): string { if (typeof messageText === "string") { return messageText; diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index e25ae37e21f..36f71f063bb 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -101,23 +101,8 @@ namespace ts { return diagnostic.messageText; } - function getRelativeFileName(fileName: string, host: CompilerHost): string { - return host ? convertToRelativePath(fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : fileName; - } - function reportDiagnosticSimply(diagnostic: Diagnostic, host: CompilerHost): void { - let output = ""; - - if (diagnostic.file) { - const { line, character } = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); - const relativeFileName = getRelativeFileName(diagnostic.file.fileName, host); - output += `${ relativeFileName }(${ line + 1 },${ character + 1 }): `; - } - - const category = DiagnosticCategory[diagnostic.category].toLowerCase(); - output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; - - sys.write(output); + sys.write(ts.formatDiagnostics([diagnostic], host)); } const redForegroundEscapeSequence = "\u001b[91m"; @@ -145,7 +130,7 @@ namespace ts { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length); const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line; - const relativeFileName = getRelativeFileName(file.fileName, host); + const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName;; const hasMoreThanFiveLines = (lastLine - firstLine) >= 4; let gutterWidth = (lastLine + 1 + "").length; From 919e31a264a1607b5fb978f72c81fc030047bcc4 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Wed, 13 Jul 2016 11:26:24 -0700 Subject: [PATCH 070/109] Include resolution trace --- .../reference/relativeModuleWithoutSlash.js | 53 +++++++++++------ .../relativeModuleWithoutSlash.symbols | 54 ++++++++++++----- .../relativeModuleWithoutSlash.trace.json | 26 ++++++++ .../relativeModuleWithoutSlash.types | 59 ++++++++++++++----- .../compiler/relativeModuleWithoutSlash.ts | 24 +++++--- 5 files changed, 161 insertions(+), 55 deletions(-) create mode 100644 tests/baselines/reference/relativeModuleWithoutSlash.trace.json diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.js b/tests/baselines/reference/relativeModuleWithoutSlash.js index de0a03c7923..f83406499d4 100644 --- a/tests/baselines/reference/relativeModuleWithoutSlash.js +++ b/tests/baselines/reference/relativeModuleWithoutSlash.js @@ -1,27 +1,42 @@ //// [tests/cases/compiler/relativeModuleWithoutSlash.ts] //// -//// [index.ts] -export default 0; - -//// [index.ts] -export default 1; - //// [a.ts] -import parent from ".."; -import here from "."; -parent + here; + +export default { a: 0 }; + +//// [index.ts] +export default { aIndex: 0 }; + +//// [test.ts] +import a from "."; +import aIndex from "./"; +a.a; +aIndex.a; //aIndex.aIndex; See GH#9690 + +//// [test.ts] +import a from ".."; +import aIndex from "../"; +a.a; +aIndex.a; //aIndex.aIndex; -//// [index.js] -"use strict"; -exports.__esModule = true; -exports["default"] = 0; -//// [index.js] -"use strict"; -exports.__esModule = true; -exports["default"] = 1; //// [a.js] "use strict"; -var __1 = require(".."); +exports.__esModule = true; +exports["default"] = { a: 0 }; +//// [index.js] +"use strict"; +exports.__esModule = true; +exports["default"] = { aIndex: 0 }; +//// [test.js] +"use strict"; var _1 = require("."); -__1["default"] + _1["default"]; +var _2 = require("./"); +_1["default"].a; +_2["default"].a; //aIndex.aIndex; See GH#9690 +//// [test.js] +"use strict"; +var __1 = require(".."); +var _1 = require("../"); +__1["default"].a; +_1["default"].a; //aIndex.aIndex; diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.symbols b/tests/baselines/reference/relativeModuleWithoutSlash.symbols index 280a844f2f7..434c3aa6bd7 100644 --- a/tests/baselines/reference/relativeModuleWithoutSlash.symbols +++ b/tests/baselines/reference/relativeModuleWithoutSlash.symbols @@ -1,17 +1,43 @@ -=== tests/cases/compiler/index.ts === -export default 0; -No type information for this code. -No type information for this code.=== tests/cases/compiler/a/index.ts === -export default 1; -No type information for this code. -No type information for this code.=== tests/cases/compiler/a/a.ts === -import parent from ".."; ->parent : Symbol(parent, Decl(a.ts, 0, 6)) +=== tests/cases/compiler/a.ts === -import here from "."; ->here : Symbol(here, Decl(a.ts, 1, 6)) +export default { a: 0 }; +>a : Symbol(a, Decl(a.ts, 1, 16)) -parent + here; ->parent : Symbol(parent, Decl(a.ts, 0, 6)) ->here : Symbol(here, Decl(a.ts, 1, 6)) +=== tests/cases/compiler/a/index.ts === +export default { aIndex: 0 }; +>aIndex : Symbol(aIndex, Decl(index.ts, 0, 16)) + +=== tests/cases/compiler/a/test.ts === +import a from "."; +>a : Symbol(a, Decl(test.ts, 0, 6)) + +import aIndex from "./"; +>aIndex : Symbol(aIndex, Decl(test.ts, 1, 6)) + +a.a; +>a.a : Symbol(a, Decl(a.ts, 1, 16)) +>a : Symbol(a, Decl(test.ts, 0, 6)) +>a : Symbol(a, Decl(a.ts, 1, 16)) + +aIndex.a; //aIndex.aIndex; See GH#9690 +>aIndex.a : Symbol(a, Decl(a.ts, 1, 16)) +>aIndex : Symbol(aIndex, Decl(test.ts, 1, 6)) +>a : Symbol(a, Decl(a.ts, 1, 16)) + +=== tests/cases/compiler/a/b/test.ts === +import a from ".."; +>a : Symbol(a, Decl(test.ts, 0, 6)) + +import aIndex from "../"; +>aIndex : Symbol(aIndex, Decl(test.ts, 1, 6)) + +a.a; +>a.a : Symbol(a, Decl(a.ts, 1, 16)) +>a : Symbol(a, Decl(test.ts, 0, 6)) +>a : Symbol(a, Decl(a.ts, 1, 16)) + +aIndex.a; //aIndex.aIndex; +>aIndex.a : Symbol(a, Decl(a.ts, 1, 16)) +>aIndex : Symbol(aIndex, Decl(test.ts, 1, 6)) +>a : Symbol(a, Decl(a.ts, 1, 16)) diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.trace.json b/tests/baselines/reference/relativeModuleWithoutSlash.trace.json new file mode 100644 index 00000000000..765389e4629 --- /dev/null +++ b/tests/baselines/reference/relativeModuleWithoutSlash.trace.json @@ -0,0 +1,26 @@ +[ + "======== Resolving module '.' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/test.ts'. ========", + "Explicitly specified module resolution kind: 'NodeJs'.", + "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", + "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", + "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", + "======== Module name '.' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========", + "======== Resolving module './' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/test.ts'. ========", + "Explicitly specified module resolution kind: 'NodeJs'.", + "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", + "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", + "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", + "======== Module name './' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========", + "======== Resolving module '..' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/b/test.ts'. ========", + "Explicitly specified module resolution kind: 'NodeJs'.", + "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", + "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", + "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", + "======== Module name '..' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========", + "======== Resolving module '../' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/b/test.ts'. ========", + "Explicitly specified module resolution kind: 'NodeJs'.", + "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", + "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", + "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", + "======== Module name '../' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========" +] \ No newline at end of file diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.types b/tests/baselines/reference/relativeModuleWithoutSlash.types index 3093aa2e7c6..3b58f097405 100644 --- a/tests/baselines/reference/relativeModuleWithoutSlash.types +++ b/tests/baselines/reference/relativeModuleWithoutSlash.types @@ -1,18 +1,47 @@ -=== tests/cases/compiler/index.ts === -export default 0; -No type information for this code. -No type information for this code.=== tests/cases/compiler/a/index.ts === -export default 1; -No type information for this code. -No type information for this code.=== tests/cases/compiler/a/a.ts === -import parent from ".."; ->parent : number +=== tests/cases/compiler/a.ts === -import here from "."; ->here : number +export default { a: 0 }; +>{ a: 0 } : { a: number; } +>a : number +>0 : number -parent + here; ->parent + here : number ->parent : number ->here : number +=== tests/cases/compiler/a/index.ts === +export default { aIndex: 0 }; +>{ aIndex: 0 } : { aIndex: number; } +>aIndex : number +>0 : number + +=== tests/cases/compiler/a/test.ts === +import a from "."; +>a : { a: number; } + +import aIndex from "./"; +>aIndex : { a: number; } + +a.a; +>a.a : number +>a : { a: number; } +>a : number + +aIndex.a; //aIndex.aIndex; See GH#9690 +>aIndex.a : number +>aIndex : { a: number; } +>a : number + +=== tests/cases/compiler/a/b/test.ts === +import a from ".."; +>a : { a: number; } + +import aIndex from "../"; +>aIndex : { a: number; } + +a.a; +>a.a : number +>a : { a: number; } +>a : number + +aIndex.a; //aIndex.aIndex; +>aIndex.a : number +>aIndex : { a: number; } +>a : number diff --git a/tests/cases/compiler/relativeModuleWithoutSlash.ts b/tests/cases/compiler/relativeModuleWithoutSlash.ts index 35ad2ae9c6a..3b4f50da306 100644 --- a/tests/cases/compiler/relativeModuleWithoutSlash.ts +++ b/tests/cases/compiler/relativeModuleWithoutSlash.ts @@ -1,10 +1,20 @@ -// @Filename: index.ts -export default 0; +// @traceResolution: true +// @moduleResolution: node + +// @Filename: a.ts +export default { a: 0 }; // @Filename: a/index.ts -export default 1; +export default { aIndex: 0 }; -// @Filename: a/a.ts -import parent from ".."; -import here from "."; -parent + here; +// @Filename: a/test.ts +import a from "."; +import aIndex from "./"; +a.a; +aIndex.a; //aIndex.aIndex; See GH#9690 + +// @Filename: a/b/test.ts +import a from ".."; +import aIndex from "../"; +a.a; +aIndex.a; //aIndex.aIndex; From 606ac0e533d78f5e89bc61ce4b0beec7af77ccad Mon Sep 17 00:00:00 2001 From: zhengbli Date: Wed, 13 Jul 2016 11:38:26 -0700 Subject: [PATCH 071/109] Port #9621 to release-2.0 --- src/compiler/checker.ts | 3 ++ .../cases/fourslash/server/jsdocTypedefTag.ts | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index aea8c982a95..e842f008bbe 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3160,6 +3160,9 @@ namespace ts { if (declaration.kind === SyntaxKind.ExportAssignment) { return links.type = checkExpression((declaration).expression); } + if (declaration.flags & NodeFlags.JavaScriptFile && declaration.kind === SyntaxKind.JSDocPropertyTag && (declaration).typeExpression) { + return links.type = getTypeFromTypeNode((declaration).typeExpression.type); + } // Handle variable, parameter or property if (!pushTypeResolution(symbol, TypeSystemPropertyName.Type)) { return unknownType; diff --git a/tests/cases/fourslash/server/jsdocTypedefTag.ts b/tests/cases/fourslash/server/jsdocTypedefTag.ts index e645b518020..968e30a412d 100644 --- a/tests/cases/fourslash/server/jsdocTypedefTag.ts +++ b/tests/cases/fourslash/server/jsdocTypedefTag.ts @@ -32,16 +32,24 @@ //// var numberLike; numberLike./*numberLike*/ //// //// /** @type {Person} */ -//// var p;p./*person*/ +//// var p;p./*person*/; +//// p.personName./*personName*/; +//// p.personAge./*personAge*/; //// //// /** @type {Animal} */ -//// var a;a./*animal*/ +//// var a;a./*animal*/; +//// a.animalName./*animalName*/; +//// a.animalAge./*animalAge*/; //// //// /** @type {Cat} */ -//// var c;c./*cat*/ +//// var c;c./*cat*/; +//// c.catName./*catName*/; +//// c.catAge./*catAge*/; //// //// /** @type {Dog} */ -//// var d;d./*dog*/ +//// var d;d./*dog*/; +//// d.dogName./*dogName*/; +//// d.dogAge./*dogAge*/; goTo.marker('numberLike'); verify.memberListContains('charAt'); @@ -50,15 +58,31 @@ verify.memberListContains('toExponential'); goTo.marker('person'); verify.memberListContains('personName'); verify.memberListContains('personAge'); +goTo.marker('personName'); +verify.memberListContains('charAt'); +goTo.marker('personAge'); +verify.memberListContains('toExponential'); goTo.marker('animal'); verify.memberListContains('animalName'); verify.memberListContains('animalAge'); +goTo.marker('animalName'); +verify.memberListContains('charAt'); +goTo.marker('animalAge'); +verify.memberListContains('toExponential'); goTo.marker('dog'); verify.memberListContains('dogName'); verify.memberListContains('dogAge'); +goTo.marker('dogName'); +verify.memberListContains('charAt'); +goTo.marker('dogAge'); +verify.memberListContains('toExponential'); goTo.marker('cat'); verify.memberListContains('catName'); -verify.memberListContains('catAge'); \ No newline at end of file +verify.memberListContains('catAge'); +goTo.marker('catName'); +verify.memberListContains('charAt'); +goTo.marker('catAge'); +verify.memberListContains('toExponential'); \ No newline at end of file From 5efbf61c951c22eba2ea7630fbdd5bb67c70d336 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 13 Jul 2016 11:42:59 -0700 Subject: [PATCH 072/109] Skip `this` in emitter in 2 more places --- src/compiler/emitter.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 2d5acb3b486..6e1a2a39c10 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4571,14 +4571,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge function emitRestParameter(node: FunctionLikeDeclaration) { if (languageVersion < ScriptTarget.ES6 && hasDeclaredRestParameter(node)) { - const restIndex = node.parameters.length - 1; - const restParam = node.parameters[restIndex]; + const restParam = node.parameters[node.parameters.length - 1]; // A rest parameter cannot have a binding pattern, so let's just ignore it if it does. if (isBindingPattern(restParam.name)) { return; } + const skipThisCount = node.parameters.length && (node.parameters[0].name).text === "this" ? 1 : 0; + const restIndex = node.parameters.length - 1 - skipThisCount; const tempName = createTempVariable(TempFlags._i).text; writeLine(); emitLeadingComments(restParam); @@ -6155,10 +6156,11 @@ const _super = (function (geti, seti) { if (valueDeclaration) { const parameters = valueDeclaration.parameters; + const skipThisCount = parameters.length && (parameters[0].name).text === "this" ? 1 : 0; const parameterCount = parameters.length; - if (parameterCount > 0) { - for (let i = 0; i < parameterCount; i++) { - if (i > 0) { + if (parameterCount > skipThisCount) { + for (let i = skipThisCount; i < parameterCount; i++) { + if (i > skipThisCount) { write(", "); } From 2cc040c66629d29f470a9ef9914dab7a4ec245f5 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 13 Jul 2016 11:43:28 -0700 Subject: [PATCH 073/109] Test that emitter skips `this` with rest parameter Also test that it's skipped when emitting decorator metadata --- .../emitDecoratorMetadata_restArgs.js | 2 +- .../emitDecoratorMetadata_restArgs.symbols | 5 ++-- .../emitDecoratorMetadata_restArgs.types | 5 ++-- .../emitSkipsThisWithRestParameter.js | 18 ++++++++++++ .../emitSkipsThisWithRestParameter.symbols | 25 ++++++++++++++++ .../emitSkipsThisWithRestParameter.types | 29 +++++++++++++++++++ .../emitDecoratorMetadata_restArgs.ts | 2 +- .../emitSkipsThisWithRestParameter.ts | 5 ++++ 8 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 tests/baselines/reference/emitSkipsThisWithRestParameter.js create mode 100644 tests/baselines/reference/emitSkipsThisWithRestParameter.symbols create mode 100644 tests/baselines/reference/emitSkipsThisWithRestParameter.types create mode 100644 tests/cases/compiler/emitSkipsThisWithRestParameter.ts diff --git a/tests/baselines/reference/emitDecoratorMetadata_restArgs.js b/tests/baselines/reference/emitDecoratorMetadata_restArgs.js index 35350c54e0a..6ca7e40d413 100644 --- a/tests/baselines/reference/emitDecoratorMetadata_restArgs.js +++ b/tests/baselines/reference/emitDecoratorMetadata_restArgs.js @@ -14,7 +14,7 @@ class A { class B { constructor(...args: number[]) {} @MyMethodDecorator - method(...args: string[]) {} + method(this: this, ...args: string[]) {} } diff --git a/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols b/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols index b665b778f86..29ccb8b2711 100644 --- a/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols +++ b/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols @@ -37,8 +37,9 @@ class B { @MyMethodDecorator >MyMethodDecorator : Symbol(MyMethodDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 2, 13)) - method(...args: string[]) {} + method(this: this, ...args: string[]) {} >method : Symbol(B.method, Decl(emitDecoratorMetadata_restArgs.ts, 13, 37)) ->args : Symbol(args, Decl(emitDecoratorMetadata_restArgs.ts, 15, 11)) +>this : Symbol(this, Decl(emitDecoratorMetadata_restArgs.ts, 15, 11)) +>args : Symbol(args, Decl(emitDecoratorMetadata_restArgs.ts, 15, 22)) } diff --git a/tests/baselines/reference/emitDecoratorMetadata_restArgs.types b/tests/baselines/reference/emitDecoratorMetadata_restArgs.types index 4820d3a7d8d..e08261e4503 100644 --- a/tests/baselines/reference/emitDecoratorMetadata_restArgs.types +++ b/tests/baselines/reference/emitDecoratorMetadata_restArgs.types @@ -37,8 +37,9 @@ class B { @MyMethodDecorator >MyMethodDecorator : (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void - method(...args: string[]) {} ->method : (...args: string[]) => void + method(this: this, ...args: string[]) {} +>method : (this: this, ...args: string[]) => void +>this : this >args : string[] } diff --git a/tests/baselines/reference/emitSkipsThisWithRestParameter.js b/tests/baselines/reference/emitSkipsThisWithRestParameter.js new file mode 100644 index 00000000000..d1e99f9409d --- /dev/null +++ b/tests/baselines/reference/emitSkipsThisWithRestParameter.js @@ -0,0 +1,18 @@ +//// [emitSkipsThisWithRestParameter.ts] +function rebase(fn: (base: any, ...args: any[]) => any): (...args: any[]) => any { + return function(this: any, ...args: any[]) { + return fn.apply(this, [ this ].concat(args)); + }; +} + + +//// [emitSkipsThisWithRestParameter.js] +function rebase(fn) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + return fn.apply(this, [this].concat(args)); + }; +} diff --git a/tests/baselines/reference/emitSkipsThisWithRestParameter.symbols b/tests/baselines/reference/emitSkipsThisWithRestParameter.symbols new file mode 100644 index 00000000000..4f1e2bc1aec --- /dev/null +++ b/tests/baselines/reference/emitSkipsThisWithRestParameter.symbols @@ -0,0 +1,25 @@ +=== tests/cases/compiler/emitSkipsThisWithRestParameter.ts === +function rebase(fn: (base: any, ...args: any[]) => any): (...args: any[]) => any { +>rebase : Symbol(rebase, Decl(emitSkipsThisWithRestParameter.ts, 0, 0)) +>fn : Symbol(fn, Decl(emitSkipsThisWithRestParameter.ts, 0, 16)) +>base : Symbol(base, Decl(emitSkipsThisWithRestParameter.ts, 0, 21)) +>args : Symbol(args, Decl(emitSkipsThisWithRestParameter.ts, 0, 31)) +>args : Symbol(args, Decl(emitSkipsThisWithRestParameter.ts, 0, 58)) + + return function(this: any, ...args: any[]) { +>this : Symbol(this, Decl(emitSkipsThisWithRestParameter.ts, 1, 20)) +>args : Symbol(args, Decl(emitSkipsThisWithRestParameter.ts, 1, 30)) + + return fn.apply(this, [ this ].concat(args)); +>fn.apply : Symbol(Function.apply, Decl(lib.d.ts, --, --)) +>fn : Symbol(fn, Decl(emitSkipsThisWithRestParameter.ts, 0, 16)) +>apply : Symbol(Function.apply, Decl(lib.d.ts, --, --)) +>this : Symbol(this, Decl(emitSkipsThisWithRestParameter.ts, 1, 20)) +>[ this ].concat : Symbol(Array.concat, Decl(lib.d.ts, --, --)) +>this : Symbol(this, Decl(emitSkipsThisWithRestParameter.ts, 1, 20)) +>concat : Symbol(Array.concat, Decl(lib.d.ts, --, --)) +>args : Symbol(args, Decl(emitSkipsThisWithRestParameter.ts, 1, 30)) + + }; +} + diff --git a/tests/baselines/reference/emitSkipsThisWithRestParameter.types b/tests/baselines/reference/emitSkipsThisWithRestParameter.types new file mode 100644 index 00000000000..97276fa117d --- /dev/null +++ b/tests/baselines/reference/emitSkipsThisWithRestParameter.types @@ -0,0 +1,29 @@ +=== tests/cases/compiler/emitSkipsThisWithRestParameter.ts === +function rebase(fn: (base: any, ...args: any[]) => any): (...args: any[]) => any { +>rebase : (fn: (base: any, ...args: any[]) => any) => (...args: any[]) => any +>fn : (base: any, ...args: any[]) => any +>base : any +>args : any[] +>args : any[] + + return function(this: any, ...args: any[]) { +>function(this: any, ...args: any[]) { return fn.apply(this, [ this ].concat(args)); } : (this: any, ...args: any[]) => any +>this : any +>args : any[] + + return fn.apply(this, [ this ].concat(args)); +>fn.apply(this, [ this ].concat(args)) : any +>fn.apply : (this: Function, thisArg: any, argArray?: any) => any +>fn : (base: any, ...args: any[]) => any +>apply : (this: Function, thisArg: any, argArray?: any) => any +>this : any +>[ this ].concat(args) : any[] +>[ this ].concat : (...items: any[]) => any[] +>[ this ] : any[] +>this : any +>concat : (...items: any[]) => any[] +>args : any[] + + }; +} + diff --git a/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts b/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts index 6b0741e2205..f58e9b704d4 100644 --- a/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts +++ b/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts @@ -16,5 +16,5 @@ class A { class B { constructor(...args: number[]) {} @MyMethodDecorator - method(...args: string[]) {} + method(this: this, ...args: string[]) {} } diff --git a/tests/cases/compiler/emitSkipsThisWithRestParameter.ts b/tests/cases/compiler/emitSkipsThisWithRestParameter.ts new file mode 100644 index 00000000000..09411a28cd2 --- /dev/null +++ b/tests/cases/compiler/emitSkipsThisWithRestParameter.ts @@ -0,0 +1,5 @@ +function rebase(fn: (base: any, ...args: any[]) => any): (...args: any[]) => any { + return function(this: any, ...args: any[]) { + return fn.apply(this, [ this ].concat(args)); + }; +} From df590588125e5a8e362ed35f1c4acf46f8499977 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Wed, 13 Jul 2016 11:47:53 -0700 Subject: [PATCH 074/109] Fix endsWith bug --- src/compiler/utilities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 4a8391338c3..f970a94373a 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -3120,6 +3120,6 @@ namespace ts { export function endsWith(str: string, suffix: string): boolean { const expectedPos = str.length - suffix.length; - return str.indexOf(suffix, expectedPos) === expectedPos; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; } } From 5484e754e4940ca7b59f2cbe17951c82170bf97c Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 13 Jul 2016 12:40:37 -0700 Subject: [PATCH 075/109] Remove extra semicolon --- src/compiler/tsc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 36f71f063bb..2d90804a03b 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -130,7 +130,7 @@ namespace ts { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length); const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line; - const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName;; + const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName; const hasMoreThanFiveLines = (lastLine - firstLine) >= 4; let gutterWidth = (lastLine + 1 + "").length; From ebb09069283fa8a6ba792a06c75cb3a5421f4190 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 13 Jul 2016 13:06:10 -0700 Subject: [PATCH 076/109] Use originalKeywordKind to detect this parameters --- src/compiler/emitter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6e1a2a39c10..bdf50a2c4da 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4578,7 +4578,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge return; } - const skipThisCount = node.parameters.length && (node.parameters[0].name).text === "this" ? 1 : 0; + const skipThisCount = node.parameters.length && (node.parameters[0].name).originalKeywordKind === SyntaxKind.ThisKeyword ? 1 : 0; const restIndex = node.parameters.length - 1 - skipThisCount; const tempName = createTempVariable(TempFlags._i).text; writeLine(); @@ -4727,7 +4727,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge write("("); if (node) { const parameters = node.parameters; - const skipCount = node.parameters.length && (node.parameters[0].name).text === "this" ? 1 : 0; + const skipCount = node.parameters.length && (node.parameters[0].name).originalKeywordKind === SyntaxKind.ThisKeyword ? 1 : 0; const omitCount = languageVersion < ScriptTarget.ES6 && hasDeclaredRestParameter(node) ? 1 : 0; emitList(parameters, skipCount, parameters.length - omitCount - skipCount, /*multiLine*/ false, /*trailingComma*/ false); } @@ -6156,7 +6156,7 @@ const _super = (function (geti, seti) { if (valueDeclaration) { const parameters = valueDeclaration.parameters; - const skipThisCount = parameters.length && (parameters[0].name).text === "this" ? 1 : 0; + const skipThisCount = parameters.length && (parameters[0].name).originalKeywordKind === SyntaxKind.ThisKeyword ? 1 : 0; const parameterCount = parameters.length; if (parameterCount > skipThisCount) { for (let i = skipThisCount; i < parameterCount; i++) { From e28acd3c1f57d04c38fcf509c89d41a9597f6efe Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 13 Jul 2016 09:13:55 -0700 Subject: [PATCH 077/109] Add formatDiagnostics utility --- src/compiler/program.ts | 17 +++++++++++++++++ src/compiler/tsc.ts | 19 ++----------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 670d30b7d33..032c5dc847b 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -997,6 +997,23 @@ namespace ts { return sortAndDeduplicateDiagnostics(diagnostics); } + export function formatDiagnostics(diagnostics: Diagnostic[], host: CompilerHost): string { + let output = ""; + + for (const diagnostic of diagnostics) { + if (diagnostic.file) { + const { line, character } = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); + const fileName = diagnostic.file.fileName; + const relativeFileName = convertToRelativePath(fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)); + output += `${ relativeFileName }(${ line + 1 },${ character + 1 }): `; + } + + const category = DiagnosticCategory[diagnostic.category].toLowerCase(); + output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; + } + return output; + } + export function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain, newLine: string): string { if (typeof messageText === "string") { return messageText; diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index e25ae37e21f..36f71f063bb 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -101,23 +101,8 @@ namespace ts { return diagnostic.messageText; } - function getRelativeFileName(fileName: string, host: CompilerHost): string { - return host ? convertToRelativePath(fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : fileName; - } - function reportDiagnosticSimply(diagnostic: Diagnostic, host: CompilerHost): void { - let output = ""; - - if (diagnostic.file) { - const { line, character } = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); - const relativeFileName = getRelativeFileName(diagnostic.file.fileName, host); - output += `${ relativeFileName }(${ line + 1 },${ character + 1 }): `; - } - - const category = DiagnosticCategory[diagnostic.category].toLowerCase(); - output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; - - sys.write(output); + sys.write(ts.formatDiagnostics([diagnostic], host)); } const redForegroundEscapeSequence = "\u001b[91m"; @@ -145,7 +130,7 @@ namespace ts { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length); const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line; - const relativeFileName = getRelativeFileName(file.fileName, host); + const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName;; const hasMoreThanFiveLines = (lastLine - firstLine) >= 4; let gutterWidth = (lastLine + 1 + "").length; From 05fbe7cddd89ad62994702228c90fe53e199a0a3 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 13 Jul 2016 15:25:15 -0700 Subject: [PATCH 078/109] use getNewLine from host rather than sys --- src/compiler/program.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 032c5dc847b..eceaff3df6d 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1009,7 +1009,7 @@ namespace ts { } const category = DiagnosticCategory[diagnostic.category].toLowerCase(); - output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; + output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) }${ host.getNewLine() }`; } return output; } From 62f49c3b7e517a26cf1a1b8597fd3d7fe72a546d Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 13 Jul 2016 15:25:15 -0700 Subject: [PATCH 079/109] use getNewLine from host rather than sys --- src/compiler/program.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c2a1e6ade66..dbcb9f7c617 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1003,7 +1003,7 @@ namespace ts { } const category = DiagnosticCategory[diagnostic.category].toLowerCase(); - output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, sys.newLine) }${ sys.newLine }`; + output += `${ category } TS${ diagnostic.code }: ${ flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) }${ host.getNewLine() }`; } return output; } From a706ad58bd3a473f43dc272b78279803e676d479 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 13 Jul 2016 16:24:11 -0700 Subject: [PATCH 080/109] fix absolute paths in baselines --- .../relativeModuleWithoutSlash.symbols | 8 ++-- .../relativeModuleWithoutSlash.trace.json | 40 +++++++++---------- .../relativeModuleWithoutSlash.types | 8 ++-- .../compiler/relativeModuleWithoutSlash.ts | 8 ++-- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.symbols b/tests/baselines/reference/relativeModuleWithoutSlash.symbols index 434c3aa6bd7..8c54a0682c7 100644 --- a/tests/baselines/reference/relativeModuleWithoutSlash.symbols +++ b/tests/baselines/reference/relativeModuleWithoutSlash.symbols @@ -1,13 +1,13 @@ -=== tests/cases/compiler/a.ts === +=== /a.ts === export default { a: 0 }; >a : Symbol(a, Decl(a.ts, 1, 16)) -=== tests/cases/compiler/a/index.ts === +=== /a/index.ts === export default { aIndex: 0 }; >aIndex : Symbol(aIndex, Decl(index.ts, 0, 16)) -=== tests/cases/compiler/a/test.ts === +=== /a/test.ts === import a from "."; >a : Symbol(a, Decl(test.ts, 0, 6)) @@ -24,7 +24,7 @@ aIndex.a; //aIndex.aIndex; See GH#9690 >aIndex : Symbol(aIndex, Decl(test.ts, 1, 6)) >a : Symbol(a, Decl(a.ts, 1, 16)) -=== tests/cases/compiler/a/b/test.ts === +=== /a/b/test.ts === import a from ".."; >a : Symbol(a, Decl(test.ts, 0, 6)) diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.trace.json b/tests/baselines/reference/relativeModuleWithoutSlash.trace.json index 765389e4629..cee5b060676 100644 --- a/tests/baselines/reference/relativeModuleWithoutSlash.trace.json +++ b/tests/baselines/reference/relativeModuleWithoutSlash.trace.json @@ -1,26 +1,26 @@ [ - "======== Resolving module '.' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/test.ts'. ========", + "======== Resolving module '.' from '/a/test.ts'. ========", "Explicitly specified module resolution kind: 'NodeJs'.", - "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", - "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", - "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", - "======== Module name '.' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========", - "======== Resolving module './' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/test.ts'. ========", + "Loading module as file / folder, candidate module location '/a'.", + "File '/a.ts' exist - use it as a name resolution result.", + "Resolving real path for '/a.ts', result '/a.ts'", + "======== Module name '.' was successfully resolved to '/a.ts'. ========", + "======== Resolving module './' from '/a/test.ts'. ========", "Explicitly specified module resolution kind: 'NodeJs'.", - "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", - "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", - "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", - "======== Module name './' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========", - "======== Resolving module '..' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/b/test.ts'. ========", + "Loading module as file / folder, candidate module location '/a'.", + "File '/a.ts' exist - use it as a name resolution result.", + "Resolving real path for '/a.ts', result '/a.ts'", + "======== Module name './' was successfully resolved to '/a.ts'. ========", + "======== Resolving module '..' from '/a/b/test.ts'. ========", "Explicitly specified module resolution kind: 'NodeJs'.", - "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", - "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", - "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", - "======== Module name '..' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========", - "======== Resolving module '../' from 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a/b/test.ts'. ========", + "Loading module as file / folder, candidate module location '/a'.", + "File '/a.ts' exist - use it as a name resolution result.", + "Resolving real path for '/a.ts', result '/a.ts'", + "======== Module name '..' was successfully resolved to '/a.ts'. ========", + "======== Resolving module '../' from '/a/b/test.ts'. ========", "Explicitly specified module resolution kind: 'NodeJs'.", - "Loading module as file / folder, candidate module location 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a'.", - "File 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts' exist - use it as a name resolution result.", - "Resolving real path for 'C:/Users/anhans/work/TypeScript/tests/cases/compiler/a.ts', result 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'", - "======== Module name '../' was successfully resolved to 'c:/users/anhans/work/typescript/tests/cases/compiler/a.ts'. ========" + "Loading module as file / folder, candidate module location '/a'.", + "File '/a.ts' exist - use it as a name resolution result.", + "Resolving real path for '/a.ts', result '/a.ts'", + "======== Module name '../' was successfully resolved to '/a.ts'. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/relativeModuleWithoutSlash.types b/tests/baselines/reference/relativeModuleWithoutSlash.types index 3b58f097405..796ef714dd9 100644 --- a/tests/baselines/reference/relativeModuleWithoutSlash.types +++ b/tests/baselines/reference/relativeModuleWithoutSlash.types @@ -1,17 +1,17 @@ -=== tests/cases/compiler/a.ts === +=== /a.ts === export default { a: 0 }; >{ a: 0 } : { a: number; } >a : number >0 : number -=== tests/cases/compiler/a/index.ts === +=== /a/index.ts === export default { aIndex: 0 }; >{ aIndex: 0 } : { aIndex: number; } >aIndex : number >0 : number -=== tests/cases/compiler/a/test.ts === +=== /a/test.ts === import a from "."; >a : { a: number; } @@ -28,7 +28,7 @@ aIndex.a; //aIndex.aIndex; See GH#9690 >aIndex : { a: number; } >a : number -=== tests/cases/compiler/a/b/test.ts === +=== /a/b/test.ts === import a from ".."; >a : { a: number; } diff --git a/tests/cases/compiler/relativeModuleWithoutSlash.ts b/tests/cases/compiler/relativeModuleWithoutSlash.ts index 3b4f50da306..42b328e1175 100644 --- a/tests/cases/compiler/relativeModuleWithoutSlash.ts +++ b/tests/cases/compiler/relativeModuleWithoutSlash.ts @@ -1,19 +1,19 @@ // @traceResolution: true // @moduleResolution: node -// @Filename: a.ts +// @Filename: /a.ts export default { a: 0 }; -// @Filename: a/index.ts +// @Filename: /a/index.ts export default { aIndex: 0 }; -// @Filename: a/test.ts +// @Filename: /a/test.ts import a from "."; import aIndex from "./"; a.a; aIndex.a; //aIndex.aIndex; See GH#9690 -// @Filename: a/b/test.ts +// @Filename: /a/b/test.ts import a from ".."; import aIndex from "../"; a.a; From 4f9a23468b4abce5bb752c68ef8ead9c343104f1 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 13 Jul 2016 17:08:57 -0700 Subject: [PATCH 081/109] move endsWith to core.ts --- src/compiler/core.ts | 11 +++++++++++ src/compiler/utilities.ts | 9 --------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 7c125d72e99..5764c316090 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -899,6 +899,17 @@ namespace ts { return true; } + /* @internal */ + export function startsWith(str: string, prefix: string): boolean { + return str.lastIndexOf(prefix, 0) === 0; + } + + /* @internal */ + export function endsWith(str: string, suffix: string): boolean { + const expectedPos = str.length - suffix.length; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; + } + export function fileExtensionIs(path: string, extension: string): boolean { return path.length > extension.length && endsWith(path, extension); } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index f970a94373a..7219a5bbd24 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -3113,13 +3113,4 @@ namespace ts { export function isParameterPropertyDeclaration(node: ParameterDeclaration): boolean { return node.flags & NodeFlags.ParameterPropertyModifier && node.parent.kind === SyntaxKind.Constructor && isClassLike(node.parent.parent); } - - export function startsWith(str: string, prefix: string): boolean { - return str.lastIndexOf(prefix, 0) === 0; - } - - export function endsWith(str: string, suffix: string): boolean { - const expectedPos = str.length - suffix.length; - return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; - } } From 695582e33b94c324a6cbbb05ae2c0721ef9d25fa Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 13 Jul 2016 23:49:32 -0700 Subject: [PATCH 082/109] Tell travis to build on OSX in addition to Linux (#9717) This way we can have a CI environment with a case-insensitive filesystem. Travis added supprot for this around April. --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index b31d1f10da0..92e9d082a49 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,3 +6,7 @@ node_js: - '0.10' sudo: false + +os: + - linux + - osx From 3cb051375222697ff886c6d7d7c49eda9e866d10 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 14 Jul 2016 10:29:12 -0700 Subject: [PATCH 083/109] Have travis fast_finish (#9718) This causes a build to be marked as failed the instant any of its component builds fail (rather than waiting for them all to finish to mark a failure). --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 92e9d082a49..989924dc32c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,3 +10,6 @@ sudo: false os: - linux - osx + +matrix: + fast_finish: true From b8e814e9a4b41dfc62f9a56bc2a470931c42bb61 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 14 Jul 2016 10:30:37 -0700 Subject: [PATCH 084/109] Harden compilerRunner vs rooted path names in tests (#9714) * Harden compilerRunner vs rooted path names in tests * Call toPath on currentDirectory --- src/harness/compilerRunner.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index 1834b0b3bbc..ecdc18394b0 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -50,7 +50,9 @@ class CompilerBaselineRunner extends RunnerBase { } private makeUnitName(name: string, root: string) { - return ts.isRootedDiskPath(name) ? name : ts.combinePaths(root, name); + const path = ts.toPath(name, root, (fileName) => Harness.Compiler.getCanonicalFileName(fileName)); + const pathStart = ts.toPath(Harness.IO.getCurrentDirectory(), "", (fileName) => Harness.Compiler.getCanonicalFileName(fileName)); + return path.replace(pathStart, "/"); }; public checkTestCodeOutput(fileName: string) { From 2da684655762d4a51e8c33c4772059d1a689e9df Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 14 Jul 2016 23:02:56 -0700 Subject: [PATCH 085/109] use sys based host for formatting diagnostics --- src/compiler/program.ts | 8 +++++++- src/compiler/tsc.ts | 38 ++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index dbcb9f7c617..206311e2f18 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -991,7 +991,13 @@ namespace ts { return sortAndDeduplicateDiagnostics(diagnostics); } - export function formatDiagnostics(diagnostics: Diagnostic[], host: CompilerHost): string { + export interface FormatDiagnosticsHost { + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + getNewLine(): string; + } + + export function formatDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): string { let output = ""; for (const diagnostic of diagnostics) { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 2d90804a03b..e32a3816d64 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -6,9 +6,19 @@ namespace ts { fileWatcher?: FileWatcher; } - let reportDiagnostic = reportDiagnosticSimply; + const defaultFormatDiagnosticsHost: FormatDiagnosticsHost = { + getCurrentDirectory: () => sys.getCurrentDirectory(), + getNewLine: () => sys.newLine, + getCanonicalFileName: createGetCanonicalFileName(sys.useCaseSensitiveFileNames) + }; - function reportDiagnostics(diagnostics: Diagnostic[], host: CompilerHost): void { + let reportDiagnosticWorker = reportDiagnosticSimply; + + function reportDiagnostic(diagnostic: Diagnostic, host: FormatDiagnosticsHost) { + reportDiagnosticWorker(diagnostic, host || defaultFormatDiagnosticsHost); + } + + function reportDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): void { for (const diagnostic of diagnostics) { reportDiagnostic(diagnostic, host); } @@ -101,7 +111,7 @@ namespace ts { return diagnostic.messageText; } - function reportDiagnosticSimply(diagnostic: Diagnostic, host: CompilerHost): void { + function reportDiagnosticSimply(diagnostic: Diagnostic, host: FormatDiagnosticsHost): void { sys.write(ts.formatDiagnostics([diagnostic], host)); } @@ -122,7 +132,7 @@ namespace ts { return formatStyle + text + resetEscapeSequence; } - function reportDiagnosticWithColorAndContext(diagnostic: Diagnostic, host: CompilerHost): void { + function reportDiagnosticWithColorAndContext(diagnostic: Diagnostic, host: FormatDiagnosticsHost): void { let output = ""; if (diagnostic.file) { @@ -257,7 +267,7 @@ namespace ts { if (commandLine.options.locale) { if (!isJSONSupported()) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } validateLocaleAndSetLanguage(commandLine.options.locale, commandLine.errors); @@ -288,11 +298,11 @@ namespace ts { if (commandLine.options.project) { if (!isJSONSupported()) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--project"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--project"), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } if (commandLine.fileNames.length !== 0) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } @@ -300,14 +310,14 @@ namespace ts { if (!fileOrDirectory /* current directory "." */ || sys.directoryExists(fileOrDirectory)) { configFileName = combinePaths(fileOrDirectory, "tsconfig.json"); if (!sys.fileExists(configFileName)) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } } else { configFileName = fileOrDirectory; if (!sys.fileExists(configFileName)) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } } @@ -325,7 +335,7 @@ namespace ts { if (isWatchSet(commandLine.options)) { if (!sys.watchFile) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } if (configFileName) { @@ -378,7 +388,7 @@ namespace ts { } if (isWatchSet(configParseResult.options)) { if (!sys.watchFile) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* host */ undefined); sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } @@ -417,7 +427,7 @@ namespace ts { } if (compilerOptions.pretty) { - reportDiagnostic = reportDiagnosticWithColorAndContext; + reportDiagnosticWorker = reportDiagnosticWithColorAndContext; } // reset the cache of existing files @@ -742,7 +752,7 @@ namespace ts { const currentDirectory = sys.getCurrentDirectory(); const file = normalizePath(combinePaths(currentDirectory, "tsconfig.json")); if (sys.fileExists(file)) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file), /* host */ undefined); } else { const compilerOptions = extend(options, defaultInitCompilerOptions); @@ -762,7 +772,7 @@ namespace ts { } sys.writeFile(file, JSON.stringify(configurations, undefined, 4)); - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Successfully_created_a_tsconfig_json_file), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Successfully_created_a_tsconfig_json_file), /* host */ undefined); } return; From d66837bac8ec305362d51a4ecdc4548283129904 Mon Sep 17 00:00:00 2001 From: Tingan Ho Date: Sat, 16 Jul 2016 02:52:26 +0800 Subject: [PATCH 086/109] Fixes capitalization (#9736) --- src/compiler/commandLineParser.ts | 4 ++-- src/compiler/diagnosticMessages.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 7b2aedb5d3d..f11854a6858 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -135,12 +135,12 @@ namespace ts { { name: "noUnusedLocals", type: "boolean", - description: Diagnostics.Report_Errors_on_Unused_Locals, + description: Diagnostics.Report_errors_on_unused_locals, }, { name: "noUnusedParameters", type: "boolean", - description: Diagnostics.Report_Errors_on_Unused_Parameters + description: Diagnostics.Report_errors_on_unused_parameters, }, { name: "noLib", diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 7996f80bd91..8ffb02a8974 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2800,11 +2800,11 @@ "category": "Error", "code": 6133 }, - "Report Errors on Unused Locals.": { + "Report errors on unused locals.": { "category": "Message", "code": 6134 }, - "Report Errors on Unused Parameters.": { + "Report errors on unused parameters.": { "category": "Message", "code": 6135 }, From 4954f810ac53fbb1a2f56d33dd1dc0b44e4cd85c Mon Sep 17 00:00:00 2001 From: falsandtru Date: Sat, 16 Jul 2016 03:52:39 +0900 Subject: [PATCH 087/109] Fix a command example in help messages (#9747) --- src/compiler/tsc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 2d90804a03b..c49df2ada18 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -642,7 +642,7 @@ namespace ts { // Build up the list of examples. const padding = makePadding(marginLength); output += getDiagnosticText(Diagnostics.Examples_Colon_0, makePadding(marginLength - examplesLength) + "tsc hello.ts") + sys.newLine; - output += padding + "tsc --out file.js file.ts" + sys.newLine; + output += padding + "tsc --outFile file.js file.ts" + sys.newLine; output += padding + "tsc @args.txt" + sys.newLine; output += sys.newLine; From af0c548312e2e3867249964b2ed107beb22cf53e Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 15 Jul 2016 12:33:53 -0700 Subject: [PATCH 088/109] Merge pull request #9750 from Microsoft/fixFormatDiagnostics use sys based host for formatting diagnostics --- src/compiler/program.ts | 8 +++++++- src/compiler/tsc.ts | 38 ++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index eceaff3df6d..39a55afe27a 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -997,7 +997,13 @@ namespace ts { return sortAndDeduplicateDiagnostics(diagnostics); } - export function formatDiagnostics(diagnostics: Diagnostic[], host: CompilerHost): string { + export interface FormatDiagnosticsHost { + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + getNewLine(): string; + } + + export function formatDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): string { let output = ""; for (const diagnostic of diagnostics) { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 36f71f063bb..9ff03ba74b4 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -6,9 +6,19 @@ namespace ts { fileWatcher?: FileWatcher; } - let reportDiagnostic = reportDiagnosticSimply; + const defaultFormatDiagnosticsHost: FormatDiagnosticsHost = { + getCurrentDirectory: () => sys.getCurrentDirectory(), + getNewLine: () => sys.newLine, + getCanonicalFileName: createGetCanonicalFileName(sys.useCaseSensitiveFileNames) + }; - function reportDiagnostics(diagnostics: Diagnostic[], host: CompilerHost): void { + let reportDiagnosticWorker = reportDiagnosticSimply; + + function reportDiagnostic(diagnostic: Diagnostic, host: FormatDiagnosticsHost) { + reportDiagnosticWorker(diagnostic, host || defaultFormatDiagnosticsHost); + } + + function reportDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): void { for (const diagnostic of diagnostics) { reportDiagnostic(diagnostic, host); } @@ -101,7 +111,7 @@ namespace ts { return diagnostic.messageText; } - function reportDiagnosticSimply(diagnostic: Diagnostic, host: CompilerHost): void { + function reportDiagnosticSimply(diagnostic: Diagnostic, host: FormatDiagnosticsHost): void { sys.write(ts.formatDiagnostics([diagnostic], host)); } @@ -122,7 +132,7 @@ namespace ts { return formatStyle + text + resetEscapeSequence; } - function reportDiagnosticWithColorAndContext(diagnostic: Diagnostic, host: CompilerHost): void { + function reportDiagnosticWithColorAndContext(diagnostic: Diagnostic, host: FormatDiagnosticsHost): void { let output = ""; if (diagnostic.file) { @@ -257,7 +267,7 @@ namespace ts { if (commandLine.options.locale) { if (!isJSONSupported()) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } validateLocaleAndSetLanguage(commandLine.options.locale, commandLine.errors); @@ -288,11 +298,11 @@ namespace ts { if (commandLine.options.project) { if (!isJSONSupported()) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--project"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--project"), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } if (commandLine.fileNames.length !== 0) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } @@ -300,14 +310,14 @@ namespace ts { if (!fileOrDirectory /* current directory "." */ || sys.directoryExists(fileOrDirectory)) { configFileName = combinePaths(fileOrDirectory, "tsconfig.json"); if (!sys.fileExists(configFileName)) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } } else { configFileName = fileOrDirectory; if (!sys.fileExists(configFileName)) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } } @@ -325,7 +335,7 @@ namespace ts { if (isWatchSet(commandLine.options)) { if (!sys.watchFile) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* host */ undefined); return sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } if (configFileName) { @@ -378,7 +388,7 @@ namespace ts { } if (isWatchSet(configParseResult.options)) { if (!sys.watchFile) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), /* host */ undefined); sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); } @@ -417,7 +427,7 @@ namespace ts { } if (compilerOptions.pretty) { - reportDiagnostic = reportDiagnosticWithColorAndContext; + reportDiagnosticWorker = reportDiagnosticWithColorAndContext; } // reset the cache of existing files @@ -742,7 +752,7 @@ namespace ts { const currentDirectory = sys.getCurrentDirectory(); const file = normalizePath(combinePaths(currentDirectory, "tsconfig.json")); if (sys.fileExists(file)) { - reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file), /* host */ undefined); } else { const compilerOptions = extend(options, defaultInitCompilerOptions); @@ -762,7 +772,7 @@ namespace ts { } sys.writeFile(file, JSON.stringify(configurations, undefined, 4)); - reportDiagnostic(createCompilerDiagnostic(Diagnostics.Successfully_created_a_tsconfig_json_file), /* compilerHost */ undefined); + reportDiagnostic(createCompilerDiagnostic(Diagnostics.Successfully_created_a_tsconfig_json_file), /* host */ undefined); } return; From bf8937cc84e9d868dd762f765d9dda52ecb5dddc Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 15 Jul 2016 12:51:53 -0700 Subject: [PATCH 089/109] remove extra semicolon --- src/compiler/tsc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 9ff03ba74b4..e32a3816d64 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -140,7 +140,7 @@ namespace ts { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length); const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line; - const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName;; + const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName; const hasMoreThanFiveLines = (lastLine - firstLine) >= 4; let gutterWidth = (lastLine + 1 + "").length; From 5319fa3a0d9f7710345801df6ada0253349d82e2 Mon Sep 17 00:00:00 2001 From: Yui Date: Fri, 15 Jul 2016 16:49:18 -0700 Subject: [PATCH 090/109] Fix linting error (#9762) --- src/compiler/tsc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 36f71f063bb..2d90804a03b 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -130,7 +130,7 @@ namespace ts { const { line: firstLine, character: firstLineChar } = getLineAndCharacterOfPosition(file, start); const { line: lastLine, character: lastLineChar } = getLineAndCharacterOfPosition(file, start + length); const lastLineInFile = getLineAndCharacterOfPosition(file, file.text.length).line; - const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName;; + const relativeFileName = host ? convertToRelativePath(file.fileName, host.getCurrentDirectory(), fileName => host.getCanonicalFileName(fileName)) : file.fileName; const hasMoreThanFiveLines = (lastLine - firstLine) >= 4; let gutterWidth = (lastLine + 1 + "").length; From 761482cf5eff363635b391d673be3e1bd8bb853f Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Fri, 15 Jul 2016 16:55:16 -0700 Subject: [PATCH 091/109] Use sorcery to merge sourcemaps between browserify and gulp-typescript (#9439) * Use sorcery to merge sourcemaps between browserify and gulp-typescript * Use shorthand * Fix nit * move comments, change loop into map * Ahahaha, we should run code before pushing it * Move conditional into call --- Gulpfile.ts | 35 ++++++++++++++++++++++++++++++++--- package.json | 3 +++ scripts/types/ambient.d.ts | 4 +++- src/compiler/emitter.ts | 2 +- src/harness/projectsRunner.ts | 2 +- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Gulpfile.ts b/Gulpfile.ts index 0305f754111..57da2b62aa8 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -694,6 +694,12 @@ gulp.task(nodeServerOutFile, false, [servicesFile], () => { .pipe(gulp.dest(path.dirname(nodeServerOutFile))); }); +import convertMap = require("convert-source-map"); +import sorcery = require("sorcery"); +declare module "convert-source-map" { + export function fromSource(source: string, largeSource?: boolean): SourceMapConverter; +} + gulp.task("browserify", "Runs browserify on run.js to produce a file suitable for running tests in the browser", [servicesFile], (done) => { const testProject = tsc.createProject("src/harness/tsconfig.json", getCompilerSettings({ outFile: "built/local/bundle.js" }, /*useBuiltCompiler*/ true)); return testProject.src() @@ -701,14 +707,37 @@ gulp.task("browserify", "Runs browserify on run.js to produce a file suitable fo .pipe(sourcemaps.init()) .pipe(tsc(testProject)) .pipe(through2.obj((file, enc, next) => { - browserify(intoStream(file.contents)) + const originalMap = file.sourceMap; + const prebundledContent = file.contents.toString(); + // Make paths absolute to help sorcery deal with all the terrible paths being thrown around + originalMap.sources = originalMap.sources.map(s => path.resolve(s)); + // intoStream (below) makes browserify think the input file is named this, so this is what it puts in the sourcemap + originalMap.file = "built/local/_stream_0.js"; + + browserify(intoStream(file.contents), { debug: true }) .bundle((err, res) => { // assumes file.contents is a Buffer - file.contents = res; + const maps = JSON.parse(convertMap.fromSource(res.toString(), /*largeSource*/true).toJSON()); + delete maps.sourceRoot; + maps.sources = maps.sources.map(s => path.resolve(s === "_stream_0.js" ? "built/local/_stream_0.js" : s)); + // Strip browserify's inline comments away (could probably just let sorcery do this, but then we couldn't fix the paths) + file.contents = new Buffer(convertMap.removeComments(res.toString())); + const chain = sorcery.loadSync("built/local/bundle.js", { + content: { + "built/local/_stream_0.js": prebundledContent, + "built/local/bundle.js": file.contents.toString() + }, + sourcemaps: { + "built/local/_stream_0.js": originalMap, + "built/local/bundle.js": maps, + } + }); + const finalMap = chain.apply(); + file.sourceMap = finalMap; next(undefined, file); }); })) - .pipe(sourcemaps.write(".", { includeContent: false, sourceRoot: "../../" })) + .pipe(sourcemaps.write(".", { includeContent: false })) .pipe(gulp.dest(".")); }); diff --git a/package.json b/package.json index 3bbb96ee468..efe3866b6db 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "devDependencies": { "@types/browserify": "latest", + "@types/convert-source-map": "latest", "@types/chai": "latest", "@types/del": "latest", "@types/glob": "latest", @@ -50,6 +51,7 @@ "@types/through2": "latest", "browserify": "latest", "chai": "latest", + "convert-source-map": "latest", "del": "latest", "gulp": "latest", "gulp-clone": "latest", @@ -68,6 +70,7 @@ "mocha": "latest", "mocha-fivemat-progress-reporter": "latest", "run-sequence": "latest", + "sorcery": "latest", "through2": "latest", "ts-node": "latest", "tsd": "latest", diff --git a/scripts/types/ambient.d.ts b/scripts/types/ambient.d.ts index 8a86a290bee..e77e3fe8c5a 100644 --- a/scripts/types/ambient.d.ts +++ b/scripts/types/ambient.d.ts @@ -19,4 +19,6 @@ declare module "into-stream" { export function obj(content: any): NodeJS.ReadableStream } export = IntoStream; -} \ No newline at end of file +} + +declare module "sorcery"; diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 2d5acb3b486..6adf76903fb 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -614,7 +614,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge const sourceMappingURL = sourceMap.getSourceMappingURL(); if (sourceMappingURL) { - write(`//# sourceMappingURL=${sourceMappingURL}`); + write(`//# ${"sourceMappingURL"}=${sourceMappingURL}`); // Sometimes tools can sometimes see this line as a source mapping url comment } writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, /*writeByteOrderMark*/ compilerOptions.emitBOM, sourceFiles); diff --git a/src/harness/projectsRunner.ts b/src/harness/projectsRunner.ts index cf3c78d8859..038b2dbe359 100644 --- a/src/harness/projectsRunner.ts +++ b/src/harness/projectsRunner.ts @@ -328,7 +328,7 @@ class ProjectRunner extends RunnerBase { if (Harness.Compiler.isJS(fileName)) { // Make sure if there is URl we have it cleaned up - const indexOfSourceMapUrl = data.lastIndexOf("//# sourceMappingURL="); + const indexOfSourceMapUrl = data.lastIndexOf(`//# ${"sourceMappingURL"}=`); // This line can be seen as a sourceMappingURL comment if (indexOfSourceMapUrl !== -1) { data = data.substring(0, indexOfSourceMapUrl + 21) + cleanProjectUrl(data.substring(indexOfSourceMapUrl + 21)); } From 87f75ff8233e655fb6eb66953b1eb871a4269a98 Mon Sep 17 00:00:00 2001 From: Yui Date: Fri, 15 Jul 2016 18:01:08 -0700 Subject: [PATCH 092/109] Use reference types to reference node.d.ts (#9686) --- tests/webTestServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/webTestServer.ts b/tests/webTestServer.ts index dab552e2619..9d28b4592ff 100644 --- a/tests/webTestServer.ts +++ b/tests/webTestServer.ts @@ -1,4 +1,4 @@ -/// +/// import http = require("http"); import fs = require("fs"); From 9ef65cf3af3e40d463135b466361ef7293d8b526 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 17 Jul 2016 23:25:33 -0700 Subject: [PATCH 093/109] remove unused method declaration --- src/compiler/types.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 3a3a937ade7..981c9db96f2 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2908,7 +2908,6 @@ namespace ts { getCancellationToken?(): CancellationToken; getDefaultLibFileName(options: CompilerOptions): string; getDefaultLibLocation?(): string; - getDefaultTypeDirectiveNames?(rootPath: string): string[]; writeFile: WriteFileCallback; getCurrentDirectory(): string; getDirectories(path: string): string[]; From 290caad40254101faf324a05360a142d0ed88301 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 17 Jul 2016 23:51:17 -0700 Subject: [PATCH 094/109] Fix #9636: Report unused type paramters only on last declaration --- src/compiler/checker.ts | 13 +++-- .../reference/unusedTypeParameters6.js | 16 ++++++ .../reference/unusedTypeParameters6.symbols | 13 +++++ .../reference/unusedTypeParameters6.types | 13 +++++ .../reference/unusedTypeParameters7.js | 16 ++++++ .../reference/unusedTypeParameters7.symbols | 13 +++++ .../reference/unusedTypeParameters7.types | 13 +++++ .../unusedTypeParameters8.errors.txt | 11 ++++ .../reference/unusedTypeParameters8.js | 16 ++++++ .../reference/unusedTypeParameters9.js | 30 +++++++++++ .../reference/unusedTypeParameters9.symbols | 53 +++++++++++++++++++ .../reference/unusedTypeParameters9.types | 53 +++++++++++++++++++ tests/cases/compiler/unusedTypeParameters6.ts | 8 +++ tests/cases/compiler/unusedTypeParameters7.ts | 8 +++ tests/cases/compiler/unusedTypeParameters8.ts | 8 +++ tests/cases/compiler/unusedTypeParameters9.ts | 17 ++++++ 16 files changed, 298 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/unusedTypeParameters6.js create mode 100644 tests/baselines/reference/unusedTypeParameters6.symbols create mode 100644 tests/baselines/reference/unusedTypeParameters6.types create mode 100644 tests/baselines/reference/unusedTypeParameters7.js create mode 100644 tests/baselines/reference/unusedTypeParameters7.symbols create mode 100644 tests/baselines/reference/unusedTypeParameters7.types create mode 100644 tests/baselines/reference/unusedTypeParameters8.errors.txt create mode 100644 tests/baselines/reference/unusedTypeParameters8.js create mode 100644 tests/baselines/reference/unusedTypeParameters9.js create mode 100644 tests/baselines/reference/unusedTypeParameters9.symbols create mode 100644 tests/baselines/reference/unusedTypeParameters9.types create mode 100644 tests/cases/compiler/unusedTypeParameters6.ts create mode 100644 tests/cases/compiler/unusedTypeParameters7.ts create mode 100644 tests/cases/compiler/unusedTypeParameters8.ts create mode 100644 tests/cases/compiler/unusedTypeParameters9.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d6db67d3fa8..5ca952f883f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -13274,7 +13274,7 @@ namespace ts { checkAsyncFunctionReturnType(node); } } - if (!(node).body) { + if (noUnusedIdentifiers && !(node).body) { checkUnusedTypeParameters(node); } } @@ -14609,8 +14609,15 @@ namespace ts { function checkUnusedTypeParameters(node: ClassDeclaration | ClassExpression | FunctionDeclaration | MethodDeclaration | FunctionExpression | ArrowFunction | ConstructorDeclaration | SignatureDeclaration | InterfaceDeclaration) { if (compilerOptions.noUnusedLocals && !isInAmbientContext(node)) { if (node.typeParameters) { + // Only report errors on the last declaration for the type parameter container; + // this ensures that all uses have been accounted for. + const symbol = node.symbol && getMergedSymbol(node.symbol); + const lastDeclaration = symbol && symbol.declarations && lastOrUndefined(symbol.declarations); + if (lastDeclaration !== node) { + return; + } for (const typeParameter of node.typeParameters) { - if (!typeParameter.symbol.isReferenced) { + if (!getMergedSymbol(typeParameter.symbol).isReferenced) { error(typeParameter.name, Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name); } } @@ -16119,7 +16126,7 @@ namespace ts { if (produceDiagnostics) { checkTypeForDuplicateIndexSignatures(node); - checkUnusedTypeParameters(node); + registerForUnusedIdentifiersCheck(node); } } diff --git a/tests/baselines/reference/unusedTypeParameters6.js b/tests/baselines/reference/unusedTypeParameters6.js new file mode 100644 index 00000000000..4c2b3a9d0ba --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters6.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/unusedTypeParameters6.ts] //// + +//// [a.ts] + +class C { } + +//// [b.ts] +interface C { a: T; } + +//// [a.js] +var C = (function () { + function C() { + } + return C; +}()); +//// [b.js] diff --git a/tests/baselines/reference/unusedTypeParameters6.symbols b/tests/baselines/reference/unusedTypeParameters6.symbols new file mode 100644 index 00000000000..bf20b44d347 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters6.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/a.ts === + +class C { } +>C : Symbol(C, Decl(a.ts, 0, 0), Decl(b.ts, 0, 0)) +>T : Symbol(T, Decl(a.ts, 1, 8), Decl(b.ts, 0, 12)) + +=== tests/cases/compiler/b.ts === +interface C { a: T; } +>C : Symbol(C, Decl(a.ts, 0, 0), Decl(b.ts, 0, 0)) +>T : Symbol(T, Decl(a.ts, 1, 8), Decl(b.ts, 0, 12)) +>a : Symbol(C.a, Decl(b.ts, 0, 16)) +>T : Symbol(T, Decl(a.ts, 1, 8), Decl(b.ts, 0, 12)) + diff --git a/tests/baselines/reference/unusedTypeParameters6.types b/tests/baselines/reference/unusedTypeParameters6.types new file mode 100644 index 00000000000..165862c0080 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters6.types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/a.ts === + +class C { } +>C : C +>T : T + +=== tests/cases/compiler/b.ts === +interface C { a: T; } +>C : C +>T : T +>a : T +>T : T + diff --git a/tests/baselines/reference/unusedTypeParameters7.js b/tests/baselines/reference/unusedTypeParameters7.js new file mode 100644 index 00000000000..d63f7a0edc3 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters7.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/unusedTypeParameters7.ts] //// + +//// [a.ts] + +class C { a: T; } + +//// [b.ts] +interface C { } + +//// [a.js] +var C = (function () { + function C() { + } + return C; +}()); +//// [b.js] diff --git a/tests/baselines/reference/unusedTypeParameters7.symbols b/tests/baselines/reference/unusedTypeParameters7.symbols new file mode 100644 index 00000000000..79704b437a6 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters7.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/a.ts === + +class C { a: T; } +>C : Symbol(C, Decl(a.ts, 0, 0), Decl(b.ts, 0, 0)) +>T : Symbol(T, Decl(a.ts, 1, 8), Decl(b.ts, 0, 12)) +>a : Symbol(C.a, Decl(a.ts, 1, 12)) +>T : Symbol(T, Decl(a.ts, 1, 8), Decl(b.ts, 0, 12)) + +=== tests/cases/compiler/b.ts === +interface C { } +>C : Symbol(C, Decl(a.ts, 0, 0), Decl(b.ts, 0, 0)) +>T : Symbol(T, Decl(a.ts, 1, 8), Decl(b.ts, 0, 12)) + diff --git a/tests/baselines/reference/unusedTypeParameters7.types b/tests/baselines/reference/unusedTypeParameters7.types new file mode 100644 index 00000000000..a52b4cee7ec --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters7.types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/a.ts === + +class C { a: T; } +>C : C +>T : T +>a : T +>T : T + +=== tests/cases/compiler/b.ts === +interface C { } +>C : C +>T : T + diff --git a/tests/baselines/reference/unusedTypeParameters8.errors.txt b/tests/baselines/reference/unusedTypeParameters8.errors.txt new file mode 100644 index 00000000000..d7928d36900 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters8.errors.txt @@ -0,0 +1,11 @@ +tests/cases/compiler/b.ts(1,13): error TS6133: 'T' is declared but never used. + + +==== tests/cases/compiler/a.ts (0 errors) ==== + + class C { } + +==== tests/cases/compiler/b.ts (1 errors) ==== + interface C { } + ~ +!!! error TS6133: 'T' is declared but never used. \ No newline at end of file diff --git a/tests/baselines/reference/unusedTypeParameters8.js b/tests/baselines/reference/unusedTypeParameters8.js new file mode 100644 index 00000000000..0c34373d315 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters8.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/unusedTypeParameters8.ts] //// + +//// [a.ts] + +class C { } + +//// [b.ts] +interface C { } + +//// [a.js] +var C = (function () { + function C() { + } + return C; +}()); +//// [b.js] diff --git a/tests/baselines/reference/unusedTypeParameters9.js b/tests/baselines/reference/unusedTypeParameters9.js new file mode 100644 index 00000000000..8d82921b076 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters9.js @@ -0,0 +1,30 @@ +//// [unusedTypeParameters9.ts] + +// clas + interface +class C1 { } +interface C1 { a: T; } + +// interface + class +class C2 { a: T; } +interface C2 { } + +// interfaces +interface C3 { a(c: (p: T) => void): void; } +interface C3 { b: string; } +interface C3 { c: number; } +interface C3 { d: boolean; } +interface C3 { e: any; } + +//// [unusedTypeParameters9.js] +// clas + interface +var C1 = (function () { + function C1() { + } + return C1; +}()); +// interface + class +var C2 = (function () { + function C2() { + } + return C2; +}()); diff --git a/tests/baselines/reference/unusedTypeParameters9.symbols b/tests/baselines/reference/unusedTypeParameters9.symbols new file mode 100644 index 00000000000..6c4f6aab71c --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters9.symbols @@ -0,0 +1,53 @@ +=== tests/cases/compiler/unusedTypeParameters9.ts === + +// clas + interface +class C1 { } +>C1 : Symbol(C1, Decl(unusedTypeParameters9.ts, 0, 0), Decl(unusedTypeParameters9.ts, 2, 15)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 2, 9), Decl(unusedTypeParameters9.ts, 3, 13)) + +interface C1 { a: T; } +>C1 : Symbol(C1, Decl(unusedTypeParameters9.ts, 0, 0), Decl(unusedTypeParameters9.ts, 2, 15)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 2, 9), Decl(unusedTypeParameters9.ts, 3, 13)) +>a : Symbol(C1.a, Decl(unusedTypeParameters9.ts, 3, 17)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 2, 9), Decl(unusedTypeParameters9.ts, 3, 13)) + +// interface + class +class C2 { a: T; } +>C2 : Symbol(C2, Decl(unusedTypeParameters9.ts, 3, 25), Decl(unusedTypeParameters9.ts, 6, 21)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 6, 9), Decl(unusedTypeParameters9.ts, 7, 13)) +>a : Symbol(C2.a, Decl(unusedTypeParameters9.ts, 6, 13)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 6, 9), Decl(unusedTypeParameters9.ts, 7, 13)) + +interface C2 { } +>C2 : Symbol(C2, Decl(unusedTypeParameters9.ts, 3, 25), Decl(unusedTypeParameters9.ts, 6, 21)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 6, 9), Decl(unusedTypeParameters9.ts, 7, 13)) + +// interfaces +interface C3 { a(c: (p: T) => void): void; } +>C3 : Symbol(C3, Decl(unusedTypeParameters9.ts, 7, 19), Decl(unusedTypeParameters9.ts, 10, 47), Decl(unusedTypeParameters9.ts, 11, 30), Decl(unusedTypeParameters9.ts, 12, 30), Decl(unusedTypeParameters9.ts, 13, 32)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 10, 13), Decl(unusedTypeParameters9.ts, 11, 13), Decl(unusedTypeParameters9.ts, 12, 13), Decl(unusedTypeParameters9.ts, 13, 13), Decl(unusedTypeParameters9.ts, 14, 13)) +>a : Symbol(C3.a, Decl(unusedTypeParameters9.ts, 10, 17)) +>c : Symbol(c, Decl(unusedTypeParameters9.ts, 10, 20)) +>p : Symbol(p, Decl(unusedTypeParameters9.ts, 10, 24)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 10, 13), Decl(unusedTypeParameters9.ts, 11, 13), Decl(unusedTypeParameters9.ts, 12, 13), Decl(unusedTypeParameters9.ts, 13, 13), Decl(unusedTypeParameters9.ts, 14, 13)) + +interface C3 { b: string; } +>C3 : Symbol(C3, Decl(unusedTypeParameters9.ts, 7, 19), Decl(unusedTypeParameters9.ts, 10, 47), Decl(unusedTypeParameters9.ts, 11, 30), Decl(unusedTypeParameters9.ts, 12, 30), Decl(unusedTypeParameters9.ts, 13, 32)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 10, 13), Decl(unusedTypeParameters9.ts, 11, 13), Decl(unusedTypeParameters9.ts, 12, 13), Decl(unusedTypeParameters9.ts, 13, 13), Decl(unusedTypeParameters9.ts, 14, 13)) +>b : Symbol(C3.b, Decl(unusedTypeParameters9.ts, 11, 17)) + +interface C3 { c: number; } +>C3 : Symbol(C3, Decl(unusedTypeParameters9.ts, 7, 19), Decl(unusedTypeParameters9.ts, 10, 47), Decl(unusedTypeParameters9.ts, 11, 30), Decl(unusedTypeParameters9.ts, 12, 30), Decl(unusedTypeParameters9.ts, 13, 32)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 10, 13), Decl(unusedTypeParameters9.ts, 11, 13), Decl(unusedTypeParameters9.ts, 12, 13), Decl(unusedTypeParameters9.ts, 13, 13), Decl(unusedTypeParameters9.ts, 14, 13)) +>c : Symbol(C3.c, Decl(unusedTypeParameters9.ts, 12, 17)) + +interface C3 { d: boolean; } +>C3 : Symbol(C3, Decl(unusedTypeParameters9.ts, 7, 19), Decl(unusedTypeParameters9.ts, 10, 47), Decl(unusedTypeParameters9.ts, 11, 30), Decl(unusedTypeParameters9.ts, 12, 30), Decl(unusedTypeParameters9.ts, 13, 32)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 10, 13), Decl(unusedTypeParameters9.ts, 11, 13), Decl(unusedTypeParameters9.ts, 12, 13), Decl(unusedTypeParameters9.ts, 13, 13), Decl(unusedTypeParameters9.ts, 14, 13)) +>d : Symbol(C3.d, Decl(unusedTypeParameters9.ts, 13, 17)) + +interface C3 { e: any; } +>C3 : Symbol(C3, Decl(unusedTypeParameters9.ts, 7, 19), Decl(unusedTypeParameters9.ts, 10, 47), Decl(unusedTypeParameters9.ts, 11, 30), Decl(unusedTypeParameters9.ts, 12, 30), Decl(unusedTypeParameters9.ts, 13, 32)) +>T : Symbol(T, Decl(unusedTypeParameters9.ts, 10, 13), Decl(unusedTypeParameters9.ts, 11, 13), Decl(unusedTypeParameters9.ts, 12, 13), Decl(unusedTypeParameters9.ts, 13, 13), Decl(unusedTypeParameters9.ts, 14, 13)) +>e : Symbol(C3.e, Decl(unusedTypeParameters9.ts, 14, 17)) + diff --git a/tests/baselines/reference/unusedTypeParameters9.types b/tests/baselines/reference/unusedTypeParameters9.types new file mode 100644 index 00000000000..58a75e67297 --- /dev/null +++ b/tests/baselines/reference/unusedTypeParameters9.types @@ -0,0 +1,53 @@ +=== tests/cases/compiler/unusedTypeParameters9.ts === + +// clas + interface +class C1 { } +>C1 : C1 +>T : T + +interface C1 { a: T; } +>C1 : C1 +>T : T +>a : T +>T : T + +// interface + class +class C2 { a: T; } +>C2 : C2 +>T : T +>a : T +>T : T + +interface C2 { } +>C2 : C2 +>T : T + +// interfaces +interface C3 { a(c: (p: T) => void): void; } +>C3 : C3 +>T : T +>a : (c: (p: T) => void) => void +>c : (p: T) => void +>p : T +>T : T + +interface C3 { b: string; } +>C3 : C3 +>T : T +>b : string + +interface C3 { c: number; } +>C3 : C3 +>T : T +>c : number + +interface C3 { d: boolean; } +>C3 : C3 +>T : T +>d : boolean + +interface C3 { e: any; } +>C3 : C3 +>T : T +>e : any + diff --git a/tests/cases/compiler/unusedTypeParameters6.ts b/tests/cases/compiler/unusedTypeParameters6.ts new file mode 100644 index 00000000000..f445665f4ea --- /dev/null +++ b/tests/cases/compiler/unusedTypeParameters6.ts @@ -0,0 +1,8 @@ +//@noUnusedLocals:true +//@noUnusedParameters:true + +// @fileName: a.ts +class C { } + +// @fileName: b.ts +interface C { a: T; } \ No newline at end of file diff --git a/tests/cases/compiler/unusedTypeParameters7.ts b/tests/cases/compiler/unusedTypeParameters7.ts new file mode 100644 index 00000000000..87b42d97650 --- /dev/null +++ b/tests/cases/compiler/unusedTypeParameters7.ts @@ -0,0 +1,8 @@ +//@noUnusedLocals:true +//@noUnusedParameters:true + +// @fileName: a.ts +class C { a: T; } + +// @fileName: b.ts +interface C { } \ No newline at end of file diff --git a/tests/cases/compiler/unusedTypeParameters8.ts b/tests/cases/compiler/unusedTypeParameters8.ts new file mode 100644 index 00000000000..4034ed04c72 --- /dev/null +++ b/tests/cases/compiler/unusedTypeParameters8.ts @@ -0,0 +1,8 @@ +//@noUnusedLocals:true +//@noUnusedParameters:true + +// @fileName: a.ts +class C { } + +// @fileName: b.ts +interface C { } \ No newline at end of file diff --git a/tests/cases/compiler/unusedTypeParameters9.ts b/tests/cases/compiler/unusedTypeParameters9.ts new file mode 100644 index 00000000000..48581d4ab2e --- /dev/null +++ b/tests/cases/compiler/unusedTypeParameters9.ts @@ -0,0 +1,17 @@ +//@noUnusedLocals:true +//@noUnusedParameters:true + +// clas + interface +class C1 { } +interface C1 { a: T; } + +// interface + class +class C2 { a: T; } +interface C2 { } + +// interfaces +interface C3 { a(c: (p: T) => void): void; } +interface C3 { b: string; } +interface C3 { c: number; } +interface C3 { d: boolean; } +interface C3 { e: any; } \ No newline at end of file From 9886f88004168d4cce287f8f323ffeaab8100a92 Mon Sep 17 00:00:00 2001 From: Yui Date: Mon, 18 Jul 2016 08:48:12 -0700 Subject: [PATCH 095/109] [Release-2.0] Fix 9685: missing decoratedClassAlias emit in self-reference decorated class (#9763) * Wip * Fix incorrect emit decorated class alias when targeting es6 or higher * Add tests and baselines * Remove unused test file --- src/compiler/emitter.ts | 15 +++---- .../decoratedClassExportsCommonJS1.js | 28 +++++++++++++ .../decoratedClassExportsCommonJS1.symbols | 21 ++++++++++ .../decoratedClassExportsCommonJS1.types | 24 ++++++++++++ .../decoratedClassExportsCommonJS2.js | 26 +++++++++++++ .../decoratedClassExportsCommonJS2.symbols | 17 ++++++++ .../decoratedClassExportsCommonJS2.types | 20 ++++++++++ .../reference/decoratedClassExportsSystem1.js | 39 +++++++++++++++++++ .../decoratedClassExportsSystem1.symbols | 26 +++++++++++++ .../decoratedClassExportsSystem1.types | 29 ++++++++++++++ .../reference/decoratedClassExportsSystem2.js | 35 +++++++++++++++++ .../decoratedClassExportsSystem2.symbols | 17 ++++++++ .../decoratedClassExportsSystem2.types | 20 ++++++++++ .../class/decoratedClassExportsCommonJS1.ts | 13 +++++++ .../class/decoratedClassExportsCommonJS2.ts | 10 +++++ .../class/decoratedClassExportsSystem1.ts | 13 +++++++ .../class/decoratedClassExportsSystem2.ts | 10 +++++ 17 files changed, 356 insertions(+), 7 deletions(-) create mode 100644 tests/baselines/reference/decoratedClassExportsCommonJS1.js create mode 100644 tests/baselines/reference/decoratedClassExportsCommonJS1.symbols create mode 100644 tests/baselines/reference/decoratedClassExportsCommonJS1.types create mode 100644 tests/baselines/reference/decoratedClassExportsCommonJS2.js create mode 100644 tests/baselines/reference/decoratedClassExportsCommonJS2.symbols create mode 100644 tests/baselines/reference/decoratedClassExportsCommonJS2.types create mode 100644 tests/baselines/reference/decoratedClassExportsSystem1.js create mode 100644 tests/baselines/reference/decoratedClassExportsSystem1.symbols create mode 100644 tests/baselines/reference/decoratedClassExportsSystem1.types create mode 100644 tests/baselines/reference/decoratedClassExportsSystem2.js create mode 100644 tests/baselines/reference/decoratedClassExportsSystem2.symbols create mode 100644 tests/baselines/reference/decoratedClassExportsSystem2.types create mode 100644 tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts create mode 100644 tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS2.ts create mode 100644 tests/cases/conformance/decorators/class/decoratedClassExportsSystem1.ts create mode 100644 tests/cases/conformance/decorators/class/decoratedClassExportsSystem2.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 2d5acb3b486..7ac3b5acfb0 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2749,7 +2749,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge * if we should also export the value after its it changed * - check if node is a source level declaration to emit it differently, * i.e non-exported variable statement 'var x = 1' is hoisted so - * we we emit variable statement 'var' should be dropped. + * when we emit variable statement 'var' should be dropped. */ function isSourceFileLevelDeclarationInSystemJsModule(node: Node, isExported: boolean): boolean { if (!node || !isCurrentFileSystemExternalModule()) { @@ -5503,16 +5503,15 @@ const _super = (function (geti, seti) { write("export "); } - if (!isHoistedDeclarationInSystemModule) { - write("let "); - } if (decoratedClassAlias !== undefined) { - write(`${decoratedClassAlias}`); + write(`let ${decoratedClassAlias}`); } else { + if (!isHoistedDeclarationInSystemModule) { + write("let "); + } emitDeclarationName(node); } - write(" = "); } else if (isES6ExportedDeclaration(node)) { @@ -5530,7 +5529,9 @@ const _super = (function (geti, seti) { // // We'll emit: // - // (_temp = class C { ... }, _temp.a = 1, _temp.b = 2, _temp) + // let C_1 = class C{}; + // C_1.a = 1; + // C_1.b = 2; // so forth and so on // // This keeps the expression as an expression, while ensuring that the static parts // of it have been initialized by the time it is used. diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS1.js b/tests/baselines/reference/decoratedClassExportsCommonJS1.js new file mode 100644 index 00000000000..4a04d724f0c --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsCommonJS1.js @@ -0,0 +1,28 @@ +//// [decoratedClassExportsCommonJS1.ts] +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { + static prop0: string; + static prop1 = Testing123.prop0; +} + +//// [decoratedClassExportsCommonJS1.js] +"use strict"; +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); +}; +let Testing123_1 = class Testing123 { +}; +let Testing123 = Testing123_1; +Testing123.prop1 = Testing123.prop0; +Testing123 = Testing123_1 = __decorate([ + Something({ v: () => Testing123 }), + __metadata('design:paramtypes', []) +], Testing123); +exports.Testing123 = Testing123; diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols b/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols new file mode 100644 index 00000000000..3381ef7c06a --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsCommonJS1.symbols @@ -0,0 +1,21 @@ +=== tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts === +declare var Something: any; +>Something : Symbol(Something, Decl(decoratedClassExportsCommonJS1.ts, 0, 11)) + +@Something({ v: () => Testing123 }) +>Something : Symbol(Something, Decl(decoratedClassExportsCommonJS1.ts, 0, 11)) +>v : Symbol(v, Decl(decoratedClassExportsCommonJS1.ts, 1, 12)) +>Testing123 : Symbol(Testing123, Decl(decoratedClassExportsCommonJS1.ts, 0, 27)) + +export class Testing123 { +>Testing123 : Symbol(Testing123, Decl(decoratedClassExportsCommonJS1.ts, 0, 27)) + + static prop0: string; +>prop0 : Symbol(Testing123.prop0, Decl(decoratedClassExportsCommonJS1.ts, 2, 25)) + + static prop1 = Testing123.prop0; +>prop1 : Symbol(Testing123.prop1, Decl(decoratedClassExportsCommonJS1.ts, 3, 25)) +>Testing123.prop0 : Symbol(Testing123.prop0, Decl(decoratedClassExportsCommonJS1.ts, 2, 25)) +>Testing123 : Symbol(Testing123, Decl(decoratedClassExportsCommonJS1.ts, 0, 27)) +>prop0 : Symbol(Testing123.prop0, Decl(decoratedClassExportsCommonJS1.ts, 2, 25)) +} diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS1.types b/tests/baselines/reference/decoratedClassExportsCommonJS1.types new file mode 100644 index 00000000000..0142adb654f --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsCommonJS1.types @@ -0,0 +1,24 @@ +=== tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts === +declare var Something: any; +>Something : any + +@Something({ v: () => Testing123 }) +>Something({ v: () => Testing123 }) : any +>Something : any +>{ v: () => Testing123 } : { v: () => typeof Testing123; } +>v : () => typeof Testing123 +>() => Testing123 : () => typeof Testing123 +>Testing123 : typeof Testing123 + +export class Testing123 { +>Testing123 : Testing123 + + static prop0: string; +>prop0 : string + + static prop1 = Testing123.prop0; +>prop1 : string +>Testing123.prop0 : string +>Testing123 : typeof Testing123 +>prop0 : string +} diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS2.js b/tests/baselines/reference/decoratedClassExportsCommonJS2.js new file mode 100644 index 00000000000..c5e8eb9aa29 --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsCommonJS2.js @@ -0,0 +1,26 @@ +//// [a.ts] + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { } + +//// [a.js] +"use strict"; +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); +}; +let Testing123_1 = class Testing123 { +}; +let Testing123 = Testing123_1; +Testing123 = Testing123_1 = __decorate([ + Something({ v: () => Testing123 }), + __metadata('design:paramtypes', []) +], Testing123); +exports.Testing123 = Testing123; diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS2.symbols b/tests/baselines/reference/decoratedClassExportsCommonJS2.symbols new file mode 100644 index 00000000000..8f587c1bff1 --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsCommonJS2.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/decorators/class/a.ts === + +declare function forwardRef(x: any): any; +>forwardRef : Symbol(forwardRef, Decl(a.ts, 0, 0)) +>x : Symbol(x, Decl(a.ts, 1, 28)) + +declare var Something: any; +>Something : Symbol(Something, Decl(a.ts, 2, 11)) + +@Something({ v: () => Testing123 }) +>Something : Symbol(Something, Decl(a.ts, 2, 11)) +>v : Symbol(v, Decl(a.ts, 3, 12)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) + +export class Testing123 { } +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) + diff --git a/tests/baselines/reference/decoratedClassExportsCommonJS2.types b/tests/baselines/reference/decoratedClassExportsCommonJS2.types new file mode 100644 index 00000000000..eba793247de --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsCommonJS2.types @@ -0,0 +1,20 @@ +=== tests/cases/conformance/decorators/class/a.ts === + +declare function forwardRef(x: any): any; +>forwardRef : (x: any) => any +>x : any + +declare var Something: any; +>Something : any + +@Something({ v: () => Testing123 }) +>Something({ v: () => Testing123 }) : any +>Something : any +>{ v: () => Testing123 } : { v: () => typeof Testing123; } +>v : () => typeof Testing123 +>() => Testing123 : () => typeof Testing123 +>Testing123 : typeof Testing123 + +export class Testing123 { } +>Testing123 : Testing123 + diff --git a/tests/baselines/reference/decoratedClassExportsSystem1.js b/tests/baselines/reference/decoratedClassExportsSystem1.js new file mode 100644 index 00000000000..1730ba4460f --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsSystem1.js @@ -0,0 +1,39 @@ +//// [a.ts] + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { + static prop0: string; + static prop1 = Testing123.prop0; +} + +//// [a.js] +System.register([], function(exports_1, context_1) { + "use strict"; + var __moduleName = context_1 && context_1.id; + 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); + }; + var Testing123; + return { + setters:[], + execute: function() { + let Testing123_1 = class Testing123 { + }; + let Testing123 = Testing123_1; + Testing123.prop1 = Testing123.prop0; + Testing123 = Testing123_1 = __decorate([ + Something({ v: () => Testing123 }), + __metadata('design:paramtypes', []) + ], Testing123); + exports_1("Testing123", Testing123); + } + } +}); diff --git a/tests/baselines/reference/decoratedClassExportsSystem1.symbols b/tests/baselines/reference/decoratedClassExportsSystem1.symbols new file mode 100644 index 00000000000..559f78624e3 --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsSystem1.symbols @@ -0,0 +1,26 @@ +=== tests/cases/conformance/decorators/class/a.ts === + +declare function forwardRef(x: any): any; +>forwardRef : Symbol(forwardRef, Decl(a.ts, 0, 0)) +>x : Symbol(x, Decl(a.ts, 1, 28)) + +declare var Something: any; +>Something : Symbol(Something, Decl(a.ts, 2, 11)) + +@Something({ v: () => Testing123 }) +>Something : Symbol(Something, Decl(a.ts, 2, 11)) +>v : Symbol(v, Decl(a.ts, 3, 12)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) + +export class Testing123 { +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) + + static prop0: string; +>prop0 : Symbol(Testing123.prop0, Decl(a.ts, 4, 25)) + + static prop1 = Testing123.prop0; +>prop1 : Symbol(Testing123.prop1, Decl(a.ts, 5, 25)) +>Testing123.prop0 : Symbol(Testing123.prop0, Decl(a.ts, 4, 25)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) +>prop0 : Symbol(Testing123.prop0, Decl(a.ts, 4, 25)) +} diff --git a/tests/baselines/reference/decoratedClassExportsSystem1.types b/tests/baselines/reference/decoratedClassExportsSystem1.types new file mode 100644 index 00000000000..1cc69e8b680 --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsSystem1.types @@ -0,0 +1,29 @@ +=== tests/cases/conformance/decorators/class/a.ts === + +declare function forwardRef(x: any): any; +>forwardRef : (x: any) => any +>x : any + +declare var Something: any; +>Something : any + +@Something({ v: () => Testing123 }) +>Something({ v: () => Testing123 }) : any +>Something : any +>{ v: () => Testing123 } : { v: () => typeof Testing123; } +>v : () => typeof Testing123 +>() => Testing123 : () => typeof Testing123 +>Testing123 : typeof Testing123 + +export class Testing123 { +>Testing123 : Testing123 + + static prop0: string; +>prop0 : string + + static prop1 = Testing123.prop0; +>prop1 : string +>Testing123.prop0 : string +>Testing123 : typeof Testing123 +>prop0 : string +} diff --git a/tests/baselines/reference/decoratedClassExportsSystem2.js b/tests/baselines/reference/decoratedClassExportsSystem2.js new file mode 100644 index 00000000000..b4d34de2958 --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsSystem2.js @@ -0,0 +1,35 @@ +//// [a.ts] + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { } + +//// [a.js] +System.register([], function(exports_1, context_1) { + "use strict"; + var __moduleName = context_1 && context_1.id; + 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); + }; + var Testing123; + return { + setters:[], + execute: function() { + let Testing123_1 = class Testing123 { + }; + let Testing123 = Testing123_1; + Testing123 = Testing123_1 = __decorate([ + Something({ v: () => Testing123 }), + __metadata('design:paramtypes', []) + ], Testing123); + exports_1("Testing123", Testing123); + } + } +}); diff --git a/tests/baselines/reference/decoratedClassExportsSystem2.symbols b/tests/baselines/reference/decoratedClassExportsSystem2.symbols new file mode 100644 index 00000000000..8f587c1bff1 --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsSystem2.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/decorators/class/a.ts === + +declare function forwardRef(x: any): any; +>forwardRef : Symbol(forwardRef, Decl(a.ts, 0, 0)) +>x : Symbol(x, Decl(a.ts, 1, 28)) + +declare var Something: any; +>Something : Symbol(Something, Decl(a.ts, 2, 11)) + +@Something({ v: () => Testing123 }) +>Something : Symbol(Something, Decl(a.ts, 2, 11)) +>v : Symbol(v, Decl(a.ts, 3, 12)) +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) + +export class Testing123 { } +>Testing123 : Symbol(Testing123, Decl(a.ts, 2, 27)) + diff --git a/tests/baselines/reference/decoratedClassExportsSystem2.types b/tests/baselines/reference/decoratedClassExportsSystem2.types new file mode 100644 index 00000000000..eba793247de --- /dev/null +++ b/tests/baselines/reference/decoratedClassExportsSystem2.types @@ -0,0 +1,20 @@ +=== tests/cases/conformance/decorators/class/a.ts === + +declare function forwardRef(x: any): any; +>forwardRef : (x: any) => any +>x : any + +declare var Something: any; +>Something : any + +@Something({ v: () => Testing123 }) +>Something({ v: () => Testing123 }) : any +>Something : any +>{ v: () => Testing123 } : { v: () => typeof Testing123; } +>v : () => typeof Testing123 +>() => Testing123 : () => typeof Testing123 +>Testing123 : typeof Testing123 + +export class Testing123 { } +>Testing123 : Testing123 + diff --git a/tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts b/tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts new file mode 100644 index 00000000000..e00adf3d63b --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS1.ts @@ -0,0 +1,13 @@ +// @target: es6 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @module: commonjs +// @filename: a.ts + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { + static prop0: string; + static prop1 = Testing123.prop0; +} \ No newline at end of file diff --git a/tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS2.ts b/tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS2.ts new file mode 100644 index 00000000000..38f6ce9f27d --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedClassExportsCommonJS2.ts @@ -0,0 +1,10 @@ +// @target: es6 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @module: commonjs +// @filename: a.ts + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { } \ No newline at end of file diff --git a/tests/cases/conformance/decorators/class/decoratedClassExportsSystem1.ts b/tests/cases/conformance/decorators/class/decoratedClassExportsSystem1.ts new file mode 100644 index 00000000000..1e2619ab89e --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedClassExportsSystem1.ts @@ -0,0 +1,13 @@ +// @target: es6 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @module: system +// @filename: a.ts + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { + static prop0: string; + static prop1 = Testing123.prop0; +} \ No newline at end of file diff --git a/tests/cases/conformance/decorators/class/decoratedClassExportsSystem2.ts b/tests/cases/conformance/decorators/class/decoratedClassExportsSystem2.ts new file mode 100644 index 00000000000..bf7c9a0ca2d --- /dev/null +++ b/tests/cases/conformance/decorators/class/decoratedClassExportsSystem2.ts @@ -0,0 +1,10 @@ +// @target: es6 +// @experimentaldecorators: true +// @emitDecoratorMetadata: true +// @module: system +// @filename: a.ts + +declare function forwardRef(x: any): any; +declare var Something: any; +@Something({ v: () => Testing123 }) +export class Testing123 { } \ No newline at end of file From 7f045adc86ac09822fdecdbdc28c66edd9228aa4 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 18 Jul 2016 09:19:29 -0700 Subject: [PATCH 096/109] Code review comments --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 38c55efe6a3..d68502dc8e8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14614,7 +14614,7 @@ namespace ts { if (node.typeParameters) { // Only report errors on the last declaration for the type parameter container; // this ensures that all uses have been accounted for. - const symbol = node.symbol && getMergedSymbol(node.symbol); + const symbol = getSymbolOfNode(node); const lastDeclaration = symbol && symbol.declarations && lastOrUndefined(symbol.declarations); if (lastDeclaration !== node) { return; From 22cac1aa49d66cb3b7de87ff00fd89439e505b62 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Mon, 18 Jul 2016 13:29:38 -0700 Subject: [PATCH 097/109] Provide the complete path to tsconfig file. Fixes #9785 --- src/compiler/tsc.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index e25ae37e21f..14806885296 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -385,7 +385,8 @@ namespace ts { sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); return; } - const configParseResult = parseJsonConfigFileContent(configObject, sys, getNormalizedAbsolutePath(getDirectoryPath(configFileName), sys.getCurrentDirectory()), commandLine.options, configFileName); + const cwd = sys.getCurrentDirectory(); + const configParseResult = parseJsonConfigFileContent(configObject, sys, getNormalizedAbsolutePath(getDirectoryPath(configFileName), cwd), commandLine.options, getNormalizedAbsolutePath(configFileName, cwd)); if (configParseResult.errors.length > 0) { reportDiagnostics(configParseResult.errors, /* compilerHost */ undefined); sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); From ac72affc6bfb7bb578af43e9c2fb936e953e57b1 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 18 Jul 2016 14:56:08 -0700 Subject: [PATCH 098/109] Update LKG --- lib/tsc.js | 192 ++++++++++++++---------- lib/tsserver.js | 263 +++++++++++++++++++++++---------- lib/tsserverlibrary.d.ts | 22 ++- lib/tsserverlibrary.js | 263 +++++++++++++++++++++++---------- lib/typescript.d.ts | 14 +- lib/typescript.js | 287 +++++++++++++++++++++++++----------- lib/typescriptServices.d.ts | 14 +- lib/typescriptServices.js | 287 +++++++++++++++++++++++++----------- 8 files changed, 938 insertions(+), 404 deletions(-) diff --git a/lib/tsc.js b/lib/tsc.js index 69b9ab5e477..05a903f9014 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -825,10 +825,17 @@ var ts; return true; } ts.containsPath = containsPath; + function startsWith(str, prefix) { + return str.lastIndexOf(prefix, 0) === 0; + } + ts.startsWith = startsWith; + function endsWith(str, suffix) { + var expectedPos = str.length - suffix.length; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; + } + ts.endsWith = endsWith; function fileExtensionIs(path, extension) { - var pathLen = path.length; - var extLen = extension.length; - return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; + return path.length > extension.length && endsWith(path, extension); } ts.fileExtensionIs = fileExtensionIs; function fileExtensionIsAny(path, extensions) { @@ -1093,6 +1100,8 @@ var ts; } ts.objectAllocator = { getNodeConstructor: function () { return Node; }, + getTokenConstructor: function () { return Node; }, + getIdentifierConstructor: function () { return Node; }, getSourceFileConstructor: function () { return Node; }, getSymbolConstructor: function () { return Symbol; }, getTypeConstructor: function () { return Type; }, @@ -1224,7 +1233,7 @@ var ts; function readDirectory(path, extensions, excludes, includes) { return ts.matchFiles(path, extensions, excludes, includes, false, shell.CurrentDirectory, getAccessibleFileSystemEntries); } - return { + var wscriptSystem = { args: args, newLine: "\r\n", useCaseSensitiveFileNames: false, @@ -1243,7 +1252,7 @@ var ts; return fso.FolderExists(path); }, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!wscriptSystem.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } }, @@ -1263,6 +1272,7 @@ var ts; } } }; + return wscriptSystem; } function getNodeSystem() { var _fs = require("fs"); @@ -1435,7 +1445,7 @@ var ts; function getDirectories(path) { return ts.filter(_fs.readdirSync(path), function (p) { return fileSystemEntryExists(ts.combinePaths(path, p), 1); }); } - return { + var nodeSystem = { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, @@ -1485,7 +1495,7 @@ var ts; fileExists: fileExists, directoryExists: directoryExists, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!nodeSystem.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } }, @@ -1533,6 +1543,7 @@ var ts; return _fs.realpathSync(path); } }; + return nodeSystem; } function getChakraSystem() { var realpath = ChakraHost.realpath && (function (path) { return ChakraHost.realpath(path); }); @@ -2282,8 +2293,8 @@ var ts; Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: { code: 6131, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", message: "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'." }, File_name_0_has_a_1_extension_stripping_it: { code: 6132, category: ts.DiagnosticCategory.Message, key: "File_name_0_has_a_1_extension_stripping_it_6132", message: "File name '{0}' has a '{1}' extension - stripping it" }, _0_is_declared_but_never_used: { code: 6133, category: ts.DiagnosticCategory.Error, key: "_0_is_declared_but_never_used_6133", message: "'{0}' is declared but never used." }, - Report_Errors_on_Unused_Locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Locals_6134", message: "Report Errors on Unused Locals." }, - Report_Errors_on_Unused_Parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Parameters_6135", message: "Report Errors on Unused Parameters." }, + Report_errors_on_unused_locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_locals_6134", message: "Report errors on unused locals." }, + Report_errors_on_unused_parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_parameters_6135", message: "Report errors on unused parameters." }, The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: { code: 6136, category: ts.DiagnosticCategory.Message, key: "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", message: "The maximum dependency depth to search under node_modules and load JavaScript files" }, No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0: { code: 6137, category: ts.DiagnosticCategory.Message, key: "No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0_6137", message: "No types specified in 'package.json' but 'allowJs' is set, so returning 'main' value of '{0}'" }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, @@ -4836,7 +4847,7 @@ var ts; } ts.isExpression = isExpression; function isExternalModuleNameRelative(moduleName) { - return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\"; + return /^\.\.?($|[\\/])/.test(moduleName); } ts.isExternalModuleNameRelative = isExternalModuleNameRelative; function isInstantiatedModule(node, preserveConstEnums) { @@ -6344,25 +6355,24 @@ var ts; return node.flags & 92 && node.parent.kind === 148 && ts.isClassLike(node.parent.parent); } ts.isParameterPropertyDeclaration = isParameterPropertyDeclaration; - function startsWith(str, prefix) { - return str.lastIndexOf(prefix, 0) === 0; - } - ts.startsWith = startsWith; - function endsWith(str, suffix) { - var expectedPos = str.length - suffix.length; - return str.indexOf(suffix, expectedPos) === expectedPos; - } - ts.endsWith = endsWith; })(ts || (ts = {})); var ts; (function (ts) { ts.parseTime = 0; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; function createNode(kind, pos, end) { if (kind === 256) { return new (SourceFileConstructor || (SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind === 69) { + return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } + else if (kind < 139) { + return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); + } else { return new (NodeConstructor || (NodeConstructor = ts.objectAllocator.getNodeConstructor()))(kind, pos, end); } @@ -6785,6 +6795,8 @@ var ts; var scanner = ts.createScanner(2, true); var disallowInAndDecoratorContext = 4194304 | 16777216; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; var sourceFile; var parseDiagnostics; @@ -6810,6 +6822,8 @@ var ts; } function initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind) { NodeConstructor = ts.objectAllocator.getNodeConstructor(); + TokenConstructor = ts.objectAllocator.getTokenConstructor(); + IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor(); SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; syntaxCursor = _syntaxCursor; @@ -7116,7 +7130,9 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return new NodeConstructor(kind, pos, pos); + return kind >= 139 ? new NodeConstructor(kind, pos, pos) : + kind === 69 ? new IdentifierConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node, end) { node.end = end === undefined ? scanner.getStartPos() : end; @@ -10892,6 +10908,9 @@ var ts; case 55: if (canParseTag) { parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral); + if (!parentTagTerminated) { + resumePos = scanner.getStartPos(); + } } seenAsterisk = false; break; @@ -15418,17 +15437,18 @@ var ts; if (declaration.kind === 235) { return links.type = checkExpression(declaration.expression); } + if (declaration.flags & 134217728 && declaration.kind === 280 && declaration.typeExpression) { + return links.type = getTypeFromTypeNode(declaration.typeExpression.type); + } if (!pushTypeResolution(symbol, 0)) { return unknownType; } var type = undefined; - if (declaration.kind === 187) { - type = getUnionType(ts.map(symbol.declarations, function (decl) { return checkExpressionCached(decl.right); })); - } - else if (declaration.kind === 172) { - if (declaration.parent.kind === 187) { - type = checkExpressionCached(declaration.parent.right); - } + if (declaration.kind === 187 || + declaration.kind === 172 && declaration.parent.kind === 187) { + type = getUnionType(ts.map(symbol.declarations, function (decl) { return decl.kind === 187 ? + checkExpressionCached(decl.right) : + checkExpressionCached(decl.parent.right); })); } if (type === undefined) { type = getWidenedTypeForVariableLikeDeclaration(declaration, true); @@ -21935,7 +21955,7 @@ var ts; function getInferredClassType(symbol) { var links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, undefined, undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, undefined, undefined); } return links.inferredClassType; } @@ -23155,7 +23175,7 @@ var ts; checkAsyncFunctionReturnType(node); } } - if (!node.body) { + if (noUnusedIdentifiers && !node.body) { checkUnusedTypeParameters(node); } } @@ -24098,9 +24118,14 @@ var ts; function checkUnusedTypeParameters(node) { if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) { if (node.typeParameters) { + var symbol = getSymbolOfNode(node); + var lastDeclaration = symbol && symbol.declarations && ts.lastOrUndefined(symbol.declarations); + if (lastDeclaration !== node) { + return; + } for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) { var typeParameter = _a[_i]; - if (!typeParameter.symbol.isReferenced) { + if (!getMergedSymbol(typeParameter.symbol).isReferenced) { error(typeParameter.name, ts.Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name); } } @@ -25177,7 +25202,7 @@ var ts; ts.forEach(node.members, checkSourceElement); if (produceDiagnostics) { checkTypeForDuplicateIndexSignatures(node); - checkUnusedTypeParameters(node); + registerForUnusedIdentifiersCheck(node); } } function checkTypeAliasDeclaration(node) { @@ -29900,7 +29925,7 @@ var ts; writeLine(); var sourceMappingURL = sourceMap.getSourceMappingURL(); if (sourceMappingURL) { - write("//# sourceMappingURL=" + sourceMappingURL); + write("//# " + "sourceMappingURL" + "=" + sourceMappingURL); } writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, compilerOptions.emitBOM, sourceFiles); sourceMap.reset(); @@ -33550,13 +33575,13 @@ var ts; if (isES6ExportedDeclaration(node) && !(node.flags & 512) && decoratedClassAlias === undefined) { write("export "); } - if (!isHoistedDeclarationInSystemModule) { - write("let "); - } if (decoratedClassAlias !== undefined) { - write("" + decoratedClassAlias); + write("let " + decoratedClassAlias); } else { + if (!isHoistedDeclarationInSystemModule) { + write("let "); + } emitDeclarationName(node); } write(" = "); @@ -35800,7 +35825,7 @@ var ts; ts.emitTime = 0; ts.ioReadTime = 0; ts.ioWriteTime = 0; - ts.version = "2.0.0"; + ts.version = "2.1.0"; var emptyArray = []; var defaultTypeRoots = ["node_modules/@types"]; function findConfigFile(searchPath, fileExists) { @@ -35880,12 +35905,7 @@ var ts; return { resolvedModule: resolvedFileName ? { resolvedFileName: resolvedFileName, isExternalLibraryImport: isExternalLibraryImport } : undefined, failedLookupLocations: failedLookupLocations }; } function moduleHasNonRelativeName(moduleName) { - if (ts.isRootedDiskPath(moduleName)) { - return false; - } - var i = moduleName.lastIndexOf("./", 1); - var startsWithDotSlashOrDotDotSlash = i === 0 || (i === 1 && moduleName.charCodeAt(0) === 46); - return !startsWithDotSlashOrDotDotSlash; + return !(ts.isRootedDiskPath(moduleName) || ts.isExternalModuleNameRelative(moduleName)); } function tryReadTypesSection(packageJsonPath, baseDirectory, state) { var jsonContent; @@ -36541,6 +36561,22 @@ var ts; return ts.sortAndDeduplicateDiagnostics(diagnostics); } ts.getPreEmitDiagnostics = getPreEmitDiagnostics; + function formatDiagnostics(diagnostics, host) { + var output = ""; + for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) { + var diagnostic = diagnostics_1[_i]; + if (diagnostic.file) { + var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character; + var fileName = diagnostic.file.fileName; + var relativeFileName = ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }); + output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): "; + } + var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase(); + output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) + host.getNewLine(); + } + return output; + } + ts.formatDiagnostics = formatDiagnostics; function flattenDiagnosticMessageText(messageText, newLine) { if (typeof messageText === "string") { return messageText; @@ -36616,7 +36652,7 @@ var ts; var resolvedTypeReferenceDirectives = {}; var fileProcessingDiagnostics = ts.createDiagnosticCollection(); var maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - var currentNodeModulesJsDepth = 0; + var currentNodeModulesDepth = 0; var modulesWithElidedImports = {}; var sourceFilesFoundSearchingNodeModules = {}; var start = new Date().getTime(); @@ -36840,8 +36876,7 @@ var ts; return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false)); } function emit(sourceFile, writeFileCallback, cancellationToken) { - var _this = this; - return runWithCancellationToken(function () { return emitWorker(_this, sourceFile, writeFileCallback, cancellationToken); }); + return runWithCancellationToken(function () { return emitWorker(program, sourceFile, writeFileCallback, cancellationToken); }); } function isEmitBlocked(emitFileName) { return hasEmitBlockingDiagnostics.contains(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName)); @@ -37248,8 +37283,17 @@ var ts; if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) { reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd); } - if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + if (file_1 && ts.lookUp(sourceFilesFoundSearchingNodeModules, file_1.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file_1.path] = false; + if (!options.noResolve) { + processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file_1); + } + modulesWithElidedImports[file_1.path] = false; + processImportedModules(file_1, ts.getDirectoryPath(fileName)); + } + else if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file_1.path] = false; processImportedModules(file_1, ts.getDirectoryPath(fileName)); } @@ -37266,6 +37310,7 @@ var ts; }); filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { var existingFile = filesByNameIgnoreCase.get(path); @@ -37366,12 +37411,9 @@ var ts; var isFromNodeModulesSearch = resolution && resolution.isExternalLibraryImport; var isJsFileFromNodeModules = isFromNodeModulesSearch && ts.hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + currentNodeModulesDepth++; } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; - } - var elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; var shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { modulesWithElidedImports[file.path] = true; @@ -37379,8 +37421,8 @@ var ts; else if (shouldAddFile) { findSourceFile(resolution.resolvedFileName, resolvedPath, false, false, file, ts.skipTrivia(file.text, file.imports[i].pos), file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } @@ -37699,12 +37741,12 @@ var ts; { name: "noUnusedLocals", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Locals + description: ts.Diagnostics.Report_errors_on_unused_locals }, { name: "noUnusedParameters", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Parameters + description: ts.Diagnostics.Report_errors_on_unused_parameters }, { name: "noLib", @@ -38483,10 +38525,18 @@ var ts; })(ts || (ts = {})); var ts; (function (ts) { - var reportDiagnostic = reportDiagnosticSimply; + var defaultFormatDiagnosticsHost = { + getCurrentDirectory: function () { return ts.sys.getCurrentDirectory(); }, + getNewLine: function () { return ts.sys.newLine; }, + getCanonicalFileName: ts.createGetCanonicalFileName(ts.sys.useCaseSensitiveFileNames) + }; + var reportDiagnosticWorker = reportDiagnosticSimply; + function reportDiagnostic(diagnostic, host) { + reportDiagnosticWorker(diagnostic, host || defaultFormatDiagnosticsHost); + } function reportDiagnostics(diagnostics, host) { - for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) { - var diagnostic = diagnostics_1[_i]; + for (var _i = 0, diagnostics_2 = diagnostics; _i < diagnostics_2.length; _i++) { + var diagnostic = diagnostics_2[_i]; reportDiagnostic(diagnostic, host); } } @@ -38557,19 +38607,8 @@ var ts; var diagnostic = ts.createCompilerDiagnostic.apply(undefined, arguments); return diagnostic.messageText; } - function getRelativeFileName(fileName, host) { - return host ? ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }) : fileName; - } function reportDiagnosticSimply(diagnostic, host) { - var output = ""; - if (diagnostic.file) { - var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character; - var relativeFileName = getRelativeFileName(diagnostic.file.fileName, host); - output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): "; - } - var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase(); - output += category + " TS" + diagnostic.code + ": " + ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) + ts.sys.newLine; - ts.sys.write(output); + ts.sys.write(ts.formatDiagnostics([diagnostic], host)); } var redForegroundEscapeSequence = "\u001b[91m"; var yellowForegroundEscapeSequence = "\u001b[93m"; @@ -38594,7 +38633,7 @@ var ts; var _a = ts.getLineAndCharacterOfPosition(file, start), firstLine = _a.line, firstLineChar = _a.character; var _b = ts.getLineAndCharacterOfPosition(file, start + length_3), lastLine = _b.line, lastLineChar = _b.character; var lastLineInFile = ts.getLineAndCharacterOfPosition(file, file.text.length).line; - var relativeFileName = getRelativeFileName(file.fileName, host); + var relativeFileName = host ? ts.convertToRelativePath(file.fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }) : file.fileName; var hasMoreThanFiveLines = (lastLine - firstLine) >= 4; var gutterWidth = (lastLine + 1 + "").length; if (hasMoreThanFiveLines) { @@ -38783,7 +38822,8 @@ var ts; ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped); return; } - var configParseResult = ts.parseJsonConfigFileContent(configObject, ts.sys, ts.getNormalizedAbsolutePath(ts.getDirectoryPath(configFileName), ts.sys.getCurrentDirectory()), commandLine.options, configFileName); + var cwd = ts.sys.getCurrentDirectory(); + var configParseResult = ts.parseJsonConfigFileContent(configObject, ts.sys, ts.getNormalizedAbsolutePath(ts.getDirectoryPath(configFileName), cwd), commandLine.options, ts.getNormalizedAbsolutePath(configFileName, cwd)); if (configParseResult.errors.length > 0) { reportDiagnostics(configParseResult.errors, undefined); ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped); @@ -38820,7 +38860,7 @@ var ts; compilerHost.fileExists = cachedFileExists; } if (compilerOptions.pretty) { - reportDiagnostic = reportDiagnosticWithColorAndContext; + reportDiagnosticWorker = reportDiagnosticWithColorAndContext; } cachedExistingFiles = {}; var compileResult = compile(rootFileNames, compilerOptions, compilerHost); @@ -38983,7 +39023,7 @@ var ts; output += ts.sys.newLine + ts.sys.newLine; var padding = makePadding(marginLength); output += getDiagnosticText(ts.Diagnostics.Examples_Colon_0, makePadding(marginLength - examplesLength) + "tsc hello.ts") + ts.sys.newLine; - output += padding + "tsc --out file.js file.ts" + ts.sys.newLine; + output += padding + "tsc --outFile file.js file.ts" + ts.sys.newLine; output += padding + "tsc @args.txt" + ts.sys.newLine; output += ts.sys.newLine; output += getDiagnosticText(ts.Diagnostics.Options_Colon) + ts.sys.newLine; diff --git a/lib/tsserver.js b/lib/tsserver.js index 68bceb54bb9..7e0dda1736e 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -830,10 +830,17 @@ var ts; return true; } ts.containsPath = containsPath; + function startsWith(str, prefix) { + return str.lastIndexOf(prefix, 0) === 0; + } + ts.startsWith = startsWith; + function endsWith(str, suffix) { + var expectedPos = str.length - suffix.length; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; + } + ts.endsWith = endsWith; function fileExtensionIs(path, extension) { - var pathLen = path.length; - var extLen = extension.length; - return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; + return path.length > extension.length && endsWith(path, extension); } ts.fileExtensionIs = fileExtensionIs; function fileExtensionIsAny(path, extensions) { @@ -1098,6 +1105,8 @@ var ts; } ts.objectAllocator = { getNodeConstructor: function () { return Node; }, + getTokenConstructor: function () { return Node; }, + getIdentifierConstructor: function () { return Node; }, getSourceFileConstructor: function () { return Node; }, getSymbolConstructor: function () { return Symbol; }, getTypeConstructor: function () { return Type; }, @@ -1229,7 +1238,7 @@ var ts; function readDirectory(path, extensions, excludes, includes) { return ts.matchFiles(path, extensions, excludes, includes, false, shell.CurrentDirectory, getAccessibleFileSystemEntries); } - return { + var wscriptSystem = { args: args, newLine: "\r\n", useCaseSensitiveFileNames: false, @@ -1248,7 +1257,7 @@ var ts; return fso.FolderExists(path); }, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!wscriptSystem.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } }, @@ -1268,6 +1277,7 @@ var ts; } } }; + return wscriptSystem; } function getNodeSystem() { var _fs = require("fs"); @@ -1440,7 +1450,7 @@ var ts; function getDirectories(path) { return ts.filter(_fs.readdirSync(path), function (p) { return fileSystemEntryExists(ts.combinePaths(path, p), 1); }); } - return { + var nodeSystem = { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, @@ -1490,7 +1500,7 @@ var ts; fileExists: fileExists, directoryExists: directoryExists, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!nodeSystem.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } }, @@ -1538,6 +1548,7 @@ var ts; return _fs.realpathSync(path); } }; + return nodeSystem; } function getChakraSystem() { var realpath = ChakraHost.realpath && (function (path) { return ChakraHost.realpath(path); }); @@ -2287,8 +2298,8 @@ var ts; Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: { code: 6131, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", message: "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'." }, File_name_0_has_a_1_extension_stripping_it: { code: 6132, category: ts.DiagnosticCategory.Message, key: "File_name_0_has_a_1_extension_stripping_it_6132", message: "File name '{0}' has a '{1}' extension - stripping it" }, _0_is_declared_but_never_used: { code: 6133, category: ts.DiagnosticCategory.Error, key: "_0_is_declared_but_never_used_6133", message: "'{0}' is declared but never used." }, - Report_Errors_on_Unused_Locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Locals_6134", message: "Report Errors on Unused Locals." }, - Report_Errors_on_Unused_Parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Parameters_6135", message: "Report Errors on Unused Parameters." }, + Report_errors_on_unused_locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_locals_6134", message: "Report errors on unused locals." }, + Report_errors_on_unused_parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_parameters_6135", message: "Report errors on unused parameters." }, The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: { code: 6136, category: ts.DiagnosticCategory.Message, key: "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", message: "The maximum dependency depth to search under node_modules and load JavaScript files" }, No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0: { code: 6137, category: ts.DiagnosticCategory.Message, key: "No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0_6137", message: "No types specified in 'package.json' but 'allowJs' is set, so returning 'main' value of '{0}'" }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, @@ -3966,12 +3977,12 @@ var ts; { name: "noUnusedLocals", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Locals + description: ts.Diagnostics.Report_errors_on_unused_locals }, { name: "noUnusedParameters", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Parameters + description: ts.Diagnostics.Report_errors_on_unused_parameters }, { name: "noLib", @@ -5754,7 +5765,7 @@ var ts; } ts.isExpression = isExpression; function isExternalModuleNameRelative(moduleName) { - return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\"; + return /^\.\.?($|[\\/])/.test(moduleName); } ts.isExternalModuleNameRelative = isExternalModuleNameRelative; function isInstantiatedModule(node, preserveConstEnums) { @@ -7262,25 +7273,24 @@ var ts; return node.flags & 92 && node.parent.kind === 148 && ts.isClassLike(node.parent.parent); } ts.isParameterPropertyDeclaration = isParameterPropertyDeclaration; - function startsWith(str, prefix) { - return str.lastIndexOf(prefix, 0) === 0; - } - ts.startsWith = startsWith; - function endsWith(str, suffix) { - var expectedPos = str.length - suffix.length; - return str.indexOf(suffix, expectedPos) === expectedPos; - } - ts.endsWith = endsWith; })(ts || (ts = {})); var ts; (function (ts) { ts.parseTime = 0; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; function createNode(kind, pos, end) { if (kind === 256) { return new (SourceFileConstructor || (SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind === 69) { + return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } + else if (kind < 139) { + return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); + } else { return new (NodeConstructor || (NodeConstructor = ts.objectAllocator.getNodeConstructor()))(kind, pos, end); } @@ -7703,6 +7713,8 @@ var ts; var scanner = ts.createScanner(2, true); var disallowInAndDecoratorContext = 4194304 | 16777216; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; var sourceFile; var parseDiagnostics; @@ -7728,6 +7740,8 @@ var ts; } function initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind) { NodeConstructor = ts.objectAllocator.getNodeConstructor(); + TokenConstructor = ts.objectAllocator.getTokenConstructor(); + IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor(); SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; syntaxCursor = _syntaxCursor; @@ -8034,7 +8048,9 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return new NodeConstructor(kind, pos, pos); + return kind >= 139 ? new NodeConstructor(kind, pos, pos) : + kind === 69 ? new IdentifierConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node, end) { node.end = end === undefined ? scanner.getStartPos() : end; @@ -11810,6 +11826,9 @@ var ts; case 55: if (canParseTag) { parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral); + if (!parentTagTerminated) { + resumePos = scanner.getStartPos(); + } } seenAsterisk = false; break; @@ -16336,17 +16355,18 @@ var ts; if (declaration.kind === 235) { return links.type = checkExpression(declaration.expression); } + if (declaration.flags & 134217728 && declaration.kind === 280 && declaration.typeExpression) { + return links.type = getTypeFromTypeNode(declaration.typeExpression.type); + } if (!pushTypeResolution(symbol, 0)) { return unknownType; } var type = undefined; - if (declaration.kind === 187) { - type = getUnionType(ts.map(symbol.declarations, function (decl) { return checkExpressionCached(decl.right); })); - } - else if (declaration.kind === 172) { - if (declaration.parent.kind === 187) { - type = checkExpressionCached(declaration.parent.right); - } + if (declaration.kind === 187 || + declaration.kind === 172 && declaration.parent.kind === 187) { + type = getUnionType(ts.map(symbol.declarations, function (decl) { return decl.kind === 187 ? + checkExpressionCached(decl.right) : + checkExpressionCached(decl.parent.right); })); } if (type === undefined) { type = getWidenedTypeForVariableLikeDeclaration(declaration, true); @@ -22853,7 +22873,7 @@ var ts; function getInferredClassType(symbol) { var links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, undefined, undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, undefined, undefined); } return links.inferredClassType; } @@ -24073,7 +24093,7 @@ var ts; checkAsyncFunctionReturnType(node); } } - if (!node.body) { + if (noUnusedIdentifiers && !node.body) { checkUnusedTypeParameters(node); } } @@ -25016,9 +25036,14 @@ var ts; function checkUnusedTypeParameters(node) { if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) { if (node.typeParameters) { + var symbol = getSymbolOfNode(node); + var lastDeclaration = symbol && symbol.declarations && ts.lastOrUndefined(symbol.declarations); + if (lastDeclaration !== node) { + return; + } for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) { var typeParameter = _a[_i]; - if (!typeParameter.symbol.isReferenced) { + if (!getMergedSymbol(typeParameter.symbol).isReferenced) { error(typeParameter.name, ts.Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name); } } @@ -26095,7 +26120,7 @@ var ts; ts.forEach(node.members, checkSourceElement); if (produceDiagnostics) { checkTypeForDuplicateIndexSignatures(node); - checkUnusedTypeParameters(node); + registerForUnusedIdentifiersCheck(node); } } function checkTypeAliasDeclaration(node) { @@ -30818,7 +30843,7 @@ var ts; writeLine(); var sourceMappingURL = sourceMap.getSourceMappingURL(); if (sourceMappingURL) { - write("//# sourceMappingURL=" + sourceMappingURL); + write("//# " + "sourceMappingURL" + "=" + sourceMappingURL); } writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, compilerOptions.emitBOM, sourceFiles); sourceMap.reset(); @@ -34468,13 +34493,13 @@ var ts; if (isES6ExportedDeclaration(node) && !(node.flags & 512) && decoratedClassAlias === undefined) { write("export "); } - if (!isHoistedDeclarationInSystemModule) { - write("let "); - } if (decoratedClassAlias !== undefined) { - write("" + decoratedClassAlias); + write("let " + decoratedClassAlias); } else { + if (!isHoistedDeclarationInSystemModule) { + write("let "); + } emitDeclarationName(node); } write(" = "); @@ -36718,7 +36743,7 @@ var ts; ts.emitTime = 0; ts.ioReadTime = 0; ts.ioWriteTime = 0; - ts.version = "2.0.0"; + ts.version = "2.1.0"; var emptyArray = []; var defaultTypeRoots = ["node_modules/@types"]; function findConfigFile(searchPath, fileExists) { @@ -36798,12 +36823,7 @@ var ts; return { resolvedModule: resolvedFileName ? { resolvedFileName: resolvedFileName, isExternalLibraryImport: isExternalLibraryImport } : undefined, failedLookupLocations: failedLookupLocations }; } function moduleHasNonRelativeName(moduleName) { - if (ts.isRootedDiskPath(moduleName)) { - return false; - } - var i = moduleName.lastIndexOf("./", 1); - var startsWithDotSlashOrDotDotSlash = i === 0 || (i === 1 && moduleName.charCodeAt(0) === 46); - return !startsWithDotSlashOrDotDotSlash; + return !(ts.isRootedDiskPath(moduleName) || ts.isExternalModuleNameRelative(moduleName)); } function tryReadTypesSection(packageJsonPath, baseDirectory, state) { var jsonContent; @@ -37459,6 +37479,22 @@ var ts; return ts.sortAndDeduplicateDiagnostics(diagnostics); } ts.getPreEmitDiagnostics = getPreEmitDiagnostics; + function formatDiagnostics(diagnostics, host) { + var output = ""; + for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) { + var diagnostic = diagnostics_1[_i]; + if (diagnostic.file) { + var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character; + var fileName = diagnostic.file.fileName; + var relativeFileName = ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }); + output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): "; + } + var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase(); + output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) + host.getNewLine(); + } + return output; + } + ts.formatDiagnostics = formatDiagnostics; function flattenDiagnosticMessageText(messageText, newLine) { if (typeof messageText === "string") { return messageText; @@ -37534,7 +37570,7 @@ var ts; var resolvedTypeReferenceDirectives = {}; var fileProcessingDiagnostics = ts.createDiagnosticCollection(); var maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - var currentNodeModulesJsDepth = 0; + var currentNodeModulesDepth = 0; var modulesWithElidedImports = {}; var sourceFilesFoundSearchingNodeModules = {}; var start = new Date().getTime(); @@ -37758,8 +37794,7 @@ var ts; return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false)); } function emit(sourceFile, writeFileCallback, cancellationToken) { - var _this = this; - return runWithCancellationToken(function () { return emitWorker(_this, sourceFile, writeFileCallback, cancellationToken); }); + return runWithCancellationToken(function () { return emitWorker(program, sourceFile, writeFileCallback, cancellationToken); }); } function isEmitBlocked(emitFileName) { return hasEmitBlockingDiagnostics.contains(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName)); @@ -38166,8 +38201,17 @@ var ts; if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) { reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd); } - if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + if (file_1 && ts.lookUp(sourceFilesFoundSearchingNodeModules, file_1.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file_1.path] = false; + if (!options.noResolve) { + processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file_1); + } + modulesWithElidedImports[file_1.path] = false; + processImportedModules(file_1, ts.getDirectoryPath(fileName)); + } + else if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file_1.path] = false; processImportedModules(file_1, ts.getDirectoryPath(fileName)); } @@ -38184,6 +38228,7 @@ var ts; }); filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { var existingFile = filesByNameIgnoreCase.get(path); @@ -38284,12 +38329,9 @@ var ts; var isFromNodeModulesSearch = resolution && resolution.isExternalLibraryImport; var isJsFileFromNodeModules = isFromNodeModulesSearch && ts.hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + currentNodeModulesDepth++; } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; - } - var elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; var shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { modulesWithElidedImports[file.path] = true; @@ -38297,8 +38339,8 @@ var ts; else if (shouldAddFile) { findSourceFile(resolution.resolvedFileName, resolvedPath, false, false, file, ts.skipTrivia(file.text, file.imports[i].pos), file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } @@ -39891,7 +39933,7 @@ var ts; return createPatternMatch(PatternMatchKind.exact, punctuationStripped, candidate === chunk.text); } else { - return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, startsWith(candidate, chunk.text)); + return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, ts.startsWith(candidate, chunk.text)); } } var isLowercase = chunk.isLowerCase; @@ -40063,14 +40105,6 @@ var ts; var str = String.fromCharCode(ch); return str === str.toLowerCase(); } - function startsWith(string, search) { - for (var i = 0, n = search.length; i < n; i++) { - if (string.charCodeAt(i) !== search.charCodeAt(i)) { - return false; - } - } - return true; - } function indexOfIgnoringCase(string, value) { for (var i = 0, n = string.length - value.length; i <= n; i++) { if (startsWithIgnoringCase(string, value, i)) { @@ -41555,6 +41589,9 @@ var ts; } return false; } + function shouldRescanJsxText(node) { + return node && node.kind === 244; + } function shouldRescanSlashToken(container) { return container.kind === 10; } @@ -41582,7 +41619,9 @@ var ts; ? 3 : shouldRescanJsxIdentifier(n) ? 4 - : 0; + : shouldRescanJsxText(n) + ? 5 + : 0; if (lastTokenInfo && expectedScanAction === lastScanAction) { return fixTokenKind(lastTokenInfo, n); } @@ -41610,6 +41649,10 @@ var ts; currentToken = scanner.scanJsxIdentifier(); lastScanAction = 4; } + else if (expectedScanAction === 5) { + currentToken = scanner.reScanJsxToken(); + lastScanAction = 5; + } else { lastScanAction = 0; } @@ -43858,19 +43901,20 @@ var ts; "version" ]; var jsDocCompletionEntries; - function createNode(kind, pos, end, flags, parent) { - var node = new NodeObject(kind, pos, end); - node.flags = flags; + function createNode(kind, pos, end, parent) { + var node = kind >= 139 ? new NodeObject(kind, pos, end) : + kind === 69 ? new IdentifierObject(kind, pos, end) : + new TokenObject(kind, pos, end); node.parent = parent; return node; } var NodeObject = (function () { function NodeObject(kind, pos, end) { - this.kind = kind; this.pos = pos; this.end = end; this.flags = 0; this.parent = undefined; + this.kind = kind; } NodeObject.prototype.getSourceFile = function () { return ts.getSourceFileOfNode(this); @@ -43905,14 +43949,14 @@ var ts; var token = useJSDocScanner ? scanner.scanJSDocToken() : scanner.scan(); var textPos = scanner.getTextPos(); if (textPos <= end) { - nodes.push(createNode(token, pos, textPos, 0, this)); + nodes.push(createNode(token, pos, textPos, this)); } pos = textPos; } return pos; }; NodeObject.prototype.createSyntaxList = function (nodes) { - var list = createNode(282, nodes.pos, nodes.end, 0, this); + var list = createNode(282, nodes.pos, nodes.end, this); list._children = []; var pos = nodes.pos; for (var _i = 0, nodes_4 = nodes; _i < nodes_4.length; _i++) { @@ -43997,6 +44041,73 @@ var ts; }; return NodeObject; }()); + var TokenOrIdentifierObject = (function () { + function TokenOrIdentifierObject(pos, end) { + this.pos = pos; + this.end = end; + this.flags = 0; + this.parent = undefined; + } + TokenOrIdentifierObject.prototype.getSourceFile = function () { + return ts.getSourceFileOfNode(this); + }; + TokenOrIdentifierObject.prototype.getStart = function (sourceFile, includeJsDocComment) { + return ts.getTokenPosOfNode(this, sourceFile, includeJsDocComment); + }; + TokenOrIdentifierObject.prototype.getFullStart = function () { + return this.pos; + }; + TokenOrIdentifierObject.prototype.getEnd = function () { + return this.end; + }; + TokenOrIdentifierObject.prototype.getWidth = function (sourceFile) { + return this.getEnd() - this.getStart(sourceFile); + }; + TokenOrIdentifierObject.prototype.getFullWidth = function () { + return this.end - this.pos; + }; + TokenOrIdentifierObject.prototype.getLeadingTriviaWidth = function (sourceFile) { + return this.getStart(sourceFile) - this.pos; + }; + TokenOrIdentifierObject.prototype.getFullText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end); + }; + TokenOrIdentifierObject.prototype.getText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.getStart(), this.getEnd()); + }; + TokenOrIdentifierObject.prototype.getChildCount = function (sourceFile) { + return 0; + }; + TokenOrIdentifierObject.prototype.getChildAt = function (index, sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getChildren = function (sourceFile) { + return emptyArray; + }; + TokenOrIdentifierObject.prototype.getFirstToken = function (sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getLastToken = function (sourceFile) { + return undefined; + }; + return TokenOrIdentifierObject; + }()); + var TokenObject = (function (_super) { + __extends(TokenObject, _super); + function TokenObject(kind, pos, end) { + _super.call(this, pos, end); + this.kind = kind; + } + return TokenObject; + }(TokenOrIdentifierObject)); + var IdentifierObject = (function (_super) { + __extends(IdentifierObject, _super); + function IdentifierObject(kind, pos, end) { + _super.call(this, pos, end); + } + return IdentifierObject; + }(TokenOrIdentifierObject)); + IdentifierObject.prototype.kind = 69; var SymbolObject = (function () { function SymbolObject(flags, name) { this.flags = flags; @@ -49677,6 +49788,8 @@ var ts; function initializeServices() { ts.objectAllocator = { getNodeConstructor: function () { return NodeObject; }, + getTokenConstructor: function () { return TokenObject; }, + getIdentifierConstructor: function () { return IdentifierObject; }, getSourceFileConstructor: function () { return SourceFileObject; }, getSymbolConstructor: function () { return SymbolObject; }, getTypeConstructor: function () { return TypeObject; }, @@ -52422,7 +52535,7 @@ var ts; done: false, leaf: function (relativeStart, relativeLength, ll) { if (!f(ll, relativeStart, relativeLength)) { - this.done = true; + walkFns.done = true; } } }; @@ -53072,7 +53185,7 @@ var ts; ioSession.listen(); })(server = ts.server || (ts.server = {})); })(ts || (ts = {})); -var debugObjectHost = this; +var debugObjectHost = new Function("return this")(); var ts; (function (ts) { function logInternalError(logger, err) { diff --git a/lib/tsserverlibrary.d.ts b/lib/tsserverlibrary.d.ts index 1e0cefac78b..1821c212574 100644 --- a/lib/tsserverlibrary.d.ts +++ b/lib/tsserverlibrary.d.ts @@ -405,7 +405,10 @@ declare namespace ts { interface ModifiersArray extends NodeArray { flags: NodeFlags; } - interface Modifier extends Node { + interface Token extends Node { + __tokenTag: any; + } + interface Modifier extends Token { } interface Identifier extends PrimaryExpression { text: string; @@ -2050,7 +2053,6 @@ declare namespace ts { getCancellationToken?(): CancellationToken; getDefaultLibFileName(options: CompilerOptions): string; getDefaultLibLocation?(): string; - getDefaultTypeDirectiveNames?(rootPath: string): string[]; writeFile: WriteFileCallback; getCurrentDirectory(): string; getDirectories(path: string): string[]; @@ -2156,6 +2158,8 @@ declare namespace ts { function ensureTrailingDirectorySeparator(path: string): string; function comparePaths(a: string, b: string, currentDirectory: string, ignoreCase?: boolean): Comparison; function containsPath(parent: string, child: string, currentDirectory: string, ignoreCase?: boolean): boolean; + function startsWith(str: string, prefix: string): boolean; + function endsWith(str: string, suffix: string): boolean; function fileExtensionIs(path: string, extension: string): boolean; function fileExtensionIsAny(path: string, extensions: string[]): boolean; function getRegularExpressionForWildcard(specs: string[], basePath: string, usage: "files" | "directories" | "exclude"): string; @@ -2193,6 +2197,8 @@ declare namespace ts { function changeExtension(path: T, newExtension: string): T; interface ObjectAllocator { getNodeConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Node; + getTokenConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Token; + getIdentifierConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Token; getSourceFileConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => SourceFile; getSymbolConstructor(): new (flags: SymbolFlags, name: string) => Symbol; getTypeConstructor(): new (checker: TypeChecker, flags: TypeFlags) => Type; @@ -6456,13 +6462,13 @@ declare namespace ts { key: string; message: string; }; - Report_Errors_on_Unused_Locals: { + Report_errors_on_unused_locals: { code: number; category: DiagnosticCategory; key: string; message: string; }; - Report_Errors_on_Unused_Parameters: { + Report_errors_on_unused_parameters: { code: number; category: DiagnosticCategory; key: string; @@ -7143,8 +7149,6 @@ declare namespace ts { function collapseTextChangeRangesAcrossMultipleVersions(changes: TextChangeRange[]): TextChangeRange; function getTypeParameterOwner(d: Declaration): Declaration; function isParameterPropertyDeclaration(node: ParameterDeclaration): boolean; - function startsWith(str: string, prefix: string): boolean; - function endsWith(str: string, suffix: string): boolean; } declare namespace ts { let parseTime: number; @@ -7225,6 +7229,12 @@ declare namespace ts { const defaultInitCompilerOptions: CompilerOptions; function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost; function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): Diagnostic[]; + interface FormatDiagnosticsHost { + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + getNewLine(): string; + } + function formatDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): string; function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain, newLine: string): string; function getAutomaticTypeDirectiveNames(options: CompilerOptions, rootFiles: string[], host: CompilerHost): string[]; function createProgram(rootNames: string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program): Program; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index f0bfd0f4f3e..8823d9ce98b 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -830,10 +830,17 @@ var ts; return true; } ts.containsPath = containsPath; + function startsWith(str, prefix) { + return str.lastIndexOf(prefix, 0) === 0; + } + ts.startsWith = startsWith; + function endsWith(str, suffix) { + var expectedPos = str.length - suffix.length; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; + } + ts.endsWith = endsWith; function fileExtensionIs(path, extension) { - var pathLen = path.length; - var extLen = extension.length; - return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; + return path.length > extension.length && endsWith(path, extension); } ts.fileExtensionIs = fileExtensionIs; function fileExtensionIsAny(path, extensions) { @@ -1098,6 +1105,8 @@ var ts; } ts.objectAllocator = { getNodeConstructor: function () { return Node; }, + getTokenConstructor: function () { return Node; }, + getIdentifierConstructor: function () { return Node; }, getSourceFileConstructor: function () { return Node; }, getSymbolConstructor: function () { return Symbol; }, getTypeConstructor: function () { return Type; }, @@ -1229,7 +1238,7 @@ var ts; function readDirectory(path, extensions, excludes, includes) { return ts.matchFiles(path, extensions, excludes, includes, false, shell.CurrentDirectory, getAccessibleFileSystemEntries); } - return { + var wscriptSystem = { args: args, newLine: "\r\n", useCaseSensitiveFileNames: false, @@ -1248,7 +1257,7 @@ var ts; return fso.FolderExists(path); }, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!wscriptSystem.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } }, @@ -1268,6 +1277,7 @@ var ts; } } }; + return wscriptSystem; } function getNodeSystem() { var _fs = require("fs"); @@ -1440,7 +1450,7 @@ var ts; function getDirectories(path) { return ts.filter(_fs.readdirSync(path), function (p) { return fileSystemEntryExists(ts.combinePaths(path, p), 1); }); } - return { + var nodeSystem = { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, @@ -1490,7 +1500,7 @@ var ts; fileExists: fileExists, directoryExists: directoryExists, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!nodeSystem.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } }, @@ -1538,6 +1548,7 @@ var ts; return _fs.realpathSync(path); } }; + return nodeSystem; } function getChakraSystem() { var realpath = ChakraHost.realpath && (function (path) { return ChakraHost.realpath(path); }); @@ -2287,8 +2298,8 @@ var ts; Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: { code: 6131, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", message: "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'." }, File_name_0_has_a_1_extension_stripping_it: { code: 6132, category: ts.DiagnosticCategory.Message, key: "File_name_0_has_a_1_extension_stripping_it_6132", message: "File name '{0}' has a '{1}' extension - stripping it" }, _0_is_declared_but_never_used: { code: 6133, category: ts.DiagnosticCategory.Error, key: "_0_is_declared_but_never_used_6133", message: "'{0}' is declared but never used." }, - Report_Errors_on_Unused_Locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Locals_6134", message: "Report Errors on Unused Locals." }, - Report_Errors_on_Unused_Parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Parameters_6135", message: "Report Errors on Unused Parameters." }, + Report_errors_on_unused_locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_locals_6134", message: "Report errors on unused locals." }, + Report_errors_on_unused_parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_parameters_6135", message: "Report errors on unused parameters." }, The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: { code: 6136, category: ts.DiagnosticCategory.Message, key: "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", message: "The maximum dependency depth to search under node_modules and load JavaScript files" }, No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0: { code: 6137, category: ts.DiagnosticCategory.Message, key: "No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0_6137", message: "No types specified in 'package.json' but 'allowJs' is set, so returning 'main' value of '{0}'" }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, @@ -3966,12 +3977,12 @@ var ts; { name: "noUnusedLocals", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Locals + description: ts.Diagnostics.Report_errors_on_unused_locals }, { name: "noUnusedParameters", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Parameters + description: ts.Diagnostics.Report_errors_on_unused_parameters }, { name: "noLib", @@ -5754,7 +5765,7 @@ var ts; } ts.isExpression = isExpression; function isExternalModuleNameRelative(moduleName) { - return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\"; + return /^\.\.?($|[\\/])/.test(moduleName); } ts.isExternalModuleNameRelative = isExternalModuleNameRelative; function isInstantiatedModule(node, preserveConstEnums) { @@ -7262,25 +7273,24 @@ var ts; return node.flags & 92 && node.parent.kind === 148 && ts.isClassLike(node.parent.parent); } ts.isParameterPropertyDeclaration = isParameterPropertyDeclaration; - function startsWith(str, prefix) { - return str.lastIndexOf(prefix, 0) === 0; - } - ts.startsWith = startsWith; - function endsWith(str, suffix) { - var expectedPos = str.length - suffix.length; - return str.indexOf(suffix, expectedPos) === expectedPos; - } - ts.endsWith = endsWith; })(ts || (ts = {})); var ts; (function (ts) { ts.parseTime = 0; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; function createNode(kind, pos, end) { if (kind === 256) { return new (SourceFileConstructor || (SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind === 69) { + return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } + else if (kind < 139) { + return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); + } else { return new (NodeConstructor || (NodeConstructor = ts.objectAllocator.getNodeConstructor()))(kind, pos, end); } @@ -7703,6 +7713,8 @@ var ts; var scanner = ts.createScanner(2, true); var disallowInAndDecoratorContext = 4194304 | 16777216; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; var sourceFile; var parseDiagnostics; @@ -7728,6 +7740,8 @@ var ts; } function initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind) { NodeConstructor = ts.objectAllocator.getNodeConstructor(); + TokenConstructor = ts.objectAllocator.getTokenConstructor(); + IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor(); SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; syntaxCursor = _syntaxCursor; @@ -8034,7 +8048,9 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return new NodeConstructor(kind, pos, pos); + return kind >= 139 ? new NodeConstructor(kind, pos, pos) : + kind === 69 ? new IdentifierConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node, end) { node.end = end === undefined ? scanner.getStartPos() : end; @@ -11810,6 +11826,9 @@ var ts; case 55: if (canParseTag) { parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral); + if (!parentTagTerminated) { + resumePos = scanner.getStartPos(); + } } seenAsterisk = false; break; @@ -16336,17 +16355,18 @@ var ts; if (declaration.kind === 235) { return links.type = checkExpression(declaration.expression); } + if (declaration.flags & 134217728 && declaration.kind === 280 && declaration.typeExpression) { + return links.type = getTypeFromTypeNode(declaration.typeExpression.type); + } if (!pushTypeResolution(symbol, 0)) { return unknownType; } var type = undefined; - if (declaration.kind === 187) { - type = getUnionType(ts.map(symbol.declarations, function (decl) { return checkExpressionCached(decl.right); })); - } - else if (declaration.kind === 172) { - if (declaration.parent.kind === 187) { - type = checkExpressionCached(declaration.parent.right); - } + if (declaration.kind === 187 || + declaration.kind === 172 && declaration.parent.kind === 187) { + type = getUnionType(ts.map(symbol.declarations, function (decl) { return decl.kind === 187 ? + checkExpressionCached(decl.right) : + checkExpressionCached(decl.parent.right); })); } if (type === undefined) { type = getWidenedTypeForVariableLikeDeclaration(declaration, true); @@ -22853,7 +22873,7 @@ var ts; function getInferredClassType(symbol) { var links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, undefined, undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, undefined, undefined); } return links.inferredClassType; } @@ -24073,7 +24093,7 @@ var ts; checkAsyncFunctionReturnType(node); } } - if (!node.body) { + if (noUnusedIdentifiers && !node.body) { checkUnusedTypeParameters(node); } } @@ -25016,9 +25036,14 @@ var ts; function checkUnusedTypeParameters(node) { if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) { if (node.typeParameters) { + var symbol = getSymbolOfNode(node); + var lastDeclaration = symbol && symbol.declarations && ts.lastOrUndefined(symbol.declarations); + if (lastDeclaration !== node) { + return; + } for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) { var typeParameter = _a[_i]; - if (!typeParameter.symbol.isReferenced) { + if (!getMergedSymbol(typeParameter.symbol).isReferenced) { error(typeParameter.name, ts.Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name); } } @@ -26095,7 +26120,7 @@ var ts; ts.forEach(node.members, checkSourceElement); if (produceDiagnostics) { checkTypeForDuplicateIndexSignatures(node); - checkUnusedTypeParameters(node); + registerForUnusedIdentifiersCheck(node); } } function checkTypeAliasDeclaration(node) { @@ -30818,7 +30843,7 @@ var ts; writeLine(); var sourceMappingURL = sourceMap.getSourceMappingURL(); if (sourceMappingURL) { - write("//# sourceMappingURL=" + sourceMappingURL); + write("//# " + "sourceMappingURL" + "=" + sourceMappingURL); } writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, compilerOptions.emitBOM, sourceFiles); sourceMap.reset(); @@ -34468,13 +34493,13 @@ var ts; if (isES6ExportedDeclaration(node) && !(node.flags & 512) && decoratedClassAlias === undefined) { write("export "); } - if (!isHoistedDeclarationInSystemModule) { - write("let "); - } if (decoratedClassAlias !== undefined) { - write("" + decoratedClassAlias); + write("let " + decoratedClassAlias); } else { + if (!isHoistedDeclarationInSystemModule) { + write("let "); + } emitDeclarationName(node); } write(" = "); @@ -36718,7 +36743,7 @@ var ts; ts.emitTime = 0; ts.ioReadTime = 0; ts.ioWriteTime = 0; - ts.version = "2.0.0"; + ts.version = "2.1.0"; var emptyArray = []; var defaultTypeRoots = ["node_modules/@types"]; function findConfigFile(searchPath, fileExists) { @@ -36798,12 +36823,7 @@ var ts; return { resolvedModule: resolvedFileName ? { resolvedFileName: resolvedFileName, isExternalLibraryImport: isExternalLibraryImport } : undefined, failedLookupLocations: failedLookupLocations }; } function moduleHasNonRelativeName(moduleName) { - if (ts.isRootedDiskPath(moduleName)) { - return false; - } - var i = moduleName.lastIndexOf("./", 1); - var startsWithDotSlashOrDotDotSlash = i === 0 || (i === 1 && moduleName.charCodeAt(0) === 46); - return !startsWithDotSlashOrDotDotSlash; + return !(ts.isRootedDiskPath(moduleName) || ts.isExternalModuleNameRelative(moduleName)); } function tryReadTypesSection(packageJsonPath, baseDirectory, state) { var jsonContent; @@ -37459,6 +37479,22 @@ var ts; return ts.sortAndDeduplicateDiagnostics(diagnostics); } ts.getPreEmitDiagnostics = getPreEmitDiagnostics; + function formatDiagnostics(diagnostics, host) { + var output = ""; + for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) { + var diagnostic = diagnostics_1[_i]; + if (diagnostic.file) { + var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character; + var fileName = diagnostic.file.fileName; + var relativeFileName = ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }); + output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): "; + } + var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase(); + output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) + host.getNewLine(); + } + return output; + } + ts.formatDiagnostics = formatDiagnostics; function flattenDiagnosticMessageText(messageText, newLine) { if (typeof messageText === "string") { return messageText; @@ -37534,7 +37570,7 @@ var ts; var resolvedTypeReferenceDirectives = {}; var fileProcessingDiagnostics = ts.createDiagnosticCollection(); var maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - var currentNodeModulesJsDepth = 0; + var currentNodeModulesDepth = 0; var modulesWithElidedImports = {}; var sourceFilesFoundSearchingNodeModules = {}; var start = new Date().getTime(); @@ -37758,8 +37794,7 @@ var ts; return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false)); } function emit(sourceFile, writeFileCallback, cancellationToken) { - var _this = this; - return runWithCancellationToken(function () { return emitWorker(_this, sourceFile, writeFileCallback, cancellationToken); }); + return runWithCancellationToken(function () { return emitWorker(program, sourceFile, writeFileCallback, cancellationToken); }); } function isEmitBlocked(emitFileName) { return hasEmitBlockingDiagnostics.contains(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName)); @@ -38166,8 +38201,17 @@ var ts; if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) { reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd); } - if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + if (file_1 && ts.lookUp(sourceFilesFoundSearchingNodeModules, file_1.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file_1.path] = false; + if (!options.noResolve) { + processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file_1); + } + modulesWithElidedImports[file_1.path] = false; + processImportedModules(file_1, ts.getDirectoryPath(fileName)); + } + else if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file_1.path] = false; processImportedModules(file_1, ts.getDirectoryPath(fileName)); } @@ -38184,6 +38228,7 @@ var ts; }); filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { var existingFile = filesByNameIgnoreCase.get(path); @@ -38284,12 +38329,9 @@ var ts; var isFromNodeModulesSearch = resolution && resolution.isExternalLibraryImport; var isJsFileFromNodeModules = isFromNodeModulesSearch && ts.hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + currentNodeModulesDepth++; } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; - } - var elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; var shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { modulesWithElidedImports[file.path] = true; @@ -38297,8 +38339,8 @@ var ts; else if (shouldAddFile) { findSourceFile(resolution.resolvedFileName, resolvedPath, false, false, file, ts.skipTrivia(file.text, file.imports[i].pos), file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } @@ -39891,7 +39933,7 @@ var ts; return createPatternMatch(PatternMatchKind.exact, punctuationStripped, candidate === chunk.text); } else { - return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, startsWith(candidate, chunk.text)); + return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, ts.startsWith(candidate, chunk.text)); } } var isLowercase = chunk.isLowerCase; @@ -40063,14 +40105,6 @@ var ts; var str = String.fromCharCode(ch); return str === str.toLowerCase(); } - function startsWith(string, search) { - for (var i = 0, n = search.length; i < n; i++) { - if (string.charCodeAt(i) !== search.charCodeAt(i)) { - return false; - } - } - return true; - } function indexOfIgnoringCase(string, value) { for (var i = 0, n = string.length - value.length; i <= n; i++) { if (startsWithIgnoringCase(string, value, i)) { @@ -41555,6 +41589,9 @@ var ts; } return false; } + function shouldRescanJsxText(node) { + return node && node.kind === 244; + } function shouldRescanSlashToken(container) { return container.kind === 10; } @@ -41582,7 +41619,9 @@ var ts; ? 3 : shouldRescanJsxIdentifier(n) ? 4 - : 0; + : shouldRescanJsxText(n) + ? 5 + : 0; if (lastTokenInfo && expectedScanAction === lastScanAction) { return fixTokenKind(lastTokenInfo, n); } @@ -41610,6 +41649,10 @@ var ts; currentToken = scanner.scanJsxIdentifier(); lastScanAction = 4; } + else if (expectedScanAction === 5) { + currentToken = scanner.reScanJsxToken(); + lastScanAction = 5; + } else { lastScanAction = 0; } @@ -43858,19 +43901,20 @@ var ts; "version" ]; var jsDocCompletionEntries; - function createNode(kind, pos, end, flags, parent) { - var node = new NodeObject(kind, pos, end); - node.flags = flags; + function createNode(kind, pos, end, parent) { + var node = kind >= 139 ? new NodeObject(kind, pos, end) : + kind === 69 ? new IdentifierObject(kind, pos, end) : + new TokenObject(kind, pos, end); node.parent = parent; return node; } var NodeObject = (function () { function NodeObject(kind, pos, end) { - this.kind = kind; this.pos = pos; this.end = end; this.flags = 0; this.parent = undefined; + this.kind = kind; } NodeObject.prototype.getSourceFile = function () { return ts.getSourceFileOfNode(this); @@ -43905,14 +43949,14 @@ var ts; var token = useJSDocScanner ? scanner.scanJSDocToken() : scanner.scan(); var textPos = scanner.getTextPos(); if (textPos <= end) { - nodes.push(createNode(token, pos, textPos, 0, this)); + nodes.push(createNode(token, pos, textPos, this)); } pos = textPos; } return pos; }; NodeObject.prototype.createSyntaxList = function (nodes) { - var list = createNode(282, nodes.pos, nodes.end, 0, this); + var list = createNode(282, nodes.pos, nodes.end, this); list._children = []; var pos = nodes.pos; for (var _i = 0, nodes_4 = nodes; _i < nodes_4.length; _i++) { @@ -43997,6 +44041,73 @@ var ts; }; return NodeObject; }()); + var TokenOrIdentifierObject = (function () { + function TokenOrIdentifierObject(pos, end) { + this.pos = pos; + this.end = end; + this.flags = 0; + this.parent = undefined; + } + TokenOrIdentifierObject.prototype.getSourceFile = function () { + return ts.getSourceFileOfNode(this); + }; + TokenOrIdentifierObject.prototype.getStart = function (sourceFile, includeJsDocComment) { + return ts.getTokenPosOfNode(this, sourceFile, includeJsDocComment); + }; + TokenOrIdentifierObject.prototype.getFullStart = function () { + return this.pos; + }; + TokenOrIdentifierObject.prototype.getEnd = function () { + return this.end; + }; + TokenOrIdentifierObject.prototype.getWidth = function (sourceFile) { + return this.getEnd() - this.getStart(sourceFile); + }; + TokenOrIdentifierObject.prototype.getFullWidth = function () { + return this.end - this.pos; + }; + TokenOrIdentifierObject.prototype.getLeadingTriviaWidth = function (sourceFile) { + return this.getStart(sourceFile) - this.pos; + }; + TokenOrIdentifierObject.prototype.getFullText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end); + }; + TokenOrIdentifierObject.prototype.getText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.getStart(), this.getEnd()); + }; + TokenOrIdentifierObject.prototype.getChildCount = function (sourceFile) { + return 0; + }; + TokenOrIdentifierObject.prototype.getChildAt = function (index, sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getChildren = function (sourceFile) { + return emptyArray; + }; + TokenOrIdentifierObject.prototype.getFirstToken = function (sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getLastToken = function (sourceFile) { + return undefined; + }; + return TokenOrIdentifierObject; + }()); + var TokenObject = (function (_super) { + __extends(TokenObject, _super); + function TokenObject(kind, pos, end) { + _super.call(this, pos, end); + this.kind = kind; + } + return TokenObject; + }(TokenOrIdentifierObject)); + var IdentifierObject = (function (_super) { + __extends(IdentifierObject, _super); + function IdentifierObject(kind, pos, end) { + _super.call(this, pos, end); + } + return IdentifierObject; + }(TokenOrIdentifierObject)); + IdentifierObject.prototype.kind = 69; var SymbolObject = (function () { function SymbolObject(flags, name) { this.flags = flags; @@ -49677,6 +49788,8 @@ var ts; function initializeServices() { ts.objectAllocator = { getNodeConstructor: function () { return NodeObject; }, + getTokenConstructor: function () { return TokenObject; }, + getIdentifierConstructor: function () { return IdentifierObject; }, getSourceFileConstructor: function () { return SourceFileObject; }, getSymbolConstructor: function () { return SymbolObject; }, getTypeConstructor: function () { return TypeObject; }, @@ -52422,7 +52535,7 @@ var ts; done: false, leaf: function (relativeStart, relativeLength, ll) { if (!f(ll, relativeStart, relativeLength)) { - this.done = true; + walkFns.done = true; } } }; @@ -52838,7 +52951,7 @@ var ts; server.LineLeaf = LineLeaf; })(server = ts.server || (ts.server = {})); })(ts || (ts = {})); -var debugObjectHost = this; +var debugObjectHost = new Function("return this")(); var ts; (function (ts) { function logInternalError(logger, err) { diff --git a/lib/typescript.d.ts b/lib/typescript.d.ts index c322ba1dd0c..92937fecf99 100644 --- a/lib/typescript.d.ts +++ b/lib/typescript.d.ts @@ -409,7 +409,10 @@ declare namespace ts { interface ModifiersArray extends NodeArray { flags: NodeFlags; } - interface Modifier extends Node { + interface Token extends Node { + __tokenTag: any; + } + interface Modifier extends Token { } interface Identifier extends PrimaryExpression { text: string; @@ -1696,7 +1699,6 @@ declare namespace ts { getCancellationToken?(): CancellationToken; getDefaultLibFileName(options: CompilerOptions): string; getDefaultLibLocation?(): string; - getDefaultTypeDirectiveNames?(rootPath: string): string[]; writeFile: WriteFileCallback; getCurrentDirectory(): string; getDirectories(path: string): string[]; @@ -1842,8 +1844,6 @@ declare namespace ts { function collapseTextChangeRangesAcrossMultipleVersions(changes: TextChangeRange[]): TextChangeRange; function getTypeParameterOwner(d: Declaration): Declaration; function isParameterPropertyDeclaration(node: ParameterDeclaration): boolean; - function startsWith(str: string, prefix: string): boolean; - function endsWith(str: string, suffix: string): boolean; } declare namespace ts { function createNode(kind: SyntaxKind, pos?: number, end?: number): Node; @@ -1868,6 +1868,12 @@ declare namespace ts { function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations; function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost; function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): Diagnostic[]; + interface FormatDiagnosticsHost { + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + getNewLine(): string; + } + function formatDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): string; function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain, newLine: string): string; /** * Given a set of options and a set of root files, returns the set of type directive names diff --git a/lib/typescript.js b/lib/typescript.js index 3b28d8f0e67..41d3676a415 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -1756,10 +1756,19 @@ var ts; return true; } ts.containsPath = containsPath; + /* @internal */ + function startsWith(str, prefix) { + return str.lastIndexOf(prefix, 0) === 0; + } + ts.startsWith = startsWith; + /* @internal */ + function endsWith(str, suffix) { + var expectedPos = str.length - suffix.length; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; + } + ts.endsWith = endsWith; function fileExtensionIs(path, extension) { - var pathLen = path.length; - var extLen = extension.length; - return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; + return path.length > extension.length && endsWith(path, extension); } ts.fileExtensionIs = fileExtensionIs; function fileExtensionIsAny(path, extensions) { @@ -2070,6 +2079,8 @@ var ts; } ts.objectAllocator = { getNodeConstructor: function () { return Node; }, + getTokenConstructor: function () { return Node; }, + getIdentifierConstructor: function () { return Node; }, getSourceFileConstructor: function () { return Node; }, getSymbolConstructor: function () { return Symbol; }, getTypeConstructor: function () { return Type; }, @@ -2216,7 +2227,7 @@ var ts; function readDirectory(path, extensions, excludes, includes) { return ts.matchFiles(path, extensions, excludes, includes, /*useCaseSensitiveFileNames*/ false, shell.CurrentDirectory, getAccessibleFileSystemEntries); } - return { + var wscriptSystem = { args: args, newLine: "\r\n", useCaseSensitiveFileNames: false, @@ -2235,7 +2246,7 @@ var ts; return fso.FolderExists(path); }, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!wscriptSystem.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } }, @@ -2255,6 +2266,7 @@ var ts; } } }; + return wscriptSystem; } function getNodeSystem() { var _fs = require("fs"); @@ -2444,7 +2456,7 @@ var ts; function getDirectories(path) { return ts.filter(_fs.readdirSync(path), function (p) { return fileSystemEntryExists(ts.combinePaths(path, p), 1 /* Directory */); }); } - return { + var nodeSystem = { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, @@ -2500,7 +2512,7 @@ var ts; fileExists: fileExists, directoryExists: directoryExists, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!nodeSystem.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } }, @@ -2548,6 +2560,7 @@ var ts; return _fs.realpathSync(path); } }; + return nodeSystem; } function getChakraSystem() { var realpath = ChakraHost.realpath && (function (path) { return ChakraHost.realpath(path); }); @@ -3304,8 +3317,8 @@ var ts; Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: { code: 6131, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", message: "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'." }, File_name_0_has_a_1_extension_stripping_it: { code: 6132, category: ts.DiagnosticCategory.Message, key: "File_name_0_has_a_1_extension_stripping_it_6132", message: "File name '{0}' has a '{1}' extension - stripping it" }, _0_is_declared_but_never_used: { code: 6133, category: ts.DiagnosticCategory.Error, key: "_0_is_declared_but_never_used_6133", message: "'{0}' is declared but never used." }, - Report_Errors_on_Unused_Locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Locals_6134", message: "Report Errors on Unused Locals." }, - Report_Errors_on_Unused_Parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Parameters_6135", message: "Report Errors on Unused Parameters." }, + Report_errors_on_unused_locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_locals_6134", message: "Report errors on unused locals." }, + Report_errors_on_unused_parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_parameters_6135", message: "Report errors on unused parameters." }, The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: { code: 6136, category: ts.DiagnosticCategory.Message, key: "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", message: "The maximum dependency depth to search under node_modules and load JavaScript files" }, No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0: { code: 6137, category: ts.DiagnosticCategory.Message, key: "No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0_6137", message: "No types specified in 'package.json' but 'allowJs' is set, so returning 'main' value of '{0}'" }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, @@ -6153,7 +6166,7 @@ var ts; function isExternalModuleNameRelative(moduleName) { // TypeScript 1.0 spec (April 2014): 11.2.1 // An external module name is "relative" if the first term is "." or "..". - return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\"; + return /^\.\.?($|[\\/])/.test(moduleName); } ts.isExternalModuleNameRelative = isExternalModuleNameRelative; function isInstantiatedModule(node, preserveConstEnums) { @@ -7916,15 +7929,6 @@ var ts; return node.flags & 92 /* ParameterPropertyModifier */ && node.parent.kind === 148 /* Constructor */ && ts.isClassLike(node.parent.parent); } ts.isParameterPropertyDeclaration = isParameterPropertyDeclaration; - function startsWith(str, prefix) { - return str.lastIndexOf(prefix, 0) === 0; - } - ts.startsWith = startsWith; - function endsWith(str, suffix) { - var expectedPos = str.length - suffix.length; - return str.indexOf(suffix, expectedPos) === expectedPos; - } - ts.endsWith = endsWith; })(ts || (ts = {})); /// /// @@ -7932,11 +7936,19 @@ var ts; (function (ts) { /* @internal */ ts.parseTime = 0; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; function createNode(kind, pos, end) { if (kind === 256 /* SourceFile */) { return new (SourceFileConstructor || (SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind === 69 /* Identifier */) { + return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } + else if (kind < 139 /* FirstNode */) { + return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); + } else { return new (NodeConstructor || (NodeConstructor = ts.objectAllocator.getNodeConstructor()))(kind, pos, end); } @@ -8386,6 +8398,8 @@ var ts; var disallowInAndDecoratorContext = 4194304 /* DisallowInContext */ | 16777216 /* DecoratorContext */; // capture constructors in 'initializeState' to avoid null checks var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; var sourceFile; var parseDiagnostics; @@ -8485,6 +8499,8 @@ var ts; } function initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind) { NodeConstructor = ts.objectAllocator.getNodeConstructor(); + TokenConstructor = ts.objectAllocator.getTokenConstructor(); + IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor(); SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; syntaxCursor = _syntaxCursor; @@ -8855,7 +8871,9 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return new NodeConstructor(kind, pos, pos); + return kind >= 139 /* FirstNode */ ? new NodeConstructor(kind, pos, pos) : + kind === 69 /* Identifier */ ? new IdentifierConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node, end) { node.end = end === undefined ? scanner.getStartPos() : end; @@ -13524,6 +13542,9 @@ var ts; case 55 /* AtToken */: if (canParseTag) { parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral); + if (!parentTagTerminated) { + resumePos = scanner.getStartPos(); + } } seenAsterisk = false; break; @@ -18991,22 +19012,24 @@ var ts; if (declaration.kind === 235 /* ExportAssignment */) { return links.type = checkExpression(declaration.expression); } + if (declaration.flags & 134217728 /* JavaScriptFile */ && declaration.kind === 280 /* JSDocPropertyTag */ && declaration.typeExpression) { + return links.type = getTypeFromTypeNode(declaration.typeExpression.type); + } // Handle variable, parameter or property if (!pushTypeResolution(symbol, 0 /* Type */)) { return unknownType; } var type = undefined; - // Handle module.exports = expr or this.p = expr - if (declaration.kind === 187 /* BinaryExpression */) { - type = getUnionType(ts.map(symbol.declarations, function (decl) { return checkExpressionCached(decl.right); })); - } - else if (declaration.kind === 172 /* PropertyAccessExpression */) { - // Declarations only exist for property access expressions for certain - // special assignment kinds - if (declaration.parent.kind === 187 /* BinaryExpression */) { - // Handle exports.p = expr or className.prototype.method = expr - type = checkExpressionCached(declaration.parent.right); - } + // Handle certain special assignment kinds, which happen to union across multiple declarations: + // * module.exports = expr + // * exports.p = expr + // * this.p = expr + // * className.prototype.method = expr + if (declaration.kind === 187 /* BinaryExpression */ || + declaration.kind === 172 /* PropertyAccessExpression */ && declaration.parent.kind === 187 /* BinaryExpression */) { + type = getUnionType(ts.map(symbol.declarations, function (decl) { return decl.kind === 187 /* BinaryExpression */ ? + checkExpressionCached(decl.right) : + checkExpressionCached(decl.parent.right); })); } if (type === undefined) { type = getWidenedTypeForVariableLikeDeclaration(declaration, /*reportErrors*/ true); @@ -26761,7 +26784,7 @@ var ts; function getInferredClassType(symbol) { var links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); } return links.inferredClassType; } @@ -28202,7 +28225,7 @@ var ts; checkAsyncFunctionReturnType(node); } } - if (!node.body) { + if (noUnusedIdentifiers && !node.body) { checkUnusedTypeParameters(node); } } @@ -29388,9 +29411,16 @@ var ts; function checkUnusedTypeParameters(node) { if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) { if (node.typeParameters) { + // Only report errors on the last declaration for the type parameter container; + // this ensures that all uses have been accounted for. + var symbol = getSymbolOfNode(node); + var lastDeclaration = symbol && symbol.declarations && ts.lastOrUndefined(symbol.declarations); + if (lastDeclaration !== node) { + return; + } for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) { var typeParameter = _a[_i]; - if (!typeParameter.symbol.isReferenced) { + if (!getMergedSymbol(typeParameter.symbol).isReferenced) { error(typeParameter.name, ts.Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name); } } @@ -30723,7 +30753,7 @@ var ts; ts.forEach(node.members, checkSourceElement); if (produceDiagnostics) { checkTypeForDuplicateIndexSignatures(node); - checkUnusedTypeParameters(node); + registerForUnusedIdentifiersCheck(node); } } function checkTypeAliasDeclaration(node) { @@ -35987,7 +36017,7 @@ var ts; writeLine(); var sourceMappingURL = sourceMap.getSourceMappingURL(); if (sourceMappingURL) { - write("//# sourceMappingURL=" + sourceMappingURL); + write("//# " + "sourceMappingURL" + "=" + sourceMappingURL); // Sometimes tools can sometimes see this line as a source mapping url comment } writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, /*writeByteOrderMark*/ compilerOptions.emitBOM, sourceFiles); // reset the state @@ -37884,7 +37914,7 @@ var ts; * if we should also export the value after its it changed * - check if node is a source level declaration to emit it differently, * i.e non-exported variable statement 'var x = 1' is hoisted so - * we we emit variable statement 'var' should be dropped. + * when we emit variable statement 'var' should be dropped. */ function isSourceFileLevelDeclarationInSystemJsModule(node, isExported) { if (!node || !isCurrentFileSystemExternalModule()) { @@ -40351,13 +40381,13 @@ var ts; if (isES6ExportedDeclaration(node) && !(node.flags & 512 /* Default */) && decoratedClassAlias === undefined) { write("export "); } - if (!isHoistedDeclarationInSystemModule) { - write("let "); - } if (decoratedClassAlias !== undefined) { - write("" + decoratedClassAlias); + write("let " + decoratedClassAlias); } else { + if (!isHoistedDeclarationInSystemModule) { + write("let "); + } emitDeclarationName(node); } write(" = "); @@ -40376,7 +40406,9 @@ var ts; // // We'll emit: // - // (_temp = class C { ... }, _temp.a = 1, _temp.b = 2, _temp) + // let C_1 = class C{}; + // C_1.a = 1; + // C_1.b = 2; // so forth and so on // // This keeps the expression as an expression, while ensuring that the static parts // of it have been initialized by the time it is used. @@ -42940,7 +42972,7 @@ var ts; /* @internal */ ts.ioReadTime = 0; /* @internal */ ts.ioWriteTime = 0; /** The version of the TypeScript compiler release */ - ts.version = "2.0.0"; + ts.version = "2.1.0"; var emptyArray = []; var defaultTypeRoots = ["node_modules/@types"]; function findConfigFile(searchPath, fileExists) { @@ -43029,12 +43061,7 @@ var ts; return { resolvedModule: resolvedFileName ? { resolvedFileName: resolvedFileName, isExternalLibraryImport: isExternalLibraryImport } : undefined, failedLookupLocations: failedLookupLocations }; } function moduleHasNonRelativeName(moduleName) { - if (ts.isRootedDiskPath(moduleName)) { - return false; - } - var i = moduleName.lastIndexOf("./", 1); - var startsWithDotSlashOrDotDotSlash = i === 0 || (i === 1 && moduleName.charCodeAt(0) === 46 /* dot */); - return !startsWithDotSlashOrDotDotSlash; + return !(ts.isRootedDiskPath(moduleName) || ts.isExternalModuleNameRelative(moduleName)); } function tryReadTypesSection(packageJsonPath, baseDirectory, state) { var jsonContent; @@ -43801,6 +43828,22 @@ var ts; return ts.sortAndDeduplicateDiagnostics(diagnostics); } ts.getPreEmitDiagnostics = getPreEmitDiagnostics; + function formatDiagnostics(diagnostics, host) { + var output = ""; + for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) { + var diagnostic = diagnostics_1[_i]; + if (diagnostic.file) { + var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character; + var fileName = diagnostic.file.fileName; + var relativeFileName = ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }); + output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): "; + } + var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase(); + output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) + host.getNewLine(); + } + return output; + } + ts.formatDiagnostics = formatDiagnostics; function flattenDiagnosticMessageText(messageText, newLine) { if (typeof messageText === "string") { return messageText; @@ -43893,11 +43936,11 @@ var ts; // As all these operations happen - and are nested - within the createProgram call, they close over the below variables. // The current resolution depth is tracked by incrementing/decrementing as the depth first search progresses. var maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - var currentNodeModulesJsDepth = 0; + var currentNodeModulesDepth = 0; // If a module has some of its imports skipped due to being at the depth limit under node_modules, then track // this, as it may be imported at a shallower depth later, and then it will need its skipped imports processed. var modulesWithElidedImports = {}; - // Track source files that are JavaScript files found by searching under node_modules, as these shouldn't be compiled. + // Track source files that are source files found by searching under node_modules, as these shouldn't be compiled. var sourceFilesFoundSearchingNodeModules = {}; var start = new Date().getTime(); host = host || createCompilerHost(options); @@ -44154,8 +44197,7 @@ var ts; return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, /*produceDiagnostics:*/ false)); } function emit(sourceFile, writeFileCallback, cancellationToken) { - var _this = this; - return runWithCancellationToken(function () { return emitWorker(_this, sourceFile, writeFileCallback, cancellationToken); }); + return runWithCancellationToken(function () { return emitWorker(program, sourceFile, writeFileCallback, cancellationToken); }); } function isEmitBlocked(emitFileName) { return hasEmitBlockingDiagnostics.contains(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName)); @@ -44607,9 +44649,19 @@ var ts; if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) { reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd); } - // See if we need to reprocess the imports due to prior skipped imports - if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + // If the file was previously found via a node_modules search, but is now being processed as a root file, + // then everything it sucks in may also be marked incorrectly, and needs to be checked again. + if (file_1 && ts.lookUp(sourceFilesFoundSearchingNodeModules, file_1.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file_1.path] = false; + if (!options.noResolve) { + processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file_1); + } + modulesWithElidedImports[file_1.path] = false; + processImportedModules(file_1, ts.getDirectoryPath(fileName)); + } + else if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file_1.path] = false; processImportedModules(file_1, ts.getDirectoryPath(fileName)); } @@ -44627,6 +44679,7 @@ var ts; }); filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { // for case-sensitive file systems check if we've already seen some file with similar filename ignoring case @@ -44741,12 +44794,9 @@ var ts; var isFromNodeModulesSearch = resolution && resolution.isExternalLibraryImport; var isJsFileFromNodeModules = isFromNodeModulesSearch && ts.hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + currentNodeModulesDepth++; } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; - } - var elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; var shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { modulesWithElidedImports[file.path] = true; @@ -44755,8 +44805,8 @@ var ts; findSourceFile(resolution.resolvedFileName, resolvedPath, /*isDefaultLib*/ false, /*isReference*/ false, file, ts.skipTrivia(file.text, file.imports[i].pos), file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } @@ -45094,12 +45144,12 @@ var ts; { name: "noUnusedLocals", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Locals + description: ts.Diagnostics.Report_errors_on_unused_locals }, { name: "noUnusedParameters", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Parameters + description: ts.Diagnostics.Report_errors_on_unused_parameters }, { name: "noLib", @@ -47091,7 +47141,7 @@ var ts; else { // b) Check if the part is a prefix of the candidate, in a case insensitive or sensitive // manner. If it does, return that there was a prefix match. - return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, /*isCaseSensitive:*/ startsWith(candidate, chunk.text)); + return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, /*isCaseSensitive:*/ ts.startsWith(candidate, chunk.text)); } } var isLowercase = chunk.isLowerCase; @@ -47357,14 +47407,6 @@ var ts; var str = String.fromCharCode(ch); return str === str.toLowerCase(); } - function startsWith(string, search) { - for (var i = 0, n = search.length; i < n; i++) { - if (string.charCodeAt(i) !== search.charCodeAt(i)) { - return false; - } - } - return true; - } // Assumes 'value' is already lowercase. function indexOfIgnoringCase(string, value) { for (var i = 0, n = string.length - value.length; i <= n; i++) { @@ -49209,6 +49251,7 @@ var ts; ScanAction[ScanAction["RescanSlashToken"] = 2] = "RescanSlashToken"; ScanAction[ScanAction["RescanTemplateToken"] = 3] = "RescanTemplateToken"; ScanAction[ScanAction["RescanJsxIdentifier"] = 4] = "RescanJsxIdentifier"; + ScanAction[ScanAction["RescanJsxText"] = 5] = "RescanJsxText"; })(ScanAction || (ScanAction = {})); function getFormattingScanner(sourceFile, startPos, endPos) { ts.Debug.assert(scanner === undefined); @@ -49300,6 +49343,9 @@ var ts; } return false; } + function shouldRescanJsxText(node) { + return node && node.kind === 244 /* JsxText */; + } function shouldRescanSlashToken(container) { return container.kind === 10 /* RegularExpressionLiteral */; } @@ -49330,7 +49376,9 @@ var ts; ? 3 /* RescanTemplateToken */ : shouldRescanJsxIdentifier(n) ? 4 /* RescanJsxIdentifier */ - : 0 /* Scan */; + : shouldRescanJsxText(n) + ? 5 /* RescanJsxText */ + : 0 /* Scan */; if (lastTokenInfo && expectedScanAction === lastScanAction) { // readTokenInfo was called before with the same expected scan action. // No need to re-scan text, return existing 'lastTokenInfo' @@ -49365,6 +49413,10 @@ var ts; currentToken = scanner.scanJsxIdentifier(); lastScanAction = 4 /* RescanJsxIdentifier */; } + else if (expectedScanAction === 5 /* RescanJsxText */) { + currentToken = scanner.reScanJsxToken(); + lastScanAction = 5 /* RescanJsxText */; + } else { lastScanAction = 0 /* Scan */; } @@ -52037,19 +52089,20 @@ var ts; "version" ]; var jsDocCompletionEntries; - function createNode(kind, pos, end, flags, parent) { - var node = new NodeObject(kind, pos, end); - node.flags = flags; + function createNode(kind, pos, end, parent) { + var node = kind >= 139 /* FirstNode */ ? new NodeObject(kind, pos, end) : + kind === 69 /* Identifier */ ? new IdentifierObject(kind, pos, end) : + new TokenObject(kind, pos, end); node.parent = parent; return node; } var NodeObject = (function () { function NodeObject(kind, pos, end) { - this.kind = kind; this.pos = pos; this.end = end; this.flags = 0 /* None */; this.parent = undefined; + this.kind = kind; } NodeObject.prototype.getSourceFile = function () { return ts.getSourceFileOfNode(this); @@ -52084,14 +52137,14 @@ var ts; var token = useJSDocScanner ? scanner.scanJSDocToken() : scanner.scan(); var textPos = scanner.getTextPos(); if (textPos <= end) { - nodes.push(createNode(token, pos, textPos, 0, this)); + nodes.push(createNode(token, pos, textPos, this)); } pos = textPos; } return pos; }; NodeObject.prototype.createSyntaxList = function (nodes) { - var list = createNode(282 /* SyntaxList */, nodes.pos, nodes.end, 0, this); + var list = createNode(282 /* SyntaxList */, nodes.pos, nodes.end, this); list._children = []; var pos = nodes.pos; for (var _i = 0, nodes_4 = nodes; _i < nodes_4.length; _i++) { @@ -52177,6 +52230,74 @@ var ts; }; return NodeObject; }()); + var TokenOrIdentifierObject = (function () { + function TokenOrIdentifierObject(pos, end) { + // Set properties in same order as NodeObject + this.pos = pos; + this.end = end; + this.flags = 0 /* None */; + this.parent = undefined; + } + TokenOrIdentifierObject.prototype.getSourceFile = function () { + return ts.getSourceFileOfNode(this); + }; + TokenOrIdentifierObject.prototype.getStart = function (sourceFile, includeJsDocComment) { + return ts.getTokenPosOfNode(this, sourceFile, includeJsDocComment); + }; + TokenOrIdentifierObject.prototype.getFullStart = function () { + return this.pos; + }; + TokenOrIdentifierObject.prototype.getEnd = function () { + return this.end; + }; + TokenOrIdentifierObject.prototype.getWidth = function (sourceFile) { + return this.getEnd() - this.getStart(sourceFile); + }; + TokenOrIdentifierObject.prototype.getFullWidth = function () { + return this.end - this.pos; + }; + TokenOrIdentifierObject.prototype.getLeadingTriviaWidth = function (sourceFile) { + return this.getStart(sourceFile) - this.pos; + }; + TokenOrIdentifierObject.prototype.getFullText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end); + }; + TokenOrIdentifierObject.prototype.getText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.getStart(), this.getEnd()); + }; + TokenOrIdentifierObject.prototype.getChildCount = function (sourceFile) { + return 0; + }; + TokenOrIdentifierObject.prototype.getChildAt = function (index, sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getChildren = function (sourceFile) { + return emptyArray; + }; + TokenOrIdentifierObject.prototype.getFirstToken = function (sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getLastToken = function (sourceFile) { + return undefined; + }; + return TokenOrIdentifierObject; + }()); + var TokenObject = (function (_super) { + __extends(TokenObject, _super); + function TokenObject(kind, pos, end) { + _super.call(this, pos, end); + this.kind = kind; + } + return TokenObject; + }(TokenOrIdentifierObject)); + var IdentifierObject = (function (_super) { + __extends(IdentifierObject, _super); + function IdentifierObject(kind, pos, end) { + _super.call(this, pos, end); + } + return IdentifierObject; + }(TokenOrIdentifierObject)); + IdentifierObject.prototype.kind = 69 /* Identifier */; var SymbolObject = (function () { function SymbolObject(flags, name) { this.flags = flags; @@ -58941,6 +59062,8 @@ var ts; function initializeServices() { ts.objectAllocator = { getNodeConstructor: function () { return NodeObject; }, + getTokenConstructor: function () { return TokenObject; }, + getIdentifierConstructor: function () { return IdentifierObject; }, getSourceFileConstructor: function () { return SourceFileObject; }, getSymbolConstructor: function () { return SymbolObject; }, getTypeConstructor: function () { return TypeObject; }, @@ -59566,7 +59689,7 @@ var ts; // /// /* @internal */ -var debugObjectHost = this; +var debugObjectHost = new Function("return this")(); // We need to use 'null' to interface with the managed side. /* tslint:disable:no-null-keyword */ /* tslint:disable:no-in-operator */ diff --git a/lib/typescriptServices.d.ts b/lib/typescriptServices.d.ts index 4ffdd868f16..a14277d920b 100644 --- a/lib/typescriptServices.d.ts +++ b/lib/typescriptServices.d.ts @@ -409,7 +409,10 @@ declare namespace ts { interface ModifiersArray extends NodeArray { flags: NodeFlags; } - interface Modifier extends Node { + interface Token extends Node { + __tokenTag: any; + } + interface Modifier extends Token { } interface Identifier extends PrimaryExpression { text: string; @@ -1696,7 +1699,6 @@ declare namespace ts { getCancellationToken?(): CancellationToken; getDefaultLibFileName(options: CompilerOptions): string; getDefaultLibLocation?(): string; - getDefaultTypeDirectiveNames?(rootPath: string): string[]; writeFile: WriteFileCallback; getCurrentDirectory(): string; getDirectories(path: string): string[]; @@ -1842,8 +1844,6 @@ declare namespace ts { function collapseTextChangeRangesAcrossMultipleVersions(changes: TextChangeRange[]): TextChangeRange; function getTypeParameterOwner(d: Declaration): Declaration; function isParameterPropertyDeclaration(node: ParameterDeclaration): boolean; - function startsWith(str: string, prefix: string): boolean; - function endsWith(str: string, suffix: string): boolean; } declare namespace ts { function createNode(kind: SyntaxKind, pos?: number, end?: number): Node; @@ -1868,6 +1868,12 @@ declare namespace ts { function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations; function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost; function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): Diagnostic[]; + interface FormatDiagnosticsHost { + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + getNewLine(): string; + } + function formatDiagnostics(diagnostics: Diagnostic[], host: FormatDiagnosticsHost): string; function flattenDiagnosticMessageText(messageText: string | DiagnosticMessageChain, newLine: string): string; /** * Given a set of options and a set of root files, returns the set of type directive names diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 3b28d8f0e67..41d3676a415 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -1756,10 +1756,19 @@ var ts; return true; } ts.containsPath = containsPath; + /* @internal */ + function startsWith(str, prefix) { + return str.lastIndexOf(prefix, 0) === 0; + } + ts.startsWith = startsWith; + /* @internal */ + function endsWith(str, suffix) { + var expectedPos = str.length - suffix.length; + return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos; + } + ts.endsWith = endsWith; function fileExtensionIs(path, extension) { - var pathLen = path.length; - var extLen = extension.length; - return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension; + return path.length > extension.length && endsWith(path, extension); } ts.fileExtensionIs = fileExtensionIs; function fileExtensionIsAny(path, extensions) { @@ -2070,6 +2079,8 @@ var ts; } ts.objectAllocator = { getNodeConstructor: function () { return Node; }, + getTokenConstructor: function () { return Node; }, + getIdentifierConstructor: function () { return Node; }, getSourceFileConstructor: function () { return Node; }, getSymbolConstructor: function () { return Symbol; }, getTypeConstructor: function () { return Type; }, @@ -2216,7 +2227,7 @@ var ts; function readDirectory(path, extensions, excludes, includes) { return ts.matchFiles(path, extensions, excludes, includes, /*useCaseSensitiveFileNames*/ false, shell.CurrentDirectory, getAccessibleFileSystemEntries); } - return { + var wscriptSystem = { args: args, newLine: "\r\n", useCaseSensitiveFileNames: false, @@ -2235,7 +2246,7 @@ var ts; return fso.FolderExists(path); }, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!wscriptSystem.directoryExists(directoryName)) { fso.CreateFolder(directoryName); } }, @@ -2255,6 +2266,7 @@ var ts; } } }; + return wscriptSystem; } function getNodeSystem() { var _fs = require("fs"); @@ -2444,7 +2456,7 @@ var ts; function getDirectories(path) { return ts.filter(_fs.readdirSync(path), function (p) { return fileSystemEntryExists(ts.combinePaths(path, p), 1 /* Directory */); }); } - return { + var nodeSystem = { args: process.argv.slice(2), newLine: _os.EOL, useCaseSensitiveFileNames: useCaseSensitiveFileNames, @@ -2500,7 +2512,7 @@ var ts; fileExists: fileExists, directoryExists: directoryExists, createDirectory: function (directoryName) { - if (!this.directoryExists(directoryName)) { + if (!nodeSystem.directoryExists(directoryName)) { _fs.mkdirSync(directoryName); } }, @@ -2548,6 +2560,7 @@ var ts; return _fs.realpathSync(path); } }; + return nodeSystem; } function getChakraSystem() { var realpath = ChakraHost.realpath && (function (path) { return ChakraHost.realpath(path); }); @@ -3304,8 +3317,8 @@ var ts; Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: { code: 6131, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", message: "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'." }, File_name_0_has_a_1_extension_stripping_it: { code: 6132, category: ts.DiagnosticCategory.Message, key: "File_name_0_has_a_1_extension_stripping_it_6132", message: "File name '{0}' has a '{1}' extension - stripping it" }, _0_is_declared_but_never_used: { code: 6133, category: ts.DiagnosticCategory.Error, key: "_0_is_declared_but_never_used_6133", message: "'{0}' is declared but never used." }, - Report_Errors_on_Unused_Locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Locals_6134", message: "Report Errors on Unused Locals." }, - Report_Errors_on_Unused_Parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_Errors_on_Unused_Parameters_6135", message: "Report Errors on Unused Parameters." }, + Report_errors_on_unused_locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_locals_6134", message: "Report errors on unused locals." }, + Report_errors_on_unused_parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_parameters_6135", message: "Report errors on unused parameters." }, The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: { code: 6136, category: ts.DiagnosticCategory.Message, key: "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", message: "The maximum dependency depth to search under node_modules and load JavaScript files" }, No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0: { code: 6137, category: ts.DiagnosticCategory.Message, key: "No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0_6137", message: "No types specified in 'package.json' but 'allowJs' is set, so returning 'main' value of '{0}'" }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, @@ -6153,7 +6166,7 @@ var ts; function isExternalModuleNameRelative(moduleName) { // TypeScript 1.0 spec (April 2014): 11.2.1 // An external module name is "relative" if the first term is "." or "..". - return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\"; + return /^\.\.?($|[\\/])/.test(moduleName); } ts.isExternalModuleNameRelative = isExternalModuleNameRelative; function isInstantiatedModule(node, preserveConstEnums) { @@ -7916,15 +7929,6 @@ var ts; return node.flags & 92 /* ParameterPropertyModifier */ && node.parent.kind === 148 /* Constructor */ && ts.isClassLike(node.parent.parent); } ts.isParameterPropertyDeclaration = isParameterPropertyDeclaration; - function startsWith(str, prefix) { - return str.lastIndexOf(prefix, 0) === 0; - } - ts.startsWith = startsWith; - function endsWith(str, suffix) { - var expectedPos = str.length - suffix.length; - return str.indexOf(suffix, expectedPos) === expectedPos; - } - ts.endsWith = endsWith; })(ts || (ts = {})); /// /// @@ -7932,11 +7936,19 @@ var ts; (function (ts) { /* @internal */ ts.parseTime = 0; var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; function createNode(kind, pos, end) { if (kind === 256 /* SourceFile */) { return new (SourceFileConstructor || (SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor()))(kind, pos, end); } + else if (kind === 69 /* Identifier */) { + return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); + } + else if (kind < 139 /* FirstNode */) { + return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); + } else { return new (NodeConstructor || (NodeConstructor = ts.objectAllocator.getNodeConstructor()))(kind, pos, end); } @@ -8386,6 +8398,8 @@ var ts; var disallowInAndDecoratorContext = 4194304 /* DisallowInContext */ | 16777216 /* DecoratorContext */; // capture constructors in 'initializeState' to avoid null checks var NodeConstructor; + var TokenConstructor; + var IdentifierConstructor; var SourceFileConstructor; var sourceFile; var parseDiagnostics; @@ -8485,6 +8499,8 @@ var ts; } function initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind) { NodeConstructor = ts.objectAllocator.getNodeConstructor(); + TokenConstructor = ts.objectAllocator.getTokenConstructor(); + IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor(); SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor(); sourceText = _sourceText; syntaxCursor = _syntaxCursor; @@ -8855,7 +8871,9 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return new NodeConstructor(kind, pos, pos); + return kind >= 139 /* FirstNode */ ? new NodeConstructor(kind, pos, pos) : + kind === 69 /* Identifier */ ? new IdentifierConstructor(kind, pos, pos) : + new TokenConstructor(kind, pos, pos); } function finishNode(node, end) { node.end = end === undefined ? scanner.getStartPos() : end; @@ -13524,6 +13542,9 @@ var ts; case 55 /* AtToken */: if (canParseTag) { parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral); + if (!parentTagTerminated) { + resumePos = scanner.getStartPos(); + } } seenAsterisk = false; break; @@ -18991,22 +19012,24 @@ var ts; if (declaration.kind === 235 /* ExportAssignment */) { return links.type = checkExpression(declaration.expression); } + if (declaration.flags & 134217728 /* JavaScriptFile */ && declaration.kind === 280 /* JSDocPropertyTag */ && declaration.typeExpression) { + return links.type = getTypeFromTypeNode(declaration.typeExpression.type); + } // Handle variable, parameter or property if (!pushTypeResolution(symbol, 0 /* Type */)) { return unknownType; } var type = undefined; - // Handle module.exports = expr or this.p = expr - if (declaration.kind === 187 /* BinaryExpression */) { - type = getUnionType(ts.map(symbol.declarations, function (decl) { return checkExpressionCached(decl.right); })); - } - else if (declaration.kind === 172 /* PropertyAccessExpression */) { - // Declarations only exist for property access expressions for certain - // special assignment kinds - if (declaration.parent.kind === 187 /* BinaryExpression */) { - // Handle exports.p = expr or className.prototype.method = expr - type = checkExpressionCached(declaration.parent.right); - } + // Handle certain special assignment kinds, which happen to union across multiple declarations: + // * module.exports = expr + // * exports.p = expr + // * this.p = expr + // * className.prototype.method = expr + if (declaration.kind === 187 /* BinaryExpression */ || + declaration.kind === 172 /* PropertyAccessExpression */ && declaration.parent.kind === 187 /* BinaryExpression */) { + type = getUnionType(ts.map(symbol.declarations, function (decl) { return decl.kind === 187 /* BinaryExpression */ ? + checkExpressionCached(decl.right) : + checkExpressionCached(decl.parent.right); })); } if (type === undefined) { type = getWidenedTypeForVariableLikeDeclaration(declaration, /*reportErrors*/ true); @@ -26761,7 +26784,7 @@ var ts; function getInferredClassType(symbol) { var links = getSymbolLinks(symbol); if (!links.inferredClassType) { - links.inferredClassType = createAnonymousType(undefined, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); + links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, /*stringIndexType*/ undefined, /*numberIndexType*/ undefined); } return links.inferredClassType; } @@ -28202,7 +28225,7 @@ var ts; checkAsyncFunctionReturnType(node); } } - if (!node.body) { + if (noUnusedIdentifiers && !node.body) { checkUnusedTypeParameters(node); } } @@ -29388,9 +29411,16 @@ var ts; function checkUnusedTypeParameters(node) { if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) { if (node.typeParameters) { + // Only report errors on the last declaration for the type parameter container; + // this ensures that all uses have been accounted for. + var symbol = getSymbolOfNode(node); + var lastDeclaration = symbol && symbol.declarations && ts.lastOrUndefined(symbol.declarations); + if (lastDeclaration !== node) { + return; + } for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) { var typeParameter = _a[_i]; - if (!typeParameter.symbol.isReferenced) { + if (!getMergedSymbol(typeParameter.symbol).isReferenced) { error(typeParameter.name, ts.Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name); } } @@ -30723,7 +30753,7 @@ var ts; ts.forEach(node.members, checkSourceElement); if (produceDiagnostics) { checkTypeForDuplicateIndexSignatures(node); - checkUnusedTypeParameters(node); + registerForUnusedIdentifiersCheck(node); } } function checkTypeAliasDeclaration(node) { @@ -35987,7 +36017,7 @@ var ts; writeLine(); var sourceMappingURL = sourceMap.getSourceMappingURL(); if (sourceMappingURL) { - write("//# sourceMappingURL=" + sourceMappingURL); + write("//# " + "sourceMappingURL" + "=" + sourceMappingURL); // Sometimes tools can sometimes see this line as a source mapping url comment } writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, /*writeByteOrderMark*/ compilerOptions.emitBOM, sourceFiles); // reset the state @@ -37884,7 +37914,7 @@ var ts; * if we should also export the value after its it changed * - check if node is a source level declaration to emit it differently, * i.e non-exported variable statement 'var x = 1' is hoisted so - * we we emit variable statement 'var' should be dropped. + * when we emit variable statement 'var' should be dropped. */ function isSourceFileLevelDeclarationInSystemJsModule(node, isExported) { if (!node || !isCurrentFileSystemExternalModule()) { @@ -40351,13 +40381,13 @@ var ts; if (isES6ExportedDeclaration(node) && !(node.flags & 512 /* Default */) && decoratedClassAlias === undefined) { write("export "); } - if (!isHoistedDeclarationInSystemModule) { - write("let "); - } if (decoratedClassAlias !== undefined) { - write("" + decoratedClassAlias); + write("let " + decoratedClassAlias); } else { + if (!isHoistedDeclarationInSystemModule) { + write("let "); + } emitDeclarationName(node); } write(" = "); @@ -40376,7 +40406,9 @@ var ts; // // We'll emit: // - // (_temp = class C { ... }, _temp.a = 1, _temp.b = 2, _temp) + // let C_1 = class C{}; + // C_1.a = 1; + // C_1.b = 2; // so forth and so on // // This keeps the expression as an expression, while ensuring that the static parts // of it have been initialized by the time it is used. @@ -42940,7 +42972,7 @@ var ts; /* @internal */ ts.ioReadTime = 0; /* @internal */ ts.ioWriteTime = 0; /** The version of the TypeScript compiler release */ - ts.version = "2.0.0"; + ts.version = "2.1.0"; var emptyArray = []; var defaultTypeRoots = ["node_modules/@types"]; function findConfigFile(searchPath, fileExists) { @@ -43029,12 +43061,7 @@ var ts; return { resolvedModule: resolvedFileName ? { resolvedFileName: resolvedFileName, isExternalLibraryImport: isExternalLibraryImport } : undefined, failedLookupLocations: failedLookupLocations }; } function moduleHasNonRelativeName(moduleName) { - if (ts.isRootedDiskPath(moduleName)) { - return false; - } - var i = moduleName.lastIndexOf("./", 1); - var startsWithDotSlashOrDotDotSlash = i === 0 || (i === 1 && moduleName.charCodeAt(0) === 46 /* dot */); - return !startsWithDotSlashOrDotDotSlash; + return !(ts.isRootedDiskPath(moduleName) || ts.isExternalModuleNameRelative(moduleName)); } function tryReadTypesSection(packageJsonPath, baseDirectory, state) { var jsonContent; @@ -43801,6 +43828,22 @@ var ts; return ts.sortAndDeduplicateDiagnostics(diagnostics); } ts.getPreEmitDiagnostics = getPreEmitDiagnostics; + function formatDiagnostics(diagnostics, host) { + var output = ""; + for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) { + var diagnostic = diagnostics_1[_i]; + if (diagnostic.file) { + var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character; + var fileName = diagnostic.file.fileName; + var relativeFileName = ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }); + output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): "; + } + var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase(); + output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) + host.getNewLine(); + } + return output; + } + ts.formatDiagnostics = formatDiagnostics; function flattenDiagnosticMessageText(messageText, newLine) { if (typeof messageText === "string") { return messageText; @@ -43893,11 +43936,11 @@ var ts; // As all these operations happen - and are nested - within the createProgram call, they close over the below variables. // The current resolution depth is tracked by incrementing/decrementing as the depth first search progresses. var maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2; - var currentNodeModulesJsDepth = 0; + var currentNodeModulesDepth = 0; // If a module has some of its imports skipped due to being at the depth limit under node_modules, then track // this, as it may be imported at a shallower depth later, and then it will need its skipped imports processed. var modulesWithElidedImports = {}; - // Track source files that are JavaScript files found by searching under node_modules, as these shouldn't be compiled. + // Track source files that are source files found by searching under node_modules, as these shouldn't be compiled. var sourceFilesFoundSearchingNodeModules = {}; var start = new Date().getTime(); host = host || createCompilerHost(options); @@ -44154,8 +44197,7 @@ var ts; return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, /*produceDiagnostics:*/ false)); } function emit(sourceFile, writeFileCallback, cancellationToken) { - var _this = this; - return runWithCancellationToken(function () { return emitWorker(_this, sourceFile, writeFileCallback, cancellationToken); }); + return runWithCancellationToken(function () { return emitWorker(program, sourceFile, writeFileCallback, cancellationToken); }); } function isEmitBlocked(emitFileName) { return hasEmitBlockingDiagnostics.contains(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName)); @@ -44607,9 +44649,19 @@ var ts; if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) { reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd); } - // See if we need to reprocess the imports due to prior skipped imports - if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { - if (currentNodeModulesJsDepth < maxNodeModulesJsDepth) { + // If the file was previously found via a node_modules search, but is now being processed as a root file, + // then everything it sucks in may also be marked incorrectly, and needs to be checked again. + if (file_1 && ts.lookUp(sourceFilesFoundSearchingNodeModules, file_1.path) && currentNodeModulesDepth == 0) { + sourceFilesFoundSearchingNodeModules[file_1.path] = false; + if (!options.noResolve) { + processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib); + processTypeReferenceDirectives(file_1); + } + modulesWithElidedImports[file_1.path] = false; + processImportedModules(file_1, ts.getDirectoryPath(fileName)); + } + else if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) { + if (currentNodeModulesDepth < maxNodeModulesJsDepth) { modulesWithElidedImports[file_1.path] = false; processImportedModules(file_1, ts.getDirectoryPath(fileName)); } @@ -44627,6 +44679,7 @@ var ts; }); filesByName.set(path, file); if (file) { + sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0); file.path = path; if (host.useCaseSensitiveFileNames()) { // for case-sensitive file systems check if we've already seen some file with similar filename ignoring case @@ -44741,12 +44794,9 @@ var ts; var isFromNodeModulesSearch = resolution && resolution.isExternalLibraryImport; var isJsFileFromNodeModules = isFromNodeModulesSearch && ts.hasJavaScriptFileExtension(resolution.resolvedFileName); if (isFromNodeModulesSearch) { - sourceFilesFoundSearchingNodeModules[resolvedPath] = true; + currentNodeModulesDepth++; } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth++; - } - var elideImport = isJsFileFromNodeModules && currentNodeModulesJsDepth > maxNodeModulesJsDepth; + var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth; var shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport; if (elideImport) { modulesWithElidedImports[file.path] = true; @@ -44755,8 +44805,8 @@ var ts; findSourceFile(resolution.resolvedFileName, resolvedPath, /*isDefaultLib*/ false, /*isReference*/ false, file, ts.skipTrivia(file.text, file.imports[i].pos), file.imports[i].end); } - if (isJsFileFromNodeModules) { - currentNodeModulesJsDepth--; + if (isFromNodeModulesSearch) { + currentNodeModulesDepth--; } } } @@ -45094,12 +45144,12 @@ var ts; { name: "noUnusedLocals", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Locals + description: ts.Diagnostics.Report_errors_on_unused_locals }, { name: "noUnusedParameters", type: "boolean", - description: ts.Diagnostics.Report_Errors_on_Unused_Parameters + description: ts.Diagnostics.Report_errors_on_unused_parameters }, { name: "noLib", @@ -47091,7 +47141,7 @@ var ts; else { // b) Check if the part is a prefix of the candidate, in a case insensitive or sensitive // manner. If it does, return that there was a prefix match. - return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, /*isCaseSensitive:*/ startsWith(candidate, chunk.text)); + return createPatternMatch(PatternMatchKind.prefix, punctuationStripped, /*isCaseSensitive:*/ ts.startsWith(candidate, chunk.text)); } } var isLowercase = chunk.isLowerCase; @@ -47357,14 +47407,6 @@ var ts; var str = String.fromCharCode(ch); return str === str.toLowerCase(); } - function startsWith(string, search) { - for (var i = 0, n = search.length; i < n; i++) { - if (string.charCodeAt(i) !== search.charCodeAt(i)) { - return false; - } - } - return true; - } // Assumes 'value' is already lowercase. function indexOfIgnoringCase(string, value) { for (var i = 0, n = string.length - value.length; i <= n; i++) { @@ -49209,6 +49251,7 @@ var ts; ScanAction[ScanAction["RescanSlashToken"] = 2] = "RescanSlashToken"; ScanAction[ScanAction["RescanTemplateToken"] = 3] = "RescanTemplateToken"; ScanAction[ScanAction["RescanJsxIdentifier"] = 4] = "RescanJsxIdentifier"; + ScanAction[ScanAction["RescanJsxText"] = 5] = "RescanJsxText"; })(ScanAction || (ScanAction = {})); function getFormattingScanner(sourceFile, startPos, endPos) { ts.Debug.assert(scanner === undefined); @@ -49300,6 +49343,9 @@ var ts; } return false; } + function shouldRescanJsxText(node) { + return node && node.kind === 244 /* JsxText */; + } function shouldRescanSlashToken(container) { return container.kind === 10 /* RegularExpressionLiteral */; } @@ -49330,7 +49376,9 @@ var ts; ? 3 /* RescanTemplateToken */ : shouldRescanJsxIdentifier(n) ? 4 /* RescanJsxIdentifier */ - : 0 /* Scan */; + : shouldRescanJsxText(n) + ? 5 /* RescanJsxText */ + : 0 /* Scan */; if (lastTokenInfo && expectedScanAction === lastScanAction) { // readTokenInfo was called before with the same expected scan action. // No need to re-scan text, return existing 'lastTokenInfo' @@ -49365,6 +49413,10 @@ var ts; currentToken = scanner.scanJsxIdentifier(); lastScanAction = 4 /* RescanJsxIdentifier */; } + else if (expectedScanAction === 5 /* RescanJsxText */) { + currentToken = scanner.reScanJsxToken(); + lastScanAction = 5 /* RescanJsxText */; + } else { lastScanAction = 0 /* Scan */; } @@ -52037,19 +52089,20 @@ var ts; "version" ]; var jsDocCompletionEntries; - function createNode(kind, pos, end, flags, parent) { - var node = new NodeObject(kind, pos, end); - node.flags = flags; + function createNode(kind, pos, end, parent) { + var node = kind >= 139 /* FirstNode */ ? new NodeObject(kind, pos, end) : + kind === 69 /* Identifier */ ? new IdentifierObject(kind, pos, end) : + new TokenObject(kind, pos, end); node.parent = parent; return node; } var NodeObject = (function () { function NodeObject(kind, pos, end) { - this.kind = kind; this.pos = pos; this.end = end; this.flags = 0 /* None */; this.parent = undefined; + this.kind = kind; } NodeObject.prototype.getSourceFile = function () { return ts.getSourceFileOfNode(this); @@ -52084,14 +52137,14 @@ var ts; var token = useJSDocScanner ? scanner.scanJSDocToken() : scanner.scan(); var textPos = scanner.getTextPos(); if (textPos <= end) { - nodes.push(createNode(token, pos, textPos, 0, this)); + nodes.push(createNode(token, pos, textPos, this)); } pos = textPos; } return pos; }; NodeObject.prototype.createSyntaxList = function (nodes) { - var list = createNode(282 /* SyntaxList */, nodes.pos, nodes.end, 0, this); + var list = createNode(282 /* SyntaxList */, nodes.pos, nodes.end, this); list._children = []; var pos = nodes.pos; for (var _i = 0, nodes_4 = nodes; _i < nodes_4.length; _i++) { @@ -52177,6 +52230,74 @@ var ts; }; return NodeObject; }()); + var TokenOrIdentifierObject = (function () { + function TokenOrIdentifierObject(pos, end) { + // Set properties in same order as NodeObject + this.pos = pos; + this.end = end; + this.flags = 0 /* None */; + this.parent = undefined; + } + TokenOrIdentifierObject.prototype.getSourceFile = function () { + return ts.getSourceFileOfNode(this); + }; + TokenOrIdentifierObject.prototype.getStart = function (sourceFile, includeJsDocComment) { + return ts.getTokenPosOfNode(this, sourceFile, includeJsDocComment); + }; + TokenOrIdentifierObject.prototype.getFullStart = function () { + return this.pos; + }; + TokenOrIdentifierObject.prototype.getEnd = function () { + return this.end; + }; + TokenOrIdentifierObject.prototype.getWidth = function (sourceFile) { + return this.getEnd() - this.getStart(sourceFile); + }; + TokenOrIdentifierObject.prototype.getFullWidth = function () { + return this.end - this.pos; + }; + TokenOrIdentifierObject.prototype.getLeadingTriviaWidth = function (sourceFile) { + return this.getStart(sourceFile) - this.pos; + }; + TokenOrIdentifierObject.prototype.getFullText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end); + }; + TokenOrIdentifierObject.prototype.getText = function (sourceFile) { + return (sourceFile || this.getSourceFile()).text.substring(this.getStart(), this.getEnd()); + }; + TokenOrIdentifierObject.prototype.getChildCount = function (sourceFile) { + return 0; + }; + TokenOrIdentifierObject.prototype.getChildAt = function (index, sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getChildren = function (sourceFile) { + return emptyArray; + }; + TokenOrIdentifierObject.prototype.getFirstToken = function (sourceFile) { + return undefined; + }; + TokenOrIdentifierObject.prototype.getLastToken = function (sourceFile) { + return undefined; + }; + return TokenOrIdentifierObject; + }()); + var TokenObject = (function (_super) { + __extends(TokenObject, _super); + function TokenObject(kind, pos, end) { + _super.call(this, pos, end); + this.kind = kind; + } + return TokenObject; + }(TokenOrIdentifierObject)); + var IdentifierObject = (function (_super) { + __extends(IdentifierObject, _super); + function IdentifierObject(kind, pos, end) { + _super.call(this, pos, end); + } + return IdentifierObject; + }(TokenOrIdentifierObject)); + IdentifierObject.prototype.kind = 69 /* Identifier */; var SymbolObject = (function () { function SymbolObject(flags, name) { this.flags = flags; @@ -58941,6 +59062,8 @@ var ts; function initializeServices() { ts.objectAllocator = { getNodeConstructor: function () { return NodeObject; }, + getTokenConstructor: function () { return TokenObject; }, + getIdentifierConstructor: function () { return IdentifierObject; }, getSourceFileConstructor: function () { return SourceFileObject; }, getSymbolConstructor: function () { return SymbolObject; }, getTypeConstructor: function () { return TypeObject; }, @@ -59566,7 +59689,7 @@ var ts; // /// /* @internal */ -var debugObjectHost = this; +var debugObjectHost = new Function("return this")(); // We need to use 'null' to interface with the managed side. /* tslint:disable:no-null-keyword */ /* tslint:disable:no-in-operator */ From 2a26beb9d8933f66b4e8bc23c1ee89b50c7a2aff Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 19 Jul 2016 15:10:29 -0700 Subject: [PATCH 100/109] Add performance framework from transforms branch (#9536) * Port performance tools from transforms branch * Use friendlier names, add compiler option to print all recorded measures * Always print total time * + -> .getTime --- Jakefile.js | 2 + src/compiler/binder.ts | 6 +- src/compiler/checker.ts | 6 +- src/compiler/commandLineParser.ts | 4 ++ src/compiler/core.ts | 2 + src/compiler/parser.ts | 6 +- src/compiler/performance.ts | 107 ++++++++++++++++++++++++++++++ src/compiler/program.ts | 21 +++--- src/compiler/sourcemap.ts | 4 ++ src/compiler/tsc.ts | 41 +++++++----- src/compiler/tsconfig.json | 1 + src/compiler/types.ts | 1 + 12 files changed, 159 insertions(+), 42 deletions(-) create mode 100644 src/compiler/performance.ts diff --git a/Jakefile.js b/Jakefile.js index eee9fe1370e..1c22305cd86 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -34,6 +34,7 @@ if (process.env.path !== undefined) { var compilerSources = [ "core.ts", + "performance.ts", "sys.ts", "types.ts", "scanner.ts", @@ -54,6 +55,7 @@ var compilerSources = [ var servicesSources = [ "core.ts", + "performance.ts", "sys.ts", "types.ts", "scanner.ts", diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index b7852a64d04..6059cd1f86a 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -3,8 +3,6 @@ /* @internal */ namespace ts { - export let bindTime = 0; - export const enum ModuleInstanceState { NonInstantiated = 0, Instantiated = 1, @@ -91,9 +89,9 @@ namespace ts { const binder = createBinder(); export function bindSourceFile(file: SourceFile, options: CompilerOptions) { - const start = new Date().getTime(); + const start = performance.mark(); binder(file, options); - bindTime += new Date().getTime() - start; + performance.measure("Bind", start); } function createBinder(): (file: SourceFile, options: CompilerOptions) => void { diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d68502dc8e8..d769cc4e3fc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15,8 +15,6 @@ namespace ts { return node.id; } - export let checkTime = 0; - export function getSymbolId(symbol: Symbol): number { if (!symbol.id) { symbol.id = nextSymbolId; @@ -17026,11 +17024,11 @@ namespace ts { } function checkSourceFile(node: SourceFile) { - const start = new Date().getTime(); + const start = performance.mark(); checkSourceFileWorker(node); - checkTime += new Date().getTime() - start; + performance.measure("Check", start); } // Fully type check a source file and collect the relevant diagnostics. diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index f11854a6858..b82cf6a094d 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -27,6 +27,10 @@ namespace ts { name: "diagnostics", type: "boolean", }, + { + name: "extendedDiagnostics", + type: "boolean", + }, { name: "emitBOM", type: "boolean" diff --git a/src/compiler/core.ts b/src/compiler/core.ts index bffd3179e83..926ee38a795 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1,4 +1,6 @@ /// +/// + /* @internal */ namespace ts { diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 2eae2c4025e..774cea60e09 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2,8 +2,6 @@ /// namespace ts { - /* @internal */ export let parseTime = 0; - let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let IdentifierConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; @@ -421,10 +419,10 @@ namespace ts { } export function createSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, setParentNodes = false, scriptKind?: ScriptKind): SourceFile { - const start = new Date().getTime(); + const start = performance.mark(); const result = Parser.parseSourceFile(fileName, sourceText, languageVersion, /*syntaxCursor*/ undefined, setParentNodes, scriptKind); - parseTime += new Date().getTime() - start; + performance.measure("Parse", start); return result; } diff --git a/src/compiler/performance.ts b/src/compiler/performance.ts new file mode 100644 index 00000000000..f40b191a1a5 --- /dev/null +++ b/src/compiler/performance.ts @@ -0,0 +1,107 @@ +/*@internal*/ +namespace ts { + /** Performance measurements for the compiler. */ + export namespace performance { + declare const onProfilerEvent: { (markName: string): void; profiler: boolean; }; + declare const performance: { now?(): number } | undefined; + let profilerEvent: (markName: string) => void; + let markInternal: () => number; + let counters: Map; + let measures: Map; + + /** + * Emit a performance event if ts-profiler is connected. This is primarily used + * to generate heap snapshots. + * + * @param eventName A name for the event. + */ + export function emit(eventName: string) { + if (profilerEvent) { + profilerEvent(eventName); + } + } + + /** + * Increments a counter with the specified name. + * + * @param counterName The name of the counter. + */ + export function increment(counterName: string) { + if (counters) { + counters[counterName] = (getProperty(counters, counterName) || 0) + 1; + } + } + + /** + * Gets the value of the counter with the specified name. + * + * @param counterName The name of the counter. + */ + export function getCount(counterName: string) { + return counters && getProperty(counters, counterName) || 0; + } + + /** + * Marks the start of a performance measurement. + */ + export function mark() { + return measures ? markInternal() : 0; + } + + /** + * Adds a performance measurement with the specified name. + * + * @param measureName The name of the performance measurement. + * @param marker The timestamp of the starting mark. + */ + export function measure(measureName: string, marker: number) { + if (measures) { + measures[measureName] = (getProperty(measures, measureName) || 0) + (Date.now() - marker); + } + } + + /** + * Iterate over each measure, performing some action + * + * @param cb The action to perform for each measure + */ + export function forEachMeasure(cb: (measureName: string, duration: number) => void) { + return forEachKey(measures, key => cb(key, measures[key])); + } + + /** + * Gets the total duration of all measurements with the supplied name. + * + * @param measureName The name of the measure whose durations should be accumulated. + */ + export function getDuration(measureName: string) { + return measures && getProperty(measures, measureName) || 0; + } + + /** Enables (and resets) performance measurements for the compiler. */ + export function enable() { + counters = { }; + measures = { + "I/O Read": 0, + "I/O Write": 0, + "Program": 0, + "Parse": 0, + "Bind": 0, + "Check": 0, + "Emit": 0, + }; + + profilerEvent = typeof onProfilerEvent === "function" && onProfilerEvent.profiler === true + ? onProfilerEvent + : undefined; + markInternal = performance && performance.now ? performance.now : Date.now ? Date.now : () => new Date().getTime(); + } + + /** Disables (and clears) performance measurements for the compiler. */ + export function disable() { + counters = undefined; + measures = undefined; + profilerEvent = undefined; + } + } +} \ No newline at end of file diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 206311e2f18..988714be2ab 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -3,11 +3,6 @@ /// namespace ts { - /* @internal */ export let programTime = 0; - /* @internal */ export let emitTime = 0; - /* @internal */ export let ioReadTime = 0; - /* @internal */ export let ioWriteTime = 0; - /** The version of the TypeScript compiler release */ export const version = "2.1.0"; @@ -865,9 +860,9 @@ namespace ts { function getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile { let text: string; try { - const start = new Date().getTime(); + const start = performance.mark(); text = sys.readFile(fileName, options.charset); - ioReadTime += new Date().getTime() - start; + performance.measure("I/O Read", start); } catch (e) { if (onError) { @@ -934,7 +929,7 @@ namespace ts { function writeFile(fileName: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { try { - const start = new Date().getTime(); + const start = performance.mark(); ensureDirectoriesExist(getDirectoryPath(normalizePath(fileName))); if (isWatchSet(options) && sys.createHash && sys.getModifiedTime) { @@ -944,7 +939,7 @@ namespace ts { sys.writeFile(fileName, data, writeByteOrderMark); } - ioWriteTime += new Date().getTime() - start; + performance.measure("I/O Write", start); } catch (e) { if (onError) { @@ -1121,7 +1116,7 @@ namespace ts { // Track source files that are source files found by searching under node_modules, as these shouldn't be compiled. const sourceFilesFoundSearchingNodeModules: Map = {}; - const start = new Date().getTime(); + const start = performance.mark(); host = host || createCompilerHost(options); @@ -1220,7 +1215,7 @@ namespace ts { verifyCompilerOptions(); - programTime += new Date().getTime() - start; + performance.measure("Program", start); return program; @@ -1463,14 +1458,14 @@ namespace ts { // checked is to not pass the file to getEmitResolver. const emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver((options.outFile || options.out) ? undefined : sourceFile); - const start = new Date().getTime(); + const start = performance.mark(); const emitResult = emitFiles( emitResolver, getEmitHost(writeFileCallback), sourceFile); - emitTime += new Date().getTime() - start; + performance.measure("Emit", start); return emitResult; } diff --git a/src/compiler/sourcemap.ts b/src/compiler/sourcemap.ts index cf7c3d1eaae..2d8c36a3d02 100644 --- a/src/compiler/sourcemap.ts +++ b/src/compiler/sourcemap.ts @@ -240,6 +240,8 @@ namespace ts { return; } + const start = performance.mark(); + const sourceLinePos = getLineAndCharacterOfPosition(currentSourceFile, pos); // Convert the location to be one-based. @@ -279,6 +281,8 @@ namespace ts { } updateLastEncodedAndRecordedSpans(); + + performance.measure("Source Map", start); } function getStartPos(range: TextRange) { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 242d24caf3c..10538d0c009 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -550,12 +550,8 @@ namespace ts { } function compile(fileNames: string[], compilerOptions: CompilerOptions, compilerHost: CompilerHost) { - ioReadTime = 0; - ioWriteTime = 0; - programTime = 0; - bindTime = 0; - checkTime = 0; - emitTime = 0; + const hasDiagnostics = compilerOptions.diagnostics || compilerOptions.extendedDiagnostics; + if (hasDiagnostics) performance.enable(); const program = createProgram(fileNames, compilerOptions, compilerHost); const exitStatus = compileProgram(); @@ -566,7 +562,7 @@ namespace ts { }); } - if (compilerOptions.diagnostics) { + if (hasDiagnostics) { const memoryUsed = sys.getMemoryUsage ? sys.getMemoryUsage() : -1; reportCountStatistic("Files", program.getSourceFiles().length); reportCountStatistic("Lines", countLines(program)); @@ -579,17 +575,28 @@ namespace ts { reportStatisticalValue("Memory used", Math.round(memoryUsed / 1000) + "K"); } - // Individual component times. - // Note: To match the behavior of previous versions of the compiler, the reported parse time includes - // I/O read time and processing time for triple-slash references and module imports, and the reported - // emit time includes I/O write time. We preserve this behavior so we can accurately compare times. - reportTimeStatistic("I/O read", ioReadTime); - reportTimeStatistic("I/O write", ioWriteTime); - reportTimeStatistic("Parse time", programTime); - reportTimeStatistic("Bind time", bindTime); - reportTimeStatistic("Check time", checkTime); - reportTimeStatistic("Emit time", emitTime); + const programTime = performance.getDuration("Program"); + const bindTime = performance.getDuration("Bind"); + const checkTime = performance.getDuration("Check"); + const emitTime = performance.getDuration("Emit"); + if (compilerOptions.extendedDiagnostics) { + performance.forEachMeasure((name, duration) => reportTimeStatistic(`${name} time`, duration)); + } + else { + // Individual component times. + // Note: To match the behavior of previous versions of the compiler, the reported parse time includes + // I/O read time and processing time for triple-slash references and module imports, and the reported + // emit time includes I/O write time. We preserve this behavior so we can accurately compare times. + reportTimeStatistic("I/O read", performance.getDuration("I/O Read")); + reportTimeStatistic("I/O write", performance.getDuration("I/O Write")); + reportTimeStatistic("Parse time", programTime); + reportTimeStatistic("Bind time", bindTime); + reportTimeStatistic("Check time", checkTime); + reportTimeStatistic("Emit time", emitTime); + } reportTimeStatistic("Total time", programTime + bindTime + checkTime + emitTime); + + performance.disable(); } return { program, exitStatus }; diff --git a/src/compiler/tsconfig.json b/src/compiler/tsconfig.json index 827a9b81c4d..cc9bfddcece 100644 --- a/src/compiler/tsconfig.json +++ b/src/compiler/tsconfig.json @@ -12,6 +12,7 @@ }, "files": [ "core.ts", + "performance.ts", "sys.ts", "types.ts", "scanner.ts", diff --git a/src/compiler/types.ts b/src/compiler/types.ts index d0df5e86550..dc332b24567 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2539,6 +2539,7 @@ namespace ts { declaration?: boolean; declarationDir?: string; /* @internal */ diagnostics?: boolean; + /* @internal */ extendedDiagnostics?: boolean; disableSizeLimit?: boolean; emitBOM?: boolean; emitDecoratorMetadata?: boolean; From 80db0f2f166d0a3547319fce789c31604e8fc83b Mon Sep 17 00:00:00 2001 From: Yui Date: Tue, 19 Jul 2016 15:16:27 -0700 Subject: [PATCH 101/109] [Release-2.0] Fix 9782: do not report blocked-scope-used-before-declaration error in ambient context (#9789) (#9830) * Do not report block-scoped-used-before-declaration in ambient context * Add tests and baselines --- src/compiler/checker.ts | 2 +- .../noUsedBeforeDefinedErrorInAmbientContext1.symbols | 9 +++++++++ .../noUsedBeforeDefinedErrorInAmbientContext1.types | 9 +++++++++ .../noUsedBeforeDefinedErrorInAmbientContext1.ts | 4 ++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.symbols create mode 100644 tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.types create mode 100644 tests/cases/compiler/noUsedBeforeDefinedErrorInAmbientContext1.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d769cc4e3fc..1cebd469388 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -974,7 +974,7 @@ namespace ts { Debug.assert(declaration !== undefined, "Block-scoped variable declaration is undefined"); - if (!isBlockScopedNameDeclaredBeforeUse(getAncestor(declaration, SyntaxKind.VariableDeclaration), errorLocation)) { + if (!isInAmbientContext(declaration) && !isBlockScopedNameDeclaredBeforeUse(getAncestor(declaration, SyntaxKind.VariableDeclaration), errorLocation)) { error(errorLocation, Diagnostics.Block_scoped_variable_0_used_before_its_declaration, declarationNameToString(declaration.name)); } } diff --git a/tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.symbols b/tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.symbols new file mode 100644 index 00000000000..690a19ef18f --- /dev/null +++ b/tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.symbols @@ -0,0 +1,9 @@ +=== tests/cases/compiler/test.d.ts === + +declare var S: typeof A; // no error +>S : Symbol(S, Decl(test.d.ts, 1, 11)) +>A : Symbol(A, Decl(test.d.ts, 2, 13)) + +declare const A: number; +>A : Symbol(A, Decl(test.d.ts, 2, 13)) + diff --git a/tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.types b/tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.types new file mode 100644 index 00000000000..dfacda30915 --- /dev/null +++ b/tests/baselines/reference/noUsedBeforeDefinedErrorInAmbientContext1.types @@ -0,0 +1,9 @@ +=== tests/cases/compiler/test.d.ts === + +declare var S: typeof A; // no error +>S : number +>A : number + +declare const A: number; +>A : number + diff --git a/tests/cases/compiler/noUsedBeforeDefinedErrorInAmbientContext1.ts b/tests/cases/compiler/noUsedBeforeDefinedErrorInAmbientContext1.ts new file mode 100644 index 00000000000..834356e88b4 --- /dev/null +++ b/tests/cases/compiler/noUsedBeforeDefinedErrorInAmbientContext1.ts @@ -0,0 +1,4 @@ +// @filename: test.d.ts + +declare var S: typeof A; // no error +declare const A: number; \ No newline at end of file From 729464dc23ba896b4a77ec9b3d8acd1cc1907fc9 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 20 Jul 2016 15:42:29 -0700 Subject: [PATCH 102/109] Integrate feedback from @mihailik to performance framework (#9845) * Integrate feedback from @mihailik * Rons feedback, explicitly include in new tsconfigs --- src/compiler/performance.ts | 202 ++++++++++++++++++------------------ src/harness/tsconfig.json | 1 + src/services/services.ts | 38 +++---- src/services/shims.ts | 6 +- src/services/tsconfig.json | 1 + 5 files changed, 126 insertions(+), 122 deletions(-) diff --git a/src/compiler/performance.ts b/src/compiler/performance.ts index f40b191a1a5..63f929c0a26 100644 --- a/src/compiler/performance.ts +++ b/src/compiler/performance.ts @@ -1,107 +1,109 @@ /*@internal*/ namespace ts { + declare const performance: { now?(): number } | undefined; + /** Gets a timestamp with (at least) ms resolution */ + export const timestamp = typeof performance !== "undefined" && performance.now ? performance.now : Date.now ? Date.now : () => +(new Date()); +} + +/*@internal*/ +namespace ts.performance { /** Performance measurements for the compiler. */ - export namespace performance { - declare const onProfilerEvent: { (markName: string): void; profiler: boolean; }; - declare const performance: { now?(): number } | undefined; - let profilerEvent: (markName: string) => void; - let markInternal: () => number; - let counters: Map; - let measures: Map; + declare const onProfilerEvent: { (markName: string): void; profiler: boolean; }; + let profilerEvent: (markName: string) => void; + let counters: Map; + let measures: Map; - /** - * Emit a performance event if ts-profiler is connected. This is primarily used - * to generate heap snapshots. - * - * @param eventName A name for the event. - */ - export function emit(eventName: string) { - if (profilerEvent) { - profilerEvent(eventName); - } - } - - /** - * Increments a counter with the specified name. - * - * @param counterName The name of the counter. - */ - export function increment(counterName: string) { - if (counters) { - counters[counterName] = (getProperty(counters, counterName) || 0) + 1; - } - } - - /** - * Gets the value of the counter with the specified name. - * - * @param counterName The name of the counter. - */ - export function getCount(counterName: string) { - return counters && getProperty(counters, counterName) || 0; - } - - /** - * Marks the start of a performance measurement. - */ - export function mark() { - return measures ? markInternal() : 0; - } - - /** - * Adds a performance measurement with the specified name. - * - * @param measureName The name of the performance measurement. - * @param marker The timestamp of the starting mark. - */ - export function measure(measureName: string, marker: number) { - if (measures) { - measures[measureName] = (getProperty(measures, measureName) || 0) + (Date.now() - marker); - } - } - - /** - * Iterate over each measure, performing some action - * - * @param cb The action to perform for each measure - */ - export function forEachMeasure(cb: (measureName: string, duration: number) => void) { - return forEachKey(measures, key => cb(key, measures[key])); - } - - /** - * Gets the total duration of all measurements with the supplied name. - * - * @param measureName The name of the measure whose durations should be accumulated. - */ - export function getDuration(measureName: string) { - return measures && getProperty(measures, measureName) || 0; - } - - /** Enables (and resets) performance measurements for the compiler. */ - export function enable() { - counters = { }; - measures = { - "I/O Read": 0, - "I/O Write": 0, - "Program": 0, - "Parse": 0, - "Bind": 0, - "Check": 0, - "Emit": 0, - }; - - profilerEvent = typeof onProfilerEvent === "function" && onProfilerEvent.profiler === true - ? onProfilerEvent - : undefined; - markInternal = performance && performance.now ? performance.now : Date.now ? Date.now : () => new Date().getTime(); - } - - /** Disables (and clears) performance measurements for the compiler. */ - export function disable() { - counters = undefined; - measures = undefined; - profilerEvent = undefined; + /** + * Emit a performance event if ts-profiler is connected. This is primarily used + * to generate heap snapshots. + * + * @param eventName A name for the event. + */ + export function emit(eventName: string) { + if (profilerEvent) { + profilerEvent(eventName); } } + + /** + * Increments a counter with the specified name. + * + * @param counterName The name of the counter. + */ + export function increment(counterName: string) { + if (counters) { + counters[counterName] = (getProperty(counters, counterName) || 0) + 1; + } + } + + /** + * Gets the value of the counter with the specified name. + * + * @param counterName The name of the counter. + */ + export function getCount(counterName: string) { + return counters && getProperty(counters, counterName) || 0; + } + + /** + * Marks the start of a performance measurement. + */ + export function mark() { + return measures ? timestamp() : 0; + } + + /** + * Adds a performance measurement with the specified name. + * + * @param measureName The name of the performance measurement. + * @param marker The timestamp of the starting mark. + */ + export function measure(measureName: string, marker: number) { + if (measures) { + measures[measureName] = (getProperty(measures, measureName) || 0) + (timestamp() - marker); + } + } + + /** + * Iterate over each measure, performing some action + * + * @param cb The action to perform for each measure + */ + export function forEachMeasure(cb: (measureName: string, duration: number) => void) { + return forEachKey(measures, key => cb(key, measures[key])); + } + + /** + * Gets the total duration of all measurements with the supplied name. + * + * @param measureName The name of the measure whose durations should be accumulated. + */ + export function getDuration(measureName: string) { + return measures && getProperty(measures, measureName) || 0; + } + + /** Enables (and resets) performance measurements for the compiler. */ + export function enable() { + counters = { }; + measures = { + "I/O Read": 0, + "I/O Write": 0, + "Program": 0, + "Parse": 0, + "Bind": 0, + "Check": 0, + "Emit": 0, + }; + + profilerEvent = typeof onProfilerEvent === "function" && onProfilerEvent.profiler === true + ? onProfilerEvent + : undefined; + } + + /** Disables (and clears) performance measurements for the compiler. */ + export function disable() { + counters = undefined; + measures = undefined; + profilerEvent = undefined; + } } \ No newline at end of file diff --git a/src/harness/tsconfig.json b/src/harness/tsconfig.json index 5853bee3274..3b9025c27c3 100644 --- a/src/harness/tsconfig.json +++ b/src/harness/tsconfig.json @@ -14,6 +14,7 @@ }, "files": [ "../compiler/core.ts", + "../compiler/performance.ts", "../compiler/sys.ts", "../compiler/types.ts", "../compiler/scanner.ts", diff --git a/src/services/services.ts b/src/services/services.ts index d9e025cf8fd..226d18f77dc 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -434,7 +434,7 @@ namespace ts { } } IdentifierObject.prototype.kind = SyntaxKind.Identifier; - + class SymbolObject implements Symbol { flags: SymbolFlags; name: string; @@ -3349,14 +3349,14 @@ namespace ts { let isJsDocTagName = false; - let start = new Date().getTime(); + let start = timestamp(); const currentToken = getTokenAtPosition(sourceFile, position); - log("getCompletionData: Get current token: " + (new Date().getTime() - start)); + log("getCompletionData: Get current token: " + (timestamp() - start)); - start = new Date().getTime(); + start = timestamp(); // Completion not allowed inside comments, bail out if this is the case const insideComment = isInsideComment(sourceFile, currentToken, position); - log("getCompletionData: Is inside comment: " + (new Date().getTime() - start)); + log("getCompletionData: Is inside comment: " + (timestamp() - start)); if (insideComment) { // The current position is next to the '@' sign, when no tag name being provided yet. @@ -3399,9 +3399,9 @@ namespace ts { } } - start = new Date().getTime(); + start = timestamp(); const previousToken = findPrecedingToken(position, sourceFile); - log("getCompletionData: Get previous token 1: " + (new Date().getTime() - start)); + log("getCompletionData: Get previous token 1: " + (timestamp() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. // Note: 'previousToken' (and thus 'contextToken') can be undefined if we are the beginning of the file @@ -3410,9 +3410,9 @@ namespace ts { // Check if the caret is at the end of an identifier; this is a partial identifier that we want to complete: e.g. a.toS| // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && isWord(contextToken.kind)) { - const start = new Date().getTime(); + const start = timestamp(); contextToken = findPrecedingToken(contextToken.getFullStart(), sourceFile); - log("getCompletionData: Get previous token 2: " + (new Date().getTime() - start)); + log("getCompletionData: Get previous token 2: " + (timestamp() - start)); } // Find the node where completion is requested on. @@ -3459,7 +3459,7 @@ namespace ts { } } - const semanticStart = new Date().getTime(); + const semanticStart = timestamp(); let isMemberCompletion: boolean; let isNewIdentifierLocation: boolean; let symbols: Symbol[] = []; @@ -3497,7 +3497,7 @@ namespace ts { } } - log("getCompletionData: Semantic work: " + (new Date().getTime() - semanticStart)); + log("getCompletionData: Semantic work: " + (timestamp() - semanticStart)); return { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot: (isRightOfDot || isRightOfOpenTag), isJsDocTagName }; @@ -3641,12 +3641,12 @@ namespace ts { } function isCompletionListBlocker(contextToken: Node): boolean { - const start = new Date().getTime(); + const start = timestamp(); const result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || isSolelyIdentifierDefinitionLocation(contextToken) || isDotOfNumericLiteral(contextToken) || isInJsxText(contextToken); - log("getCompletionsAtPosition: isCompletionListBlocker: " + (new Date().getTime() - start)); + log("getCompletionsAtPosition: isCompletionListBlocker: " + (timestamp() - start)); return result; } @@ -4299,7 +4299,7 @@ namespace ts { } function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[], location: Node, performCharacterChecks: boolean): Map { - const start = new Date().getTime(); + const start = timestamp(); const uniqueNames: Map = {}; if (symbols) { for (const symbol of symbols) { @@ -4314,7 +4314,7 @@ namespace ts { } } - log("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (new Date().getTime() - start)); + log("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (timestamp() - start)); return uniqueNames; } @@ -7735,14 +7735,14 @@ namespace ts { } function getIndentationAtPosition(fileName: string, position: number, editorOptions: EditorOptions) { - let start = new Date().getTime(); + let start = timestamp(); const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - log("getIndentationAtPosition: getCurrentSourceFile: " + (new Date().getTime() - start)); + log("getIndentationAtPosition: getCurrentSourceFile: " + (timestamp() - start)); - start = new Date().getTime(); + start = timestamp(); const result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); - log("getIndentationAtPosition: computeIndentation : " + (new Date().getTime() - start)); + log("getIndentationAtPosition: computeIndentation : " + (timestamp() - start)); return result; } diff --git a/src/services/shims.ts b/src/services/shims.ts index e85bf537d30..271d6f2d6e2 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -423,7 +423,7 @@ namespace ts { } public isCancellationRequested(): boolean { - const time = Date.now(); + const time = timestamp(); const duration = Math.abs(time - this.lastCancellationCheckTime); if (duration > 10) { // Check no more than once every 10 ms. @@ -498,13 +498,13 @@ namespace ts { let start: number; if (logPerformance) { logger.log(actionDescription); - start = Date.now(); + start = timestamp(); } const result = action(); if (logPerformance) { - const end = Date.now(); + const end = timestamp(); logger.log(`${actionDescription} completed in ${end - start} msec`); if (typeof result === "string") { let str = result; diff --git a/src/services/tsconfig.json b/src/services/tsconfig.json index 86efd254937..cfeb7c2fcd5 100644 --- a/src/services/tsconfig.json +++ b/src/services/tsconfig.json @@ -13,6 +13,7 @@ }, "files": [ "../compiler/core.ts", + "../compiler/performance.ts", "../compiler/sys.ts", "../compiler/types.ts", "../compiler/scanner.ts", From 1b07fbb2228e00c4dbfb1250333ab5c963707875 Mon Sep 17 00:00:00 2001 From: Herrington Darkholme Date: Thu, 21 Jul 2016 10:01:12 +0800 Subject: [PATCH 103/109] Fix #9843. IScriptSnapshot can return undefined --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index 226d18f77dc..3124c78bd15 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -94,7 +94,7 @@ namespace ts { * change range cannot be determined. However, in that case, incremental parsing will * not happen and the entire document will be re - parsed. */ - getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange; + getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange | undefined; /** Releases all resources held by this script snapshot */ dispose?(): void; From f24341f719866af6b31f96e6eebafba1852ac80a Mon Sep 17 00:00:00 2001 From: Sudheesh Singanamalla Date: Fri, 22 Jul 2016 00:55:21 +0530 Subject: [PATCH 104/109] Remove dependency on tsd, Related to #9658 (#9724) --- Jakefile.js | 9 --------- package.json | 1 - scripts/tsd.json | 12 ------------ 3 files changed, 22 deletions(-) delete mode 100644 scripts/tsd.json diff --git a/Jakefile.js b/Jakefile.js index 1c22305cd86..3ccca833333 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -468,15 +468,6 @@ task("publish-nightly", ["configure-nightly", "LKG", "clean", "setDebugMode", "r exec(cmd); }); -var scriptsTsdJson = path.join(scriptsDirectory, "tsd.json"); -file(scriptsTsdJson); - -task("tsd-scripts", [scriptsTsdJson], function () { - var cmd = "tsd --config " + scriptsTsdJson + " install"; - console.log(cmd); - exec(cmd); -}, { async: true }); - var importDefinitelyTypedTestsDirectory = path.join(scriptsDirectory, "importDefinitelyTypedTests"); var importDefinitelyTypedTestsJs = path.join(importDefinitelyTypedTestsDirectory, "importDefinitelyTypedTests.js"); var importDefinitelyTypedTestsTs = path.join(importDefinitelyTypedTestsDirectory, "importDefinitelyTypedTests.ts"); diff --git a/package.json b/package.json index efe3866b6db..5606a423a0e 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,6 @@ "sorcery": "latest", "through2": "latest", "ts-node": "latest", - "tsd": "latest", "tslint": "next", "typescript": "next" }, diff --git a/scripts/tsd.json b/scripts/tsd.json deleted file mode 100644 index c2fc88a0b0f..00000000000 --- a/scripts/tsd.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "v4", - "repo": "borisyankov/DefinitelyTyped", - "ref": "master", - "path": "typings", - "bundle": "typings/tsd.d.ts", - "installed": { - "node/node.d.ts": { - "commit": "5f480287834a2615274eea31574b713e64decf17" - } - } -} From bd25c130caaa6c607e830f0f29784d1691308d87 Mon Sep 17 00:00:00 2001 From: Yui Date: Fri, 22 Jul 2016 07:15:12 -0700 Subject: [PATCH 105/109] Port PR 9745 to master (#9881) * Add completion for quote property name in object literal expression * Add fourslash tests for completion of quoted property in object literal expression * Handle object-literal expression as an argument Undo wip Undo wip Conflicts: src/services/services.ts * Add tests and baseline for object literal expression for arguments --- src/services/services.ts | 49 ++++++++++++++++--- ...nForQuotedPropertyInPropertyAssignment1.ts | 24 +++++++++ ...nForQuotedPropertyInPropertyAssignment2.ts | 30 ++++++++++++ ...nForQuotedPropertyInPropertyAssignment3.ts | 26 ++++++++++ ...nForQuotedPropertyInPropertyAssignment4.ts | 24 +++++++++ 5 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment1.ts create mode 100644 tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment2.ts create mode 100644 tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment3.ts create mode 100644 tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment4.ts diff --git a/src/services/services.ts b/src/services/services.ts index 3124c78bd15..3b8be487aba 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -4296,6 +4296,7 @@ namespace ts { kindModifiers: getSymbolModifiers(symbol), sortText: "0", }; + } function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[], location: Node, performCharacterChecks: boolean): Map { @@ -4324,22 +4325,58 @@ namespace ts { return undefined; } - const argumentInfo = SignatureHelp.getContainingArgumentInfo(node, position, sourceFile); - if (argumentInfo) { - // Get string literal completions from specialized signatures of the target - return getStringLiteralCompletionEntriesFromCallExpression(argumentInfo); + if (node.parent.kind === SyntaxKind.PropertyAssignment && node.parent.parent.kind === SyntaxKind.ObjectLiteralExpression) { + // Get quoted name of properties of the object literal expression + // i.e. interface ConfigFiles { + // 'jspm:dev': string + // } + // let files: ConfigFiles = { + // '/*completion position*/' + // } + // + // function foo(c: ConfigFiles) {} + // foo({ + // '/*completion position*/' + // }); + return getStringLiteralCompletionEntriesFromPropertyAssignment(node.parent); } else if (isElementAccessExpression(node.parent) && node.parent.argumentExpression === node) { // Get all names of properties on the expression + // i.e. interface A { + // 'prop1': string + // } + // let a: A; + // a['/*completion position*/'] return getStringLiteralCompletionEntriesFromElementAccess(node.parent); } else { - // Otherwise, get the completions from the contextual type if one exists + const argumentInfo = SignatureHelp.getContainingArgumentInfo(node, position, sourceFile); + if (argumentInfo) { + // Get string literal completions from specialized signatures of the target + // i.e. declare function f(a: 'A'); + // f("/*completion position*/") + return getStringLiteralCompletionEntriesFromCallExpression(argumentInfo, node); + } + + // Get completion for string literal from string literal type + // i.e. var x: "hi" | "hello" = "/*completion position*/" return getStringLiteralCompletionEntriesFromContextualType(node); } } - function getStringLiteralCompletionEntriesFromCallExpression(argumentInfo: SignatureHelp.ArgumentListInfo) { + function getStringLiteralCompletionEntriesFromPropertyAssignment(element: ObjectLiteralElement) { + const typeChecker = program.getTypeChecker(); + const type = typeChecker.getContextualType((element.parent)); + const entries: CompletionEntry[] = []; + if (type) { + getCompletionEntriesFromSymbols(type.getApparentProperties(), entries, element, /*performCharacterChecks*/false); + if (entries.length) { + return { isMemberCompletion: true, isNewIdentifierLocation: true, entries }; + } + } + } + + function getStringLiteralCompletionEntriesFromCallExpression(argumentInfo: SignatureHelp.ArgumentListInfo, location: Node) { const typeChecker = program.getTypeChecker(); const candidates: Signature[] = []; const entries: CompletionEntry[] = []; diff --git a/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment1.ts b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment1.ts new file mode 100644 index 00000000000..7faebc1474b --- /dev/null +++ b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment1.ts @@ -0,0 +1,24 @@ +/// + +//// export interface Configfiles { +//// jspm: string; +//// 'jspm:browser': string; +//// 'jspm:dev': string; +//// 'jspm:node': string; +//// } + +//// let files: Configfiles; +//// files = { +//// /*0*/: '', +//// '/*1*/': '' +//// } + +goTo.marker('0'); +verify.completionListContains("jspm"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(1); + +goTo.marker('1'); +verify.completionListContains("jspm:dev"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(4); diff --git a/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment2.ts b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment2.ts new file mode 100644 index 00000000000..4ba88e7dd2a --- /dev/null +++ b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment2.ts @@ -0,0 +1,30 @@ +/// + +//// export interface Config { +//// files: ConfigFiles +//// } + +//// export interface ConfigFiles { +//// jspm: string; +//// 'jspm:browser': string; +//// 'jspm:dev': string; +//// 'jspm:node': string; +//// } + +//// let config: Config; +//// config = { +//// files: { +//// /*0*/: '', +//// '/*1*/': '' +//// } +//// } + +goTo.marker('0'); +verify.completionListContains("jspm"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(1); + +goTo.marker('1'); +verify.completionListContains("jspm:dev"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(4); diff --git a/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment3.ts b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment3.ts new file mode 100644 index 00000000000..238606520e3 --- /dev/null +++ b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment3.ts @@ -0,0 +1,26 @@ +/// + +//// let configFiles1: { +//// jspm: string; +//// 'jspm:browser': string; +//// } = { +//// /*0*/: "", +//// } + +//// let configFiles2: { +//// jspm: string; +//// 'jspm:browser': string; +//// } = { +//// jspm: "", +//// '/*1*/': "" +//// } + +goTo.marker('0'); +verify.completionListContains("jspm"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(1); + +goTo.marker('1'); +verify.completionListContains("jspm:browser"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(2); diff --git a/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment4.ts b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment4.ts new file mode 100644 index 00000000000..9855bb8c502 --- /dev/null +++ b/tests/cases/fourslash/completionForQuotedPropertyInPropertyAssignment4.ts @@ -0,0 +1,24 @@ +/// + +//// export interface ConfigFiles { +//// jspm: string; +//// 'jspm:browser': string; +//// 'jspm:dev': string; +//// 'jspm:node': string; +//// } + +//// function foo(c: ConfigFiles) {} +//// foo({ +//// j/*0*/: "", +//// "/*1*/": "", +//// }) + +goTo.marker('0'); +verify.completionListContains("jspm"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(1); + +goTo.marker('1'); +verify.completionListContains("jspm:dev"); +verify.completionListAllowsNewIdentifier(); +verify.memberListCount(4); From f94025d855581f4fc94d7ca895fc2c227614205a Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 1 Jul 2016 13:34:15 -0700 Subject: [PATCH 106/109] Improve web tests * Provide a favicon so chrome doesn't block waiting for one * Provide accurate content type so chrome doesn't warn --- tests/webTestResults.html | 13 +++++++------ tests/webTestServer.ts | 26 +++++++++++++++++--------- tests/webhost/favicon-32x32.png | Bin 0 -> 800 bytes 3 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 tests/webhost/favicon-32x32.png diff --git a/tests/webTestResults.html b/tests/webTestResults.html index 2993681934e..9c403248f94 100644 --- a/tests/webTestResults.html +++ b/tests/webTestResults.html @@ -3,22 +3,23 @@ Mocha Tests + -
+
- - + +
- +
- +
- +