Rust: avoid multiple PrimaryQLClass warnings

Fixes things like:
```
multiplePrimaryQlClasses
| x | PathExpr,VariableAccess |
```
This commit is contained in:
Arthur Baars
2024-10-17 18:58:33 +02:00
parent e1c315b288
commit 11396ef7cb

View File

@@ -1,6 +1,8 @@
private import rust
private import codeql.rust.elements.internal.generated.ParentChild
private import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl
private import codeql.rust.elements.internal.PathExprImpl::Impl as PathExprImpl
private import codeql.rust.elements.internal.ImplicitVariableAccessImpl::Impl as ImplicitVariableAccessImpl
private import codeql.util.DenseRank
module Impl {
@@ -449,7 +451,8 @@ module Impl {
private class TVariableAccess = Synth::TPathExpr or Synth::TImplicitVariableAccess;
/** A variable access. */
class VariableAccess extends ExprImpl::Expr, TVariableAccess instanceof VariableAccessCand {
abstract class VariableAccess extends ExprImpl::Expr, TVariableAccess instanceof VariableAccessCand
{
private string name;
private Variable v;
@@ -466,6 +469,18 @@ module Impl {
override string getAPrimaryQlClass() { result = "VariableAccess" }
}
private class VariableAccessPathExpr extends VariableAccess, PathExprImpl::PathExpr {
override string getAPrimaryQlClass() { result = VariableAccess.super.getAPrimaryQlClass() }
}
private class VariableAccessImplicitVariableAccess extends VariableAccess,
ImplicitVariableAccessImpl::ImplicitVariableAccess
{
override string toString() { result = VariableAccess.super.toString() }
override string getAPrimaryQlClass() { result = VariableAccess.super.getAPrimaryQlClass() }
}
/** Holds if `e` occurs in the LHS of an assignment or compound assignment. */
private predicate assignmentExprDescendant(Expr e) {
e = any(AssignmentExpr ae).getLhs()