diff --git a/ets2panda/linter/src/lib/autofixes/Autofixer.ts b/ets2panda/linter/src/lib/autofixes/Autofixer.ts index bca8d8304e2313dc8a46587c66d274ce8cc7f519..ed5c32ac961f0114112101c03253e11ff4595256 100644 --- a/ets2panda/linter/src/lib/autofixes/Autofixer.ts +++ b/ets2panda/linter/src/lib/autofixes/Autofixer.ts @@ -4861,19 +4861,41 @@ export class Autofixer { const statements = fn.body.statements; const lastExpr = statements.length > 0 ? statements[statements.length - 1] : undefined; if (hasReturn && lastExpr && !ts.isReturnStatement(lastExpr) || !hasReturn) { - const lastBrace = fn.body.getEnd() - 1; + const text = this.createUndefinedReturnStatement(fn, lastExpr); fixes.push({ - start: lastBrace, - end: lastBrace, - replacementText: '\nreturn undefined;\n' + start: lastExpr ? lastExpr.getEnd() : fn.body.getEnd() - 1, + end: lastExpr ? lastExpr.getEnd() : fn.body.getEnd() - 1, + replacementText: text }); } } } - return fixes; } + private createUndefinedReturnStatement(fn: ts.FunctionLikeDeclaration, lastExpr: ts.Statement | undefined): string { + const returnStatement = ts.factory.createReturnStatement(ts.factory.createIdentifier(UNDEFINED_NAME)); + if (lastExpr) { + const startPos = lastExpr.getStart(); + const lineAndCharacter = this.sourceFile.getLineAndCharacterOfPosition(startPos); + const indent = lineAndCharacter.character; + return ( + this.getNewLine() + + ' '.repeat(indent) + + this.printer.printNode(ts.EmitHint.Unspecified, returnStatement, fn.getSourceFile()) + ); + } + const lineAndCharacter = this.sourceFile.getLineAndCharacterOfPosition(fn.getStart()); + const indent = lineAndCharacter.character + INDENT_STEP; + return ( + this.getNewLine() + + ' '.repeat(indent) + + this.printer.printNode(ts.EmitHint.Unspecified, returnStatement, fn.getSourceFile()) + + this.getNewLine() + + ' '.repeat(lineAndCharacter.character) + ); + } + private fixGenericCallNoTypeArgsWithContextualType(node: ts.NewExpression): Autofix[] | undefined { const contextualType = this.typeChecker.getContextualType(node); if (!contextualType) { diff --git a/ets2panda/linter/test/main/limit_void_type.ets.autofix.json b/ets2panda/linter/test/main/limit_void_type.ets.autofix.json index 6f5db8552032294b7974848e0d120ab14b44b82d..60cf6b289814a5d50e03aad0eb99b9634cc3fa9f 100644 --- a/ets2panda/linter/test/main/limit_void_type.ets.autofix.json +++ b/ets2panda/linter/test/main/limit_void_type.ets.autofix.json @@ -1111,7 +1111,7 @@ { "start": 4720, "end": 4720, - "replacementText": "\nreturn undefined;\n", + "replacementText": "\n return undefined;\n", "line": 162, "column": 16, "endLine": 162, @@ -1151,7 +1151,7 @@ { "start": 4800, "end": 4800, - "replacementText": "\nreturn undefined;\n", + "replacementText": "\n return undefined;\n ", "line": 165, "column": 8, "endLine": 165, @@ -1289,9 +1289,9 @@ "endColumn": 42 }, { - "start": 5587, - "end": 5587, - "replacementText": "\nreturn undefined;\n", + "start": 5586, + "end": 5586, + "replacementText": "\n return undefined;", "line": 211, "column": 29, "endLine": 211, @@ -1530,9 +1530,9 @@ "endColumn": 44 }, { - "start": 5952, - "end": 5952, - "replacementText": "\nreturn undefined;\n", + "start": 5951, + "end": 5951, + "replacementText": "\n return undefined;", "line": 228, "column": 31, "endLine": 228, @@ -1652,9 +1652,9 @@ "endColumn": 35 }, { - "start": 6160, - "end": 6160, - "replacementText": "\nreturn undefined;\n", + "start": 6159, + "end": 6159, + "replacementText": "\n return undefined;", "line": 246, "column": 22, "endLine": 246, @@ -1692,9 +1692,9 @@ "endColumn": 48 }, { - "start": 6290, - "end": 6290, - "replacementText": "\nreturn undefined;\n", + "start": 6289, + "end": 6289, + "replacementText": "\n return undefined;", "line": 250, "column": 35, "endLine": 250, @@ -1762,9 +1762,9 @@ "endColumn": 35 }, { - "start": 6402, - "end": 6402, - "replacementText": "\nreturn undefined;\n", + "start": 6401, + "end": 6401, + "replacementText": "\n return undefined;", "line": 257, "column": 22, "endLine": 257, @@ -1962,9 +1962,9 @@ "endColumn": 35 }, { - "start": 6812, - "end": 6812, - "replacementText": "\nreturn undefined;\n", + "start": 6809, + "end": 6809, + "replacementText": "\n return undefined;", "line": 287, "column": 21, "endLine": 287, @@ -2086,7 +2086,7 @@ { "start": 6982, "end": 6982, - "replacementText": "\nreturn undefined;\n", + "replacementText": "\n return undefined;\n ", "line": 302, "column": 12, "endLine": 302, @@ -2264,9 +2264,9 @@ "endColumn": 42 }, { - "start": 7333, - "end": 7333, - "replacementText": "\nreturn undefined;\n", + "start": 7332, + "end": 7332, + "replacementText": "\n return undefined;", "line": 325, "column": 28, "endLine": 325, @@ -2388,7 +2388,7 @@ { "start": 7510, "end": 7510, - "replacementText": "\nreturn undefined;\n", + "replacementText": "\n return undefined;\n", "line": 340, "column": 28, "endLine": 340, diff --git a/ets2panda/linter/test/main/limit_void_type.ets.migrate.ets b/ets2panda/linter/test/main/limit_void_type.ets.migrate.ets index b9a240dfe5be2337d97b90856d88d0f2edd8eac0..6b8f40649c5f86a834156b4bc0719f5b4cfd2dc5 100644 --- a/ets2panda/linter/test/main/limit_void_type.ets.migrate.ets +++ b/ets2panda/linter/test/main/limit_void_type.ets.migrate.ets @@ -164,13 +164,13 @@ class A { } function f3(): undefined | Promise { -return undefined; + return undefined; } // type `void` is not allowed in union type class B { m(): undefined | number { -return undefined; -} // type `void` is not allowed in union type + return undefined; + } // type `void` is not allowed in union type } type ss = void; @@ -220,8 +220,7 @@ function foocfe(a: number): string | undefined { if (a >= 0.0) { return "a >= 0"; } - -return undefined; + return undefined; } function foocfe2(a: number): string | undefined { @@ -243,8 +242,7 @@ function greet(hour: number): string | undefined { } else { return undefined; } - -return undefined; + return undefined; } function logOrReturn(flag: boolean): string | undefined { @@ -257,8 +255,7 @@ function logOrReturn(flag: boolean): string | undefined { function justLogs(): string | undefined { console.log("Hello!"); - -return undefined; + return undefined; } function getStatus(code: number): string | undefined { @@ -266,8 +263,7 @@ function getStatus(code: number): string | undefined { case 1: return "OK"; case 2: return "Warning"; } - -return undefined; + return undefined; } function tryThing(): string | undefined { @@ -276,8 +272,7 @@ function tryThing(): string | undefined { } catch (e) { console.error(e); } - -return undefined; + return undefined; } class A1 { @@ -307,9 +302,8 @@ class A1 { // will return return undefined; } - -return undefined; -} + return undefined; + } test3(a: number): undefined | boolean { if (a > 0.0) { @@ -322,8 +316,8 @@ return undefined; test4(): undefined | boolean { // will return -return undefined; -} + return undefined; + } } function test(a: number): boolean | undefined { @@ -349,8 +343,7 @@ function test2(a: number): undefined | boolean { // will return return undefined; } - -return undefined; + return undefined; } function test3(a: number): undefined | boolean { @@ -364,7 +357,7 @@ function test3(a: number): undefined | boolean { function test4(a: number): undefined | boolean { // will return -return undefined; + return undefined; } let unionVoid = (()=>{ diff --git a/ets2panda/linter/test/main/limit_void_type.ets.migrate.json b/ets2panda/linter/test/main/limit_void_type.ets.migrate.json index 0ab5549e55155123c47cafcb9a8f2cafddd7243a..3644453e029b1f234d75a59250d1cd1efbf4ea60 100644 --- a/ets2panda/linter/test/main/limit_void_type.ets.migrate.json +++ b/ets2panda/linter/test/main/limit_void_type.ets.migrate.json @@ -995,9 +995,9 @@ "severity": "ERROR" }, { - "line": 234, + "line": 233, "column": 5, - "endLine": 234, + "endLine": 233, "endColumn": 7, "problem": "DeclWithDuplicateName", "suggest": "", @@ -1005,9 +1005,9 @@ "severity": "ERROR" }, { - "line": 234, + "line": 233, "column": 9, - "endLine": 234, + "endLine": 233, "endColumn": 13, "problem": "LimitedVoidType", "suggest": "", @@ -1015,9 +1015,9 @@ "severity": "ERROR" }, { - "line": 234, + "line": 233, "column": 16, - "endLine": 234, + "endLine": 233, "endColumn": 21, "problem": "LimitedVoidType", "suggest": "", @@ -1025,9 +1025,9 @@ "severity": "ERROR" }, { - "line": 235, + "line": 234, "column": 8, - "endLine": 235, + "endLine": 234, "endColumn": 21, "problem": "LimitedVoidType", "suggest": "", @@ -1035,9 +1035,9 @@ "severity": "ERROR" }, { - "line": 235, + "line": 234, "column": 8, - "endLine": 235, + "endLine": 234, "endColumn": 12, "problem": "LimitedVoidType", "suggest": "", @@ -1045,9 +1045,9 @@ "severity": "ERROR" }, { - "line": 235, + "line": 234, "column": 24, - "endLine": 235, + "endLine": 234, "endColumn": 29, "problem": "LimitedVoidType", "suggest": "", @@ -1055,9 +1055,9 @@ "severity": "ERROR" }, { - "line": 236, + "line": 235, "column": 9, - "endLine": 236, + "endLine": 235, "endColumn": 22, "problem": "LimitedVoidType", "suggest": "", @@ -1065,9 +1065,9 @@ "severity": "ERROR" }, { - "line": 236, + "line": 235, "column": 9, - "endLine": 236, + "endLine": 235, "endColumn": 13, "problem": "LimitedVoidType", "suggest": "", @@ -1075,9 +1075,9 @@ "severity": "ERROR" }, { - "line": 265, + "line": 262, "column": 11, - "endLine": 265, + "endLine": 262, "endColumn": 15, "problem": "SwitchExpression", "suggest": "", @@ -1085,9 +1085,9 @@ "severity": "ERROR" }, { - "line": 266, + "line": 263, "column": 10, - "endLine": 266, + "endLine": 263, "endColumn": 11, "problem": "NumericSemantics", "suggest": "", @@ -1095,9 +1095,9 @@ "severity": "ERROR" }, { - "line": 267, + "line": 264, "column": 10, - "endLine": 267, + "endLine": 264, "endColumn": 11, "problem": "NumericSemantics", "suggest": "", @@ -1105,9 +1105,9 @@ "severity": "ERROR" }, { - "line": 285, + "line": 280, "column": 8, - "endLine": 285, + "endLine": 280, "endColumn": 22, "problem": "LimitedVoidType", "suggest": "", @@ -1115,9 +1115,9 @@ "severity": "ERROR" }, { - "line": 285, + "line": 280, "column": 18, - "endLine": 285, + "endLine": 280, "endColumn": 22, "problem": "LimitedVoidType", "suggest": "", @@ -1125,9 +1125,9 @@ "severity": "ERROR" }, { - "line": 372, + "line": 365, "column": 9, - "endLine": 372, + "endLine": 365, "endColumn": 13, "problem": "LimitedVoidType", "suggest": "", @@ -1135,9 +1135,9 @@ "severity": "ERROR" }, { - "line": 379, + "line": 372, "column": 35, - "endLine": 379, + "endLine": 372, "endColumn": 39, "problem": "LimitedVoidType", "suggest": "", @@ -1145,9 +1145,9 @@ "severity": "ERROR" }, { - "line": 380, + "line": 373, "column": 36, - "endLine": 380, + "endLine": 373, "endColumn": 40, "problem": "LimitedVoidType", "suggest": "", @@ -1155,9 +1155,9 @@ "severity": "ERROR" }, { - "line": 381, + "line": 374, "column": 36, - "endLine": 381, + "endLine": 374, "endColumn": 40, "problem": "LimitedVoidType", "suggest": "", @@ -1165,9 +1165,9 @@ "severity": "ERROR" }, { - "line": 384, + "line": 377, "column": 23, - "endLine": 384, + "endLine": 377, "endColumn": 27, "problem": "LimitedVoidType", "suggest": "", @@ -1175,9 +1175,9 @@ "severity": "ERROR" }, { - "line": 387, + "line": 380, "column": 39, - "endLine": 387, + "endLine": 380, "endColumn": 43, "problem": "LimitedVoidType", "suggest": "", @@ -1185,9 +1185,9 @@ "severity": "ERROR" }, { - "line": 388, + "line": 381, "column": 50, - "endLine": 388, + "endLine": 381, "endColumn": 54, "problem": "LimitedVoidType", "suggest": "", @@ -1195,9 +1195,9 @@ "severity": "ERROR" }, { - "line": 389, + "line": 382, "column": 38, - "endLine": 389, + "endLine": 382, "endColumn": 42, "problem": "LimitedVoidType", "suggest": "", @@ -1205,9 +1205,9 @@ "severity": "ERROR" }, { - "line": 389, + "line": 382, "column": 23, - "endLine": 389, + "endLine": 382, "endColumn": 34, "problem": "LimitedVoidType", "suggest": "", @@ -1215,9 +1215,9 @@ "severity": "ERROR" }, { - "line": 390, + "line": 383, "column": 29, - "endLine": 390, + "endLine": 383, "endColumn": 33, "problem": "LimitedVoidType", "suggest": "", @@ -1225,9 +1225,9 @@ "severity": "ERROR" }, { - "line": 391, + "line": 384, "column": 28, - "endLine": 391, + "endLine": 384, "endColumn": 32, "problem": "LimitedVoidType", "suggest": "",