From a5d7e1dea103592526537cecf70494d848b7b5f5 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Thu, 14 Sep 2017 14:14:03 -0700 Subject: [PATCH] Fixes to emit / format for codeFix --- src/compiler/emitter.ts | 6 +++++ src/harness/fourslash.ts | 2 +- src/services/formatting/rules.ts | 5 ++-- .../fourslash/convertFunctionToEs6Class3.ts | 4 +-- ...nvertFunctionToEs6Class_emptySwitchCase.ts | 25 +++++++++++++++++++ ...ToEs6Class_objectLiteralInArrowFunction.ts | 21 ++++++++++++++++ 6 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 tests/cases/fourslash/convertFunctionToEs6Class_emptySwitchCase.ts create mode 100644 tests/cases/fourslash/convertFunctionToEs6Class_objectLiteralInArrowFunction.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 8788e0c02f455..2c6eef3672f79 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2417,6 +2417,12 @@ namespace ts { const isEmpty = isUndefined || start >= children.length || count === 0; if (isEmpty && format & ListFormat.OptionalIfEmpty) { + if (onBeforeEmitNodeArray) { + onBeforeEmitNodeArray(children); + } + if (onAfterEmitNodeArray) { + onAfterEmitNodeArray(children); + } return; } diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index fb5e9e0354e72..64e25e0eb9a29 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -3500,7 +3500,7 @@ ${code} expected = makeWhitespaceVisible(expected); actual = makeWhitespaceVisible(actual); } - return `Expected:\n${expected}\nActual:${actual}`; + return `Expected:\n${expected}\nActual:\n${actual}`; } function differOnlyByWhitespace(a: string, b: string) { diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 07c2804ee8356..d41d9dfbfd868 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -755,9 +755,8 @@ namespace ts.formatting { return true; case SyntaxKind.Block: { const blockParent = context.currentTokenParent.parent; - if (blockParent.kind !== SyntaxKind.ArrowFunction && - blockParent.kind !== SyntaxKind.FunctionExpression - ) { + // In a codefix scenario, we can't rely on parents being set. So just always return true. + if (!blockParent || blockParent.kind !== SyntaxKind.ArrowFunction && blockParent.kind !== SyntaxKind.FunctionExpression) { return true; } } diff --git a/tests/cases/fourslash/convertFunctionToEs6Class3.ts b/tests/cases/fourslash/convertFunctionToEs6Class3.ts index bb48ffadec25f..fec4dd8edfae2 100644 --- a/tests/cases/fourslash/convertFunctionToEs6Class3.ts +++ b/tests/cases/fourslash/convertFunctionToEs6Class3.ts @@ -2,14 +2,14 @@ // @allowNonTsExtensions: true // @Filename: test123.js -//// [|var bar = 10, /*1*/foo = function() { }; +//// var bar = 10, /*1*/foo = function() { }; //// /*2*/foo.prototype.instanceMethod1 = function() { return "this is name"; }; //// /*3*/foo.prototype.instanceMethod2 = () => { return "this is name"; }; //// /*4*/foo.prototype.instanceProp1 = "hello"; //// /*5*/foo.prototype.instanceProp2 = undefined; //// /*6*/foo.staticProp = "world"; //// /*7*/foo.staticMethod1 = function() { return "this is static name"; }; -//// /*8*/foo.staticMethod2 = () => "this is static name";|] +//// /*8*/foo.staticMethod2 = () => "this is static name"; ['1', '2', '3', '4', '5', '6', '7', '8'].forEach(m => verify.applicableRefactorAvailableAtMarker(m)); diff --git a/tests/cases/fourslash/convertFunctionToEs6Class_emptySwitchCase.ts b/tests/cases/fourslash/convertFunctionToEs6Class_emptySwitchCase.ts new file mode 100644 index 0000000000000..90bd48784ce8b --- /dev/null +++ b/tests/cases/fourslash/convertFunctionToEs6Class_emptySwitchCase.ts @@ -0,0 +1,25 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: /a.js +////function /**/MyClass() { +////} +////MyClass.prototype.f = function(x) { +//// switch (x) { +//// case 0: +//// } +////} + +verify.applicableRefactorAvailableAtMarker(""); +verify.fileAfterApplyingRefactorAtMarker("", +`class MyClass { + constructor() { + } + f(x) { + switch (x) { + case 0: + } + } +} +`, +'Convert to ES2015 class', 'convert'); diff --git a/tests/cases/fourslash/convertFunctionToEs6Class_objectLiteralInArrowFunction.ts b/tests/cases/fourslash/convertFunctionToEs6Class_objectLiteralInArrowFunction.ts new file mode 100644 index 0000000000000..0bbbf4e00246c --- /dev/null +++ b/tests/cases/fourslash/convertFunctionToEs6Class_objectLiteralInArrowFunction.ts @@ -0,0 +1,21 @@ +/// + +// @allowNonTsExtensions: true +// @Filename: /a.js +////function /**/MyClass() { +////} +////MyClass.prototype.foo = function() { +//// ({ bar: () => { } }) +////} + +verify.applicableRefactorAvailableAtMarker(""); +verify.fileAfterApplyingRefactorAtMarker("", +`class MyClass { + constructor() { + } + foo() { + ({ bar: () => { } }); + } +} +`, +'Convert to ES2015 class', 'convert');