QL code and tests for C#/C++/JavaScript.

This commit is contained in:
Pavel Avgustinov
2018-08-02 17:53:23 +01:00
commit b55526aa58
10684 changed files with 581163 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
/**
* @name Pointless forwarding method
* @description A method forwards calls to another method of the same name that is not called independently.
* @kind problem
* @problem.severity recommendation
* @precision medium
* @id cs/useless-forwarding-method
* @tags maintainability
* useless-code
*/
import csharp
predicate methodInClass(ValueOrRefType t, Method m, string name)
{
m.getDeclaringType() = t
and m.getName() = name
}
predicate callIn(MethodCall mc, Method fromMethod)
{
fromMethod = mc.getEnclosingCallable()
}
predicate callTo(MethodCall mc, Method toMethod)
{
toMethod = mc.getTarget().getSourceDeclaration()
}
predicate candidates(Method forwarder, Method forwardee)
{
exists(ValueOrRefType t, string name |
methodInClass(t, forwarder, name) and methodInClass(t, forwardee, name) |
not ignored(forwarder) and not ignored(forwardee) and forwarder != forwardee
)
}
predicate ignored(Method m)
{
m.isAbstract()
or m.implements()
or m.isOverride()
or m.isVirtual()
or m.getName() = "Dispose"
or not m.fromSource()
}
from Method forwarder, Method forwardee
where
not extractionIsStandalone()
and candidates(forwarder, forwardee)
and forex(MethodCall c | callTo(c, forwardee) | callIn(c, forwarder))
and forex(MethodCall c | callIn(c, forwarder) | callTo(c, forwardee))
select forwarder.getSourceDeclaration(), "This method is a forwarder for $@, which is not called independently - the methods can be merged.",
forwardee.getSourceDeclaration(), forwardee.getName()