From 77d247fe2cdc41e54aa72edc03c6100c0463879c Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 10:13:40 -0800 Subject: [PATCH 01/10] Add tolerantParse method which strips comments from input text before calling JSON.parse(...) --- src/assets.ts | 5 +- src/common.ts | 2 +- src/json.ts | 137 ++++++++++++++++++++++++++++++ test/json.test.ts | 207 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 348 insertions(+), 3 deletions(-) create mode 100644 src/json.ts create mode 100644 test/json.test.ts diff --git a/src/assets.ts b/src/assets.ts index 54559c8201..d6e32954d9 100644 --- a/src/assets.ts +++ b/src/assets.ts @@ -10,6 +10,7 @@ import * as tasks from 'vscode-tasks'; import { OmniSharpServer } from './omnisharp/server'; import * as serverUtils from './omnisharp/utils'; import * as protocol from './omnisharp/protocol'; +import { tolerantParse } from './json'; interface DebugConfiguration { name: string; @@ -142,7 +143,7 @@ export class AssetGenerator { // TODO: This error should be surfaced to the user. If the JSON can't be parsed // (maybe due to a syntax error like an extra comma), the user should be notified // to fix up their project.json. - projectJsonObject = JSON.parse(projectFileText); + projectJsonObject = tolerantParse(projectFileText); } catch (error) { projectJsonObject = null; } @@ -357,7 +358,7 @@ function getBuildOperations(tasksJsonPath: string) { } const text = buffer.toString(); - const tasksJson: tasks.TaskConfiguration = JSON.parse(text); + const tasksJson: tasks.TaskConfiguration = tolerantParse(text); const buildTask = tasksJson.tasks.find(td => td.taskName === 'build'); resolve({ updateTasksJson: (buildTask === undefined) }); diff --git a/src/common.ts b/src/common.ts index 09a9198074..e120cc26d4 100644 --- a/src/common.ts +++ b/src/common.ts @@ -111,4 +111,4 @@ export function deleteInstallFile(type: InstallFileType): Promise { resolve(); }); }); -} \ No newline at end of file +} diff --git a/src/json.ts b/src/json.ts new file mode 100644 index 0000000000..8cace1d208 --- /dev/null +++ b/src/json.ts @@ -0,0 +1,137 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const enum CharCode { + lineFeed = 0x0a, + carriageReturn = 0x0d, + lineSeparator = 0x2028, + paragraphSeparator = 0x2029, + + asterisk = 0x2a, + backSlash = 0x5c, + doubleQuote = 0x22, + slash = 0x2f, +} + +function isLineBreak(code: number) { + return code === CharCode.lineFeed + || code === CharCode.carriageReturn + || code === CharCode.lineSeparator + || code === CharCode.paragraphSeparator; +} + +function stripComments(text: string) { + + let parts: string[] = []; + let partStart = 0; + + let index = 0; + let length = text.length; + + function next(): number | undefined { + const result = peek(); + index++; + return result; + } + + function peek(offset: number = 0): number | undefined { + if ((index + offset) < length) { + return text.charCodeAt(index + offset); + } + else { + return undefined; + } + } + + function scanString() { + while (true) { + if (index >= length) { // string ended unexpectedly + break; + } + + let code = next(); + + if (code === CharCode.doubleQuote) { + // End of string. We're done + break; + } + + if (code === CharCode.backSlash) { + // Skip escaped character. We don't care about verifying the escape sequence. + // We just don't want to accidentally scan an escaped double-quote as the end of the string. + index++; + } + + if (isLineBreak(code)) { + // string ended unexpectedly + break; + } + } + } + + while (true) { + let code = next(); + + switch (code) { + // strings + case CharCode.doubleQuote: + scanString(); + break; + + // comments + case CharCode.slash: + // Single-line comment + if (peek() === CharCode.slash) { + // Be careful not to include the first slash in the text part. + parts.push(text.substring(partStart, index - 1)); + + // Start after the second slash and scan until a line-break character is encountered. + index++; + while (index < length) { + if (isLineBreak(peek())) { + break; + } + + index++; + } + + partStart = index; + } + + // Multi-line comment + if (peek() === CharCode.asterisk) { + // Be careful not to include the first slash in the text part. + parts.push(text.substring(partStart, index - 1)); + + // Start after the asterisk and scan until a */ is encountered. + index++; + while (index < length) { + if (peek() === CharCode.asterisk && peek(1) === CharCode.slash) { + index += 2; + break; + } + + index++; + } + + partStart = index; + } + + break; + } + + if (index >= length && index > partStart) { + parts.push(text.substring(partStart, length)); + break; + } + } + + return parts.join(''); +} + +export function tolerantParse(text: string) { + text = stripComments(text); + return JSON.parse(text); +} diff --git a/test/json.test.ts b/test/json.test.ts new file mode 100644 index 0000000000..2865497b1b --- /dev/null +++ b/test/json.test.ts @@ -0,0 +1,207 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { should } from 'chai'; +import { tolerantParse } from '../src/json'; + +suite("JSON", () => { + suiteSetup(() => should()); + + test("no comments", () => { + const text = +`{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(text); + }); + + test("no comments (minified)", () => { + const text = +`{"hello":"world","from":"json"}`; + + const expected = +`{ + "hello": "world", + "from": "json" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("single-line comment before JSON", () => { + const text = +`// comment +{ + "hello": "world\\"" // comment +}`; + + const expected = +`{ + "hello": "world\\"" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("single-line comment on separate line", () => { + const text = +`{ + // comment + "hello": "world" +}`; + + const expected = +`{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("single-line comment at end of line", () => { + const text = +`{ + "hello": "world" // comment +}`; + + const expected = +`{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("single-line comment at end of text", () => { + const text = +`{ + "hello": "world" +} // comment`; + + const expected = +`{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("ignore single-line comment inside string", () => { + const text = +`{ + "hello": "world // comment" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(text); + }); + + test("single-line comment after string with escaped double quote", () => { + const text = +`{ + "hello": "world\\"" // comment +}`; + + const expected = +`{ + "hello": "world\\"" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("multi-line comment at start of text", () => { + const text = +`/**/{ + "hello": "world" +}`; + + const expected = +`{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("comment out key/value pair", () => { + const text = +`{ + /*"hello": "world"*/ + "from": "json" +}`; + + const expected = +`{ + "from": "json" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("multi-line comment at end of text", () => { + const text = +`{ + "hello": "world" +}/**/`; + + const expected = +`{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("ignore multi-line comment inside string", () => { + const text = +`{ + "hello": "wo/**/rld" +}`; + + const expected = +`{ + "hello": "wo/**/rld" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); +}); From 4b6e2b9b6746bc6bd1ff627e8f550ef75bb89a6e Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 10:14:27 -0800 Subject: [PATCH 02/10] v1.6.0 -> v1.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e395ff912d..436158a5b6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "csharp", "publisher": "ms-vscode", - "version": "1.6.0", + "version": "1.6.1", "description": "C# for Visual Studio Code (powered by OmniSharp).", "displayName": "C#", "author": "Microsoft Corporation", From 1a5bf6897f6a55aa3ba052c2e0d53adc70c00994 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 10:16:06 -0800 Subject: [PATCH 03/10] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5edc5ab489..ce517d99c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.1 (December 22, 2016) + +* Fix crash when tasks.json contains comments. ([#1074](https://github.com/OmniSharp/omnisharp-vscode/issues/1074)) + ## 1.6.0 (December 21, 2016) #### C# Scripting From 6cceda17a96db966c107c38d16cd59a086d3412d Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 10:49:48 -0800 Subject: [PATCH 04/10] Ignore byte order mark --- src/assets.ts | 1 - src/json.ts | 8 ++++++ test/json.test.ts | 65 ++++++++++++++++++++++++++++++----------------- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/assets.ts b/src/assets.ts index d6e32954d9..e1d21c25ec 100644 --- a/src/assets.ts +++ b/src/assets.ts @@ -134,7 +134,6 @@ export class AssetGenerator { } let projectFileText = fs.readFileSync(this.projectFilePath, 'utf8'); - projectFileText = projectFileText.replace(/^\uFEFF/, ''); if (path.basename(this.projectFilePath).toLowerCase() === 'project.json') { let projectJsonObject: any; diff --git a/src/json.ts b/src/json.ts index 8cace1d208..b13f975e05 100644 --- a/src/json.ts +++ b/src/json.ts @@ -13,6 +13,8 @@ const enum CharCode { backSlash = 0x5c, doubleQuote = 0x22, slash = 0x2f, + + byteOrderMark = 0xfeff, } function isLineBreak(code: number) { @@ -75,6 +77,12 @@ function stripComments(text: string) { let code = next(); switch (code) { + // byte-order mark + case CharCode.byteOrderMark: + // We just skip the byte-order mark + parts.push(text.substring(partStart, index - 1)); + partStart = index; + // strings case CharCode.doubleQuote: scanString(); diff --git a/test/json.test.ts b/test/json.test.ts index 2865497b1b..3e58884c7b 100644 --- a/test/json.test.ts +++ b/test/json.test.ts @@ -11,7 +11,7 @@ suite("JSON", () => { test("no comments", () => { const text = -`{ + `{ "hello": "world" }`; @@ -23,10 +23,10 @@ suite("JSON", () => { test("no comments (minified)", () => { const text = -`{"hello":"world","from":"json"}`; + `{"hello":"world","from":"json"}`; const expected = -`{ + `{ "hello": "world", "from": "json" }`; @@ -39,13 +39,13 @@ suite("JSON", () => { test("single-line comment before JSON", () => { const text = -`// comment + `// comment { "hello": "world\\"" // comment }`; const expected = -`{ + `{ "hello": "world\\"" }`; @@ -57,13 +57,13 @@ suite("JSON", () => { test("single-line comment on separate line", () => { const text = -`{ + `{ // comment "hello": "world" }`; const expected = -`{ + `{ "hello": "world" }`; @@ -75,12 +75,12 @@ suite("JSON", () => { test("single-line comment at end of line", () => { const text = -`{ + `{ "hello": "world" // comment }`; const expected = -`{ + `{ "hello": "world" }`; @@ -92,12 +92,12 @@ suite("JSON", () => { test("single-line comment at end of text", () => { const text = -`{ + `{ "hello": "world" } // comment`; const expected = -`{ + `{ "hello": "world" }`; @@ -109,7 +109,7 @@ suite("JSON", () => { test("ignore single-line comment inside string", () => { const text = -`{ + `{ "hello": "world // comment" }`; @@ -121,12 +121,12 @@ suite("JSON", () => { test("single-line comment after string with escaped double quote", () => { const text = -`{ + `{ "hello": "world\\"" // comment }`; const expected = -`{ + `{ "hello": "world\\"" }`; @@ -138,12 +138,12 @@ suite("JSON", () => { test("multi-line comment at start of text", () => { const text = -`/**/{ + `/**/{ "hello": "world" }`; const expected = -`{ + `{ "hello": "world" }`; @@ -155,13 +155,13 @@ suite("JSON", () => { test("comment out key/value pair", () => { const text = -`{ + `{ /*"hello": "world"*/ "from": "json" }`; const expected = -`{ + `{ "from": "json" }`; @@ -170,15 +170,15 @@ suite("JSON", () => { result.should.equal(expected); }); - + test("multi-line comment at end of text", () => { const text = -`{ + `{ "hello": "world" }/**/`; const expected = -`{ + `{ "hello": "world" }`; @@ -187,15 +187,15 @@ suite("JSON", () => { result.should.equal(expected); }); - + test("ignore multi-line comment inside string", () => { const text = -`{ + `{ "hello": "wo/**/rld" }`; const expected = -`{ + `{ "hello": "wo/**/rld" }`; @@ -204,4 +204,21 @@ suite("JSON", () => { result.should.equal(expected); }); + + test("ignore BOM", () => { + const text = + `\uFEFF{ + "hello": "world" +}`; + + const expected = + `{ + "hello": "world" +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); }); From 603dc03f1a06fd7c1765e3b742d00c3d7221fbf1 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 10:54:08 -0800 Subject: [PATCH 05/10] Catch exception and display error message to user when tasks.json can't be parsed --- src/assets.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/assets.ts b/src/assets.ts index e1d21c25ec..440d363cfa 100644 --- a/src/assets.ts +++ b/src/assets.ts @@ -357,8 +357,19 @@ function getBuildOperations(tasksJsonPath: string) { } const text = buffer.toString(); - const tasksJson: tasks.TaskConfiguration = tolerantParse(text); - const buildTask = tasksJson.tasks.find(td => td.taskName === 'build'); + + let buildTask: tasks.TaskDescription; + + try + { + const tasksJson: tasks.TaskConfiguration = tolerantParse(text); + buildTask = tasksJson.tasks.find(td => td.taskName === 'build'); + } + catch (error) + { + vscode.window.showErrorMessage(`Failed to parse tasks.json file`); + buildTask = undefined; + } resolve({ updateTasksJson: (buildTask === undefined) }); }); From 937f2d9d13fe317eaf2403778ff8c90ced7764fb Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 11:26:39 -0800 Subject: [PATCH 06/10] Be tolerant against trailing commas --- src/json.ts | 88 ++++++++++++++++++++++++++++++++++++++++++----- test/json.test.ts | 46 +++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 8 deletions(-) diff --git a/src/json.ts b/src/json.ts index b13f975e05..d06a5e7bba 100644 --- a/src/json.ts +++ b/src/json.ts @@ -4,26 +4,75 @@ *--------------------------------------------------------------------------------------------*/ const enum CharCode { - lineFeed = 0x0a, + asterisk = 0x2a, // * + backSlash = 0x5c, // \ + closeBrace = 0x7d, // } + closeBracket = 0x5d, // ] + comma = 0x2c, // , + doubleQuote = 0x22, // " + slash = 0x2f, // / + + byteOrderMark = 0xfeff, + + // line terminator characters (see https://en.wikipedia.org/wiki/Newline#Unicode) carriageReturn = 0x0d, + formFeed = 0x0c, + lineFeed = 0x0a, lineSeparator = 0x2028, + nextLine = 0x85, paragraphSeparator = 0x2029, - - asterisk = 0x2a, - backSlash = 0x5c, - doubleQuote = 0x22, - slash = 0x2f, - - byteOrderMark = 0xfeff, + verticalTab = 0x0b, + + // whitespace characters (see https://en.wikipedia.org/wiki/Whitespace_character#Unicode) + tab = 0x09, + space = 0x20, + nonBreakingSpace = 0xa0, + ogham = 0x1680, + enQuad = 0x2000, + emQuad = 0x2001, + enSpace = 0x2002, + emSpace = 0x2003, + threePerEmSpace = 0x2004, + fourPerEmSpace = 0x2005, + sixPerEmSpace = 0x2006, + figureSpace = 0x2007, + punctuationSpace = 0x2008, + thinSpace = 0x2009, + hairSpace = 0x200a, + zeroWidthSpace = 0x200b, + narrowNoBreakSpace = 0x202f, + mathematicalSpace = 0x205f, + ideographicSpace = 0x3000, } function isLineBreak(code: number) { return code === CharCode.lineFeed || code === CharCode.carriageReturn + || code === CharCode.verticalTab + || code === CharCode.formFeed || code === CharCode.lineSeparator || code === CharCode.paragraphSeparator; } +function isWhitespace(code: number) { + return code === CharCode.space + || code === CharCode.tab + || code === CharCode.lineFeed + || code === CharCode.verticalTab + || code === CharCode.formFeed + || code === CharCode.carriageReturn + || code === CharCode.nextLine + || code === CharCode.nonBreakingSpace + || code === CharCode.ogham + || (code >= CharCode.enQuad && code <= CharCode.zeroWidthSpace) + || code === CharCode.lineSeparator + || code === CharCode.paragraphSeparator + || code === CharCode.narrowNoBreakSpace + || code === CharCode.mathematicalSpace + || code === CharCode.ideographicSpace + || code === CharCode.byteOrderMark; +} + function stripComments(text: string) { let parts: string[] = []; @@ -47,6 +96,19 @@ function stripComments(text: string) { } } + function peekPastWhitespace(): number | undefined { + let pos = index; + let code = undefined; + + do { + code = text.charCodeAt(pos); + pos++; + } + while (isWhitespace(code)); + + return code; + } + function scanString() { while (true) { if (index >= length) { // string ended unexpectedly @@ -127,6 +189,16 @@ function stripComments(text: string) { partStart = index; } + break; + + case CharCode.comma: + // Ignore trailing commas in object member lists and array element lists + let nextCode = peekPastWhitespace(); + if (nextCode === CharCode.closeBrace || nextCode === CharCode.closeBracket) { + parts.push(text.substring(partStart, index - 1)); + partStart = index; + } + break; } diff --git a/test/json.test.ts b/test/json.test.ts index 3e58884c7b..3838281c52 100644 --- a/test/json.test.ts +++ b/test/json.test.ts @@ -221,4 +221,50 @@ suite("JSON", () => { result.should.equal(expected); }); + + test("ignore trailing comma in object member list", () => { + const text = + `{ + "obj": { + "hello": "world", + "from": "json", + } +}`; + + const expected = + `{ + "obj": { + "hello": "world", + "from": "json" + } +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); + + test("ignore trailing comma in array element list", () => { + const text = + `{ + "array": [ + "element1", + "element2", + ] +}`; + + const expected = + `{ + "array": [ + "element1", + "element2" + ] +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); }); From b6288ae94ba91cb50a1495e0e8d6045ea9707c98 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 11:30:08 -0800 Subject: [PATCH 07/10] Display error to user when we fail to parse their project.json file --- src/assets.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/assets.ts b/src/assets.ts index 440d363cfa..27f782e321 100644 --- a/src/assets.ts +++ b/src/assets.ts @@ -139,11 +139,10 @@ export class AssetGenerator { let projectJsonObject: any; try { - // TODO: This error should be surfaced to the user. If the JSON can't be parsed - // (maybe due to a syntax error like an extra comma), the user should be notified - // to fix up their project.json. projectJsonObject = tolerantParse(projectFileText); - } catch (error) { + } + catch (error) { + vscode.window.showErrorMessage('Failed to parse project.json file'); projectJsonObject = null; } @@ -360,13 +359,11 @@ function getBuildOperations(tasksJsonPath: string) { let buildTask: tasks.TaskDescription; - try - { + try { const tasksJson: tasks.TaskConfiguration = tolerantParse(text); buildTask = tasksJson.tasks.find(td => td.taskName === 'build'); } - catch (error) - { + catch (error) { vscode.window.showErrorMessage(`Failed to parse tasks.json file`); buildTask = undefined; } From 50a28ec911b39848a3a37f2c74020b090683b4c5 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 11:33:31 -0800 Subject: [PATCH 08/10] Rename method for clarity --- src/json.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/json.ts b/src/json.ts index d06a5e7bba..81f9055ea8 100644 --- a/src/json.ts +++ b/src/json.ts @@ -73,7 +73,7 @@ function isWhitespace(code: number) { || code === CharCode.byteOrderMark; } -function stripComments(text: string) { +function cleanJsonText(text: string) { let parts: string[] = []; let partStart = 0; @@ -212,6 +212,6 @@ function stripComments(text: string) { } export function tolerantParse(text: string) { - text = stripComments(text); + text = cleanJsonText(text); return JSON.parse(text); } From 5bb02be7d677570a552991fcd38a4bed8b7b142c Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Thu, 22 Dec 2016 11:45:00 -0800 Subject: [PATCH 09/10] Add test for trailing comma with leading and trailing whitespace --- test/json.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/json.test.ts b/test/json.test.ts index 3838281c52..08b34ec776 100644 --- a/test/json.test.ts +++ b/test/json.test.ts @@ -267,4 +267,23 @@ suite("JSON", () => { result.should.equal(expected); }); + + test("ignore trailing comma in object member list with leading and trailing whitespace", () => { + const text = + `{ + "obj": { "a" : 1 , } +}`; + + const expected = + `{ + "obj": { + "a": 1 + } +}`; + + let json = tolerantParse(text); + let result = JSON.stringify(json, null, 4); + + result.should.equal(expected); + }); }); From 950287252b63fabc248831ca0f16bf803e3a22f0 Mon Sep 17 00:00:00 2001 From: Rajkumar Janakiraman Date: Thu, 22 Dec 2016 12:53:59 -0800 Subject: [PATCH 10/10] Updating debugger to version 1.6.3 (#1077) * Updating the version for the debugger release. * Updating debugger version to 1.6.3 --- package.json | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 436158a5b6..fe99c022a6 100644 --- a/package.json +++ b/package.json @@ -149,8 +149,8 @@ }, { "description": ".NET Core Debugger (Windows / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-win7-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-win7-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-win7-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-win7-x64.zip", "installPath": ".debugger", "runtimeIds": [ "win7-x64" @@ -158,8 +158,8 @@ }, { "description": ".NET Core Debugger (macOS / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-osx.10.11-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-osx.10.11-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-osx.10.11-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-osx.10.11-x64.zip", "installPath": ".debugger", "runtimeIds": [ "osx.10.11-x64" @@ -171,8 +171,8 @@ }, { "description": ".NET Core Debugger (CentOS / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-centos.7-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-centos.7-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-centos.7-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-centos.7-x64.zip", "installPath": ".debugger", "runtimeIds": [ "centos.7-x64" @@ -184,8 +184,8 @@ }, { "description": ".NET Core Debugger (Debian / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-debian.8-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-debian.8-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-debian.8-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-debian.8-x64.zip", "installPath": ".debugger", "runtimeIds": [ "debian.8-x64" @@ -197,8 +197,8 @@ }, { "description": ".NET Core Debugger (Fedora 23 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-fedora.23-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-fedora.23-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-fedora.23-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-fedora.23-x64.zip", "installPath": ".debugger", "runtimeIds": [ "fedora.23-x64" @@ -210,8 +210,8 @@ }, { "description": ".NET Core Debugger (Fedora 24 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-fedora.24-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-fedora.24-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-fedora.24-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-fedora.24-x64.zip", "installPath": ".debugger", "runtimeIds": [ "fedora.24-x64" @@ -223,8 +223,8 @@ }, { "description": ".NET Core Debugger (OpenSUSE 13 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-opensuse.13.2-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-opensuse.13.2-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-opensuse.13.2-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-opensuse.13.2-x64.zip", "installPath": ".debugger", "runtimeIds": [ "opensuse.13.2-x64" @@ -236,8 +236,8 @@ }, { "description": ".NET Core Debugger (OpenSUSE 42 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-opensuse.42.1-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-opensuse.42.1-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-opensuse.42.1-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-opensuse.42.1-x64.zip", "installPath": ".debugger", "runtimeIds": [ "opensuse.42.1-x64" @@ -249,8 +249,8 @@ }, { "description": ".NET Core Debugger (RHEL / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-rhel.7.2-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-rhel.7.2-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-rhel.7.2-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-rhel.7.2-x64.zip", "installPath": ".debugger", "runtimeIds": [ "rhel.7-x64" @@ -262,8 +262,8 @@ }, { "description": ".NET Core Debugger (Ubuntu 14.04 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-ubuntu.14.04-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-ubuntu.14.04-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-ubuntu.14.04-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-ubuntu.14.04-x64.zip", "installPath": ".debugger", "runtimeIds": [ "ubuntu.14.04-x64" @@ -275,8 +275,8 @@ }, { "description": ".NET Core Debugger (Ubuntu 16.04 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-ubuntu.16.04-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-ubuntu.16.04-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-ubuntu.16.04-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-ubuntu.16.04-x64.zip", "installPath": ".debugger", "runtimeIds": [ "ubuntu.16.04-x64" @@ -288,8 +288,8 @@ }, { "description": ".NET Core Debugger (Ubuntu 16.10 / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-2/coreclr-debug-ubuntu.16.10-x64.zip", - "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-2/coreclr-debug-ubuntu.16.10-x64.zip", + "url": "https://vsdebugger.azureedge.net/coreclr-debug-1-6-3/coreclr-debug-ubuntu.16.10-x64.zip", + "fallbackUrl": "https://vsdebugger.blob.core.windows.net/coreclr-debug-1-6-3/coreclr-debug-ubuntu.16.10-x64.zip", "installPath": ".debugger", "runtimeIds": [ "ubuntu.16.10-x64"