From 1855a0758056082176fb36d5be5fa490df8835f4 Mon Sep 17 00:00:00 2001 From: "shyyko.serhiy@gmail.com" Date: Wed, 8 Jul 2015 13:26:44 +0300 Subject: [PATCH 01/15] Fix issue https://github.com/Microsoft/TypeScript/issues/3277 --- src/compiler/sys.ts | 11 ++++++++--- src/compiler/tsc.ts | 16 +++++++++++----- src/server/server.ts | 20 ++++++++++---------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index a47d6959ba..d561916364 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -8,7 +8,7 @@ namespace ts { write(s: string): void; readFile(path: string, encoding?: string): string; writeFile(path: string, data: string, writeByteOrderMark?: boolean): void; - watchFile?(path: string, callback: (path: string) => void): FileWatcher; + watchFile?(path: string, callback: (path: string, removed: boolean) => void): FileWatcher; resolvePath(path: string): string; fileExists(path: string): boolean; directoryExists(path: string): boolean; @@ -282,11 +282,16 @@ namespace ts { }; function fileChanged(curr: any, prev: any) { + // mtime.getTime() equals 0 if file was removed + if (curr.mtime.getTime() === 0) { + callback(fileName, true); + return; + } if (+curr.mtime <= +prev.mtime) { return; } - callback(fileName); + callback(fileName, false); }; }, resolvePath: function (path: string): string { @@ -331,4 +336,4 @@ namespace ts { return undefined; // Unsupported host } })(); -} \ No newline at end of file +} diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 2a01774fbc..d0ad9c0c43 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -82,7 +82,7 @@ namespace ts { function reportDiagnostic(diagnostic: Diagnostic) { var output = ""; - + if (diagnostic.file) { var loc = getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); @@ -257,7 +257,7 @@ namespace ts { var sourceFile = hostGetSourceFile(fileName, languageVersion, onError); if (sourceFile && compilerOptions.watch) { // Attach a file watcher - sourceFile.fileWatcher = sys.watchFile(sourceFile.fileName, () => sourceFileChanged(sourceFile)); + sourceFile.fileWatcher = sys.watchFile(sourceFile.fileName, (fileName, removed) => sourceFileChanged(sourceFile, removed)); } return sourceFile; } @@ -279,9 +279,15 @@ namespace ts { } // If a source file changes, mark it as unwatched and start the recompilation timer - function sourceFileChanged(sourceFile: SourceFile) { + function sourceFileChanged(sourceFile: SourceFile, removed: boolean) { sourceFile.fileWatcher.close(); sourceFile.fileWatcher = undefined; + if (removed){ + var index = rootFileNames.indexOf(sourceFile.fileName); + if (index !== -1){ + rootFileNames.splice(index, 1); + } + } startTimer(); } @@ -354,11 +360,11 @@ namespace ts { return { program, exitStatus }; function compileProgram(): ExitStatus { - // First get any syntactic errors. + // First get any syntactic errors. var diagnostics = program.getSyntacticDiagnostics(); reportDiagnostics(diagnostics); - // If we didn't have any syntactic errors, then also try getting the global and + // If we didn't have any syntactic errors, then also try getting the global and // semantic errors. if (diagnostics.length === 0) { var diagnostics = program.getGlobalDiagnostics(); diff --git a/src/server/server.ts b/src/server/server.ts index 843197b918..842995cbad 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -11,7 +11,7 @@ namespace ts.server { input: process.stdin, output: process.stdout, terminal: false, - }); + }); class Logger implements ts.server.Logger { fd = -1; @@ -58,7 +58,7 @@ namespace ts.server { isVerbose() { return this.loggingEnabled() && (this.level == "verbose"); } - + msg(s: string, type = "Err") { if (this.fd < 0) { @@ -85,7 +85,7 @@ namespace ts.server { interface WatchedFile { fileName: string; - callback: (fileName: string) => void; + callback: (fileName: string, removed: boolean) => void; mtime: Date; } @@ -121,11 +121,11 @@ namespace ts.server { fs.stat(watchedFile.fileName,(err, stats) => { if (err) { - watchedFile.callback(watchedFile.fileName); + watchedFile.callback(watchedFile.fileName, false); } else if (watchedFile.mtime.getTime() !== stats.mtime.getTime()) { watchedFile.mtime = WatchedFileSet.getModifiedTime(watchedFile.fileName); - watchedFile.callback(watchedFile.fileName); + watchedFile.callback(watchedFile.fileName, watchedFile.mtime.getTime() === 0); } }); } @@ -153,7 +153,7 @@ namespace ts.server { }, this.interval); } - addFile(fileName: string, callback: (fileName: string) => void ): WatchedFile { + addFile(fileName: string, callback: (fileName: string, removed: boolean) => void ): WatchedFile { var file: WatchedFile = { fileName, callback, @@ -170,7 +170,7 @@ namespace ts.server { removeFile(file: WatchedFile) { this.watchedFiles = WatchedFileSet.copyListRemovingItem(file, this.watchedFiles); } - } + } class IOSession extends Session { constructor(host: ServerHost, logger: ts.server.Logger) { @@ -243,11 +243,11 @@ namespace ts.server { // TODO: check that this location is writable var logger = createLoggerFromEnv(); - + // REVIEW: for now this implementation uses polling. // The advantage of polling is that it works reliably // on all os and with network mounted files. - // For 90 referenced files, the average time to detect + // For 90 referenced files, the average time to detect // changes is 2*msInterval (by default 5 seconds). // The overhead of this is .04 percent (1/2500) with // average pause of < 1 millisecond (and max @@ -271,4 +271,4 @@ namespace ts.server { }); // Start listening ioSession.listen(); -} \ No newline at end of file +} From 30888da8fa212ecc59d01fd9999e2edce57917cc Mon Sep 17 00:00:00 2001 From: "shyyko.serhiy@gmail.com" Date: Thu, 9 Jul 2015 13:12:50 +0300 Subject: [PATCH 02/15] fixed indent issues --- src/compiler/sys.ts | 4 ++-- src/compiler/tsc.ts | 4 ++-- src/server/server.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index d561916364..10586d0d9b 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -284,14 +284,14 @@ namespace ts { function fileChanged(curr: any, prev: any) { // mtime.getTime() equals 0 if file was removed if (curr.mtime.getTime() === 0) { - callback(fileName, true); + callback(fileName, /* removed */ true); return; } if (+curr.mtime <= +prev.mtime) { return; } - callback(fileName, false); + callback(fileName, /* removed */ false); }; }, resolvePath: function (path: string): string { diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index d0ad9c0c43..5f008eda2c 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -282,9 +282,9 @@ namespace ts { function sourceFileChanged(sourceFile: SourceFile, removed: boolean) { sourceFile.fileWatcher.close(); sourceFile.fileWatcher = undefined; - if (removed){ + if (removed) { var index = rootFileNames.indexOf(sourceFile.fileName); - if (index !== -1){ + if (index >= 0) { rootFileNames.splice(index, 1); } } diff --git a/src/server/server.ts b/src/server/server.ts index 842995cbad..c3942b01a3 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -121,7 +121,7 @@ namespace ts.server { fs.stat(watchedFile.fileName,(err, stats) => { if (err) { - watchedFile.callback(watchedFile.fileName, false); + watchedFile.callback(watchedFile.fileName, /* removed */ false); } else if (watchedFile.mtime.getTime() !== stats.mtime.getTime()) { watchedFile.mtime = WatchedFileSet.getModifiedTime(watchedFile.fileName); From 3bb66a130f75e786238e861c2a69546a2e1f4965 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 30 Sep 2015 13:39:40 -0700 Subject: [PATCH 03/15] JSX Spread Attributes are expression parents Fixes #4688 --- src/compiler/utilities.ts | 1 + tests/cases/fourslash/jsxSpreadReference.ts | 26 +++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 tests/cases/fourslash/jsxSpreadReference.ts diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 0d687d599a..8e86ef2ca2 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -981,6 +981,7 @@ namespace ts { return node === (parent).expression; case SyntaxKind.Decorator: case SyntaxKind.JsxExpression: + case SyntaxKind.JsxSpreadAttribute: return true; case SyntaxKind.ExpressionWithTypeArguments: return (parent).expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent); diff --git a/tests/cases/fourslash/jsxSpreadReference.ts b/tests/cases/fourslash/jsxSpreadReference.ts new file mode 100644 index 0000000000..1b57e880cc --- /dev/null +++ b/tests/cases/fourslash/jsxSpreadReference.ts @@ -0,0 +1,26 @@ +/// + +//@Filename: file.tsx +//// declare module JSX { +//// interface Element { } +//// interface IntrinsicElements { +//// } +//// interface ElementAttributesProperty { props } +//// } +//// class MyClass { +//// props: { +//// name?: string; +//// size?: number; +//// } +//// } +//// +//// var [|/*dst*/nn|]: {name?: string; size?: number}; +//// var x = ; + +goTo.marker('src'); +debugger; +goTo.definition(); +verify.caretAtMarker('dst'); + +goTo.marker('src'); +verify.renameLocations(false, false); From 77c0c12fcef3fc972fa3d7fa362687cf7a5522e6 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 30 Sep 2015 13:39:49 -0700 Subject: [PATCH 04/15] Accept symbol baselines --- tests/baselines/reference/jsxReactTestSuite.symbols | 7 +++++++ tests/baselines/reference/tsxAttributeResolution8.symbols | 1 + tests/baselines/reference/tsxEmit2.symbols | 5 +++++ tests/baselines/reference/tsxExternalModuleEmit2.symbols | 1 + tests/baselines/reference/tsxReactEmit2.symbols | 5 +++++ tests/baselines/reference/tsxReactEmit5.symbols | 1 + tests/baselines/reference/tsxReactEmit6.symbols | 1 + 7 files changed, 21 insertions(+) diff --git a/tests/baselines/reference/jsxReactTestSuite.symbols b/tests/baselines/reference/jsxReactTestSuite.symbols index 1fe64cbfdd..b86054ac56 100644 --- a/tests/baselines/reference/jsxReactTestSuite.symbols +++ b/tests/baselines/reference/jsxReactTestSuite.symbols @@ -145,6 +145,7 @@ var x = Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) +>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3)) >y : Symbol(unknown) ={2 } z />; @@ -167,25 +168,31 @@ var x = ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) +>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3)) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) +>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3)) >y : Symbol(unknown) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) +>x : Symbol(x, Decl(jsxReactTestSuite.tsx, 10, 11), Decl(jsxReactTestSuite.tsx, 35, 3)) >y : Symbol(unknown) >z : Symbol(unknown) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) >x : Symbol(unknown) +>y : Symbol(y, Decl(jsxReactTestSuite.tsx, 9, 11)) ; >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) >x : Symbol(unknown) >y : Symbol(unknown) +>z : Symbol(z, Decl(jsxReactTestSuite.tsx, 11, 11)) +>z : Symbol(z, Decl(jsxReactTestSuite.tsx, 11, 11)) >Child : Symbol(Child, Decl(jsxReactTestSuite.tsx, 5, 11)) >Component : Symbol(Component, Decl(jsxReactTestSuite.tsx, 2, 11)) diff --git a/tests/baselines/reference/tsxAttributeResolution8.symbols b/tests/baselines/reference/tsxAttributeResolution8.symbols index 9bb09c6cd8..85db1985cc 100644 --- a/tests/baselines/reference/tsxAttributeResolution8.symbols +++ b/tests/baselines/reference/tsxAttributeResolution8.symbols @@ -20,4 +20,5 @@ var x: any; // Should be OK >test1 : Symbol(JSX.IntrinsicElements.test1, Decl(tsxAttributeResolution8.tsx, 2, 30)) +>x : Symbol(x, Decl(tsxAttributeResolution8.tsx, 7, 3)) diff --git a/tests/baselines/reference/tsxEmit2.symbols b/tests/baselines/reference/tsxEmit2.symbols index 5eefc31710..5da1b16ae4 100644 --- a/tests/baselines/reference/tsxEmit2.symbols +++ b/tests/baselines/reference/tsxEmit2.symbols @@ -21,12 +21,14 @@ var p1, p2, p3; var spreads1 =
{p2}
; >spreads1 : Symbol(spreads1, Decl(tsxEmit2.tsx, 8, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) +>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3)) >p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) var spreads2 =
{p2}
; >spreads2 : Symbol(spreads2, Decl(tsxEmit2.tsx, 9, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) +>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3)) >p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) @@ -35,12 +37,14 @@ var spreads3 =
{p2}
; >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) >x : Symbol(unknown) >p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11)) +>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3)) >p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) var spreads4 =
{p2}
; >spreads4 : Symbol(spreads4, Decl(tsxEmit2.tsx, 11, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) +>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3)) >x : Symbol(unknown) >p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11)) >p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7)) @@ -51,6 +55,7 @@ var spreads5 =
{p2}
; >div : Symbol(JSX.IntrinsicElements, Decl(tsxEmit2.tsx, 1, 22)) >x : Symbol(unknown) >p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7)) +>p1 : Symbol(p1, Decl(tsxEmit2.tsx, 7, 3)) >y : Symbol(unknown) >p3 : Symbol(p3, Decl(tsxEmit2.tsx, 7, 11)) >p2 : Symbol(p2, Decl(tsxEmit2.tsx, 7, 7)) diff --git a/tests/baselines/reference/tsxExternalModuleEmit2.symbols b/tests/baselines/reference/tsxExternalModuleEmit2.symbols index 6f8d3d76cd..ff5fdc4917 100644 --- a/tests/baselines/reference/tsxExternalModuleEmit2.symbols +++ b/tests/baselines/reference/tsxExternalModuleEmit2.symbols @@ -26,6 +26,7 @@ declare var Foo, React; // Should see mod_1['default'] in emit here ; >Foo : Symbol(Foo, Decl(app.tsx, 1, 11)) +>Main : Symbol(Main, Decl(app.tsx, 0, 6)) >Foo : Symbol(Foo, Decl(app.tsx, 1, 11)) diff --git a/tests/baselines/reference/tsxReactEmit2.symbols b/tests/baselines/reference/tsxReactEmit2.symbols index 049fdb1819..051f7588f2 100644 --- a/tests/baselines/reference/tsxReactEmit2.symbols +++ b/tests/baselines/reference/tsxReactEmit2.symbols @@ -23,12 +23,14 @@ var p1, p2, p3; var spreads1 =
{p2}
; >spreads1 : Symbol(spreads1, Decl(tsxReactEmit2.tsx, 9, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) +>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3)) >p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) var spreads2 =
{p2}
; >spreads2 : Symbol(spreads2, Decl(tsxReactEmit2.tsx, 10, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) +>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3)) >p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) @@ -37,12 +39,14 @@ var spreads3 =
{p2}
; >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) >x : Symbol(unknown) >p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11)) +>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3)) >p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) var spreads4 =
{p2}
; >spreads4 : Symbol(spreads4, Decl(tsxReactEmit2.tsx, 12, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) +>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3)) >x : Symbol(unknown) >p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11)) >p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7)) @@ -53,6 +57,7 @@ var spreads5 =
{p2}
; >div : Symbol(JSX.IntrinsicElements, Decl(tsxReactEmit2.tsx, 1, 22)) >x : Symbol(unknown) >p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7)) +>p1 : Symbol(p1, Decl(tsxReactEmit2.tsx, 8, 3)) >y : Symbol(unknown) >p3 : Symbol(p3, Decl(tsxReactEmit2.tsx, 8, 11)) >p2 : Symbol(p2, Decl(tsxReactEmit2.tsx, 8, 7)) diff --git a/tests/baselines/reference/tsxReactEmit5.symbols b/tests/baselines/reference/tsxReactEmit5.symbols index 388e717957..3e0e179067 100644 --- a/tests/baselines/reference/tsxReactEmit5.symbols +++ b/tests/baselines/reference/tsxReactEmit5.symbols @@ -31,5 +31,6 @@ var spread1 =
; >spread1 : Symbol(spread1, Decl(react-consumer.tsx, 4, 3)) >div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 2, 22)) >x : Symbol(unknown) +>foo : Symbol(foo, Decl(react-consumer.tsx, 3, 3)) >y : Symbol(unknown) diff --git a/tests/baselines/reference/tsxReactEmit6.symbols b/tests/baselines/reference/tsxReactEmit6.symbols index 0302cef3e8..fd717ee4a5 100644 --- a/tests/baselines/reference/tsxReactEmit6.symbols +++ b/tests/baselines/reference/tsxReactEmit6.symbols @@ -34,6 +34,7 @@ namespace M { >spread1 : Symbol(spread1, Decl(react-consumer.tsx, 8, 4)) >div : Symbol(JSX.IntrinsicElements, Decl(file.tsx, 2, 22)) >x : Symbol(unknown) +>foo : Symbol(foo, Decl(react-consumer.tsx, 7, 4)) >y : Symbol(unknown) } From 3f9f6879484b9c4fc4d38d4efb1233067d826a4f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 13:49:21 -0700 Subject: [PATCH 05/15] Added failing test. --- .../findAllRefsForVariableInExtendsClause01.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/cases/fourslash/findAllRefsForVariableInExtendsClause01.ts diff --git a/tests/cases/fourslash/findAllRefsForVariableInExtendsClause01.ts b/tests/cases/fourslash/findAllRefsForVariableInExtendsClause01.ts new file mode 100644 index 0000000000..1ec144d7e8 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsForVariableInExtendsClause01.ts @@ -0,0 +1,15 @@ +/// + + +////var [|Base|] = class { }; +////class C extends [|Base|] { } + +let ranges = test.ranges(); +for (let range of ranges) { + goTo.position(range.start); + + verify.referencesCountIs(ranges.length); + for (let expectedReference of ranges) { + verify.referencesAtPositionContains(expectedReference); + } +} \ No newline at end of file From f80fa8ea82cbd4333e3dcddcae0e58e7d2db756f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 13:50:29 -0700 Subject: [PATCH 06/15] Use appropriate resolution meaning. --- src/compiler/checker.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d57f9eaed1..df4f99fbb3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14054,7 +14054,10 @@ namespace ts { } if (isHeritageClauseElementIdentifier(entityName)) { - let meaning = entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments ? SymbolFlags.Type : SymbolFlags.Namespace; + let meaning = entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments ? + (SymbolFlags.Value | SymbolFlags.Type) : + SymbolFlags.Namespace; + meaning |= SymbolFlags.Alias; return resolveEntityName(entityName, meaning); } From a29f01413de647b0671adbf1834551225963535e Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 13:51:12 -0700 Subject: [PATCH 07/15] Accepted baselines. --- .../baselines/reference/extendClassExpressionFromModule.symbols | 1 + tests/baselines/reference/extendNonClassSymbol1.symbols | 1 + tests/baselines/reference/reboundBaseClassSymbol.symbols | 2 +- tests/baselines/reference/reboundBaseClassSymbol.types | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/extendClassExpressionFromModule.symbols b/tests/baselines/reference/extendClassExpressionFromModule.symbols index c131ea8fa2..78d483b5d7 100644 --- a/tests/baselines/reference/extendClassExpressionFromModule.symbols +++ b/tests/baselines/reference/extendClassExpressionFromModule.symbols @@ -8,6 +8,7 @@ var x = foo1; class y extends x {} >y : Symbol(y, Decl(foo2.ts, 1, 13)) +>x : Symbol(x, Decl(foo2.ts, 1, 3)) === tests/cases/conformance/classes/classExpressions/foo1.ts === class x{} diff --git a/tests/baselines/reference/extendNonClassSymbol1.symbols b/tests/baselines/reference/extendNonClassSymbol1.symbols index 02291ebb18..7c03ef3a97 100644 --- a/tests/baselines/reference/extendNonClassSymbol1.symbols +++ b/tests/baselines/reference/extendNonClassSymbol1.symbols @@ -9,4 +9,5 @@ var x = A; class C extends x { } // error, could not find symbol xs >C : Symbol(C, Decl(extendNonClassSymbol1.ts, 1, 10)) +>x : Symbol(x, Decl(extendNonClassSymbol1.ts, 1, 3)) diff --git a/tests/baselines/reference/reboundBaseClassSymbol.symbols b/tests/baselines/reference/reboundBaseClassSymbol.symbols index 788d7d95c9..2396e7b7b8 100644 --- a/tests/baselines/reference/reboundBaseClassSymbol.symbols +++ b/tests/baselines/reference/reboundBaseClassSymbol.symbols @@ -11,6 +11,6 @@ module Foo { interface B extends A { b: string; } >B : Symbol(B, Decl(reboundBaseClassSymbol.ts, 2, 14)) ->A : Symbol(A, Decl(reboundBaseClassSymbol.ts, 0, 0)) +>A : Symbol(A, Decl(reboundBaseClassSymbol.ts, 2, 7)) >b : Symbol(b, Decl(reboundBaseClassSymbol.ts, 3, 27)) } diff --git a/tests/baselines/reference/reboundBaseClassSymbol.types b/tests/baselines/reference/reboundBaseClassSymbol.types index 9c62d838f4..e2ae18400c 100644 --- a/tests/baselines/reference/reboundBaseClassSymbol.types +++ b/tests/baselines/reference/reboundBaseClassSymbol.types @@ -12,6 +12,6 @@ module Foo { interface B extends A { b: string; } >B : B ->A : A +>A : any >b : string } From e9dc1fbdfabbf5ee9bdaa0729650d48bc0904e17 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 13:55:37 -0700 Subject: [PATCH 08/15] Added one more test. --- .../findAllRefsForVariableInImplementsClause01.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/cases/fourslash/findAllRefsForVariableInImplementsClause01.ts diff --git a/tests/cases/fourslash/findAllRefsForVariableInImplementsClause01.ts b/tests/cases/fourslash/findAllRefsForVariableInImplementsClause01.ts new file mode 100644 index 0000000000..93f8cec810 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsForVariableInImplementsClause01.ts @@ -0,0 +1,10 @@ +/// + + +////var Base = class { }; +////class C extends Base implements [|Base|] { } + +let ranges = test.ranges(); +for (let range of ranges) { + verify.referencesCountIs(0); +} \ No newline at end of file From 81821ac36df1ec5d155bd6330b215eef7c379da3 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 30 Sep 2015 14:25:52 -0700 Subject: [PATCH 09/15] Remove debugger statement --- tests/cases/fourslash/jsxSpreadReference.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/cases/fourslash/jsxSpreadReference.ts b/tests/cases/fourslash/jsxSpreadReference.ts index 1b57e880cc..f9cf3d5b9e 100644 --- a/tests/cases/fourslash/jsxSpreadReference.ts +++ b/tests/cases/fourslash/jsxSpreadReference.ts @@ -18,7 +18,6 @@ //// var x = ; goTo.marker('src'); -debugger; goTo.definition(); verify.caretAtMarker('dst'); From c78149215b57c65ab1493cdd2e079d9d0b8d67c1 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 30 Sep 2015 14:26:56 -0700 Subject: [PATCH 10/15] Add comments to bool params --- tests/cases/fourslash/jsxSpreadReference.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cases/fourslash/jsxSpreadReference.ts b/tests/cases/fourslash/jsxSpreadReference.ts index f9cf3d5b9e..64ab03e6ab 100644 --- a/tests/cases/fourslash/jsxSpreadReference.ts +++ b/tests/cases/fourslash/jsxSpreadReference.ts @@ -22,4 +22,4 @@ goTo.definition(); verify.caretAtMarker('dst'); goTo.marker('src'); -verify.renameLocations(false, false); +verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); From 091e2344a377f3a433cc14ac178a4b129ed18d31 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 14:29:15 -0700 Subject: [PATCH 11/15] Added failing test. --- .../findAllRefsForVariableInExtendsClause02.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/cases/fourslash/findAllRefsForVariableInExtendsClause02.ts diff --git a/tests/cases/fourslash/findAllRefsForVariableInExtendsClause02.ts b/tests/cases/fourslash/findAllRefsForVariableInExtendsClause02.ts new file mode 100644 index 0000000000..0f06a3c420 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsForVariableInExtendsClause02.ts @@ -0,0 +1,17 @@ +/// + +////interface [|Base|] { } +////namespace n { +//// var Base = class { }; +//// interface I extends [|Base|] { } +////} + +let ranges = test.ranges(); +for (let range of ranges) { + goTo.position(range.start); + + verify.referencesCountIs(ranges.length); + for (let expectedReference of ranges) { + verify.referencesAtPositionContains(expectedReference); + } +} \ No newline at end of file From 48de0b6ff6b2ec8c0d6e00339d9e254c023add40 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 14:30:54 -0700 Subject: [PATCH 12/15] Account for interface extends clauses. --- src/compiler/checker.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index df4f99fbb3..18942e8ce5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14054,9 +14054,20 @@ namespace ts { } if (isHeritageClauseElementIdentifier(entityName)) { - let meaning = entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments ? - (SymbolFlags.Value | SymbolFlags.Type) : - SymbolFlags.Namespace; + let meaning = SymbolFlags.None; + + // In an interface or class, we're definitely interested in a type. + if (entityName.parent.kind === SyntaxKind.ExpressionWithTypeArguments) { + meaning = SymbolFlags.Type; + + // In a class 'extends' clause we are also looking for a value. + if (isExpressionWithTypeArgumentsInClassExtendsClause(entityName.parent)) { + meaning |= SymbolFlags.Value; + } + } + else { + meaning = SymbolFlags.Namespace; + } meaning |= SymbolFlags.Alias; return resolveEntityName(entityName, meaning); From cbca15435f71082a91b17c68d33938d32e019286 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 30 Sep 2015 14:32:11 -0700 Subject: [PATCH 13/15] Accepted baselines. --- tests/baselines/reference/reboundBaseClassSymbol.symbols | 2 +- tests/baselines/reference/reboundBaseClassSymbol.types | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/reboundBaseClassSymbol.symbols b/tests/baselines/reference/reboundBaseClassSymbol.symbols index 2396e7b7b8..788d7d95c9 100644 --- a/tests/baselines/reference/reboundBaseClassSymbol.symbols +++ b/tests/baselines/reference/reboundBaseClassSymbol.symbols @@ -11,6 +11,6 @@ module Foo { interface B extends A { b: string; } >B : Symbol(B, Decl(reboundBaseClassSymbol.ts, 2, 14)) ->A : Symbol(A, Decl(reboundBaseClassSymbol.ts, 2, 7)) +>A : Symbol(A, Decl(reboundBaseClassSymbol.ts, 0, 0)) >b : Symbol(b, Decl(reboundBaseClassSymbol.ts, 3, 27)) } diff --git a/tests/baselines/reference/reboundBaseClassSymbol.types b/tests/baselines/reference/reboundBaseClassSymbol.types index e2ae18400c..9c62d838f4 100644 --- a/tests/baselines/reference/reboundBaseClassSymbol.types +++ b/tests/baselines/reference/reboundBaseClassSymbol.types @@ -12,6 +12,6 @@ module Foo { interface B extends A { b: string; } >B : B ->A : any +>A : A >b : string } From cc95dcac1bec89ece5986b8a5c1e8e19bb160db2 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 1 Oct 2015 18:33:52 -0700 Subject: [PATCH 14/15] Fix lint error that was commited This is what happens when your merge PRs by hand and forget to run the linter. You break everyone's PRs. --- 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 d0f888cfa0..7b74024aec 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -301,7 +301,7 @@ namespace ts { sourceFile.fileWatcher.close(); sourceFile.fileWatcher = undefined; if (removed) { - var index = rootFileNames.indexOf(sourceFile.fileName); + let index = rootFileNames.indexOf(sourceFile.fileName); if (index >= 0) { rootFileNames.splice(index, 1); } From e16a14b5b3b5f771b10db23d36c9031d38f3119b Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Fri, 2 Oct 2015 15:15:39 -0700 Subject: [PATCH 15/15] tslint had a new release and added this rule, theirs was a little stricter --- Jakefile.js | 1 - scripts/tslint/noInferrableTypesRule.ts | 49 ------------------------- src/harness/fourslash.ts | 4 +- 3 files changed, 2 insertions(+), 52 deletions(-) delete mode 100644 scripts/tslint/noInferrableTypesRule.ts diff --git a/Jakefile.js b/Jakefile.js index 943f2eff5e..e99043d3f5 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -813,7 +813,6 @@ task("update-sublime", ["local", serverFile], function() { var tslintRuleDir = "scripts/tslint"; var tslintRules = ([ "nextLineRule", - "noInferrableTypesRule", "noNullRule", "booleanTriviaRule" ]); diff --git a/scripts/tslint/noInferrableTypesRule.ts b/scripts/tslint/noInferrableTypesRule.ts deleted file mode 100644 index cbc0162260..0000000000 --- a/scripts/tslint/noInferrableTypesRule.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// -/// - - -export class Rule extends Lint.Rules.AbstractRule { - public static FAILURE_STRING_FACTORY = (type: string) => `LHS type (${type}) inferred by RHS expression, remove type annotation`; - - public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { - return this.applyWithWalker(new InferrableTypeWalker(sourceFile, this.getOptions())); - } -} - -class InferrableTypeWalker extends Lint.RuleWalker { - visitVariableStatement(node: ts.VariableStatement) { - node.declarationList.declarations.forEach(e => { - if ((!!e.type) && (!!e.initializer)) { - let failure: string; - switch (e.type.kind) { - case ts.SyntaxKind.BooleanKeyword: - if (e.initializer.kind === ts.SyntaxKind.TrueKeyword || e.initializer.kind === ts.SyntaxKind.FalseKeyword) { - failure = 'boolean'; - } - break; - case ts.SyntaxKind.NumberKeyword: - if (e.initializer.kind === ts.SyntaxKind.NumericLiteral) { - failure = 'number'; - } - break; - case ts.SyntaxKind.StringKeyword: - switch (e.initializer.kind) { - case ts.SyntaxKind.StringLiteral: - case ts.SyntaxKind.NoSubstitutionTemplateLiteral: - case ts.SyntaxKind.TemplateExpression: - failure = 'string'; - break; - default: - break; - } - break; - } - if (failure) { - this.addFailure(this.createFailure(e.type.getStart(), e.type.getWidth(), Rule.FAILURE_STRING_FACTORY(failure))); - } - } - }); - - super.visitVariableStatement(node); - } -} diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 3042f0c464..a846077a85 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -157,7 +157,7 @@ namespace FourSlash { return true; } - public setCancelled(numberOfCalls: number = 0): void { + public setCancelled(numberOfCalls = 0): void { ts.Debug.assert(numberOfCalls >= 0); this.numberOfCallsBeforeCancellation = numberOfCalls; } @@ -761,7 +761,7 @@ namespace FourSlash { this.raiseError(`verifyReferencesAtPositionListContains failed - could not find the item: ${JSON.stringify(missingItem)} in the returned list: (${JSON.stringify(references)})`); } - public verifyReferencesCountIs(count: number, localFilesOnly: boolean = true) { + public verifyReferencesCountIs(count: number, localFilesOnly = true) { this.taoInvalidReason = "verifyReferences NYI"; let references = this.getReferencesAtCaret();