Fix inconsistent variable references

This commit is contained in:
Arthur Baars
2020-11-23 14:27:40 +01:00
parent 290d3decc8
commit c745978ebb
5 changed files with 247 additions and 16 deletions

View File

@@ -13,24 +13,36 @@ private VariableScope enclosingScope(AstNode node) {
result.getScopeElement() = parent*(node.getParent())
}
private string parameterName(AstNode node) {
result = node.(Identifier).getValue() or
result = node.(SplatParameter).getName().getValue() or
result = node.(HashSplatParameter).getName().getValue() or
result = node.(BlockParameter).getName().getValue() or
result = node.(OptionalParameter).getName().getValue() or
result = node.(KeywordParameter).getName().getValue() or
result = parameterName(node.(DestructuredParameter).getAFieldOrChild())
}
/** Holds if `scope` defines `name` as a parameter. */
private predicate scopeDefinesParameter(VariableScope scope, string name, Location location) {
exists(Identifier var |
name = var.getValue() and
location = var.getLocation() and
var in [scope
.(BlockScope)
.getScopeElement()
.getAFieldOrChild()
.(BlockParameters)
.getAFieldOrChild+(),
scope
.(MethodScope)
.getScopeElement()
.getAFieldOrChild()
.(MethodParameters)
.getAFieldOrChild+()]
)
location =
min(AstNode var |
name = parameterName(var) and
var in [scope
.(BlockScope)
.getScopeElement()
.getAFieldOrChild()
.(BlockParameters)
.getAFieldOrChild(),
scope
.(MethodScope)
.getScopeElement()
.getAFieldOrChild()
.(MethodParameters)
.getAFieldOrChild()]
|
var.getLocation() as loc order by loc.getStartLine(), loc.getStartColumn()
)
}
/** Holds if `var` is assigned in `scope`. */

View File

@@ -0,0 +1,58 @@
1.times do | x ; y|
y = 5
puts x
puts y
end
def order_pizza(client, *pizzas)
if pizzas.count == 1
puts "1 pizza for #{client}!"
else
puts "#{ pizzas.count} pizzas for #{client}!"
end
end
def print_map(**map)
map.each do |key, value|
puts "#{key} = #{value}"
end
end
def call_block(&block)
block.call
end
def opt_param(name = 'unknown', size = name.length)
puts name
puts size
end
def key_param(first: , middle: '', last:)
puts "#{first} #{middle} #{last}"
end
b = 2
def multi(a = (b = 5))
# `a` is a parameter and `b` is a new variable
puts "#{a} #{b}"
end
def multi2(d: e = 4)
# `d` is a parameter and `e` is a local variable
puts "#{d} #{e}"
end
def dup_underscore(_,_)
puts _ # binds to the first _
end
def tuples((a,b))
puts "#{a} #{b}"
end
x = 10
1.times do | y = (x = 1)|
puts x
puts y
end

View File

@@ -24,6 +24,57 @@ variableAccess
| nested_scopes.rb:38:8:38:8 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:4:1:39:3 | class scope |
| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:1:1:42:1 | top-level scope |
| nested_scopes.rb:41:1:41:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:1:1:42:1 | top-level scope |
| parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:1:18:1:18 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:3:9:3:9 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:4:9:4:9 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:9:25:9:30 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:11:41:11:46 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:15:17:15:19 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope |
| parameters.rb:16:3:16:5 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope |
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:17:13:17:15 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:17:22:17:26 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:21:17:21:21 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope |
| parameters.rb:22:3:22:7 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope |
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:25:40:25:43 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:26:8:26:11 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:27:8:27:11 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:31:11:31:15 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:31:20:31:25 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:31:30:31:33 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:34:1:34:1 | b | parameters.rb:34:1:34:1 | b | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:37:11:37:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:37:16:37:16 | b | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:42:11:42:11 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:42:16:42:16 | e | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope |
| parameters.rb:45:22:45:22 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope |
| parameters.rb:46:8:46:8 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope |
| parameters.rb:49:13:49:13 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:49:15:49:15 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:50:11:50:11 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:50:16:50:16 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:53:1:53:1 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope |
| parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:55:9:55:9 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:56:9:56:9 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope |
| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | block scope |
| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope |
| scopes.rb:5:9:5:9 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope |
@@ -44,6 +95,49 @@ parameterAccess
| nested_scopes.rb:18:34:18:34 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:16:21:19:15 | block scope |
| nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:9:24:11 | method scope |
| nested_scopes.rb:23:16:23:16 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:9:24:11 | method scope |
| parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:1:18:1:18 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:3:9:3:9 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:4:9:4:9 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope |
| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:9:25:9:30 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:11:41:11:46 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope |
| parameters.rb:15:17:15:19 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope |
| parameters.rb:16:3:16:5 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope |
| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:17:13:17:15 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:17:22:17:26 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope |
| parameters.rb:21:17:21:21 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope |
| parameters.rb:22:3:22:7 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope |
| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:25:40:25:43 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:26:8:26:11 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:27:8:27:11 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope |
| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:31:11:31:15 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:31:20:31:25 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:31:30:31:33 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope |
| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:37:11:37:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:42:11:42:11 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope |
| parameters.rb:45:22:45:22 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope |
| parameters.rb:46:8:46:8 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope |
| parameters.rb:49:13:49:13 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:49:15:49:15 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:50:11:50:11 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:50:16:50:16 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope |
| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope |
| parameters.rb:56:9:56:9 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope |
| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | block scope |
| scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | scopes.rb:9:9:13:3 | block scope |
localVariableAccess
@@ -62,6 +156,14 @@ localVariableAccess
| nested_scopes.rb:38:8:38:8 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:4:1:39:3 | class scope |
| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:1:1:42:1 | top-level scope |
| nested_scopes.rb:41:1:41:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:1:1:42:1 | top-level scope |
| parameters.rb:34:1:34:1 | b | parameters.rb:34:1:34:1 | b | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:37:16:37:16 | b | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | method scope |
| parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:42:16:42:16 | e | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | method scope |
| parameters.rb:53:1:53:1 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:55:9:55:9 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope |
| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope |
| scopes.rb:5:9:5:9 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope |
| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:13:3 | top-level scope |

View File

@@ -11,6 +11,29 @@ variable
| nested_scopes.rb:22:21:22:21 | a |
| nested_scopes.rb:31:11:31:11 | a |
| nested_scopes.rb:40:1:40:1 | d |
| parameters.rb:1:14:1:14 | x |
| parameters.rb:1:18:1:18 | y |
| parameters.rb:7:17:7:22 | client |
| parameters.rb:7:25:7:31 | pizzas |
| parameters.rb:15:15:15:19 | map |
| parameters.rb:16:16:16:18 | key |
| parameters.rb:16:21:16:25 | value |
| parameters.rb:21:16:21:21 | block |
| parameters.rb:25:15:25:30 | name |
| parameters.rb:25:33:25:50 | size |
| parameters.rb:30:15:30:20 | first |
| parameters.rb:30:24:30:33 | middle |
| parameters.rb:30:36:30:40 | last |
| parameters.rb:34:1:34:1 | b |
| parameters.rb:35:11:35:21 | a |
| parameters.rb:35:16:35:16 | b |
| parameters.rb:40:12:40:19 | d |
| parameters.rb:40:15:40:15 | e |
| parameters.rb:45:20:45:20 | _ |
| parameters.rb:49:12:49:16 | a |
| parameters.rb:49:12:49:16 | b |
| parameters.rb:53:1:53:1 | x |
| parameters.rb:54:14:54:24 | y |
| scopes.rb:2:14:2:14 | x |
| scopes.rb:4:4:4:4 | a |
| scopes.rb:7:1:7:1 | a |
@@ -21,6 +44,25 @@ parameter
| nested_scopes.rb:16:29:16:29 | a |
| nested_scopes.rb:18:26:18:26 | x |
| nested_scopes.rb:22:21:22:21 | a |
| parameters.rb:1:14:1:14 | x |
| parameters.rb:1:18:1:18 | y |
| parameters.rb:7:17:7:22 | client |
| parameters.rb:7:25:7:31 | pizzas |
| parameters.rb:15:15:15:19 | map |
| parameters.rb:16:16:16:18 | key |
| parameters.rb:16:21:16:25 | value |
| parameters.rb:21:16:21:21 | block |
| parameters.rb:25:15:25:30 | name |
| parameters.rb:25:33:25:50 | size |
| parameters.rb:30:15:30:20 | first |
| parameters.rb:30:24:30:33 | middle |
| parameters.rb:30:36:30:40 | last |
| parameters.rb:35:11:35:21 | a |
| parameters.rb:40:12:40:19 | d |
| parameters.rb:45:20:45:20 | _ |
| parameters.rb:49:12:49:16 | a |
| parameters.rb:49:12:49:16 | b |
| parameters.rb:54:14:54:24 | y |
| scopes.rb:2:14:2:14 | x |
| scopes.rb:9:14:9:14 | x |
localVariable
@@ -31,5 +73,9 @@ localVariable
| nested_scopes.rb:13:11:13:11 | a |
| nested_scopes.rb:31:11:31:11 | a |
| nested_scopes.rb:40:1:40:1 | d |
| parameters.rb:34:1:34:1 | b |
| parameters.rb:35:16:35:16 | b |
| parameters.rb:40:15:40:15 | e |
| parameters.rb:53:1:53:1 | x |
| scopes.rb:4:4:4:4 | a |
| scopes.rb:7:1:7:1 | a |

View File

@@ -11,6 +11,19 @@
| nested_scopes.rb:22:9:24:11 | method scope |
| nested_scopes.rb:27:7:29:9 | method scope |
| nested_scopes.rb:30:7:33:9 | class scope |
| parameters.rb:1:1:58:1 | top-level scope |
| parameters.rb:1:9:5:3 | block scope |
| parameters.rb:7:1:13:3 | method scope |
| parameters.rb:15:1:19:3 | method scope |
| parameters.rb:16:12:18:5 | block scope |
| parameters.rb:21:1:23:3 | method scope |
| parameters.rb:25:1:28:3 | method scope |
| parameters.rb:30:1:32:3 | method scope |
| parameters.rb:35:1:38:3 | method scope |
| parameters.rb:40:1:43:3 | method scope |
| parameters.rb:45:1:47:3 | method scope |
| parameters.rb:49:1:51:3 | method scope |
| parameters.rb:54:9:57:3 | block scope |
| scopes.rb:1:1:1:15 | method scope |
| scopes.rb:1:1:13:3 | top-level scope |
| scopes.rb:2:9:6:3 | block scope |