diff --git a/.github/workflows/update-lkg.yml b/.github/workflows/update-lkg.yml new file mode 100644 index 00000000000..8864d1316c0 --- /dev/null +++ b/.github/workflows/update-lkg.yml @@ -0,0 +1,28 @@ +name: Update LKG + +on: + workflow_dispatch: {} + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Use node version 12 + uses: actions/setup-node@v1 + with: + node-version: 12 + registry-url: https://registry.npmjs.org/ + + - name: Configure Git and Update LKG + run: | + git config user.email "ts_bot@rcavanaugh.com" + git config user.name "TypeScript Bot" + npm install + gulp LKG + npm test + git diff + git add ./lib + git commit -m "Update LKG" + git push diff --git a/package.json b/package.json index 7f9e66add40..dc47a9b5f5d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "typescript", "author": "Microsoft Corp.", "homepage": "https://www.typescriptlang.org/", - "version": "4.0.0", + "version": "4.1.0", "license": "Apache-2.0", "description": "TypeScript is a language for application scale JavaScript development", "keywords": [ diff --git a/src/compiler/corePublic.ts b/src/compiler/corePublic.ts index dad59377900..ecf3f929fae 100644 --- a/src/compiler/corePublic.ts +++ b/src/compiler/corePublic.ts @@ -1,7 +1,7 @@ namespace ts { // WARNING: The script `configurePrerelease.ts` uses a regexp to parse out these values. // If changing the text in this section, be sure to test `configurePrerelease` too. - export const versionMajorMinor = "4.0"; + export const versionMajorMinor = "4.1"; /** The version of the TypeScript compiler release */ export const version = `${versionMajorMinor}.0-dev`; diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 1729e3a810c..c021b87d1c4 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7217,7 +7217,8 @@ namespace ts { let state = JSDocState.SawAsterisk; let margin: number | undefined; // + 4 for leading '/** ' - let indent = start - Math.max(content.lastIndexOf("\n", start), 0) + 4; + // + 1 because the last index of \n is always one index before the first character in the line and coincidentally, if there is no \n before start, it is -1, which is also one index before the first character + let indent = start - (content.lastIndexOf("\n", start) + 1) + 4; function pushComment(text: string) { if (!margin) { margin = indent; @@ -7273,7 +7274,7 @@ namespace ts { comments.push(whitespace); } else if (margin !== undefined && indent + whitespace.length > margin) { - comments.push(whitespace.slice(margin - indent - 1)); + comments.push(whitespace.slice(margin - indent)); } indent += whitespace.length; break; diff --git a/src/compiler/resolutionCache.ts b/src/compiler/resolutionCache.ts index 56ea6a03e80..725f94c7799 100644 --- a/src/compiler/resolutionCache.ts +++ b/src/compiler/resolutionCache.ts @@ -568,7 +568,7 @@ namespace ts { } else { resolution.refCount = 1; - Debug.assert(resolution.files === undefined); + Debug.assert(length(resolution.files) === 0); // This resolution shouldnt be referenced by any file yet if (isExternalModuleNameRelative(name)) { watchFailedLookupLocationOfResolution(resolution); } diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index 2a54c7529f7..5df54f51fe0 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -1946,7 +1946,7 @@ interface Int8Array { interface Int8ArrayConstructor { readonly prototype: Int8Array; new(length: number): Int8Array; - new(array: ArrayLike): Int8Array; + new(array: ArrayLike | ArrayBufferLike): Int8Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array; /** @@ -2229,7 +2229,7 @@ interface Uint8Array { interface Uint8ArrayConstructor { readonly prototype: Uint8Array; new(length: number): Uint8Array; - new(array: ArrayLike): Uint8Array; + new(array: ArrayLike | ArrayBufferLike): Uint8Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array; /** @@ -2511,7 +2511,7 @@ interface Uint8ClampedArray { interface Uint8ClampedArrayConstructor { readonly prototype: Uint8ClampedArray; new(length: number): Uint8ClampedArray; - new(array: ArrayLike): Uint8ClampedArray; + new(array: ArrayLike | ArrayBufferLike): Uint8ClampedArray; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8ClampedArray; /** @@ -2791,7 +2791,7 @@ interface Int16Array { interface Int16ArrayConstructor { readonly prototype: Int16Array; new(length: number): Int16Array; - new(array: ArrayLike): Int16Array; + new(array: ArrayLike | ArrayBufferLike): Int16Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int16Array; /** @@ -3074,7 +3074,7 @@ interface Uint16Array { interface Uint16ArrayConstructor { readonly prototype: Uint16Array; new(length: number): Uint16Array; - new(array: ArrayLike): Uint16Array; + new(array: ArrayLike | ArrayBufferLike): Uint16Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint16Array; /** @@ -3356,7 +3356,7 @@ interface Int32Array { interface Int32ArrayConstructor { readonly prototype: Int32Array; new(length: number): Int32Array; - new(array: ArrayLike): Int32Array; + new(array: ArrayLike | ArrayBufferLike): Int32Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int32Array; /** @@ -3637,7 +3637,7 @@ interface Uint32Array { interface Uint32ArrayConstructor { readonly prototype: Uint32Array; new(length: number): Uint32Array; - new(array: ArrayLike): Uint32Array; + new(array: ArrayLike | ArrayBufferLike): Uint32Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint32Array; /** @@ -3919,7 +3919,7 @@ interface Float32Array { interface Float32ArrayConstructor { readonly prototype: Float32Array; new(length: number): Float32Array; - new(array: ArrayLike): Float32Array; + new(array: ArrayLike | ArrayBufferLike): Float32Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float32Array; /** @@ -4193,7 +4193,7 @@ interface Float64Array { interface Float64ArrayConstructor { readonly prototype: Float64Array; new(length: number): Float64Array; - new(array: ArrayLike): Float64Array; + new(array: ArrayLike | ArrayBufferLike): Float64Array; new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float64Array; /** diff --git a/src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl index 869aed6c55e..52b89523d6a 100644 --- a/src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2169,6 +2169,9 @@ + + + @@ -2622,6 +2625,9 @@ + + + diff --git a/src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl index 75cb06bce8f..4c24f869731 100644 --- a/src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2169,6 +2169,9 @@ + + + @@ -2403,6 +2406,9 @@ + + + @@ -2619,6 +2625,9 @@ + + + @@ -3390,12 +3399,18 @@ + + + + + + @@ -4176,6 +4191,9 @@ + + + @@ -5550,12 +5568,18 @@ + + + + + + @@ -13164,6 +13188,9 @@ + + + diff --git a/src/loc/lcl/csy/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/csy/diagnosticMessages/diagnosticMessages.generated.json.lcl index e90adab6cb2..dca94213e93 100644 --- a/src/loc/lcl/csy/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/csy/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2178,6 +2178,9 @@ + + + @@ -2631,6 +2634,9 @@ + + + diff --git a/src/loc/lcl/deu/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/deu/diagnosticMessages/diagnosticMessages.generated.json.lcl index 2f49c14009b..1e5bd00c490 100644 --- a/src/loc/lcl/deu/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/deu/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2163,6 +2163,12 @@ + + + + + + @@ -2391,6 +2397,15 @@ + + + + + + + + + @@ -2601,6 +2616,12 @@ + + + + + + @@ -3366,6 +3387,24 @@ + + + + + + + + + + + + + + + + + + @@ -3672,6 +3711,15 @@ + + + + + + + + + @@ -3726,6 +3774,15 @@ + + + + + + + + + @@ -3744,6 +3801,15 @@ + + + + + + + + + @@ -4113,6 +4179,15 @@ + + + + + + + + + @@ -5481,6 +5556,24 @@ + + + + + + + + + + + + + + + + + + @@ -13080,6 +13173,15 @@ + + + + + + + + + diff --git a/src/loc/lcl/esn/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/esn/diagnosticMessages/diagnosticMessages.generated.json.lcl index 9649d9c68d4..dc09d8dd303 100644 --- a/src/loc/lcl/esn/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/esn/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2181,6 +2181,9 @@ + + + @@ -2634,6 +2637,9 @@ + + + diff --git a/src/loc/lcl/fra/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/fra/diagnosticMessages/diagnosticMessages.generated.json.lcl index 8c96e820e2d..e47d9aa55c7 100644 --- a/src/loc/lcl/fra/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/fra/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2178,6 +2178,12 @@ + + + + + + @@ -2406,6 +2412,15 @@ + + + + + + + + + @@ -2616,6 +2631,12 @@ + + + + + + @@ -3381,6 +3402,24 @@ + + + + + + + + + + + + + + + + + + @@ -3687,6 +3726,15 @@ + + + + + + + + + @@ -3741,6 +3789,15 @@ + + + + + + + + + @@ -3759,6 +3816,15 @@ + + + + + + + + + @@ -4128,6 +4194,15 @@ + + + + + + + + + @@ -5496,6 +5571,24 @@ + + + + + + + + + + + + + + + + + + @@ -13098,6 +13191,15 @@ + + + + + + + + + diff --git a/src/loc/lcl/ita/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/ita/diagnosticMessages/diagnosticMessages.generated.json.lcl index ca652f03e6a..f2afb9c9813 100644 --- a/src/loc/lcl/ita/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/ita/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2166,6 +2166,12 @@ + + + + + + @@ -2394,6 +2400,15 @@ + + + + + + + + + @@ -2604,6 +2619,12 @@ + + + + + + @@ -3369,6 +3390,24 @@ + + + + + + + + + + + + + + + + + + @@ -3675,6 +3714,15 @@ + + + + + + + + + @@ -3729,6 +3777,15 @@ + + + + + + + + + @@ -3747,6 +3804,15 @@ + + + + + + + + + @@ -4116,6 +4182,15 @@ + + + + + + + + + @@ -5484,6 +5559,24 @@ + + + + + + + + + + + + + + + + + + @@ -13086,6 +13179,15 @@ + + + + + + + + + diff --git a/src/loc/lcl/jpn/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/jpn/diagnosticMessages/diagnosticMessages.generated.json.lcl index 58ec2f850ad..ed5a51fdb03 100644 --- a/src/loc/lcl/jpn/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/jpn/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2169,6 +2169,9 @@ + + + @@ -2622,6 +2625,9 @@ + + + diff --git a/src/loc/lcl/kor/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/kor/diagnosticMessages/diagnosticMessages.generated.json.lcl index 6fd5a378f20..e974ed13c02 100644 --- a/src/loc/lcl/kor/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/kor/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2169,6 +2169,9 @@ + + + @@ -2622,6 +2625,9 @@ + + + diff --git a/src/loc/lcl/plk/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/plk/diagnosticMessages/diagnosticMessages.generated.json.lcl index 83395f5e494..589887655fd 100644 --- a/src/loc/lcl/plk/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/plk/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2159,6 +2159,9 @@ + + + @@ -2612,6 +2615,9 @@ + + + diff --git a/src/loc/lcl/ptb/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/ptb/diagnosticMessages/diagnosticMessages.generated.json.lcl index 50ec9b5b086..2e2338162d5 100644 --- a/src/loc/lcl/ptb/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/ptb/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2159,6 +2159,15 @@ + + + + + + + + + @@ -2387,6 +2396,15 @@ + + + + + + + + + @@ -2597,6 +2615,15 @@ + + + + + + + + + @@ -3362,6 +3389,24 @@ + + + + + + + + + + + + + + + + + + @@ -3668,6 +3713,15 @@ + + + + + + + + + @@ -3722,6 +3776,15 @@ + + + + + + + + + @@ -3740,6 +3803,15 @@ + + + + + + + + + @@ -4109,6 +4181,15 @@ + + + + + + + + + @@ -5477,6 +5558,24 @@ + + + + + + + + + + + + + + + + + + @@ -13076,6 +13175,15 @@ + + + + + + + + + diff --git a/src/loc/lcl/rus/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/rus/diagnosticMessages/diagnosticMessages.generated.json.lcl index 1fb77c996e4..495ad4fe286 100644 --- a/src/loc/lcl/rus/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/rus/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2165,6 +2165,12 @@ + + + + + + @@ -2393,6 +2399,15 @@ + + + + + + + + + @@ -2603,6 +2618,12 @@ + + + + + + @@ -3368,6 +3389,24 @@ + + + + + + + + + + + + + + + + + + @@ -3674,6 +3713,15 @@ + + + + + + + + + @@ -3728,6 +3776,15 @@ + + + + + + + + + @@ -3746,6 +3803,15 @@ + + + + + + + + + @@ -4115,6 +4181,15 @@ + + + + + + + + + @@ -5483,6 +5558,24 @@ + + + + + + + + + + + + + + + + + + @@ -13085,6 +13178,15 @@ + + + + + + + + + diff --git a/src/loc/lcl/trk/diagnosticMessages/diagnosticMessages.generated.json.lcl b/src/loc/lcl/trk/diagnosticMessages/diagnosticMessages.generated.json.lcl index 0c656550ca7..63a6ba2f21c 100644 --- a/src/loc/lcl/trk/diagnosticMessages/diagnosticMessages.generated.json.lcl +++ b/src/loc/lcl/trk/diagnosticMessages/diagnosticMessages.generated.json.lcl @@ -2396,6 +2396,9 @@ + + + @@ -3383,12 +3386,18 @@ + + + + + + @@ -3701,6 +3710,9 @@ + + + @@ -4166,6 +4178,9 @@ + + + @@ -5540,12 +5555,18 @@ + + + + + + @@ -13154,6 +13175,9 @@ + + + diff --git a/src/services/utilities.ts b/src/services/utilities.ts index c11c65d076d..ce0c15366be 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1217,6 +1217,10 @@ namespace ts { } const children = n.getChildren(sourceFile); + if (children.length === 0) { + return n; + } + const candidate = findRightmostChildNodeWithTokens(children, /*exclusiveStartPosition*/ children.length, sourceFile); return candidate && findRightmostToken(candidate, sourceFile); } diff --git a/src/testRunner/unittests/tsserver/partialSemanticServer.ts b/src/testRunner/unittests/tsserver/partialSemanticServer.ts index 6e865f56d50..b8c6668d3c1 100644 --- a/src/testRunner/unittests/tsserver/partialSemanticServer.ts +++ b/src/testRunner/unittests/tsserver/partialSemanticServer.ts @@ -213,5 +213,23 @@ function fooB() { }` assert.isFalse(project.dirty); checkProjectActualFiles(project, [libFile.path, file1.path, file2.path, file3.path, something.path]); }); + + it("should not crash when external module name resolution is reused", () => { + const { session, file1, file2, file3 } = setup(); + const service = session.getProjectService(); + openFilesForSession([file1], session); + checkNumberOfProjects(service, { inferredProjects: 1 }); + const project = service.inferredProjects[0]; + checkProjectActualFiles(project, [libFile.path, file1.path, file2.path]); + + // Close the file that contains non relative external module name and open some file that doesnt have non relative external module import + closeFilesForSession([file1], session); + openFilesForSession([file3], session); + checkProjectActualFiles(project, [libFile.path, file3.path]); + + // Open file with non relative external module name + openFilesForSession([file2], session); + checkProjectActualFiles(project, [libFile.path, file2.path, file3.path]); + }); }); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 2600bfaea34..db58c35ac46 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -14,7 +14,7 @@ and limitations under the License. ***************************************************************************** */ declare namespace ts { - const versionMajorMinor = "4.0"; + const versionMajorMinor = "4.1"; /** The version of the TypeScript compiler release */ const version: string; /** diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index fefe6eda25f..a0dab441a38 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -14,7 +14,7 @@ and limitations under the License. ***************************************************************************** */ declare namespace ts { - const versionMajorMinor = "4.0"; + const versionMajorMinor = "4.1"; /** The version of the TypeScript compiler release */ const version: string; /** diff --git a/tests/cases/fourslash/completionsAfterJSDoc.ts b/tests/cases/fourslash/completionsAfterJSDoc.ts new file mode 100644 index 00000000000..eb882e3829a --- /dev/null +++ b/tests/cases/fourslash/completionsAfterJSDoc.ts @@ -0,0 +1,17 @@ +/// + +////export interface Foo { +//// /** JSDoc */ +//// /**/foo(): void; +////} + +// Should not crash, #35632 +verify.completions({ + marker: "", + isNewIdentifierLocation: true, + exact: [{ + name: "readonly", + kind: "keyword", + sortText: completion.SortText.GlobalsOrKeywords + }] +}); diff --git a/tests/cases/fourslash/jsDocIndentationPreservation1.ts b/tests/cases/fourslash/jsDocIndentationPreservation1.ts new file mode 100644 index 00000000000..1e454ac4be1 --- /dev/null +++ b/tests/cases/fourslash/jsDocIndentationPreservation1.ts @@ -0,0 +1,13 @@ +/// +// @allowJs: true +// @Filename: Foo.js + +/////** +//// * Does some stuff. +//// * Second line. +//// * Third line. +//// */ +////function foo/**/(){} + +goTo.marker(); +verify.quickInfoIs("function foo(): void", "Does some stuff.\n Second line.\n\tThird line."); diff --git a/tests/cases/fourslash/jsDocIndentationPreservation2.ts b/tests/cases/fourslash/jsDocIndentationPreservation2.ts new file mode 100644 index 00000000000..e832bc12708 --- /dev/null +++ b/tests/cases/fourslash/jsDocIndentationPreservation2.ts @@ -0,0 +1,13 @@ +/// +// @allowJs: true +// @Filename: Foo.js + +/////** +//// Does some stuff. +//// Second line. +//// Third line. +////*/ +////function foo/**/(){} + +goTo.marker(); +verify.quickInfoIs("function foo(): void", "Does some stuff.\n Second line.\n\tThird line."); diff --git a/tests/cases/fourslash/jsDocIndentationPreservation3.ts b/tests/cases/fourslash/jsDocIndentationPreservation3.ts new file mode 100644 index 00000000000..117ea0dee4e --- /dev/null +++ b/tests/cases/fourslash/jsDocIndentationPreservation3.ts @@ -0,0 +1,13 @@ +/// +// @allowJs: true +// @Filename: Foo.js + +/////** +//// Does some stuff. +//// Second line. +//// Third line. +////*/ +////function foo/**/(){} + +goTo.marker(); +verify.quickInfoIs("function foo(): void", "Does some stuff.\n Second line.\n\tThird line.");