eslint-plugin-sonarjs 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/rules/cognitive-complexity.js +48 -31
- package/lib/rules/cognitive-complexity.js.map +1 -1
- package/lib/rules/no-element-overwrite.js +17 -7
- package/lib/rules/no-element-overwrite.js.map +1 -1
- package/lib/rules/no-extra-arguments.js +44 -9
- package/lib/rules/no-extra-arguments.js.map +1 -1
- package/lib/rules/no-identical-conditions.js +14 -2
- package/lib/rules/no-identical-conditions.js.map +1 -1
- package/lib/rules/no-identical-expressions.js +23 -5
- package/lib/rules/no-identical-expressions.js.map +1 -1
- package/lib/rules/no-identical-functions.js +17 -5
- package/lib/rules/no-identical-functions.js.map +1 -1
- package/lib/rules/prefer-immediate-return.js +10 -1
- package/lib/rules/prefer-immediate-return.js.map +1 -1
- package/lib/utils/locations.d.ts +28 -1
- package/lib/utils/locations.js +38 -0
- package/lib/utils/locations.js.map +1 -1
- package/package.json +1 -1
|
@@ -21,24 +21,29 @@
|
|
|
21
21
|
// https://jira.sonarsource.com/browse/RSPEC-3776
|
|
22
22
|
var nodes_1 = require("../utils/nodes");
|
|
23
23
|
var locations_1 = require("../utils/locations");
|
|
24
|
-
var MESSAGE = "Refactor this function to reduce its Cognitive Complexity from {{complexity}} to the {{threshold}} allowed.";
|
|
25
24
|
var DEFAULT_THRESHOLD = 15;
|
|
26
25
|
var rule = {
|
|
27
26
|
meta: {
|
|
28
|
-
schema: [
|
|
27
|
+
schema: [
|
|
28
|
+
{ type: "integer", minimum: 0 },
|
|
29
|
+
{
|
|
30
|
+
// internal parameter
|
|
31
|
+
enum: ["sonar-runtime"],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
29
34
|
},
|
|
30
35
|
create: function (context) {
|
|
31
36
|
var threshold = context.options[0] !== undefined ? context.options[0] : DEFAULT_THRESHOLD;
|
|
32
37
|
/** Complexity of the current function if it is *not* considered nested to the first level function */
|
|
33
|
-
var complexityIfNotNested =
|
|
38
|
+
var complexityIfNotNested = [];
|
|
34
39
|
/** Complexity of the current function if it is considered nested to the first level function */
|
|
35
|
-
var complexityIfNested =
|
|
40
|
+
var complexityIfNested = [];
|
|
36
41
|
/** Current nesting level (number of enclosing control flow statements and functions) */
|
|
37
42
|
var nesting = 0;
|
|
38
43
|
/** Indicator if the current top level function has a structural (generated by control flow statements) complexity */
|
|
39
44
|
var topLevelHasStructuralComplexity = false;
|
|
40
45
|
/** Own (not including nested functions) complexity of the current top function */
|
|
41
|
-
var topLevelOwnComplexity =
|
|
46
|
+
var topLevelOwnComplexity = [];
|
|
42
47
|
/** Nodes that should increase nesting level */
|
|
43
48
|
var nestingNodes = new Set();
|
|
44
49
|
/** Set of already considered (with already computed complexity) logical expressions */
|
|
@@ -105,13 +110,13 @@ var rule = {
|
|
|
105
110
|
if (enclosingFunctions.length === 0) {
|
|
106
111
|
// top level function
|
|
107
112
|
topLevelHasStructuralComplexity = false;
|
|
108
|
-
topLevelOwnComplexity =
|
|
113
|
+
topLevelOwnComplexity = [];
|
|
109
114
|
secondLevelFunctions = [];
|
|
110
115
|
}
|
|
111
116
|
else if (enclosingFunctions.length === 1) {
|
|
112
117
|
// second level function
|
|
113
|
-
complexityIfNotNested =
|
|
114
|
-
complexityIfNested =
|
|
118
|
+
complexityIfNotNested = [];
|
|
119
|
+
complexityIfNested = [];
|
|
115
120
|
}
|
|
116
121
|
else {
|
|
117
122
|
nesting++;
|
|
@@ -126,7 +131,7 @@ var rule = {
|
|
|
126
131
|
if (topLevelHasStructuralComplexity) {
|
|
127
132
|
var totalComplexity_1 = topLevelOwnComplexity;
|
|
128
133
|
secondLevelFunctions.forEach(function (secondLevelFunction) {
|
|
129
|
-
totalComplexity_1
|
|
134
|
+
totalComplexity_1 = totalComplexity_1.concat(secondLevelFunction.complexityIfNested);
|
|
130
135
|
});
|
|
131
136
|
checkFunction(totalComplexity_1, locations_1.getMainFunctionTokenLocation(node, nodes_1.getParent(context), context));
|
|
132
137
|
}
|
|
@@ -154,12 +159,13 @@ var rule = {
|
|
|
154
159
|
}
|
|
155
160
|
function visitIfStatement(ifStatement) {
|
|
156
161
|
var parent = nodes_1.getParent(context);
|
|
162
|
+
var ifLoc = locations_1.getFirstToken(ifStatement, context).loc;
|
|
157
163
|
// if the current `if` statement is `else if`, do not count it in structural complexity
|
|
158
164
|
if (nodes_1.isIfStatement(parent) && parent.alternate === ifStatement) {
|
|
159
|
-
addComplexity();
|
|
165
|
+
addComplexity(ifLoc);
|
|
160
166
|
}
|
|
161
167
|
else {
|
|
162
|
-
addStructuralComplexity();
|
|
168
|
+
addStructuralComplexity(ifLoc);
|
|
163
169
|
}
|
|
164
170
|
// always increase nesting level inside `then` statement
|
|
165
171
|
nestingNodes.add(ifStatement.consequent);
|
|
@@ -168,15 +174,16 @@ var rule = {
|
|
|
168
174
|
// - add +1 complexity
|
|
169
175
|
if (ifStatement.alternate && !nodes_1.isIfStatement(ifStatement.alternate)) {
|
|
170
176
|
nestingNodes.add(ifStatement.alternate);
|
|
171
|
-
|
|
177
|
+
var elseTokenLoc = locations_1.getFirstTokenAfter(ifStatement.consequent, context).loc;
|
|
178
|
+
addComplexity(elseTokenLoc);
|
|
172
179
|
}
|
|
173
180
|
}
|
|
174
181
|
function visitLoop(loop) {
|
|
175
|
-
addStructuralComplexity();
|
|
182
|
+
addStructuralComplexity(locations_1.getFirstToken(loop, context).loc);
|
|
176
183
|
nestingNodes.add(loop.body);
|
|
177
184
|
}
|
|
178
185
|
function visitSwitchStatement(switchStatement) {
|
|
179
|
-
addStructuralComplexity();
|
|
186
|
+
addStructuralComplexity(locations_1.getFirstToken(switchStatement, context).loc);
|
|
180
187
|
for (var _i = 0, _a = switchStatement.cases; _i < _a.length; _i++) {
|
|
181
188
|
var switchCase = _a[_i];
|
|
182
189
|
nestingNodes.add(switchCase);
|
|
@@ -184,15 +191,16 @@ var rule = {
|
|
|
184
191
|
}
|
|
185
192
|
function visitContinueOrBreakStatement(statement) {
|
|
186
193
|
if (statement.label) {
|
|
187
|
-
addComplexity();
|
|
194
|
+
addComplexity(locations_1.getFirstToken(statement, context).loc);
|
|
188
195
|
}
|
|
189
196
|
}
|
|
190
197
|
function visitCatchClause(catchClause) {
|
|
191
|
-
addStructuralComplexity();
|
|
198
|
+
addStructuralComplexity(locations_1.getFirstToken(catchClause, context).loc);
|
|
192
199
|
nestingNodes.add(catchClause.body);
|
|
193
200
|
}
|
|
194
201
|
function visitConditionalExpression(conditionalExpression) {
|
|
195
|
-
|
|
202
|
+
var questionTokenLoc = locations_1.getFirstTokenAfter(conditionalExpression.test, context).loc;
|
|
203
|
+
addStructuralComplexity(questionTokenLoc);
|
|
196
204
|
nestingNodes.add(conditionalExpression.consequent);
|
|
197
205
|
nestingNodes.add(conditionalExpression.alternate);
|
|
198
206
|
}
|
|
@@ -203,7 +211,8 @@ var rule = {
|
|
|
203
211
|
for (var _i = 0, flattenedLogicalExpressions_1 = flattenedLogicalExpressions; _i < flattenedLogicalExpressions_1.length; _i++) {
|
|
204
212
|
var current = flattenedLogicalExpressions_1[_i];
|
|
205
213
|
if (!previous || previous.operator !== current.operator) {
|
|
206
|
-
|
|
214
|
+
var operatorTokenLoc = locations_1.getFirstTokenAfter(logicalExpression.left, context).loc;
|
|
215
|
+
addComplexity(operatorTokenLoc);
|
|
207
216
|
}
|
|
208
217
|
previous = current;
|
|
209
218
|
}
|
|
@@ -216,37 +225,45 @@ var rule = {
|
|
|
216
225
|
}
|
|
217
226
|
return [];
|
|
218
227
|
}
|
|
219
|
-
function addStructuralComplexity() {
|
|
228
|
+
function addStructuralComplexity(location) {
|
|
220
229
|
var added = nesting + 1;
|
|
230
|
+
var complexityPoint = { complexity: added, location: location };
|
|
221
231
|
if (enclosingFunctions.length === 1) {
|
|
222
232
|
// top level function
|
|
223
233
|
topLevelHasStructuralComplexity = true;
|
|
224
|
-
topLevelOwnComplexity
|
|
234
|
+
topLevelOwnComplexity.push(complexityPoint);
|
|
225
235
|
}
|
|
226
236
|
else {
|
|
227
237
|
// second+ level function
|
|
228
|
-
complexityIfNested
|
|
229
|
-
complexityIfNotNested
|
|
238
|
+
complexityIfNested.push({ complexity: added + 1, location: location });
|
|
239
|
+
complexityIfNotNested.push(complexityPoint);
|
|
230
240
|
}
|
|
231
241
|
}
|
|
232
|
-
function addComplexity() {
|
|
242
|
+
function addComplexity(location) {
|
|
243
|
+
var complexityPoint = { complexity: 1, location: location };
|
|
233
244
|
if (enclosingFunctions.length === 1) {
|
|
234
245
|
// top level function
|
|
235
|
-
topLevelOwnComplexity
|
|
246
|
+
topLevelOwnComplexity.push(complexityPoint);
|
|
236
247
|
}
|
|
237
248
|
else {
|
|
238
249
|
// second+ level function
|
|
239
|
-
complexityIfNested
|
|
240
|
-
complexityIfNotNested
|
|
250
|
+
complexityIfNested.push(complexityPoint);
|
|
251
|
+
complexityIfNotNested.push(complexityPoint);
|
|
241
252
|
}
|
|
242
253
|
}
|
|
243
254
|
function checkFunction(complexity, loc) {
|
|
244
|
-
if (complexity
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
255
|
+
if (complexity === void 0) { complexity = []; }
|
|
256
|
+
var complexityAmount = complexity.reduce(function (acc, cur) { return acc + cur.complexity; }, 0);
|
|
257
|
+
if (complexityAmount > threshold) {
|
|
258
|
+
var secondaryLocations = complexity.map(function (complexityPoint) {
|
|
259
|
+
var complexity = complexityPoint.complexity, location = complexityPoint.location;
|
|
260
|
+
var message = complexity === 1 ? "+1" : "+" + complexity + " (incl. " + (complexity - 1) + " for nesting)";
|
|
261
|
+
return locations_1.issueLocation(location, undefined, message);
|
|
249
262
|
});
|
|
263
|
+
locations_1.report(context, {
|
|
264
|
+
message: "Refactor this function to reduce its Cognitive Complexity from " + complexityAmount + " to the " + threshold + " allowed.",
|
|
265
|
+
loc: loc,
|
|
266
|
+
}, secondaryLocations, complexityAmount - threshold);
|
|
250
267
|
}
|
|
251
268
|
}
|
|
252
269
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cognitive-complexity.js","sourceRoot":"","sources":["../../src/rules/cognitive-complexity.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,wCAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"cognitive-complexity.js","sourceRoot":"","sources":["../../src/rules/cognitive-complexity.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,19 @@
|
|
|
21
21
|
// https://jira.sonarsource.com/browse/RSPEC-4143
|
|
22
22
|
var equivalence_1 = require("../utils/equivalence");
|
|
23
23
|
var nodes_1 = require("../utils/nodes");
|
|
24
|
+
var locations_1 = require("../utils/locations");
|
|
25
|
+
var message = function (index, line) {
|
|
26
|
+
return "Verify this is the index that was intended; \"" + index + "\" was already set on line " + line + ".";
|
|
27
|
+
};
|
|
24
28
|
var rule = {
|
|
29
|
+
meta: {
|
|
30
|
+
schema: [
|
|
31
|
+
{
|
|
32
|
+
// internal parameter
|
|
33
|
+
enum: ["sonar-runtime"],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
25
37
|
create: function (context) {
|
|
26
38
|
return {
|
|
27
39
|
SwitchCase: function (node) {
|
|
@@ -48,14 +60,12 @@ var rule = {
|
|
|
48
60
|
}
|
|
49
61
|
var sameKeyWriteUsage = usedKeys.get(keyWriteUsage.indexOrKey);
|
|
50
62
|
if (sameKeyWriteUsage && sameKeyWriteUsage.node.loc) {
|
|
51
|
-
|
|
63
|
+
var sameKeyWriteUsageLoc = sameKeyWriteUsage.node.loc;
|
|
64
|
+
var secondaryLocations = [locations_1.issueLocation(sameKeyWriteUsageLoc, sameKeyWriteUsageLoc, "Original value")];
|
|
65
|
+
locations_1.report(context, {
|
|
52
66
|
node: keyWriteUsage.node,
|
|
53
|
-
message:
|
|
54
|
-
|
|
55
|
-
index: keyWriteUsage.indexOrKey,
|
|
56
|
-
line: String(sameKeyWriteUsage.node.loc.start.line),
|
|
57
|
-
},
|
|
58
|
-
});
|
|
67
|
+
message: message(keyWriteUsage.indexOrKey, String(sameKeyWriteUsage.node.loc.start.line)),
|
|
68
|
+
}, secondaryLocations);
|
|
59
69
|
}
|
|
60
70
|
usedKeys.set(keyWriteUsage.indexOrKey, keyWriteUsage);
|
|
61
71
|
collection = keyWriteUsage.collectionNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-element-overwrite.js","sourceRoot":"","sources":["../../src/rules/no-element-overwrite.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,oDAAqD;AACrD,wCAOwB;
|
|
1
|
+
{"version":3,"file":"no-element-overwrite.js","sourceRoot":"","sources":["../../src/rules/no-element-overwrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,16 @@
|
|
|
20
20
|
*/
|
|
21
21
|
// https://jira.sonarsource.com/browse/RSPEC-930
|
|
22
22
|
var nodes_1 = require("../utils/nodes");
|
|
23
|
+
var locations_1 = require("../utils/locations");
|
|
23
24
|
var rule = {
|
|
25
|
+
meta: {
|
|
26
|
+
schema: [
|
|
27
|
+
{
|
|
28
|
+
// internal parameter
|
|
29
|
+
enum: ["sonar-runtime"],
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
},
|
|
24
33
|
create: function (context) {
|
|
25
34
|
var callExpressionsToCheck = [];
|
|
26
35
|
var usingArguments = new Set();
|
|
@@ -64,7 +73,7 @@ var rule = {
|
|
|
64
73
|
callExpressionsToCheck.forEach(function (_a) {
|
|
65
74
|
var callExpr = _a.callExpr, functionNode = _a.functionNode;
|
|
66
75
|
if (!usingArguments.has(functionNode) && !emptyFunctions.has(functionNode)) {
|
|
67
|
-
|
|
76
|
+
reportIssue(callExpr, functionNode);
|
|
68
77
|
}
|
|
69
78
|
});
|
|
70
79
|
},
|
|
@@ -100,17 +109,43 @@ var rule = {
|
|
|
100
109
|
}
|
|
101
110
|
}
|
|
102
111
|
}
|
|
103
|
-
function
|
|
112
|
+
function reportIssue(callExpr, functionNode) {
|
|
113
|
+
var paramLength = functionNode.params.length;
|
|
114
|
+
var argsLength = callExpr.arguments.length;
|
|
104
115
|
// prettier-ignore
|
|
105
|
-
var expectedArguments =
|
|
106
|
-
|
|
107
|
-
|
|
116
|
+
var expectedArguments = paramLength === 0 ? "no arguments" :
|
|
117
|
+
paramLength === 1 ? "1 argument" :
|
|
118
|
+
paramLength + " arguments";
|
|
108
119
|
// prettier-ignore
|
|
109
|
-
var providedArguments =
|
|
110
|
-
|
|
111
|
-
|
|
120
|
+
var providedArguments = argsLength === 0 ? "none was" :
|
|
121
|
+
argsLength === 1 ? "1 was" :
|
|
122
|
+
argsLength + " were";
|
|
112
123
|
var message = "This function expects " + expectedArguments + ", but " + providedArguments + " provided.";
|
|
113
|
-
|
|
124
|
+
locations_1.report(context, {
|
|
125
|
+
message: message,
|
|
126
|
+
node: callExpr,
|
|
127
|
+
}, getSecondaryLocations(functionNode));
|
|
128
|
+
}
|
|
129
|
+
function getSecondaryLocations(functionNode) {
|
|
130
|
+
var paramLength = functionNode.params.length;
|
|
131
|
+
var secondaryLocations = [];
|
|
132
|
+
if (paramLength > 0) {
|
|
133
|
+
var startLoc = functionNode.params[0].loc;
|
|
134
|
+
var endLoc = functionNode.params[paramLength - 1].loc;
|
|
135
|
+
// defensive check as `loc` property may be undefined according to
|
|
136
|
+
// its type declaration
|
|
137
|
+
if (startLoc && endLoc) {
|
|
138
|
+
secondaryLocations.push(locations_1.issueLocation(startLoc, endLoc, "Formal parameters"));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// as we're not providing parent node, `getMainFunctionTokenLocation` may return `undefined`
|
|
143
|
+
var fnToken = locations_1.getMainFunctionTokenLocation(functionNode, undefined, context);
|
|
144
|
+
if (fnToken) {
|
|
145
|
+
secondaryLocations.push(locations_1.issueLocation(fnToken, fnToken, "Formal parameters"));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return secondaryLocations;
|
|
114
149
|
}
|
|
115
150
|
},
|
|
116
151
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-extra-arguments.js","sourceRoot":"","sources":["../../src/rules/no-extra-arguments.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,gDAAgD;AAIhD,wCAMwB;
|
|
1
|
+
{"version":3,"file":"no-extra-arguments.js","sourceRoot":"","sources":["../../src/rules/no-extra-arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,16 @@
|
|
|
21
21
|
// https://jira.sonarsource.com/browse/RSPEC-1862
|
|
22
22
|
var nodes_1 = require("../utils/nodes");
|
|
23
23
|
var equivalence_1 = require("../utils/equivalence");
|
|
24
|
+
var locations_1 = require("../utils/locations");
|
|
24
25
|
var rule = {
|
|
26
|
+
meta: {
|
|
27
|
+
schema: [
|
|
28
|
+
{
|
|
29
|
+
// internal parameter
|
|
30
|
+
enum: ["sonar-runtime"],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
25
34
|
create: function (context) {
|
|
26
35
|
return {
|
|
27
36
|
IfStatement: function (node) {
|
|
@@ -32,8 +41,11 @@ var rule = {
|
|
|
32
41
|
if (nodes_1.isIfStatement(statement)) {
|
|
33
42
|
if (equivalence_1.areEquivalent(condition, statement.test, context.getSourceCode())) {
|
|
34
43
|
var line = ifStmt.loc && ifStmt.loc.start.line;
|
|
35
|
-
if (line
|
|
36
|
-
|
|
44
|
+
if (line && condition.loc) {
|
|
45
|
+
locations_1.report(context, {
|
|
46
|
+
message: "This branch duplicates the one on line " + line,
|
|
47
|
+
node: statement.test,
|
|
48
|
+
}, [locations_1.issueLocation(condition.loc, condition.loc, "Original")]);
|
|
37
49
|
}
|
|
38
50
|
}
|
|
39
51
|
statement = statement.alternate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-identical-conditions.js","sourceRoot":"","sources":["../../src/rules/no-identical-conditions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,wCAA+C;AAC/C,oDAAqD;
|
|
1
|
+
{"version":3,"file":"no-identical-conditions.js","sourceRoot":"","sources":["../../src/rules/no-identical-conditions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,wCAA+C;AAC/C,oDAAqD;AACrD,gDAA2D;AAE3D,IAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,MAAM,EAAE;YACN;gBACE,qBAAqB;gBACrB,IAAI,EAAE,CAAC,eAAe,CAAC;aACxB;SACF;KACF;IACD,MAAM,YAAC,OAAyB;QAC9B,OAAO;YACL,WAAW,YAAC,IAAiB;gBAC3B,IAAM,MAAM,GAAG,IAA0B,CAAC;gBAC1C,IAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;gBAC9B,IAAI,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBACjC,OAAO,SAAS,EAAE;oBAChB,IAAI,qBAAa,CAAC,SAAS,CAAC,EAAE;wBAC5B,IAAI,2BAAa,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE;4BACrE,IAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;4BACjD,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE;gCACzB,kBAAM,CACJ,OAAO,EACP;oCACE,OAAO,EAAE,4CAA0C,IAAM;oCACzD,IAAI,EAAE,SAAS,CAAC,IAAI;iCACrB,EACD,CAAC,yBAAa,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAC1D,CAAC;6BACH;yBACF;wBACD,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;qBACjC;yBAAM;wBACL,MAAM;qBACP;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,iBAAS,IAAI,CAAC"}
|
|
@@ -21,9 +21,13 @@
|
|
|
21
21
|
// https://jira.sonarsource.com/browse/RSPEC-1764
|
|
22
22
|
var nodes_1 = require("../utils/nodes");
|
|
23
23
|
var equivalence_1 = require("../utils/equivalence");
|
|
24
|
+
var locations_1 = require("../utils/locations");
|
|
24
25
|
var EQUALITY_OPERATOR_TOKEN_KINDS = new Set(["==", "===", "!=", "!=="]);
|
|
25
26
|
// consider only binary expressions with these operators
|
|
26
27
|
var RELEVANT_OPERATOR_TOKEN_KINDS = new Set(["&&", "||", "/", "-", "<<", ">>", "<", "<=", ">", ">="]);
|
|
28
|
+
var message = function (operator) {
|
|
29
|
+
return "Correct one of the identical sub-expressions on both sides of operator \"" + operator + "\"";
|
|
30
|
+
};
|
|
27
31
|
function hasRelevantOperator(node) {
|
|
28
32
|
return (RELEVANT_OPERATOR_TOKEN_KINDS.has(node.operator) ||
|
|
29
33
|
(EQUALITY_OPERATOR_TOKEN_KINDS.has(node.operator) && !hasIdentifierOperands(node)));
|
|
@@ -35,6 +39,14 @@ function isOneOntoOneShifting(node) {
|
|
|
35
39
|
return node.operator === "<<" && nodes_1.isLiteral(node.left) && node.left.value === 1;
|
|
36
40
|
}
|
|
37
41
|
var rule = {
|
|
42
|
+
meta: {
|
|
43
|
+
schema: [
|
|
44
|
+
{
|
|
45
|
+
// internal parameter
|
|
46
|
+
enum: ["sonar-runtime"],
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
38
50
|
create: function (context) {
|
|
39
51
|
return {
|
|
40
52
|
LogicalExpression: function (node) {
|
|
@@ -48,13 +60,19 @@ var rule = {
|
|
|
48
60
|
if (hasRelevantOperator(expr) &&
|
|
49
61
|
!isOneOntoOneShifting(expr) &&
|
|
50
62
|
equivalence_1.areEquivalent(expr.left, expr.right, context.getSourceCode())) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
63
|
+
var secondaryLocations = [];
|
|
64
|
+
if (expr.left.loc) {
|
|
65
|
+
secondaryLocations.push(locations_1.issueLocation(expr.left.loc));
|
|
66
|
+
}
|
|
67
|
+
locations_1.report(context, {
|
|
68
|
+
message: message(expr.operator),
|
|
69
|
+
node: isSonarRuntime() ? expr.right : expr,
|
|
70
|
+
}, secondaryLocations);
|
|
56
71
|
}
|
|
57
72
|
}
|
|
73
|
+
function isSonarRuntime() {
|
|
74
|
+
return context.options[context.options.length - 1] === "sonar-runtime";
|
|
75
|
+
}
|
|
58
76
|
},
|
|
59
77
|
};
|
|
60
78
|
module.exports = rule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-identical-expressions.js","sourceRoot":"","sources":["../../src/rules/no-identical-expressions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,wCAAyD;AACzD,oDAAqD;
|
|
1
|
+
{"version":3,"file":"no-identical-expressions.js","sourceRoot":"","sources":["../../src/rules/no-identical-expressions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,wCAAyD;AACzD,oDAAqD;AACrD,gDAA0E;AAE1E,IAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAE1E,wDAAwD;AACxD,IAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAExG,IAAM,OAAO,GAAG,UAAC,QAAgB;IAC/B,OAAA,8EAA2E,QAAQ,OAAG;AAAtF,CAAsF,CAAC;AAEzF,6BAA6B,IAA0C;IACrE,OAAO,CACL,6BAA6B,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChD,CAAC,6BAA6B,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CACnF,CAAC;AACJ,CAAC;AAED,+BAA+B,IAA0C;IACvE,OAAO,oBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,8BAA8B,IAA0C;IACtE,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,iBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,IAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,MAAM,EAAE;YACN;gBACE,qBAAqB;gBACrB,IAAI,EAAE,CAAC,eAAe,CAAC;aACxB;SACF;KACF;IACD,MAAM,YAAC,OAAyB;QAC9B,OAAO;YACL,iBAAiB,YAAC,IAAU;gBAC1B,KAAK,CAAC,IAAyB,CAAC,CAAC;YACnC,CAAC;YACD,gBAAgB,YAAC,IAAU;gBACzB,KAAK,CAAC,IAAwB,CAAC,CAAC;YAClC,CAAC;SACF,CAAC;QAEF,eAAe,IAA0C;YACvD,IACE,mBAAmB,CAAC,IAAI,CAAC;gBACzB,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAC3B,2BAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,EAC7D;gBACA,IAAM,kBAAkB,GAAoB,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;oBACjB,kBAAkB,CAAC,IAAI,CAAC,yBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;iBACvD;gBACD,kBAAM,CACJ,OAAO,EACP;oBACE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC/B,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;iBAC3C,EACD,kBAAkB,CACnB,CAAC;aACH;QACH,CAAC;QAED;YACE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,eAAe,CAAC;QACzE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,iBAAS,IAAI,CAAC"}
|
|
@@ -22,8 +22,17 @@
|
|
|
22
22
|
var equivalence_1 = require("../utils/equivalence");
|
|
23
23
|
var locations_1 = require("../utils/locations");
|
|
24
24
|
var nodes_1 = require("../utils/nodes");
|
|
25
|
-
var
|
|
25
|
+
var message = function (line) {
|
|
26
|
+
return "Update this function so that its implementation is not identical to the one on line " + line + ".";
|
|
27
|
+
};
|
|
26
28
|
var rule = {
|
|
29
|
+
meta: {
|
|
30
|
+
schema: [
|
|
31
|
+
{
|
|
32
|
+
enum: ["sonar-runtime"],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
27
36
|
create: function (context) {
|
|
28
37
|
var functions = [];
|
|
29
38
|
return {
|
|
@@ -55,11 +64,14 @@ var rule = {
|
|
|
55
64
|
if (equivalence_1.areEquivalent(duplicatingFunction.body, originalFunction.body, context.getSourceCode()) &&
|
|
56
65
|
originalFunction.loc) {
|
|
57
66
|
var loc = locations_1.getMainFunctionTokenLocation(duplicatingFunction, functions[i].parent, context);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
67
|
+
var originalFunctionLoc = locations_1.getMainFunctionTokenLocation(originalFunction, functions[j].parent, context);
|
|
68
|
+
var secondaryLocations = [
|
|
69
|
+
locations_1.issueLocation(originalFunctionLoc, originalFunctionLoc, "Original implementation"),
|
|
70
|
+
];
|
|
71
|
+
locations_1.report(context, {
|
|
72
|
+
message: message(String(originalFunction.loc.start.line)),
|
|
61
73
|
loc: loc,
|
|
62
|
-
});
|
|
74
|
+
}, secondaryLocations);
|
|
63
75
|
break;
|
|
64
76
|
}
|
|
65
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-identical-functions.js","sourceRoot":"","sources":["../../src/rules/no-identical-functions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,oDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"no-identical-functions.js","sourceRoot":"","sources":["../../src/rules/no-identical-functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,7 @@ var rule = {
|
|
|
40
40
|
var lastButOne_1 = statements[statements.length - 2];
|
|
41
41
|
var declaredIdentifier_1 = getOnlyDeclaredVariable(lastButOne_1);
|
|
42
42
|
if (returnedIdentifier_1 && declaredIdentifier_1) {
|
|
43
|
-
var sameVariable = context
|
|
43
|
+
var sameVariable = getVariables(context).find(function (variable) {
|
|
44
44
|
return (variable.references.find(function (ref) { return ref.identifier === returnedIdentifier_1; }) !== undefined &&
|
|
45
45
|
variable.references.find(function (ref) { return ref.identifier === declaredIdentifier_1.id; }) !== undefined);
|
|
46
46
|
});
|
|
@@ -90,6 +90,15 @@ var rule = {
|
|
|
90
90
|
var action = nodes_1.isReturnStatement(node) ? "return" : "throw";
|
|
91
91
|
return "Immediately " + action + " this expression instead of assigning it to the temporary variable \"" + variable + "\".";
|
|
92
92
|
}
|
|
93
|
+
function getVariables(context) {
|
|
94
|
+
var _a = context.getScope(), variableScope = _a.variableScope, currentScopeVariables = _a.variables;
|
|
95
|
+
if (variableScope === context.getScope()) {
|
|
96
|
+
return currentScopeVariables;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return currentScopeVariables.concat(variableScope.variables);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
93
102
|
},
|
|
94
103
|
};
|
|
95
104
|
module.exports = rule;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-immediate-return.js","sourceRoot":"","sources":["../../src/rules/prefer-immediate-return.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,iDAAiD;AAIjD,wCAA0G;AAE1G,IAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM;KAChB;IACD,MAAM,YAAC,OAAyB;QAC9B,OAAO;YACL,cAAc,YAAC,IAAiB;gBAC9B,iBAAiB,CAAE,IAA8B,CAAC,IAAI,CAAC,CAAC;YAC1D,CAAC;YACD,UAAU,YAAC,IAAiB;gBAC1B,iBAAiB,CAAE,IAA0B,CAAC,UAAU,CAAC,CAAC;YAC5D,CAAC;SACF,CAAC;QAEF,2BAA2B,UAA8B;YACvD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,IAAM,MAAI,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC/C,IAAM,oBAAkB,GAAG,uBAAuB,CAAC,MAAI,CAAC,CAAC;gBAEzD,IAAM,YAAU,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrD,IAAM,oBAAkB,GAAG,uBAAuB,CAAC,YAAU,CAAC,CAAC;gBAE/D,IAAI,oBAAkB,IAAI,oBAAkB,EAAE;oBAC5C,IAAM,YAAY,GAAG,
|
|
1
|
+
{"version":3,"file":"prefer-immediate-return.js","sourceRoot":"","sources":["../../src/rules/prefer-immediate-return.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/locations.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
import { Rule } from "eslint";
|
|
1
|
+
import { Rule, AST } from "eslint";
|
|
2
2
|
import * as estree from "estree";
|
|
3
|
+
export interface IssueLocation {
|
|
4
|
+
column: number;
|
|
5
|
+
line: number;
|
|
6
|
+
endColumn: number;
|
|
7
|
+
endLine: number;
|
|
8
|
+
message?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface EncodedMessage {
|
|
11
|
+
message: string;
|
|
12
|
+
cost?: number;
|
|
13
|
+
secondaryLocations: IssueLocation[];
|
|
14
|
+
}
|
|
3
15
|
/**
|
|
4
16
|
* Returns a location of the "main" function token:
|
|
5
17
|
* - function name for a function declaration, method or accessor
|
|
@@ -7,3 +19,18 @@ import * as estree from "estree";
|
|
|
7
19
|
* - "=>" for an arrow function
|
|
8
20
|
*/
|
|
9
21
|
export declare function getMainFunctionTokenLocation(fn: estree.Function, parent: estree.Node | undefined, context: Rule.RuleContext): estree.SourceLocation;
|
|
22
|
+
export declare type ReportDescriptor = Rule.ReportDescriptor & {
|
|
23
|
+
message: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Wrapper for `context.report`, supporting secondary locations and cost.
|
|
27
|
+
* Encode those extra information in the issue message when rule is executed
|
|
28
|
+
* in Sonar* environment.
|
|
29
|
+
*/
|
|
30
|
+
export declare function report(context: Rule.RuleContext, reportDescriptor: ReportDescriptor, secondaryLocations?: IssueLocation[], cost?: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Converts `SourceLocation` range into `IssueLocation`
|
|
33
|
+
*/
|
|
34
|
+
export declare function issueLocation(startLoc: estree.SourceLocation, endLoc?: estree.SourceLocation, message?: string): IssueLocation;
|
|
35
|
+
export declare function getFirstTokenAfter(node: estree.Node, context: Rule.RuleContext): AST.Token | null;
|
|
36
|
+
export declare function getFirstToken(node: estree.Node, context: Rule.RuleContext): AST.Token;
|
package/lib/utils/locations.js
CHANGED
|
@@ -38,10 +38,48 @@ function getMainFunctionTokenLocation(fn, parent, context) {
|
|
|
38
38
|
return location;
|
|
39
39
|
}
|
|
40
40
|
exports.getMainFunctionTokenLocation = getMainFunctionTokenLocation;
|
|
41
|
+
/**
|
|
42
|
+
* Wrapper for `context.report`, supporting secondary locations and cost.
|
|
43
|
+
* Encode those extra information in the issue message when rule is executed
|
|
44
|
+
* in Sonar* environment.
|
|
45
|
+
*/
|
|
46
|
+
function report(context, reportDescriptor, secondaryLocations, cost) {
|
|
47
|
+
if (secondaryLocations === void 0) { secondaryLocations = []; }
|
|
48
|
+
var message = reportDescriptor.message;
|
|
49
|
+
if (context.options[context.options.length - 1] === "sonar-runtime") {
|
|
50
|
+
var encodedMessage = { secondaryLocations: secondaryLocations, message: message, cost: cost };
|
|
51
|
+
reportDescriptor.message = JSON.stringify(encodedMessage);
|
|
52
|
+
}
|
|
53
|
+
context.report(reportDescriptor);
|
|
54
|
+
}
|
|
55
|
+
exports.report = report;
|
|
56
|
+
/**
|
|
57
|
+
* Converts `SourceLocation` range into `IssueLocation`
|
|
58
|
+
*/
|
|
59
|
+
function issueLocation(startLoc, endLoc, message) {
|
|
60
|
+
if (endLoc === void 0) { endLoc = startLoc; }
|
|
61
|
+
if (message === void 0) { message = ""; }
|
|
62
|
+
return {
|
|
63
|
+
line: startLoc.start.line,
|
|
64
|
+
column: startLoc.start.column,
|
|
65
|
+
endLine: endLoc.end.line,
|
|
66
|
+
endColumn: endLoc.end.column,
|
|
67
|
+
message: message,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
exports.issueLocation = issueLocation;
|
|
41
71
|
function getTokenByValue(node, value, context) {
|
|
42
72
|
return context
|
|
43
73
|
.getSourceCode()
|
|
44
74
|
.getTokens(node)
|
|
45
75
|
.find(function (token) { return token.value === value; });
|
|
46
76
|
}
|
|
77
|
+
function getFirstTokenAfter(node, context) {
|
|
78
|
+
return context.getSourceCode().getTokenAfter(node);
|
|
79
|
+
}
|
|
80
|
+
exports.getFirstTokenAfter = getFirstTokenAfter;
|
|
81
|
+
function getFirstToken(node, context) {
|
|
82
|
+
return context.getSourceCode().getTokens(node)[0];
|
|
83
|
+
}
|
|
84
|
+
exports.getFirstToken = getFirstToken;
|
|
47
85
|
//# sourceMappingURL=locations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locations.js","sourceRoot":"","sources":["../../src/utils/locations.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"locations.js","sourceRoot":"","sources":["../../src/utils/locations.ts"],"names":[],"mappings":"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"}
|