Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 515b836

Browse files
committed
Ruby: add getAnAncestor, getADescendent
1 parent c8f7519 commit 515b836

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

ruby/ql/lib/codeql/ruby/ast/Module.qll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,20 @@ class Module extends TModule {
2323
/** Gets an `include`d module. */
2424
Module getAnIncludedModule() { result = getAnIncludedModule(this) }
2525

26+
/** Gets the super class or an included or prepended module. */
27+
Module getADirectAncestor() {
28+
result = [this.getSuperClass(), this.getAPrependedModule(), this.getAnIncludedModule()]
29+
}
30+
31+
/** Gets a direct subclass or module including or prepending this one. */
32+
Module getADirectDescendent() { this = result.getADirectAncestor() }
33+
34+
/** Gets a module that is transitively subclassed, included, or prepended by this module. */
35+
Module getAnAncestor() { result = this.getADirectAncestor*() }
36+
37+
/** Gets a module that transitively subclasses, includes, or prepends this module. */
38+
Module getADescendent() { result = this.getADirectDescendent*() }
39+
2640
/** Holds if this module is a class. */
2741
pragma[noinline]
2842
predicate isClass() {

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,17 @@ class ModuleNode instanceof Module {
703703
/** Gets an `include`d module. */
704704
final ModuleNode getAnIncludedModule() { result = super.getAnIncludedModule() }
705705

706+
/** Gets the super class or an included or prepended module. */
707+
final ModuleNode getADirectAncestor() { result = super.getADirectAncestor() }
708+
709+
/** Gets a direct subclass or module including or prepending this one. */
710+
final ModuleNode getADirectDescendent() { result = super.getADirectDescendent() }
711+
712+
/** Gets a module that is transitively subclassed, included, or prepended by this module. */
713+
final ModuleNode getAnAncestor() { result = super.getAnAncestor() }
714+
715+
/** Gets a module that transitively subclasses, includes, or prepends this module. */
716+
final ModuleNode getADescendent() { result = super.getADescendent() }
706717
/** Holds if this module is a class. */
707718
predicate isClass() { super.isClass() }
708719

0 commit comments

Comments
 (0)