diff --git a/ql/test/library-tests/ast/classes/classes.expected b/ql/test/library-tests/ast/classes/classes.expected new file mode 100644 index 00000000000..c833e0928d7 --- /dev/null +++ b/ql/test/library-tests/ast/classes/classes.expected @@ -0,0 +1,18 @@ +classes +| classes.rb:3:1:4:3 | Foo | Class | Foo | +| classes.rb:7:1:8:3 | Bar | Class | Bar | +| classes.rb:11:1:12:3 | Baz | Class | Baz | +| classes.rb:16:1:17:3 | MyClass | Class | MyClass | +| classes.rb:20:1:31:3 | Wibble | Class | Wibble | +classesWithScopeResolutionNames +| classes.rb:16:1:17:3 | MyClass | classes.rb:16:7:16:23 | ...::MyClass | +exprsInClasses +| classes.rb:20:1:31:3 | Wibble | 0 | classes.rb:21:3:23:5 | method_a | Method | +| classes.rb:20:1:31:3 | Wibble | 1 | classes.rb:25:3:27:5 | method_b | Method | +| classes.rb:20:1:31:3 | Wibble | 2 | classes.rb:29:3:29:20 | call to some_method_call | Call | +| classes.rb:20:1:31:3 | Wibble | 3 | classes.rb:30:3:30:19 | ... = ... | AssignExpr | +methodsInClasses +| classes.rb:20:1:31:3 | Wibble | classes.rb:21:3:23:5 | method_a | +| classes.rb:20:1:31:3 | Wibble | classes.rb:25:3:27:5 | method_b | +classesWithASuperclass +| classes.rb:11:1:12:3 | Baz | classes.rb:11:13:11:32 | call to superclass_for | diff --git a/ql/test/library-tests/ast/classes/classes.ql b/ql/test/library-tests/ast/classes/classes.ql new file mode 100644 index 00000000000..7fe592e8e0a --- /dev/null +++ b/ql/test/library-tests/ast/classes/classes.ql @@ -0,0 +1,17 @@ +import ruby + +query predicate classes(Class c, string pClass, string name) { + pClass = c.getAPrimaryQlClass() and name = c.getName() +} + +query predicate classesWithScopeResolutionNames(Class c, ScopeResolution name) { + name = c.getNameScopeResolution() +} + +query predicate exprsInClasses(Class c, int i, Expr e, string eClass) { + e = c.getExpr(i) and eClass = e.getAPrimaryQlClass() +} + +query predicate methodsInClasses(Class c, Method m) { m = c.getAMethod() } + +query predicate classesWithASuperclass(Class c, Expr scExpr) { scExpr = c.getSuperclassExpr() } diff --git a/ql/test/library-tests/ast/classes/classes.rb b/ql/test/library-tests/ast/classes/classes.rb new file mode 100644 index 00000000000..477194ec774 --- /dev/null +++ b/ql/test/library-tests/ast/classes/classes.rb @@ -0,0 +1,46 @@ + +# a class with no superclass specified +class Foo +end + +# a class where the superclass is a constant +class Bar < BaseClass +end + +# a class where the superclass is a call expression +class Baz < superclass_for(:baz) +end + +# a class where the name is a scope resolution +module MyModule; end +class MyModule::MyClass +end + +# a class with some methods and some other arbitrary expressions +class Wibble + def method_a + puts 'a' + end + + def method_b + puts 'b' + end + + some_method_call() + $global_var = 123 +end + +# a singleton class with some methods and some other arbitrary expressions +x = 'hello' +class << x + def length + 100 * super + end + + def wibble + puts 'wibble' + end + + another_method_call + $global_var2 = 456 +end \ No newline at end of file diff --git a/ql/test/library-tests/ast/classes/singleton_classes.expected b/ql/test/library-tests/ast/classes/singleton_classes.expected new file mode 100644 index 00000000000..93769be4d40 --- /dev/null +++ b/ql/test/library-tests/ast/classes/singleton_classes.expected @@ -0,0 +1,10 @@ +singletonClasses +| classes.rb:35:1:46:3 | class << ... | Class | classes.rb:35:10:35:10 | call to x | +exprsInSingletonClasses +| classes.rb:35:1:46:3 | class << ... | 0 | classes.rb:36:3:38:5 | length | Method | +| classes.rb:35:1:46:3 | class << ... | 1 | classes.rb:40:3:42:5 | wibble | Method | +| classes.rb:35:1:46:3 | class << ... | 2 | classes.rb:44:3:44:21 | call to another_method_call | Call | +| classes.rb:35:1:46:3 | class << ... | 3 | classes.rb:45:3:45:20 | ... = ... | AssignExpr | +methodsInSingletonClasses +| classes.rb:35:1:46:3 | class << ... | classes.rb:36:3:38:5 | length | +| classes.rb:35:1:46:3 | class << ... | classes.rb:40:3:42:5 | wibble | diff --git a/ql/test/library-tests/ast/classes/singleton_classes.ql b/ql/test/library-tests/ast/classes/singleton_classes.ql new file mode 100644 index 00000000000..83e0da59ce2 --- /dev/null +++ b/ql/test/library-tests/ast/classes/singleton_classes.ql @@ -0,0 +1,11 @@ +import ruby + +query predicate singletonClasses(SingletonClass sc, string pClass, Expr value) { + pClass = sc.getAPrimaryQlClass() and value = sc.getValue() +} + +query predicate exprsInSingletonClasses(SingletonClass sc, int i, Expr e, string eClass) { + e = sc.getExpr(i) and eClass = e.getAPrimaryQlClass() +} + +query predicate methodsInSingletonClasses(SingletonClass sc, Method m) { m = sc.getAMethod() }