Rust: Add isFieldless and isUnitOnly to Enum

This commit is contained in:
Simon Friis Vindum
2025-11-25 10:08:26 +01:00
parent b4ae58871a
commit 50e8d0ca20
2 changed files with 27 additions and 0 deletions

View File

@@ -31,5 +31,23 @@ module Impl {
result = this.getVariantList().getAVariant() and
result.getName().getText() = name
}
/**
* Holds if this is a field-less enum, that is, an enum where no constructors contain fields.
*
* See: https://doc.rust-lang.org/reference/items/enumerations.html#r-items.enum.fieldless
*/
predicate isFieldless() {
forall(Variant v | v = this.getVariantList().getAVariant() | v.getNumberOfFields() = 0)
}
/**
* Holds if this is a unit-only enum, that is, an enum where all constructors are unit variants.
*
* See: https://doc.rust-lang.org/reference/items/enumerations.html#r-items.enum.unit-only
*/
predicate isUnitOnly() {
forall(Variant v | v = this.getVariantList().getAVariant() | v.isUnit())
}
}
}

View File

@@ -36,6 +36,15 @@ module Impl {
pragma[nomagic]
TupleField getTupleField(int i) { result = this.getFieldList().(TupleFieldList).getField(i) }
int getNumberOfFields() {
not this.hasFieldList() and
result = 0
or
result = this.getFieldList().(StructFieldList).getNumberOfFields()
or
result = this.getFieldList().(TupleFieldList).getNumberOfFields()
}
/** Holds if this variant uses tuple fields. */
pragma[nomagic]
predicate isTuple() { this.getFieldList() instanceof TupleFieldList }