From eeadfd300ce376d7bae1dd6b3a48c928658a8f76 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Mon, 6 May 2024 14:15:09 +0200 Subject: [PATCH 1/9] Fix deprecations --- packages/jsts/src/rules/S1128/rule.ts | 2 +- packages/jsts/src/rules/S1515/rule.ts | 2 +- packages/jsts/src/rules/S2259/rule.ts | 6 ++++-- packages/jsts/src/rules/S3516/rule.ts | 2 +- packages/jsts/src/rules/S3798/rule.ts | 4 ++-- packages/jsts/src/rules/S5860/rule.ts | 2 +- packages/jsts/src/rules/helpers/ast.ts | 3 ++- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/jsts/src/rules/S1128/rule.ts b/packages/jsts/src/rules/S1128/rule.ts index 05fca9b077f..e7fa09fd70e 100644 --- a/packages/jsts/src/rules/S1128/rule.ts +++ b/packages/jsts/src/rules/S1128/rule.ts @@ -154,7 +154,7 @@ export const rule: Rule.RuleModule = { const ruleListener = { ImportDeclaration: (node: estree.Node) => { - const variables = context.getDeclaredVariables(node); + const variables = context.sourceCode.getDeclaredVariables(node); for (const variable of variables) { if (!isExcluded(variable) && !isImplicitJsx(variable) && isUnused(variable)) { unusedImports.push({ diff --git a/packages/jsts/src/rules/S1515/rule.ts b/packages/jsts/src/rules/S1515/rule.ts index ba03638035a..8e1386feaa0 100644 --- a/packages/jsts/src/rules/S1515/rule.ts +++ b/packages/jsts/src/rules/S1515/rule.ts @@ -76,7 +76,7 @@ export const rule: Rule.RuleModule = { loopNode && !isIIEF(node, context) && !isAllowedCallbacks(context, node) && - context.getScope().through.some(ref => !isSafe(ref, loopNode)) + context.sourceCode.getScope(node).through.some(ref => !isSafe(ref, loopNode)) ) { context.report({ message: toEncodedMessage(message, [getMainLoopToken(loopNode, context)]), diff --git a/packages/jsts/src/rules/S2259/rule.ts b/packages/jsts/src/rules/S2259/rule.ts index b4c4d2e8d11..996bb8c61eb 100644 --- a/packages/jsts/src/rules/S2259/rule.ts +++ b/packages/jsts/src/rules/S2259/rule.ts @@ -148,13 +148,15 @@ function checkNullDereference( if (node.type !== 'Identifier') { return; } - const scope = context.getScope(); + const scope = context.sourceCode.getScope(node); const symbol = scope.references.find(v => v.identifier === node)?.resolved; if (!symbol) { return; } - const enclosingFunction = context.getAncestors().find(n => functionLike.has(n.type)); + const enclosingFunction = context.sourceCode + .getAncestors(node) + .find(n => functionLike.has(n.type)); if ( !alreadyRaisedSymbols.has(symbol) && diff --git a/packages/jsts/src/rules/S3516/rule.ts b/packages/jsts/src/rules/S3516/rule.ts index 3cb701e4653..7beedac10ee 100644 --- a/packages/jsts/src/rules/S3516/rule.ts +++ b/packages/jsts/src/rules/S3516/rule.ts @@ -70,7 +70,7 @@ export const rule: Rule.RuleModule = { const returnedValues = functionContext.returnStatements.map( returnStatement => returnStatement.argument as estree.Node, ); - if (areAllSameValue(returnedValues, context.getScope())) { + if (areAllSameValue(returnedValues, context.sourceCode.getScope(node))) { const message = toEncodedMessage( `Refactor this function to not always return the same value.`, returnedValues as TSESTree.Node[], diff --git a/packages/jsts/src/rules/S3798/rule.ts b/packages/jsts/src/rules/S3798/rule.ts index 8dec51ab33c..0b994bd420b 100644 --- a/packages/jsts/src/rules/S3798/rule.ts +++ b/packages/jsts/src/rules/S3798/rule.ts @@ -31,8 +31,8 @@ export const rule: Rule.RuleModule = { }, create(context: Rule.RuleContext) { return { - Program() { - const scope = context.getScope(); + Program(node: estree.Node) { + const scope = context.sourceCode.getScope(node); // As we parse every file with "module" source type, we find user defined global variables in the module scope const moduleScope = findModuleScope(context); moduleScope?.variables.forEach(variable => { diff --git a/packages/jsts/src/rules/S5860/rule.ts b/packages/jsts/src/rules/S5860/rule.ts index cec3010fb24..6aff1d39165 100644 --- a/packages/jsts/src/rules/S5860/rule.ts +++ b/packages/jsts/src/rules/S5860/rule.ts @@ -201,7 +201,7 @@ function checkNonExistingGroupReference( function extractGroupNodes(memberExpr: estree.MemberExpression, intellisense: RegexIntelliSense) { if (isDotNotation(memberExpr)) { const { property } = memberExpr; - const ancestors = intellisense.context.getAncestors(); + const ancestors = intellisense.context.sourceCode.getAncestors(memberExpr); let parent = ancestors.pop(); while ((parent as TSESTree.Node).type === 'TSNonNullExpression') { parent = ancestors.pop(); diff --git a/packages/jsts/src/rules/helpers/ast.ts b/packages/jsts/src/rules/helpers/ast.ts index 06f8c9f6fc0..622ec42131b 100644 --- a/packages/jsts/src/rules/helpers/ast.ts +++ b/packages/jsts/src/rules/helpers/ast.ts @@ -309,7 +309,8 @@ export function getLhsVariable( context: Rule.RuleContext, node: estree.Node, ): Scope.Variable | undefined { - const parent = context.getAncestors()[context.getAncestors().length - 1]; + const ancestors = context.sourceCode.getAncestors(node); + const parent = ancestors[ancestors.length - 1]; let formIdentifier: estree.Identifier | undefined; if (parent.type === 'VariableDeclarator' && parent.id.type === 'Identifier') { formIdentifier = parent.id; From c51ae517ae09e3e2e4ed102cd25bbfbb7d7544a8 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Mon, 6 May 2024 14:33:43 +0200 Subject: [PATCH 2/9] more deprecations --- packages/jsts/src/rules/S1172/rule.ts | 4 ++-- packages/jsts/src/rules/S1226/rule.ts | 4 ++-- packages/jsts/src/rules/S2259/rule.ts | 4 ++-- packages/jsts/src/rules/S5725/rule.ts | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/jsts/src/rules/S1172/rule.ts b/packages/jsts/src/rules/S1172/rule.ts index 29fc16985bb..3bb83f59f75 100644 --- a/packages/jsts/src/rules/S1172/rule.ts +++ b/packages/jsts/src/rules/S1172/rule.ts @@ -65,8 +65,8 @@ function reportUnusedArgument( } if ( - context - .getScope() + context.sourceCode + .getScope(node) .variables.some( v => v.name === 'arguments' && v.identifiers.length === 0 && v.references.length > 0, ) diff --git a/packages/jsts/src/rules/S1226/rule.ts b/packages/jsts/src/rules/S1226/rule.ts index fd665e9fd0a..b1181d034a1 100644 --- a/packages/jsts/src/rules/S1226/rule.ts +++ b/packages/jsts/src/rules/S1226/rule.ts @@ -75,7 +75,7 @@ export const rule: Rule.RuleModule = { // default value reassignment if ( isInsideIfStatement(context) || - context.getAncestors().some(node => node.type === 'SwitchCase') // issue-2398 + context.sourceCode.getAncestors(identifier).some(node => node.type === 'SwitchCase') // issue-2398 ) { return; } @@ -116,7 +116,7 @@ export const rule: Rule.RuleModule = { return { onCodePathStart(_codePath: Rule.CodePath, node: estree.Node) { - const currentScope = context.getScope(); + const currentScope = context.sourceCode.getScope(node); if (currentScope && currentScope.type === 'function') { const { referencesByIdentifier, variablesToCheck, variablesToCheckInCurrentScope } = computeNewContextInfo(variableUsageContext, context, node); diff --git a/packages/jsts/src/rules/S2259/rule.ts b/packages/jsts/src/rules/S2259/rule.ts index 996bb8c61eb..99540601f07 100644 --- a/packages/jsts/src/rules/S2259/rule.ts +++ b/packages/jsts/src/rules/S2259/rule.ts @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// https://sonarsource.github.io/rspec/#/rspec/S22259/javascript +// https://sonarsource.github.io/rspec/#/rspec/S2259/javascript import { Rule, Scope } from 'eslint'; import * as estree from 'estree'; @@ -69,7 +69,7 @@ export const rule: Rule.RuleModule = { 'LogicalExpression MemberExpression'(node: estree.Node) { const { object, optional } = node as estree.MemberExpression; if (!optional) { - const ancestors = context.getAncestors(); + const ancestors = context.sourceCode.getAncestors(node); const enclosingLogicalExpression = ancestors.find( n => n.type === 'LogicalExpression', ) as estree.LogicalExpression; diff --git a/packages/jsts/src/rules/S5725/rule.ts b/packages/jsts/src/rules/S5725/rule.ts index c504781a318..f48bac8bfdd 100644 --- a/packages/jsts/src/rules/S5725/rule.ts +++ b/packages/jsts/src/rules/S5725/rule.ts @@ -110,7 +110,7 @@ export const rule: Rule.RuleModule = { ) { return; } - const scope = context.getScope(); + const scope = context.sourceCode.getScope(node); const assignedVariable = scope.variables.find(v => v.name === left.name); if (!assignedVariable) { return; From a9dad145e0019108cf1da5b890272aad0e8ba91e Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Mon, 6 May 2024 15:28:22 +0200 Subject: [PATCH 3/9] fix more files --- packages/jsts/src/rules/S109/rule.ts | 6 +++--- packages/jsts/src/rules/S1128/rule.ts | 2 +- packages/jsts/src/rules/S1172/rule.ts | 2 +- packages/jsts/src/rules/S1226/rule.ts | 2 +- packages/jsts/src/rules/S1526/rule.ts | 2 +- packages/jsts/src/rules/S1527/rule.ts | 5 +++-- packages/jsts/src/rules/S1529/rule.ts | 2 +- packages/jsts/src/rules/S1788/decorator.ts | 2 +- packages/jsts/src/rules/S1848/rule.ts | 2 +- packages/jsts/src/rules/S1994/rule.ts | 2 +- packages/jsts/src/rules/S2123/rule.ts | 2 +- packages/jsts/src/rules/S2392/rule.ts | 2 +- packages/jsts/src/rules/S2424/rule.ts | 4 ++-- packages/jsts/src/rules/S2486/rule.ts | 2 +- packages/jsts/src/rules/S2703/rule.ts | 5 +++-- packages/jsts/src/rules/S2990/rule.ts | 6 +++--- packages/jsts/src/rules/S3001/rule.ts | 2 +- packages/jsts/src/rules/S3003/rule.ts | 6 +++--- packages/jsts/src/rules/S3358/rule.ts | 2 +- packages/jsts/src/rules/S3500/rule.ts | 2 +- packages/jsts/src/rules/S3513/rule.ts | 7 ++++--- packages/jsts/src/rules/S3533/rule.ts | 5 ++++- packages/jsts/src/rules/S3616/rule.ts | 9 ++++++--- packages/jsts/src/rules/S3827/rule.ts | 4 ++-- packages/jsts/src/rules/S4138/decorator.ts | 4 ++-- packages/jsts/src/rules/S4507/rule.ts | 10 +++++++--- packages/jsts/src/rules/S5876/rule.ts | 2 +- packages/jsts/src/rules/S5958/rule.ts | 10 +++++----- packages/jsts/src/rules/S6079/rule.ts | 4 ++-- packages/jsts/src/rules/S6439/rule.ts | 2 +- packages/jsts/src/rules/S881/rule.ts | 2 +- packages/jsts/src/rules/helpers/regex/flags.ts | 2 +- packages/jsts/src/rules/helpers/type.ts | 2 +- 33 files changed, 68 insertions(+), 55 deletions(-) diff --git a/packages/jsts/src/rules/S109/rule.ts b/packages/jsts/src/rules/S109/rule.ts index b9320245326..79f9215467b 100644 --- a/packages/jsts/src/rules/S109/rule.ts +++ b/packages/jsts/src/rules/S109/rule.ts @@ -44,7 +44,7 @@ export const rule: Rule.RuleModule = { const { value, parent } = numericLiteral; if ( isPower(value) || - isJSX(context) || + isJSX(context, node) || isBitwiseOperator(parent) || isJsonStringify(parent) ) { @@ -98,8 +98,8 @@ function isPower(value: number) { return Number.isInteger(Math.log10(value)) || Number.isInteger(Math.log2(value)); } -function isJSX(context: Rule.RuleContext) { - return context.getAncestors().some(node => node.type.startsWith('JSX')); +function isJSX(context: Rule.RuleContext, node: estree.Node) { + return context.sourceCode.getAncestors(node).some(node => node.type.startsWith('JSX')); } function isBitwiseOperator(node: estree.Node) { diff --git a/packages/jsts/src/rules/S1128/rule.ts b/packages/jsts/src/rules/S1128/rule.ts index e7fa09fd70e..bef28867bbb 100644 --- a/packages/jsts/src/rules/S1128/rule.ts +++ b/packages/jsts/src/rules/S1128/rule.ts @@ -247,7 +247,7 @@ function getSuggestion( context: Rule.RuleContext, { id, importDecl }: { id: estree.Identifier; importDecl: estree.ImportDeclaration }, ): Rule.SuggestionReportDescriptor { - const variables = context.getDeclaredVariables(importDecl); + const variables = context.sourceCode.getDeclaredVariables(importDecl); if (variables.length === 1) { return { messageId: 'suggestRemoveWholeStatement', diff --git a/packages/jsts/src/rules/S1172/rule.ts b/packages/jsts/src/rules/S1172/rule.ts index 3bb83f59f75..eda6b37f280 100644 --- a/packages/jsts/src/rules/S1172/rule.ts +++ b/packages/jsts/src/rules/S1172/rule.ts @@ -74,7 +74,7 @@ function reportUnusedArgument( return; } - let parametersVariable = context.getDeclaredVariables(node); + let parametersVariable = context.sourceCode.getDeclaredVariables(node); if (functionId) { parametersVariable = parametersVariable.filter(v => v.name !== functionId.name); diff --git a/packages/jsts/src/rules/S1226/rule.ts b/packages/jsts/src/rules/S1226/rule.ts index b1181d034a1..a2cf45de29b 100644 --- a/packages/jsts/src/rules/S1226/rule.ts +++ b/packages/jsts/src/rules/S1226/rule.ts @@ -273,7 +273,7 @@ function computeNewContextInfo( const referencesByIdentifier = new Map(); const variablesToCheck = new Set(variableUsageContext.variablesToCheck); const variablesToCheckInCurrentScope = new Set(); - context.getDeclaredVariables(node).forEach(variable => { + context.sourceCode.getDeclaredVariables(node).forEach(variable => { variablesToCheck.add(variable.name); variablesToCheckInCurrentScope.add(variable.name); for (const currentRef of variable.references) { diff --git a/packages/jsts/src/rules/S1526/rule.ts b/packages/jsts/src/rules/S1526/rule.ts index 350ac9a0261..05b376ae621 100644 --- a/packages/jsts/src/rules/S1526/rule.ts +++ b/packages/jsts/src/rules/S1526/rule.ts @@ -38,7 +38,7 @@ export const rule: Rule.RuleModule = { create(context: Rule.RuleContext) { return { "VariableDeclaration[kind='var']": (node: estree.Node) => { - const variables = context.getDeclaredVariables(node); + const variables = context.sourceCode.getDeclaredVariables(node); for (const variable of variables) { const declaration = variable.identifiers[0]; const misused = variable.references diff --git a/packages/jsts/src/rules/S1527/rule.ts b/packages/jsts/src/rules/S1527/rule.ts index cfd9c4211d5..3c7a2c76e35 100644 --- a/packages/jsts/src/rules/S1527/rule.ts +++ b/packages/jsts/src/rules/S1527/rule.ts @@ -20,6 +20,7 @@ // https://sonarsource.github.io/rspec/#/rspec/S1527/javascript import { Rule, Scope } from 'eslint'; +import estree from 'estree'; const futureReservedWords = [ 'implements', @@ -71,8 +72,8 @@ export const rule: Rule.RuleModule = { } return { - 'Program:exit': () => { - checkVariablesByScope(context.getScope()); + 'Program:exit': (node: estree.Node) => { + checkVariablesByScope(context.sourceCode.getScope(node)); }, }; }, diff --git a/packages/jsts/src/rules/S1529/rule.ts b/packages/jsts/src/rules/S1529/rule.ts index 2a0f547ba2e..5e2c9871634 100644 --- a/packages/jsts/src/rules/S1529/rule.ts +++ b/packages/jsts/src/rules/S1529/rule.ts @@ -57,7 +57,7 @@ export const rule: Rule.RuleModule = { !isNumeric(expression.right) ) { lonelyBitwiseAndOr = expression; - lonelyBitwiseAndOrAncestors = [...context.getAncestors()]; + lonelyBitwiseAndOrAncestors = [...context.sourceCode.getAncestors(node)]; } else if (BITWISE_OPERATORS.includes(expression.operator)) { fileContainsSeveralBitwiseOperations = true; } diff --git a/packages/jsts/src/rules/S1788/decorator.ts b/packages/jsts/src/rules/S1788/decorator.ts index 94ab1ec391f..8b5cf442129 100644 --- a/packages/jsts/src/rules/S1788/decorator.ts +++ b/packages/jsts/src/rules/S1788/decorator.ts @@ -35,7 +35,7 @@ function reportExempting( return (context, reportDescriptor) => { if ('node' in reportDescriptor) { const node = reportDescriptor['node'] as AssignmentPattern; - const scope = context.getScope(); + const scope = context.sourceCode.getScope(node); const variable = scope.variables.find(value => isIdentifier(node.left, value.name)); const enclosingFunction = variable?.defs?.[0]?.node as BaseFunction; if (enclosingFunction && !exemptionCondition(enclosingFunction)) { diff --git a/packages/jsts/src/rules/S1848/rule.ts b/packages/jsts/src/rules/S1848/rule.ts index 96b73904c2d..0c5b2919a88 100644 --- a/packages/jsts/src/rules/S1848/rule.ts +++ b/packages/jsts/src/rules/S1848/rule.ts @@ -59,7 +59,7 @@ export const rule: Rule.RuleModule = { }; function isTryable(node: estree.Node, context: Rule.RuleContext) { - const ancestors = context.getAncestors(); + const ancestors = context.sourceCode.getAncestors(node); let parent = undefined; let child = node; while ((parent = ancestors.pop()) !== undefined) { diff --git a/packages/jsts/src/rules/S1994/rule.ts b/packages/jsts/src/rules/S1994/rule.ts index 08f175c4dc5..701a79f75c5 100644 --- a/packages/jsts/src/rules/S1994/rule.ts +++ b/packages/jsts/src/rules/S1994/rule.ts @@ -59,7 +59,7 @@ export const rule: Rule.RuleModule = { ) { if (forLoopStack.length > 0) { const currentLoop = peekFor(); - const parentChain = context.getAncestors(); + const parentChain = context.sourceCode.getAncestors(node); parentChain.push(node); const forLoopChild = getChild(currentLoop.forLoop); if (forLoopChild) { diff --git a/packages/jsts/src/rules/S2123/rule.ts b/packages/jsts/src/rules/S2123/rule.ts index 8e2791ab147..a1a83c7fa2a 100644 --- a/packages/jsts/src/rules/S2123/rule.ts +++ b/packages/jsts/src/rules/S2123/rule.ts @@ -47,7 +47,7 @@ export const rule: Rule.RuleModule = { if ( !updateExpression.prefix && argument.type === 'Identifier' && - isLocalIdentifier(argument, context.getScope()) + isLocalIdentifier(argument, context.sourceCode.getScope(node)) ) { reportUpdateExpression(updateExpression); } diff --git a/packages/jsts/src/rules/S2392/rule.ts b/packages/jsts/src/rules/S2392/rule.ts index af0f2be4ac5..ae23ce8b2b7 100644 --- a/packages/jsts/src/rules/S2392/rule.ts +++ b/packages/jsts/src/rules/S2392/rule.ts @@ -77,7 +77,7 @@ export const rule: Rule.RuleModule = { return idRange[0] < scopeRange[0] || idRange[1] > scopeRange[1]; } - context.getDeclaredVariables(node).forEach(variable => { + context.sourceCode.getDeclaredVariables(node).forEach(variable => { const referencesOutside = variable.references .map(ref => ref.identifier) .filter(isOutsideOfScope); diff --git a/packages/jsts/src/rules/S2424/rule.ts b/packages/jsts/src/rules/S2424/rule.ts index 8b92605d818..5149a2129cc 100644 --- a/packages/jsts/src/rules/S2424/rule.ts +++ b/packages/jsts/src/rules/S2424/rule.ts @@ -57,8 +57,8 @@ export const rule: Rule.RuleModule = { } return { - Program: () => { - checkScope(context.getScope()); + Program: (node: estree.Node) => { + checkScope(context.sourceCode.getScope(node)); }, 'Program:exit': () => { overriden.forEach(node => { diff --git a/packages/jsts/src/rules/S2486/rule.ts b/packages/jsts/src/rules/S2486/rule.ts index 424ff2bbce9..cbbd01456c1 100644 --- a/packages/jsts/src/rules/S2486/rule.ts +++ b/packages/jsts/src/rules/S2486/rule.ts @@ -33,7 +33,7 @@ export const rule: Rule.RuleModule = { return { 'CatchClause[param.type="Identifier"]'(node: estree.CatchClause) { const param = node.param as estree.Identifier; - const scope = context.getScope(); + const scope = context.sourceCode.getScope(node); const variable = getVariableFromScope(scope, param.name); if (variable?.references.length === 0) { context.report({ diff --git a/packages/jsts/src/rules/S2703/rule.ts b/packages/jsts/src/rules/S2703/rule.ts index e827aae35f5..2176b013db8 100644 --- a/packages/jsts/src/rules/S2703/rule.ts +++ b/packages/jsts/src/rules/S2703/rule.ts @@ -21,6 +21,7 @@ import { Rule } from 'eslint'; import { flatMap, globalsByLibraries } from '../helpers'; +import estree from 'estree'; const excludedNames = new Set(flatMap(Object.values(globalsByLibraries), globals => globals)); @@ -33,8 +34,8 @@ export const rule: Rule.RuleModule = { }, create(context: Rule.RuleContext) { return { - 'Program:exit'() { - const globalScope = context.getScope(); + 'Program:exit'(node: estree.Node) { + const globalScope = context.sourceCode.getScope(node); const alreadyReported: Set = new Set(); globalScope.through .filter(ref => ref.isWrite()) diff --git a/packages/jsts/src/rules/S2990/rule.ts b/packages/jsts/src/rules/S2990/rule.ts index d172f86ad0f..c86be9c2b46 100644 --- a/packages/jsts/src/rules/S2990/rule.ts +++ b/packages/jsts/src/rules/S2990/rule.ts @@ -35,9 +35,9 @@ export const rule: Rule.RuleModule = { return { 'MemberExpression[object.type="ThisExpression"]'(node: estree.Node) { const memberExpression = node as estree.MemberExpression; - const scopeType = context.getScope().variableScope.type; - const isInsideClass = context - .getAncestors() + const scopeType = context.sourceCode.getScope(node).variableScope.type; + const isInsideClass = context.sourceCode + .getAncestors(node) .some( ancestor => ancestor.type === 'ClassDeclaration' || ancestor.type === 'ClassExpression', ); diff --git a/packages/jsts/src/rules/S3001/rule.ts b/packages/jsts/src/rules/S3001/rule.ts index 7558cd18d9f..f70c0c06f3b 100644 --- a/packages/jsts/src/rules/S3001/rule.ts +++ b/packages/jsts/src/rules/S3001/rule.ts @@ -33,7 +33,7 @@ export const rule: Rule.RuleModule = { "UnaryExpression[operator='delete'][argument.type!='MemberExpression'][argument.type!='ChainExpression']": (node: estree.Node) => { const { argument } = node as estree.UnaryExpression; - if (!isGlobalProperty(argument, context.getScope().references)) { + if (!isGlobalProperty(argument, context.sourceCode.getScope(node).references)) { context.report({ messageId: 'removeDelete', node, diff --git a/packages/jsts/src/rules/S3003/rule.ts b/packages/jsts/src/rules/S3003/rule.ts index f399baa0fdd..605f77fecb4 100644 --- a/packages/jsts/src/rules/S3003/rule.ts +++ b/packages/jsts/src/rules/S3003/rule.ts @@ -48,7 +48,7 @@ export const rule: Rule.RuleModule = { isString(right, services) && !isLiteralException(left) && !isLiteralException(right) && - !isWithinSortCallback(context) + !isWithinSortCallback(context, node) ) { context.report({ message: toEncodedMessage( @@ -69,8 +69,8 @@ function isLiteralException(node: estree.Node) { return node.type === 'Literal' && node.raw!.length === 3; } -function isWithinSortCallback(context: Rule.RuleContext) { - const ancestors = context.getAncestors().reverse(); +function isWithinSortCallback(context: Rule.RuleContext, node: estree.Node) { + const ancestors = context.sourceCode.getAncestors(node).reverse(); const maybeCallback = ancestors.find(node => ['ArrowFunctionExpression', 'FunctionExpression'].includes(node.type), ); diff --git a/packages/jsts/src/rules/S3358/rule.ts b/packages/jsts/src/rules/S3358/rule.ts index c18f9ee7c4d..d915cc5230a 100644 --- a/packages/jsts/src/rules/S3358/rule.ts +++ b/packages/jsts/src/rules/S3358/rule.ts @@ -31,7 +31,7 @@ export const rule: Rule.RuleModule = { create(context: Rule.RuleContext) { return { 'ConditionalExpression ConditionalExpression': (node: estree.Node) => { - if (!isNestingBroken(context.getAncestors())) { + if (!isNestingBroken(context.sourceCode.getAncestors(node))) { context.report({ messageId: 'extractTernary', node, diff --git a/packages/jsts/src/rules/S3500/rule.ts b/packages/jsts/src/rules/S3500/rule.ts index 17498282bbb..df781123498 100644 --- a/packages/jsts/src/rules/S3500/rule.ts +++ b/packages/jsts/src/rules/S3500/rule.ts @@ -36,7 +36,7 @@ export const rule: Rule.RuleModule = { create(context: Rule.RuleContext) { return { 'VariableDeclaration[kind="const"]': (node: estree.Node) => { - context.getDeclaredVariables(node).forEach(variable => + context.sourceCode.getDeclaredVariables(node).forEach(variable => variable.references.filter(isModifyingReference).forEach(reference => context.report({ message: toEncodedMessage( diff --git a/packages/jsts/src/rules/S3513/rule.ts b/packages/jsts/src/rules/S3513/rule.ts index 83d5e8ccd35..4146e399f17 100644 --- a/packages/jsts/src/rules/S3513/rule.ts +++ b/packages/jsts/src/rules/S3513/rule.ts @@ -23,6 +23,7 @@ import { Rule, Scope } from 'eslint'; import { TSESTree } from '@typescript-eslint/utils'; import { toEncodedMessage } from '../helpers'; import { SONAR_RUNTIME } from '../../linter/parameters'; +import estree from 'estree'; const MESSAGE = "Use the rest syntax to declare this function's arguments."; const SECONDARY_MESSAGE = 'Replace this reference to "arguments".'; @@ -39,9 +40,9 @@ export const rule: Rule.RuleModule = { create(context: Rule.RuleContext) { return { // Ignore root scope containing global variables - 'Program:exit': () => - context - .getScope() + 'Program:exit': (node: estree.Node) => + context.sourceCode + .getScope(node) .childScopes.forEach(child => checkArgumentsUsageInScopeRecursively(context, child)), }; }, diff --git a/packages/jsts/src/rules/S3533/rule.ts b/packages/jsts/src/rules/S3533/rule.ts index 88ab9b3bc9f..ab8666a6905 100644 --- a/packages/jsts/src/rules/S3533/rule.ts +++ b/packages/jsts/src/rules/S3533/rule.ts @@ -34,7 +34,10 @@ export const rule: Rule.RuleModule = { const services = context.sourceCode.parserServices; return { 'CallExpression[callee.type="Identifier"]': (node: estree.Node) => { - if (context.getScope().type !== 'module' && context.getScope().type !== 'global') { + if ( + context.sourceCode.getScope(node).type !== 'module' && + context.sourceCode.getScope(node).type !== 'global' + ) { return; } const callExpression = node as estree.CallExpression; diff --git a/packages/jsts/src/rules/S3616/rule.ts b/packages/jsts/src/rules/S3616/rule.ts index 822d103839c..0df0ae22870 100644 --- a/packages/jsts/src/rules/S3616/rule.ts +++ b/packages/jsts/src/rules/S3616/rule.ts @@ -55,7 +55,7 @@ export const rule: Rule.RuleModule = { reportIssue(node, expressions[expressions.length - 1], expressions.length); }, 'SwitchCase > LogicalExpression'(node: estree.Node) { - if (!isSwitchTrue(getEnclosingSwitchStatement(context))) { + if (!isSwitchTrue(getEnclosingSwitchStatement(context, node))) { const firstElemAndNesting = getFirstElementAndNestingLevel( node as estree.LogicalExpression, 0, @@ -69,8 +69,11 @@ export const rule: Rule.RuleModule = { }, }; -function getEnclosingSwitchStatement(context: Rule.RuleContext): estree.SwitchStatement { - const ancestors = context.getAncestors(); +function getEnclosingSwitchStatement( + context: Rule.RuleContext, + node: estree.Node, +): estree.SwitchStatement { + const ancestors = context.sourceCode.getAncestors(node); for (let i = ancestors.length - 1; i >= 0; i--) { if (ancestors[i].type === 'SwitchStatement') { return ancestors[i] as estree.SwitchStatement; diff --git a/packages/jsts/src/rules/S3827/rule.ts b/packages/jsts/src/rules/S3827/rule.ts index 635e30bcda1..591b3cd0bb3 100644 --- a/packages/jsts/src/rules/S3827/rule.ts +++ b/packages/jsts/src/rules/S3827/rule.ts @@ -47,10 +47,10 @@ export const rule: Rule.RuleModule = { const excludedNames = new Set(); const undeclaredIdentifiersByName: Map = new Map(); return { - 'Program:exit'() { + 'Program:exit'(node: estree.Node) { excludedNames.clear(); undeclaredIdentifiersByName.clear(); - const globalScope = context.getScope(); + const globalScope = context.sourceCode.getScope(node); globalScope.through.forEach(ref => { const identifier = ref.identifier; if (excludedNames.has(identifier.name)) { diff --git a/packages/jsts/src/rules/S4138/decorator.ts b/packages/jsts/src/rules/S4138/decorator.ts index 93f2956cefc..2d1306b7864 100644 --- a/packages/jsts/src/rules/S4138/decorator.ts +++ b/packages/jsts/src/rules/S4138/decorator.ts @@ -32,7 +32,7 @@ export function decorate(rule: Rule.RuleModule): Rule.RuleModule { return interceptReport(rule, (context, reportDescriptor) => { const forStmt = (reportDescriptor as any).node as estree.ForStatement; const suggest: Rule.SuggestionReportDescriptor[] = []; - if (isFixable(context.getScope())) { + if (isFixable(context.sourceCode.getScope(forStmt))) { suggest.push({ desc: 'Replace with "for of" loop', fix: fixer => rewriteForStatement(forStmt, context, fixer), @@ -77,7 +77,7 @@ function rewriteForStatement( fixes.push(fixer.replaceTextRange(headerRange, headerText)); /* rewrite `for` body: `[]` -> `element` */ - const [indexVar] = context.getDeclaredVariables(forStmt.init!); + const [indexVar] = context.sourceCode.getDeclaredVariables(forStmt.init!); for (const reference of indexVar.references) { const id = reference.identifier; if (contains(forStmt.body, id)) { diff --git a/packages/jsts/src/rules/S4507/rule.ts b/packages/jsts/src/rules/S4507/rule.ts index b088148bdfe..94f652b2857 100644 --- a/packages/jsts/src/rules/S4507/rule.ts +++ b/packages/jsts/src/rules/S4507/rule.ts @@ -53,7 +53,11 @@ function checkErrorHandlerMiddleware( callExpression: estree.CallExpression, ) { const { callee, arguments: args } = callExpression; - if (isMemberWithProperty(callee, 'use') && args.length > 0 && !isInsideConditional(context)) { + if ( + isMemberWithProperty(callee, 'use') && + args.length > 0 && + !isInsideConditional(context, callExpression) + ) { for (const m of flattenArgs(context, args)) { const middleware = getUniqueWriteUsageOrNode(context, m); if ( @@ -69,7 +73,7 @@ function checkErrorHandlerMiddleware( } } -function isInsideConditional(context: Rule.RuleContext) { - const ancestors = context.getAncestors(); +function isInsideConditional(context: Rule.RuleContext, node: estree.Node): boolean { + const ancestors = context.sourceCode.getAncestors(node); return ancestors.some(ancestor => ancestor.type === 'IfStatement'); } diff --git a/packages/jsts/src/rules/S5876/rule.ts b/packages/jsts/src/rules/S5876/rule.ts index 21e235a49ed..e460444fa8e 100644 --- a/packages/jsts/src/rules/S5876/rule.ts +++ b/packages/jsts/src/rules/S5876/rule.ts @@ -76,7 +76,7 @@ export const rule: Rule.RuleModule = { if (hasSessionFalseOption(callExpression)) { return; } - const parent = last(context.getAncestors()); + const parent = last(context.sourceCode.getAncestors(node)); if (parent.type === 'CallExpression') { const callback = getValueOfExpression( context, diff --git a/packages/jsts/src/rules/S5958/rule.ts b/packages/jsts/src/rules/S5958/rule.ts index d27602add1b..32a1d830a6d 100644 --- a/packages/jsts/src/rules/S5958/rule.ts +++ b/packages/jsts/src/rules/S5958/rule.ts @@ -27,9 +27,9 @@ export const rule: Rule.RuleModule = { create(context: Rule.RuleContext) { let catchWithDone = false; - function isInsideTest() { - return context - .getAncestors() + function isInsideTest(node: estree.Node) { + return context.sourceCode + .getAncestors(node) .some(n => n.type === 'CallExpression' && Mocha.isTestConstruct(n)); } @@ -38,7 +38,7 @@ export const rule: Rule.RuleModule = { catchWithDone = true; }, 'CatchClause:exit': (node: estree.Node) => { - if (!catchWithDone || !isInsideTest()) { + if (!catchWithDone || !isInsideTest(node)) { return; } catchWithDone = false; @@ -57,7 +57,7 @@ export const rule: Rule.RuleModule = { CallExpression(node: estree.Node) { const callExpr = node as estree.CallExpression; if ( - isInsideTest() && + isInsideTest(node) && isThrowAssertWithoutNot(callExpr) && (callExpr.arguments.length === 0 || (callExpr.arguments.length === 1 && isIdentifier(callExpr.arguments[0], 'Error'))) diff --git a/packages/jsts/src/rules/S6079/rule.ts b/packages/jsts/src/rules/S6079/rule.ts index 6b83cb2a736..19cb829a2db 100644 --- a/packages/jsts/src/rules/S6079/rule.ts +++ b/packages/jsts/src/rules/S6079/rule.ts @@ -58,8 +58,8 @@ export const rule: Rule.RuleModule = { if (done.type !== 'Identifier') { return; } - const callbackScope = context - .getScope() + const callbackScope = context.sourceCode + .getScope(node) .childScopes.find(scope => scope.block === testCase.callback); if (!callbackScope) { return; diff --git a/packages/jsts/src/rules/S6439/rule.ts b/packages/jsts/src/rules/S6439/rule.ts index 2b58ff00489..8fcc0b488ca 100644 --- a/packages/jsts/src/rules/S6439/rule.ts +++ b/packages/jsts/src/rules/S6439/rule.ts @@ -47,7 +47,7 @@ export const rule: Rule.RuleModule = { }, }, create(context: Rule.RuleContext) { - if (!isRequiredParserServices(context.parserServices)) { + if (!isRequiredParserServices(context.sourceCode.parserServices)) { return {}; } let usesReactNative = false; diff --git a/packages/jsts/src/rules/S881/rule.ts b/packages/jsts/src/rules/S881/rule.ts index 5b3842c0857..acc65561a41 100644 --- a/packages/jsts/src/rules/S881/rule.ts +++ b/packages/jsts/src/rules/S881/rule.ts @@ -41,7 +41,7 @@ export const rule: Rule.RuleModule = { return { UpdateExpression(node: estree.Node) { - if (!isIgnored(node, context.getAncestors())) { + if (!isIgnored(node, context.sourceCode.getAncestors(node))) { reportUpdateExpression(node as estree.UpdateExpression); } }, diff --git a/packages/jsts/src/rules/helpers/regex/flags.ts b/packages/jsts/src/rules/helpers/regex/flags.ts index ffe418d2eae..b7ce2df7fcd 100644 --- a/packages/jsts/src/rules/helpers/regex/flags.ts +++ b/packages/jsts/src/rules/helpers/regex/flags.ts @@ -43,7 +43,7 @@ export function getFlags( } if (flags.type === 'Identifier' && context !== undefined) { // it's a variable, so we try to extract its value, but only if it's written once (const) - const variable = getVariableFromIdentifier(flags, context.getScope()); + const variable = getVariableFromIdentifier(flags, context.sourceCode.getScope(callExpr)); const ref = getUniqueWriteReference(variable); if (ref !== undefined && isStringLiteral(ref)) { return ref.value; diff --git a/packages/jsts/src/rules/helpers/type.ts b/packages/jsts/src/rules/helpers/type.ts index a31dd34e1fe..5af4cceecf1 100644 --- a/packages/jsts/src/rules/helpers/type.ts +++ b/packages/jsts/src/rules/helpers/type.ts @@ -277,7 +277,7 @@ export function isTypeAlias(node: TSESTree.TypeNode, context: Rule.RuleContext) ) { return false; } - const scope = context.getScope(); + const scope = context.sourceCode.getScope(node as any as estree.Node); const variable = getVariableFromScope(scope, node.typeName.name); return variable?.defs.some(def => def.node.type === 'TSTypeAliasDeclaration'); } From 81229639eed0610d10c8ac995e9c2d568a768ce1 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Mon, 6 May 2024 15:55:36 +0200 Subject: [PATCH 4/9] more fixes --- packages/jsts/src/rules/S1226/rule.ts | 6 +++--- packages/jsts/src/rules/S1481/rule.ts | 4 ++-- packages/jsts/src/rules/S1854/rule.ts | 15 ++++++++++----- packages/jsts/src/rules/S2234/rule.ts | 11 +++++++---- packages/jsts/src/rules/S5958/rule.ts | 2 +- packages/jsts/src/rules/S6442/rule.ts | 22 ++++++++++++---------- packages/jsts/src/rules/helpers/vue.ts | 2 +- 7 files changed, 36 insertions(+), 26 deletions(-) diff --git a/packages/jsts/src/rules/S1226/rule.ts b/packages/jsts/src/rules/S1226/rule.ts index a2cf45de29b..fba73e78516 100644 --- a/packages/jsts/src/rules/S1226/rule.ts +++ b/packages/jsts/src/rules/S1226/rule.ts @@ -74,7 +74,7 @@ export const rule: Rule.RuleModule = { // we do not raise issue when value is reassigned inside a top-level IfStatement, as it might be a shift or // default value reassignment if ( - isInsideIfStatement(context) || + isInsideIfStatement(context, identifier) || context.sourceCode.getAncestors(identifier).some(node => node.type === 'SwitchCase') // issue-2398 ) { return; @@ -226,8 +226,8 @@ export const rule: Rule.RuleModule = { }, }; -function isInsideIfStatement(context: Rule.RuleContext) { - const ancestors = context.getAncestors(); +function isInsideIfStatement(context: Rule.RuleContext, node: estree.Node): boolean { + const ancestors = context.sourceCode.getAncestors(node); for (let i = ancestors.length - 1; i >= 0; i--) { if ( ancestors[i].type === 'IfStatement' && diff --git a/packages/jsts/src/rules/S1481/rule.ts b/packages/jsts/src/rules/S1481/rule.ts index 86c851c4de4..aba757a44c0 100644 --- a/packages/jsts/src/rules/S1481/rule.ts +++ b/packages/jsts/src/rules/S1481/rule.ts @@ -109,8 +109,8 @@ export const rule: Rule.RuleModule = { jsxComponentsToIgnore.push((node as any).name); }, - 'Program:exit': () => { - checkScope(context.getScope(), 'nothing'); + 'Program:exit': (node: estree.Node) => { + checkScope(context.sourceCode.getScope(node), 'nothing'); toIgnore = []; jsxComponentsToIgnore = []; }, diff --git a/packages/jsts/src/rules/S1854/rule.ts b/packages/jsts/src/rules/S1854/rule.ts index f0f6ffa6573..3726dbc69dd 100644 --- a/packages/jsts/src/rules/S1854/rule.ts +++ b/packages/jsts/src/rules/S1854/rule.ts @@ -50,7 +50,7 @@ export const rule: Rule.RuleModule = { popAssignmentContext(); }, Identifier: (node: estree.Node) => { - if (isEnumConstant()) { + if (isEnumConstant(node)) { return; } checkIdentifierUsage(node as estree.Identifier); @@ -174,8 +174,10 @@ export const rule: Rule.RuleModule = { ); } - function isEnumConstant() { - return (context.getAncestors() as TSESTree.Node[]).some(n => n.type === 'TSEnumDeclaration'); + function isEnumConstant(node: estree.Node) { + return (context.sourceCode.getAncestors(node) as TSESTree.Node[]).some( + n => n.type === 'TSEnumDeclaration', + ); } function isDefaultParameter(ref: ReferenceLike) { @@ -246,7 +248,10 @@ export const rule: Rule.RuleModule = { if (isJSXAttributeName(node)) { return {}; } - const jsxReference = new JSXReference(node, context.getScope()); + const jsxReference = new JSXReference( + node, + context.sourceCode.getScope(node as any as estree.Node), + ); return { ref: jsxReference, variable: jsxReference.resolved }; } @@ -303,7 +308,7 @@ export const rule: Rule.RuleModule = { } function resolveReference(node: estree.Identifier) { - return resolveReferenceRecursively(node, context.getScope()); + return resolveReferenceRecursively(node, context.sourceCode.getScope(node)); } function resolveReferenceRecursively( diff --git a/packages/jsts/src/rules/S2234/rule.ts b/packages/jsts/src/rules/S2234/rule.ts index 159a60ba1ff..8cdf012eaae 100644 --- a/packages/jsts/src/rules/S2234/rule.ts +++ b/packages/jsts/src/rules/S2234/rule.ts @@ -75,7 +75,10 @@ export const rule: Rule.RuleModule = { argumentIndex, functionCall, ); - if (swappedArgumentName && !areComparedArguments([argumentName, swappedArgumentName])) { + if ( + swappedArgumentName && + !areComparedArguments([argumentName, swappedArgumentName], functionCall) + ) { raiseIssue(argumentName, swappedArgumentName, functionDeclaration, functionCall); return; } @@ -83,7 +86,7 @@ export const rule: Rule.RuleModule = { } } - function areComparedArguments(argumentNames: string[]): boolean { + function areComparedArguments(argumentNames: string[], node: estree.Node): boolean { function getName(node: estree.Node): string | undefined { switch (node.type) { case 'Identifier': @@ -102,8 +105,8 @@ export const rule: Rule.RuleModule = { argumentNames.length ); } - const maybeIfStmt = context - .getAncestors() + const maybeIfStmt = context.sourceCode + .getAncestors(node) .reverse() .find(ancestor => ancestor.type === 'IfStatement'); if (maybeIfStmt) { diff --git a/packages/jsts/src/rules/S5958/rule.ts b/packages/jsts/src/rules/S5958/rule.ts index 32a1d830a6d..a81ac182ef9 100644 --- a/packages/jsts/src/rules/S5958/rule.ts +++ b/packages/jsts/src/rules/S5958/rule.ts @@ -44,7 +44,7 @@ export const rule: Rule.RuleModule = { catchWithDone = false; const { param } = node as estree.CatchClause; if (param && param.type === 'Identifier') { - const exception = getVariableFromIdentifier(param, context.getScope()); + const exception = getVariableFromIdentifier(param, context.sourceCode.getScope(node)); if (exception && exception.references.length === 0) { context.report({ node: param, diff --git a/packages/jsts/src/rules/S6442/rule.ts b/packages/jsts/src/rules/S6442/rule.ts index 2a322142be2..24c27c50730 100644 --- a/packages/jsts/src/rules/S6442/rule.ts +++ b/packages/jsts/src/rules/S6442/rule.ts @@ -62,13 +62,13 @@ export const rule: Rule.RuleModule = { ); } - function getReactComponentScope(): Scope | null { - const scope = context.getScope(); + function getReactComponentScope(node: estree.Node): Scope | null { + const scope = context.sourceCode.getScope(node); const isReact = isFunctionNode(scope.block) && matchesReactComponentName(scope.block, 1); return isReact ? scope : null; } - function isInsideFunctionScope(scope: Scope | null): boolean { + function isInsideFunctionScope(scope: Scope | null, node: estree.Node): boolean { function searchUpperFunctionScope(current: Scope | null): Scope | null { if (current === null) { return null; @@ -79,7 +79,9 @@ export const rule: Rule.RuleModule = { } } - return scope !== null && searchUpperFunctionScope(context.getScope()) === scope; + return ( + scope !== null && searchUpperFunctionScope(context.sourceCode.getScope(node)) === scope + ); } function isInsideConditional(node: estree.Node): boolean { @@ -93,12 +95,12 @@ export const rule: Rule.RuleModule = { const setters: Variable[] = []; // Setter variables returned by the React useState() function. return { - ':function'() { - reactComponentScope ??= getReactComponentScope(); // Store the top-most React component scope. + ':function'(node: estree.Node) { + reactComponentScope ??= getReactComponentScope(node); // Store the top-most React component scope. }, - ':function:exit'() { - if (context.getScope() === reactComponentScope) { + ':function:exit'(node: estree.Node) { + if (context.sourceCode.getScope(node) === reactComponentScope) { // Clean variables when leaving the React component scope. reactComponentScope = null; setters.length = 0; @@ -110,7 +112,7 @@ export const rule: Rule.RuleModule = { ':has(ArrayPattern[elements.length=2][elements.0.type="Identifier"][elements.1.type="Identifier"])']( node: estree.VariableDeclarator, ) { - if (!isInsideFunctionScope(reactComponentScope)) { + if (!isInsideFunctionScope(reactComponentScope, node)) { return; } @@ -127,7 +129,7 @@ export const rule: Rule.RuleModule = { // Selector matching function calls like: setCount(1) 'CallExpression[callee.type="Identifier"][arguments.length=1]'(node: estree.CallExpression) { if ( - !isInsideFunctionScope(reactComponentScope) || + !isInsideFunctionScope(reactComponentScope, node) || setters.length === 0 || isInsideConditional(node) ) { diff --git a/packages/jsts/src/rules/helpers/vue.ts b/packages/jsts/src/rules/helpers/vue.ts index 74160c34527..09e084148dd 100644 --- a/packages/jsts/src/rules/helpers/vue.ts +++ b/packages/jsts/src/rules/helpers/vue.ts @@ -32,7 +32,7 @@ function isVueSetupScript(element: VChildElement): boolean { } export function isInsideVueSetupScript(node: estree.Node, ctx: Rule.RuleContext): boolean { - const doc: AST.VDocumentFragment = ctx.parserServices?.getDocumentFragment?.(); + const doc: AST.VDocumentFragment = ctx.sourceCode.parserServices?.getDocumentFragment?.(); const setupScript = doc?.children.find(isVueSetupScript); return ( !!setupScript && From 9b5c758cd87d896ec780a3c8230a25dec2591b61 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Mon, 6 May 2024 16:56:31 +0200 Subject: [PATCH 5/9] moar fixes --- packages/jsts/src/rules/S3516/rule.ts | 23 ++++++++++++++++++----- packages/jsts/src/rules/S4165/rule.ts | 21 ++++++++++++++++----- packages/jsts/src/rules/S4323/rule.ts | 2 +- packages/jsts/src/rules/S6351/rule.ts | 2 +- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/jsts/src/rules/S3516/rule.ts b/packages/jsts/src/rules/S3516/rule.ts index 7beedac10ee..383f62ef826 100644 --- a/packages/jsts/src/rules/S3516/rule.ts +++ b/packages/jsts/src/rules/S3516/rule.ts @@ -32,6 +32,7 @@ import { toEncodedMessage, } from '../helpers'; import { SONAR_RUNTIME } from '../../linter/parameters'; +import CodePathSegment = Rule.CodePathSegment; interface FunctionContext { codePath: Rule.CodePath; @@ -58,12 +59,14 @@ export const rule: Rule.RuleModule = { create(context: Rule.RuleContext) { const functionContextStack: FunctionContext[] = []; + const codePathSegments: Rule.CodePathSegment[][] = []; + let currentCodePathSegments: Rule.CodePathSegment[] = []; const checkOnFunctionExit = (node: estree.Node) => checkInvariantReturnStatements(node, functionContextStack[functionContextStack.length - 1]); function checkInvariantReturnStatements(node: estree.Node, functionContext?: FunctionContext) { - if (!functionContext || hasDifferentReturnTypes(functionContext)) { + if (!functionContext || hasDifferentReturnTypes(functionContext, currentCodePathSegments)) { return; } @@ -96,9 +99,18 @@ export const rule: Rule.RuleModule = { containsReturnWithoutValue: false, returnStatements: [], }); + codePathSegments.push(currentCodePathSegments); + currentCodePathSegments = []; }, onCodePathEnd() { functionContextStack.pop(); + currentCodePathSegments = codePathSegments.pop() || []; + }, + onCodePathSegmentStart: (segment: CodePathSegment) => { + currentCodePathSegments.push(segment); + }, + onCodePathSegmentEnd() { + currentCodePathSegments.pop(); }, ReturnStatement(node: estree.Node) { const currentContext = functionContextStack[functionContextStack.length - 1]; @@ -116,13 +128,14 @@ export const rule: Rule.RuleModule = { }, }; -function hasDifferentReturnTypes(functionContext: FunctionContext) { +function hasDifferentReturnTypes( + functionContext: FunctionContext, + currentSegments: Rule.CodePathSegment[], +) { // As this method is called at the exit point of a function definition, the current // segments are the ones leading to the exit point at the end of the function. If they // are reachable, it means there is an implicit return. - const hasImplicitReturn = functionContext.codePath.currentSegments.some( - segment => segment.reachable, - ); + const hasImplicitReturn = currentSegments.some(segment => segment.reachable); return ( hasImplicitReturn || diff --git a/packages/jsts/src/rules/S4165/rule.ts b/packages/jsts/src/rules/S4165/rule.ts index 7b9088310c3..011b94f104a 100644 --- a/packages/jsts/src/rules/S4165/rule.ts +++ b/packages/jsts/src/rules/S4165/rule.ts @@ -46,6 +46,8 @@ export const rule: Rule.RuleModule = { const reachingDefsMap = new Map(); // map from Variable to CodePath ids where variable is used const variableUsages = new Map>(); + const codePathSegments: Rule.CodePathSegment[][] = []; + let currentCodePathSegments: Rule.CodePathSegment[] = []; return { ':matches(AssignmentExpression, VariableDeclarator[init])': (node: estree.Node) => { @@ -55,7 +57,7 @@ export const rule: Rule.RuleModule = { popAssignmentContext(); }, Identifier: (node: estree.Node) => { - if (isEnumConstant()) { + if (isEnumConstant(node)) { return; } checkIdentifierUsage(node as estree.Identifier); @@ -75,12 +77,19 @@ export const rule: Rule.RuleModule = { // CodePath events onCodePathSegmentStart: (segment: CodePathSegment) => { reachingDefsMap.set(segment.id, new ReachingDefinitions(segment)); + currentCodePathSegments.push(segment); }, onCodePathStart: codePath => { pushContext(new CodePathContext(codePath)); + codePathSegments.push(currentCodePathSegments); + currentCodePathSegments = []; }, onCodePathEnd: () => { popContext(); + currentCodePathSegments = codePathSegments.pop() || []; + }, + onCodePathSegmentEnd() { + currentCodePathSegments.pop(); }, }; @@ -164,8 +173,10 @@ export const rule: Rule.RuleModule = { ); } - function isEnumConstant() { - return (context.getAncestors() as TSESTree.Node[]).some(n => n.type === 'TSEnumDeclaration'); + function isEnumConstant(node: estree.Node) { + return (context.sourceCode.getAncestors(node) as TSESTree.Node[]).some( + n => n.type === 'TSEnumDeclaration', + ); } function variableUsedOutsideOfCodePath(variable: Scope.Variable) { @@ -188,7 +199,7 @@ export const rule: Rule.RuleModule = { const assignment = peek(assignmentStack); assignment.add(ref); } else { - peek(codePathStack).codePath.currentSegments.forEach(segment => { + currentCodePathSegments.forEach(segment => { const reachingDefs = reachingDefsForSegment(segment); reachingDefs.add(ref); }); @@ -246,7 +257,7 @@ export const rule: Rule.RuleModule = { } function resolveReference(node: estree.Identifier) { - return resolveReferenceRecursively(node, context.getScope()); + return resolveReferenceRecursively(node, context.sourceCode.getScope(node)); } }, }; diff --git a/packages/jsts/src/rules/S4323/rule.ts b/packages/jsts/src/rules/S4323/rule.ts index 6e91a6f8d53..f196e29f2e8 100644 --- a/packages/jsts/src/rules/S4323/rule.ts +++ b/packages/jsts/src/rules/S4323/rule.ts @@ -55,7 +55,7 @@ export const rule: Rule.RuleModule = { } }), 'TSUnionType, TSIntersectionType': (node: estree.Node) => { - const ancestors = context.getAncestors(); + const ancestors = context.sourceCode.getAncestors(node); const declaration = ancestors.find( ancestor => (ancestor as TSESTree.Node).type === 'TSTypeAliasDeclaration', ); diff --git a/packages/jsts/src/rules/S6351/rule.ts b/packages/jsts/src/rules/S6351/rule.ts index 6430f6beb53..4dc86e39beb 100644 --- a/packages/jsts/src/rules/S6351/rule.ts +++ b/packages/jsts/src/rules/S6351/rule.ts @@ -196,7 +196,7 @@ function checkMultipleInputsRegex( } function isWithinWhileCondition(node: estree.Node, context: Rule.RuleContext) { - const ancestors = context.getAncestors(); + const ancestors = context.sourceCode.getAncestors(node); let parent: estree.Node | undefined; let child: estree.Node = node; while ((parent = ancestors.pop()) !== undefined) { From 574b26c0c56e4d4c33313e500c25f100d5644a31 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Tue, 7 May 2024 11:02:14 +0200 Subject: [PATCH 6/9] sonar qube --- packages/jsts/src/rules/S1854/rule.ts | 2 +- packages/jsts/src/rules/helpers/type.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jsts/src/rules/S1854/rule.ts b/packages/jsts/src/rules/S1854/rule.ts index 3726dbc69dd..67a1e74a779 100644 --- a/packages/jsts/src/rules/S1854/rule.ts +++ b/packages/jsts/src/rules/S1854/rule.ts @@ -250,7 +250,7 @@ export const rule: Rule.RuleModule = { } const jsxReference = new JSXReference( node, - context.sourceCode.getScope(node as any as estree.Node), + context.sourceCode.getScope(node as unknown as estree.Node), ); return { ref: jsxReference, variable: jsxReference.resolved }; } diff --git a/packages/jsts/src/rules/helpers/type.ts b/packages/jsts/src/rules/helpers/type.ts index 5af4cceecf1..e7374efa359 100644 --- a/packages/jsts/src/rules/helpers/type.ts +++ b/packages/jsts/src/rules/helpers/type.ts @@ -277,7 +277,7 @@ export function isTypeAlias(node: TSESTree.TypeNode, context: Rule.RuleContext) ) { return false; } - const scope = context.sourceCode.getScope(node as any as estree.Node); + const scope = context.sourceCode.getScope(node as unknown as estree.Node); const variable = getVariableFromScope(scope, node.typeName.name); return variable?.defs.some(def => def.node.type === 'TSTypeAliasDeclaration'); } From d2baf0970439f1f01acf9627e9be848766d851aa Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Tue, 7 May 2024 11:32:32 +0200 Subject: [PATCH 7/9] currentSegments --- packages/jsts/src/rules/S1854/rule.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/jsts/src/rules/S1854/rule.ts b/packages/jsts/src/rules/S1854/rule.ts index 67a1e74a779..9d0ccdd6ade 100644 --- a/packages/jsts/src/rules/S1854/rule.ts +++ b/packages/jsts/src/rules/S1854/rule.ts @@ -41,6 +41,8 @@ export const rule: Rule.RuleModule = { const variableUsages = new Map>(); const referencesUsedInDestructuring = new Set(); const destructuringStack: DestructuringContext[] = []; + const codePathSegments: CodePathSegment[][] = []; + let currentCodePathSegments: CodePathSegment[] = []; return { ':matches(AssignmentExpression, VariableDeclarator[init])': (node: estree.Node) => { @@ -89,12 +91,19 @@ export const rule: Rule.RuleModule = { // CodePath events onCodePathSegmentStart: (segment: CodePathSegment) => { liveVariablesMap.set(segment.id, new LiveVariables(segment)); + currentCodePathSegments.push(segment); }, onCodePathStart: codePath => { pushContext(new CodePathContext(codePath)); + codePathSegments.push(currentCodePathSegments); + currentCodePathSegments = []; + }, + onCodePathSegmentEnd() { + currentCodePathSegments.pop(); }, onCodePathEnd: () => { popContext(); + currentCodePathSegments = codePathSegments.pop() || []; }, }; @@ -266,7 +275,7 @@ export const rule: Rule.RuleModule = { const assignment = peek(assignmentStack); assignment.add(ref); } else { - peek(codePathStack).codePath.currentSegments.forEach(segment => { + currentCodePathSegments.forEach(segment => { lvaForSegment(segment).add(ref); }); } From b58c56d4f3f1febe6fd21298263dd162237fc751 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Tue, 7 May 2024 13:34:21 +0200 Subject: [PATCH 8/9] fix its --- packages/jsts/src/rules/S1854/rule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jsts/src/rules/S1854/rule.ts b/packages/jsts/src/rules/S1854/rule.ts index 9d0ccdd6ade..f8b445d2fb5 100644 --- a/packages/jsts/src/rules/S1854/rule.ts +++ b/packages/jsts/src/rules/S1854/rule.ts @@ -275,7 +275,7 @@ export const rule: Rule.RuleModule = { const assignment = peek(assignmentStack); assignment.add(ref); } else { - currentCodePathSegments.forEach(segment => { + [...currentCodePathSegments].forEach(segment => { lvaForSegment(segment).add(ref); }); } From c50ed0b5432316f5170cbf9fc98472f701863d69 Mon Sep 17 00:00:00 2001 From: Michal Zgliczynski Date: Tue, 7 May 2024 16:44:54 +0200 Subject: [PATCH 9/9] fix desktop project --- .../src/test/expected/jsts/desktop/typescript-S1854.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/its/ruling/src/test/expected/jsts/desktop/typescript-S1854.json b/its/ruling/src/test/expected/jsts/desktop/typescript-S1854.json index d457d158570..dd900a86b47 100644 --- a/its/ruling/src/test/expected/jsts/desktop/typescript-S1854.json +++ b/its/ruling/src/test/expected/jsts/desktop/typescript-S1854.json @@ -1,8 +1,5 @@ { "desktop:app/src/lib/git/status.ts": [ 322 -], -"desktop:app/src/ui/lib/git-perf.ts": [ -28 ] }