From 963e3c3aad7d5f13af766f9936f88dcbfcbe4404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=9B=E5=AE=9A=E8=B0=94=E7=9A=84=E7=8C=AB?= Date: Tue, 9 May 2017 04:46:21 +0800 Subject: [PATCH] add option: noImplicit --- lib/rules/getter-return.js | 19 +++++++-- tests/lib/rules/getter-return.js | 70 ++++++++++++++++++++------------ 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/lib/rules/getter-return.js b/lib/rules/getter-return.js index 3e31b9320b3a..ba081853f631 100644 --- a/lib/rules/getter-return.js +++ b/lib/rules/getter-return.js @@ -50,11 +50,23 @@ module.exports = { category: "Best Practices", recommended: false }, - - schema: [] + fixable: null, + schema: [ + { + type: "object", + properties: { + noImplicit: { + type: "boolean" + } + } + } + ] }, create(context) { + + const options = context.options[0] || {}; + let funcInfo = { upper: null, codePath: null, @@ -120,7 +132,8 @@ module.exports = { if (funcInfo.shouldCheck) { funcInfo.hasReturn = true; - if (!node.argument) { + // if noImplicit: true, should also check node.argument + if (options.noImplicit && !node.argument) { context.report({ node, message: "Expected to return a value in {{name}}.", diff --git a/tests/lib/rules/getter-return.js b/tests/lib/rules/getter-return.js index a489b636663d..fab0a9a2030d 100644 --- a/tests/lib/rules/getter-return.js +++ b/tests/lib/rules/getter-return.js @@ -23,54 +23,74 @@ const name = "getter 'bar'"; const noReturnMessage = `Expected to return a value in ${name}.`; const noLastReturnMessage = `Expected to return a value at the end of ${name}.`; const parserOptions = { ecmaVersion: 6 }; +const options = [{ noImplicit: true }]; ruleTester.run("enforce-return-in-getter", rule, { valid: [ - // test obj: get + // test obj: get, option: {noImplicit: false} { code: "var foo = { get bar(){return true;} };" }, + { code: "var foo = { get bar(){return;} };" }, { code: "var foo = { bar: function(){return true;} };" }, + { code: "var foo = { bar: function(){return;} };" }, { code: "var foo = { bar(){return true;} };", parserOptions }, - { code: "var foo = { bar: function(){} };" }, - { code: "var foo = { bar(){} };", parserOptions }, + { code: "var foo = { bar(){return;} };", parserOptions }, - // test class: get + // test class: get, option: {noImplicit: false} { code: "class foo { get bar(){return true;} }", parserOptions }, { code: "class foo { get bar(){if(baz){return true;} else {return false;} } }", parserOptions }, + { code: "class foo { get bar(){if(baz){return;} else {return false;} } }", parserOptions }, { code: "class foo { get(){return true;} }", parserOptions }, + { code: "var foo = { get bar(){if(bar) {return;} return true;} };", parserOptions, errors: [] }, - // add object.defineProperty + // test object.defineProperty(s), option: {noImplicit: false} { code: "Object.defineProperty(foo, \"bar\", { get: function () {return true;}});" }, + { code: "Object.defineProperty(foo, \"bar\", { get: function () {return;}});" }, + { code: "Object.defineProperies(foo, { bar: { get: function () {return true;}} });" }, + { code: "Object.defineProperies(foo, { bar: { get: function () {return;}} });" }, + + // test option: {noImplicit: true} + { code: "var foo = { get bar(){return true;} };", options }, + { code: "class foo { get bar(){return true;} }", options, parserOptions }, + { code: "Object.defineProperty(foo, \"bar\", { get: function () {return true;}});", options }, + { code: "Object.defineProperies(foo, { bar: { get: function () {return true;}} });", options }, // not getter. - { code: "var get = function(){};" } + { code: "var get = function(){};" }, + { code: "var get = function(){ return true; };" }, + { code: "var foo = { bar: function(){} };" }, + { code: "var foo = { bar: function(){ return true; } };" }, + { code: "var foo = { bar(){} };", parserOptions }, + { code: "var foo = { bar(){ return true; } };", parserOptions } ], invalid: [ - // TODO: why data: { name: "getter 'bar'"} is not working? // test obj: get - { code: "var foo = { get bar() {} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar() {return;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar() {return; ;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar() {return 1; return;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar() {return; return 1;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar(){if(bar) {return true;}} };", parserOptions, errors: [{ message: noLastReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar(){if(bar) {return true;} return;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar(){if(bar) {return true;} ;} };", parserOptions, errors: [{ message: noLastReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "var foo = { get bar(){if(bar) {return;} return true;} };", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, + { code: "var foo = { get bar() {} };", parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "var foo = { get bar() {return;} };", options, parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "var foo = { get bar() {return; ;} };", options, parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "var foo = { get bar() {return; return 1;} };", options, parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "var foo = { get bar(){if(bar) {return true;}} };", parserOptions, errors: [{ message: noLastReturnMessage }] }, + { code: "var foo = { get bar(){if(bar) {return true;} return;} };", options, parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "var foo = { get bar(){if(bar) {return true;} ;} };", parserOptions, errors: [{ message: noLastReturnMessage }] }, + { code: "var foo = { get bar(){if(bar) {return;} return true;} };", options, parserOptions, errors: [{ message: noReturnMessage }] }, // test class: get - { code: "class foo { get bar(){} }", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "class foo { get bar(){return;} }", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "class foo { get bar(){if(bar) {return true;}} }", parserOptions, errors: [{ message: noLastReturnMessage, data: { name: "getter 'bar'" } }] }, - { code: "class foo { get bar(){if(bar) {return;} return true;} }", parserOptions, errors: [{ message: noReturnMessage, data: { name: "getter 'bar'" } }] }, - - // add object.defineProperty - { code: "Object.defineProperty(foo, \"bar\", { get: function (){return;}});", errors: [{ message: "Expected to return a value in method 'get'.", data: { name: "getter 'bar'" } }] }, - { code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return true;}}});", errors: [{ message: "Expected to return a value at the end of method 'get'.", data: { name: "getter 'bar'" } }] }, - { code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return;} return true;}});", errors: [{ message: "Expected to return a value in method 'get'.", data: { name: "getter 'bar'" } }] } + { code: "class foo { get bar(){} }", parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "class foo { get bar(){} }", options, parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "class foo { get bar(){return;} }", options, parserOptions, errors: [{ message: noReturnMessage }] }, + { code: "class foo { get bar(){if(bar) {return true;}} }", options, parserOptions, errors: [{ message: noLastReturnMessage }] }, + { code: "class foo { get bar(){if(bar) {return;} return true;} }", options, parserOptions, errors: [{ message: noReturnMessage }] }, + + // test object.defineProperty + { code: "Object.defineProperty(foo, \"bar\", { get: function (){return;}});", options, errors: [{ message: "Expected to return a value in method 'get'." }] }, + { code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return true;}}});", errors: [{ message: "Expected to return a value at the end of method 'get'." }] }, + { code: "Object.defineProperty(foo, \"bar\", { get: function (){if(bar) {return;} return true;}});", options: [{ noImplicit: true }], errors: [{ message: "Expected to return a value in method 'get'." }] }, + + // test option: {noImplicit: true} + { code: "Object.defineProperty(foo, \"bar\", { get: function (){return;}});", options, errors: [{ message: "Expected to return a value in method 'get'." }] } ] });