From 48cfa9665a4bdf046c87c8fa08aa6cbd976fc946 Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 13 Oct 2021 12:01:48 +0000 Subject: [PATCH] Add "implicit `this`" query --- ql/src/queries/style/ImplicitThis.ql | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 ql/src/queries/style/ImplicitThis.ql diff --git a/ql/src/queries/style/ImplicitThis.ql b/ql/src/queries/style/ImplicitThis.ql new file mode 100644 index 00000000000..0f085235b61 --- /dev/null +++ b/ql/src/queries/style/ImplicitThis.ql @@ -0,0 +1,34 @@ +/** + * @name Using implicit `this` + * @description Writing member predicate calls with an implicit `this` can be confusing + * @kind problem + * @problem.severity warning + * @precision very-high + * @id ql/implicit-this + * @tags maintainability + */ + +import ql + +MemberCall explicitThisCallInFile(File f) { + result.getLocation().getFile() = f and + result.getBase() instanceof ThisAccess and + // Exclude `this.(Type).whatever(...)`, as some files have that as their only instance of `this`. + not result = any(InlineCast c).getBase() +} + +PredicateCall implicitThisCallInFile(File f) { + result.getLocation().getFile() = f and + exists(result.getTarget().getDeclaringType().getASuperType()) and + // Exclude `SomeModule::whatever(...)` + not exists(result.getQualifier()) +} + +PredicateCall confusingImplicitThisCall(File f) { + result = implicitThisCallInFile(f) and + exists(explicitThisCallInFile(f)) +} + +from PredicateCall c +where c = confusingImplicitThisCall(_) +select c, "Use of implicit `this`."