Ruby: add getAnAncestor, getADescendent

This commit is contained in:
Asger F
2022-10-18 13:32:29 +02:00
parent c8f7519cee
commit 515b8366d2
2 changed files with 25 additions and 0 deletions

View File

@@ -23,6 +23,20 @@ class Module extends TModule {
/** Gets an `include`d module. */ /** Gets an `include`d module. */
Module getAnIncludedModule() { result = getAnIncludedModule(this) } Module getAnIncludedModule() { result = getAnIncludedModule(this) }
/** Gets the super class or an included or prepended module. */
Module getADirectAncestor() {
result = [this.getSuperClass(), this.getAPrependedModule(), this.getAnIncludedModule()]
}
/** Gets a direct subclass or module including or prepending this one. */
Module getADirectDescendent() { this = result.getADirectAncestor() }
/** Gets a module that is transitively subclassed, included, or prepended by this module. */
Module getAnAncestor() { result = this.getADirectAncestor*() }
/** Gets a module that transitively subclasses, includes, or prepends this module. */
Module getADescendent() { result = this.getADirectDescendent*() }
/** Holds if this module is a class. */ /** Holds if this module is a class. */
pragma[noinline] pragma[noinline]
predicate isClass() { predicate isClass() {

View File

@@ -703,6 +703,17 @@ class ModuleNode instanceof Module {
/** Gets an `include`d module. */ /** Gets an `include`d module. */
final ModuleNode getAnIncludedModule() { result = super.getAnIncludedModule() } final ModuleNode getAnIncludedModule() { result = super.getAnIncludedModule() }
/** Gets the super class or an included or prepended module. */
final ModuleNode getADirectAncestor() { result = super.getADirectAncestor() }
/** Gets a direct subclass or module including or prepending this one. */
final ModuleNode getADirectDescendent() { result = super.getADirectDescendent() }
/** Gets a module that is transitively subclassed, included, or prepended by this module. */
final ModuleNode getAnAncestor() { result = super.getAnAncestor() }
/** Gets a module that transitively subclasses, includes, or prepends this module. */
final ModuleNode getADescendent() { result = super.getADescendent() }
/** Holds if this module is a class. */ /** Holds if this module is a class. */
predicate isClass() { super.isClass() } predicate isClass() { super.isClass() }