laerad 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/laerad/file_analyzer.rb +43 -0
- data/lib/laerad/scope.rb +3 -1
- data/lib/laerad/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3a6b8326480701c196940c855f32155f82063550c1f649d4bc6a91ce3f94c41d
|
|
4
|
+
data.tar.gz: c79f6083de445395ad1f95d12209bfe565d85e8217a4ead2de67ddc27ada0249
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b4c50c7971ba93555f6155deb1da2b9e953348f86695e6d9484c72d3af1526d128e5637f5f0ce01bc7df1aa8387fcfd253fd749da079849e5786f7bf1b5e500d
|
|
7
|
+
data.tar.gz: 076e550586df6a84ff3ded07576731537da61e77cd630937080346efe88cf3488e5ac1c503c11c66ef555e49f34be7183a9269df209e4b613f8aa8d7dcab95d1
|
data/lib/laerad/file_analyzer.rb
CHANGED
|
@@ -47,6 +47,9 @@ module Laerad
|
|
|
47
47
|
|
|
48
48
|
def finalize_scope(scope)
|
|
49
49
|
scope.single_use_variables.each do |name|
|
|
50
|
+
next if name.start_with?("_")
|
|
51
|
+
next if scope.exempt_variables.include?(name)
|
|
52
|
+
|
|
50
53
|
line = scope.variable_definition_line(name)
|
|
51
54
|
@result.add_variable_violation(
|
|
52
55
|
name: name,
|
|
@@ -80,6 +83,12 @@ module Laerad
|
|
|
80
83
|
scope.register_variable_ref(name)
|
|
81
84
|
end
|
|
82
85
|
|
|
86
|
+
when SyntaxTree::VCall
|
|
87
|
+
name = extract_var_name(node)
|
|
88
|
+
if name && (scope = find_defining_scope(name))
|
|
89
|
+
scope.register_variable_ref(name)
|
|
90
|
+
end
|
|
91
|
+
|
|
83
92
|
when SyntaxTree::Assign
|
|
84
93
|
visit(node.target)
|
|
85
94
|
visit(node.value)
|
|
@@ -101,6 +110,12 @@ module Laerad
|
|
|
101
110
|
push_scope
|
|
102
111
|
visit_params(node.params)
|
|
103
112
|
visit(node.bodystmt)
|
|
113
|
+
if (block_name = extract_block_param_name(node.params)) && contains_yield?(node.bodystmt)
|
|
114
|
+
current_scope.exempt_variables.add(block_name)
|
|
115
|
+
end
|
|
116
|
+
if contains_zsuper?(node.bodystmt)
|
|
117
|
+
current_scope.param_names.each { |name| current_scope.exempt_variables.add(name) }
|
|
118
|
+
end
|
|
104
119
|
pop_scope
|
|
105
120
|
|
|
106
121
|
when SyntaxTree::BodyStmt
|
|
@@ -224,6 +239,9 @@ module Laerad
|
|
|
224
239
|
when SyntaxTree::Args
|
|
225
240
|
node.parts.each { |part| visit(part) }
|
|
226
241
|
|
|
242
|
+
when SyntaxTree::ArgBlock
|
|
243
|
+
visit(node.value)
|
|
244
|
+
|
|
227
245
|
when SyntaxTree::ArgParen
|
|
228
246
|
visit(node.arguments)
|
|
229
247
|
|
|
@@ -347,6 +365,8 @@ module Laerad
|
|
|
347
365
|
name = case param
|
|
348
366
|
when SyntaxTree::Ident
|
|
349
367
|
param.value
|
|
368
|
+
when SyntaxTree::Label
|
|
369
|
+
param.value.chomp(":")
|
|
350
370
|
when SyntaxTree::RestParam
|
|
351
371
|
param.name&.value
|
|
352
372
|
when SyntaxTree::KwRestParam
|
|
@@ -359,6 +379,7 @@ module Laerad
|
|
|
359
379
|
|
|
360
380
|
if name
|
|
361
381
|
current_scope.register_variable_def(name, param.location.start_line)
|
|
382
|
+
current_scope.param_names.add(name)
|
|
362
383
|
end
|
|
363
384
|
end
|
|
364
385
|
|
|
@@ -371,5 +392,27 @@ module Laerad
|
|
|
371
392
|
def extract_var_name(node)
|
|
372
393
|
node.value.value if node.value.is_a?(SyntaxTree::Ident)
|
|
373
394
|
end
|
|
395
|
+
|
|
396
|
+
def extract_block_param_name(params)
|
|
397
|
+
params = params.contents if params.is_a?(SyntaxTree::Paren)
|
|
398
|
+
return unless params.is_a?(SyntaxTree::Params)
|
|
399
|
+
params.block&.name&.value
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
def contains_yield?(node)
|
|
403
|
+
tree_contains?(node, SyntaxTree::YieldNode)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
def contains_zsuper?(node)
|
|
407
|
+
tree_contains?(node, SyntaxTree::ZSuper)
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
def tree_contains?(node, target_class)
|
|
411
|
+
if node.is_a?(target_class)
|
|
412
|
+
true
|
|
413
|
+
elsif node && !node.is_a?(SyntaxTree::DefNode) && node.respond_to?(:child_nodes)
|
|
414
|
+
node.child_nodes.any? { |child| tree_contains?(child, target_class) }
|
|
415
|
+
end
|
|
416
|
+
end
|
|
374
417
|
end
|
|
375
418
|
end
|
data/lib/laerad/scope.rb
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
module Laerad
|
|
4
4
|
class Scope
|
|
5
|
-
attr_reader :variables, :variable_def_lines
|
|
5
|
+
attr_reader :variables, :variable_def_lines, :exempt_variables, :param_names
|
|
6
6
|
|
|
7
7
|
def initialize
|
|
8
8
|
@variables = Hash.new(0)
|
|
9
9
|
@variable_def_lines = Hash.new { |h, k| h[k] = [] }
|
|
10
|
+
@exempt_variables = Set.new
|
|
11
|
+
@param_names = Set.new
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def register_variable_def(name, line)
|
data/lib/laerad/version.rb
CHANGED