Implement class variables

This commit is contained in:
Arthur Baars
2021-01-13 15:24:58 +01:00
parent a07e0fb0f7
commit 2921f72473
5 changed files with 77 additions and 2 deletions

View File

@@ -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 }
}

View 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

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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 |