mirror of
https://github.com/github/codeql.git
synced 2026-04-27 01:35:13 +02:00
Implement class variables
This commit is contained in:
@@ -22,6 +22,11 @@ private predicate instanceVariableAccess(
|
||||
else instance = false
|
||||
}
|
||||
|
||||
private predicate classVariableAccess(Generated::ClassVariable var, string name, VariableScope scope) {
|
||||
name = var.getValue() and
|
||||
scope = enclosingModuleOrClass(var)
|
||||
}
|
||||
|
||||
private VariableScope enclosingMethod(Generated::AstNode node) {
|
||||
exists(VariableScope scope, Callable c |
|
||||
scope = outerScope*(enclosingScope(node)) and
|
||||
@@ -145,7 +150,14 @@ private module Cached {
|
||||
cached
|
||||
newtype TVariable =
|
||||
TGlobalVariable(string name) { name = any(Generated::GlobalVariable var).getValue() } or
|
||||
TClassVariable(VariableScope scope, string name, Generated::AstNode decl) { none() } or
|
||||
TClassVariable(VariableScope scope, string name, Generated::AstNode decl) {
|
||||
decl =
|
||||
min(Generated::ClassVariable other |
|
||||
classVariableAccess(other, name, scope)
|
||||
|
|
||||
other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn()
|
||||
)
|
||||
} or
|
||||
TInstanceVariable(VariableScope scope, string name, boolean instance, Generated::AstNode decl) {
|
||||
decl =
|
||||
min(Generated::InstanceVariable other |
|
||||
@@ -549,7 +561,12 @@ module ClassVariableAccess {
|
||||
class Range extends VariableAccess::Range, @token_class_variable {
|
||||
ClassVariable variable;
|
||||
|
||||
Range() { this.(Generated::ClassVariable).getValue() = variable.getName() }
|
||||
Range() {
|
||||
exists(VariableScope scope, string name |
|
||||
variable = TClassVariable(scope, name, _) and
|
||||
classVariableAccess(this, name, scope)
|
||||
)
|
||||
}
|
||||
|
||||
final override ClassVariable getVariable() { result = variable }
|
||||
}
|
||||
|
||||
29
ql/test/library-tests/variables/class_variables.rb
Normal file
29
ql/test/library-tests/variables/class_variables.rb
Normal file
@@ -0,0 +1,29 @@
|
||||
@@x = 42
|
||||
|
||||
p @@x
|
||||
|
||||
def print
|
||||
p @@x
|
||||
end
|
||||
|
||||
class X
|
||||
def b
|
||||
p @@x
|
||||
end
|
||||
def self.s
|
||||
p @@x
|
||||
end
|
||||
end
|
||||
|
||||
class Y < BasicObject
|
||||
@@x = 10
|
||||
end
|
||||
|
||||
module M
|
||||
@@x = 12
|
||||
end
|
||||
|
||||
module N
|
||||
include M
|
||||
p @@x
|
||||
end
|
||||
@@ -1,4 +1,12 @@
|
||||
variableAccess
|
||||
| class_variables.rb:1:1:1:3 | @@x | class_variables.rb:1:1:1:3 | @@x | class_variables.rb:1:1:29:4 | top-level scope |
|
||||
| class_variables.rb:3:3:3:5 | @@x | class_variables.rb:1:1:1:3 | @@x | class_variables.rb:1:1:29:4 | top-level scope |
|
||||
| class_variables.rb:6:4:6:6 | @@x | class_variables.rb:1:1:1:3 | @@x | class_variables.rb:1:1:29:4 | top-level scope |
|
||||
| class_variables.rb:11:7:11:9 | @@x | class_variables.rb:11:7:11:9 | @@x | class_variables.rb:9:1:16:3 | class scope |
|
||||
| class_variables.rb:14:6:14:8 | @@x | class_variables.rb:11:7:11:9 | @@x | class_variables.rb:9:1:16:3 | class scope |
|
||||
| class_variables.rb:19:3:19:5 | @@x | class_variables.rb:19:3:19:5 | @@x | class_variables.rb:18:1:20:3 | class scope |
|
||||
| class_variables.rb:23:3:23:5 | @@x | class_variables.rb:23:3:23:5 | @@x | class_variables.rb:22:1:24:3 | module scope |
|
||||
| class_variables.rb:28:5:28:7 | @@x | class_variables.rb:28:5:28:7 | @@x | class_variables.rb:26:1:29:3 | module scope |
|
||||
| instance_variables.rb:1:1:1:4 | @top | instance_variables.rb:1:1:1:4 | @top | instance_variables.rb:1:1:44:4 | top-level scope |
|
||||
| instance_variables.rb:4:3:4:6 | @foo | instance_variables.rb:4:3:4:6 | @foo | instance_variables.rb:1:1:44:4 | top-level scope |
|
||||
| instance_variables.rb:8:8:8:11 | @foo | instance_variables.rb:4:3:4:6 | @foo | instance_variables.rb:1:1:44:4 | top-level scope |
|
||||
@@ -234,6 +242,14 @@ implicitWrite
|
||||
| ssa.rb:64:8:64:8 | a |
|
||||
| ssa.rb:66:15:66:15 | a |
|
||||
readAccess
|
||||
| class_variables.rb:1:1:1:3 | @@x |
|
||||
| class_variables.rb:3:3:3:5 | @@x |
|
||||
| class_variables.rb:6:4:6:6 | @@x |
|
||||
| class_variables.rb:11:7:11:9 | @@x |
|
||||
| class_variables.rb:14:6:14:8 | @@x |
|
||||
| class_variables.rb:19:3:19:5 | @@x |
|
||||
| class_variables.rb:23:3:23:5 | @@x |
|
||||
| class_variables.rb:28:5:28:7 | @@x |
|
||||
| instance_variables.rb:1:1:1:4 | @top |
|
||||
| instance_variables.rb:4:3:4:6 | @foo |
|
||||
| instance_variables.rb:8:8:8:11 | @foo |
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
| class_variables.rb:1:1:1:3 | @@x |
|
||||
| class_variables.rb:11:7:11:9 | @@x |
|
||||
| class_variables.rb:19:3:19:5 | @@x |
|
||||
| class_variables.rb:23:3:23:5 | @@x |
|
||||
| class_variables.rb:28:5:28:7 | @@x |
|
||||
| file://:0:0:0:0 | $0 |
|
||||
| file://:0:0:0:0 | $global |
|
||||
| instance_variables.rb:1:1:1:4 | @top |
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
| class_variables.rb:1:1:29:4 | top-level scope |
|
||||
| class_variables.rb:5:1:7:3 | method scope |
|
||||
| class_variables.rb:9:1:16:3 | class scope |
|
||||
| class_variables.rb:10:3:12:5 | method scope |
|
||||
| class_variables.rb:13:3:15:5 | method scope |
|
||||
| class_variables.rb:18:1:20:3 | class scope |
|
||||
| class_variables.rb:22:1:24:3 | module scope |
|
||||
| class_variables.rb:26:1:29:3 | module scope |
|
||||
| file://:0:0:0:0 | global scope |
|
||||
| instance_variables.rb:1:1:44:4 | top-level scope |
|
||||
| instance_variables.rb:3:1:5:3 | method scope |
|
||||
|
||||
Reference in New Issue
Block a user