From 937625df9bb0315ab2907876a2693d638f829753 Mon Sep 17 00:00:00 2001 From: Dimitri Benin Date: Sat, 31 Dec 2016 03:12:44 +0100 Subject: [PATCH] implements fixer for `jasmine-no-lambda-expression-callbacks` and according tests --- CHANGELOG.md | 3 +- src/jasmineNoLambdaExpressionCallbacksRule.ts | 21 ++++++- ...ambdaExpressionCallbacksRuleDefault.ts.fix | 59 +++++++++++++++++++ ...bdaExpressionCallbacksRuleDefault.ts.lint} | 10 ++-- ...ExpressionCallbacksRuleDefaultIIFE1.ts.fix | 4 ++ ...pressionCallbacksRuleDefaultIIFE1.ts.lint} | 0 ...ExpressionCallbacksRuleDefaultIIFE2.ts.fix | 4 ++ ...pressionCallbacksRuleDefaultIIFE2.ts.lint} | 0 ...ExpressionCallbacksRuleDefaultIIFE3.ts.fix | 4 ++ ...pressionCallbacksRuleDefaultIIFE3.ts.lint} | 0 ...pressionCallbacksRuleDefaultWrapped.ts.fix | 4 ++ ...essionCallbacksRuleDefaultWrapped.ts.lint} | 0 .../default/tslint.json | 0 13 files changed, 102 insertions(+), 7 deletions(-) create mode 100644 src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.fix rename src/tests/{jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefault.ts.lint => jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.lint} (82%) create mode 100644 src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.fix rename src/tests/{jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE1.ts.lint => jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.lint} (100%) create mode 100644 src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.fix rename src/tests/{jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE2.ts.lint => jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.lint} (100%) create mode 100644 src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.fix rename src/tests/{jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE3.ts.lint => jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.lint} (100%) create mode 100644 src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.fix rename src/tests/{jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultWrapped.ts.lint => jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.lint} (100%) rename src/tests/{jasmineNoLambdaExpressionCallback => jasmineNoLambdaExpressionCallbacks}/default/tslint.json (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40794ad..b12838e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ Change Log === -v2.0.1 +v2.1.0 --- +* [new-fixer] `jasmine-no-lambda-expression-callbacks` * [enhancement] Added preliminary checks for `jasmine-no-lambda-expression-callbacks` rule to skip walking file if there are no jasmine top-level statements. diff --git a/src/jasmineNoLambdaExpressionCallbacksRule.ts b/src/jasmineNoLambdaExpressionCallbacksRule.ts index 725930f..d2821e7 100644 --- a/src/jasmineNoLambdaExpressionCallbacksRule.ts +++ b/src/jasmineNoLambdaExpressionCallbacksRule.ts @@ -1,4 +1,4 @@ -import { IRuleMetadata, RuleFailure, Rules, RuleWalker, Utils } from 'tslint/lib'; +import { Fix, IRuleMetadata, Replacement, RuleFailure, Rules, RuleWalker, Utils } from 'tslint/lib'; import { ArrowFunction, CallExpression, Expression, SourceFile, SyntaxKind } from 'typescript'; import { isJasmineDescribe, isJasmineIt, isJasmineSetupTeardown, isJasmineTest } from './utils/jasmineUtils'; import find = require('lodash/find'); @@ -50,7 +50,7 @@ class JasmineNoLambdaExpressionCallbacksWalker extends RuleWalker { const invalidLambdaExpression = this.getInvalidLambdaExpression(node); if (invalidLambdaExpression) { - this.addFailureAtNode(invalidLambdaExpression, Rule.FAILURE_STRING); + this.addFailureAtNode(invalidLambdaExpression, Rule.FAILURE_STRING, this.getFix(invalidLambdaExpression)); } super.visitCallExpression(node); @@ -82,4 +82,21 @@ class JasmineNoLambdaExpressionCallbacksWalker extends RuleWalker { return null; } + + private getFix(lambdaExpression:ArrowFunction):Fix { + const arrowToken = lambdaExpression.equalsGreaterThanToken; + const replacements = [ + new Replacement(lambdaExpression.getStart(), 0, 'function'), + new Replacement(arrowToken.getStart(), lambdaExpression.body.getStart() - arrowToken.getStart(), '') + ]; + + if (lambdaExpression.body.kind !== SyntaxKind.Block) { + replacements.push( + new Replacement(lambdaExpression.body.getStart(), 0, '{ return '), + new Replacement(lambdaExpression.getStart() + lambdaExpression.getWidth(), 0, '; }') + ); + } + + return new Fix(Rule.metadata.ruleName, replacements); + } } diff --git a/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.fix b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.fix new file mode 100644 index 0000000..105d661 --- /dev/null +++ b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.fix @@ -0,0 +1,59 @@ +describe("this is ok", function() { + it("this is ok", function() {}); + it("this is ok", wrap(function() {})); + + describe("this is still ok", wrapAgain(function() {})); +}); + +// still ok +(() => {})(); + +// still ok +someOtherCallWithLambda(() => {}) + +describe("this", function() { + it("is an error", function() { + }); +}); + +fdescribe("this, too", function() { return doSomething(); }); +fdescribe("this, too", function() { return doSomething(); }); +fdescribe("this, too", function(){ return doSomething(); }); + +xdescribe("this, too", function() { +}); + +describe("this, too", function() { + it("is an error", function() { + }); + + fit("is an error", function() { + }); + + xit("is an error", function() { + }); + + beforeEach(function() { + }); + + beforeAll(function() { + }); + + afterEach(function() { + }); + + afterAll(function() { + }); +}); + +fdescribe("this, too", wrapCallback(function() { +})); + +describe("this, too", wrapCallback(function() { + it("hi", wrapAgain(function() { + })); + + afterEach(yetAnotherWrap(function() { + })); +})); + diff --git a/src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefault.ts.lint b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.lint similarity index 82% rename from src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefault.ts.lint rename to src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.lint index d082305..69d77b1 100644 --- a/src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefault.ts.lint +++ b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefault.ts.lint @@ -20,10 +20,12 @@ describe("this", () => { }); ~ [no-lambda-callback] -fdescribe("this, too", () => { - ~~~~~~~ -}); -~ [no-lambda-callback] +fdescribe("this, too", () => doSomething()); + ~~~~~~~~~~~~~~~~~~~ [no-lambda-callback] +fdescribe("this, too", () =>doSomething()); + ~~~~~~~~~~~~~~~~~~ [no-lambda-callback] +fdescribe("this, too", ()=>doSomething()); + ~~~~~~~~~~~~~~~~~ [no-lambda-callback] xdescribe("this, too", () => { ~~~~~~~ diff --git a/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.fix b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.fix new file mode 100644 index 0000000..faa39a5 --- /dev/null +++ b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.fix @@ -0,0 +1,4 @@ +(function test() { + describe('some test in an IIFE', function() {}); +})(); + diff --git a/src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE1.ts.lint b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.lint similarity index 100% rename from src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE1.ts.lint rename to src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE1.ts.lint diff --git a/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.fix b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.fix new file mode 100644 index 0000000..85f5997 --- /dev/null +++ b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.fix @@ -0,0 +1,4 @@ +(() => { + describe('some test in an IIFE', function() {}); +})(); + diff --git a/src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE2.ts.lint b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.lint similarity index 100% rename from src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE2.ts.lint rename to src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE2.ts.lint diff --git a/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.fix b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.fix new file mode 100644 index 0000000..2af4dae --- /dev/null +++ b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.fix @@ -0,0 +1,4 @@ +(function test() { + describe('some test in an other IIFE', function() {}); +}()); + diff --git a/src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE3.ts.lint b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.lint similarity index 100% rename from src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultIIFE3.ts.lint rename to src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultIIFE3.ts.lint diff --git a/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.fix b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.fix new file mode 100644 index 0000000..e461b6a --- /dev/null +++ b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.fix @@ -0,0 +1,4 @@ +export function test() { + describe('some test in a callback', function() {}); +} + diff --git a/src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultWrapped.ts.lint b/src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.lint similarity index 100% rename from src/tests/jasmineNoLambdaExpressionCallback/default/jasmineNoLambdaExpressionCallbackRuleDefaultWrapped.ts.lint rename to src/tests/jasmineNoLambdaExpressionCallbacks/default/jasmineNoLambdaExpressionCallbacksRuleDefaultWrapped.ts.lint diff --git a/src/tests/jasmineNoLambdaExpressionCallback/default/tslint.json b/src/tests/jasmineNoLambdaExpressionCallbacks/default/tslint.json similarity index 100% rename from src/tests/jasmineNoLambdaExpressionCallback/default/tslint.json rename to src/tests/jasmineNoLambdaExpressionCallbacks/default/tslint.json