From 0f829476f4a7ecaf7c28ef190bc21c00b7a41304 Mon Sep 17 00:00:00 2001 From: Calum Grant Date: Tue, 9 Mar 2021 10:13:07 +0000 Subject: [PATCH] Ruby: Refactor EndCall to reduce number of classes --- ql/src/queries/performance/UseDetect.ql | 55 ++++++++++--------------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/ql/src/queries/performance/UseDetect.ql b/ql/src/queries/performance/UseDetect.ql index d75c4b83c25..262f7782548 100644 --- a/ql/src/queries/performance/UseDetect.ql +++ b/ql/src/queries/performance/UseDetect.ql @@ -13,42 +13,31 @@ import ruby -// Extracts the first or last element of a list -abstract class EndCall extends MethodCall { - abstract string detectCall(); -} +/** A call that extracts the first or last element of a list. */ +class EndCall extends MethodCall { + string detect; -abstract class First extends EndCall { - override string detectCall() { result = "detect" } -} - -class FirstCall extends First { - FirstCall() { - this.getMethodName() = "first" and - this.getNumberOfArguments() = 0 + EndCall() { + detect = "detect" and + ( + this.getMethodName() = "first" and + this.getNumberOfArguments() = 0 + or + this.getNumberOfArguments() = 1 and + this.getArgument(0).(IntegerLiteral).getValueText() = "0" + ) + or + detect = "reverse_detect" and + ( + this.getMethodName() = "last" and + this.getNumberOfArguments() = 0 + or + this.getNumberOfArguments() = 1 and + this.getArgument(0).(UnaryMinusExpr).getOperand().(IntegerLiteral).getValueText() = "1" + ) } -} -class FirstElement extends First, ElementReference { - FirstElement() { - this.getNumberOfArguments() = 1 and - this.getArgument(0).(IntegerLiteral).getValueText() = "0" - } -} - -abstract class Last extends EndCall { - override string detectCall() { result = "reverse_detect" } -} - -class LastCall extends Last { - LastCall() { this.getMethodName() = "last" and this.getNumberOfArguments() = 0 } -} - -class LastElement extends Last, ElementReference { - LastElement() { - this.getNumberOfArguments() = 1 and - this.getArgument(0).(UnaryMinusExpr).getOperand().(IntegerLiteral).getValueText() = "1" - } + string detectCall() { result = detect } } class SelectBlock extends MethodCall {