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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 35856e816ed1ba8b9ae913335e1e28b9b5a5181d4714064e0529d04c4ddbe98c
4
- data.tar.gz: 2396959e613c2f8261f8519c47aa7743d0be291f51fb2134d83f5f037928a43b
3
+ metadata.gz: 3a6b8326480701c196940c855f32155f82063550c1f649d4bc6a91ce3f94c41d
4
+ data.tar.gz: c79f6083de445395ad1f95d12209bfe565d85e8217a4ead2de67ddc27ada0249
5
5
  SHA512:
6
- metadata.gz: 5ef2b09e75348487b63511d4eca7b00400a00ae20dac624cb1eb224d45e641f4af9d647d7c740f7f892b679ec32aa2c09f6ab650014be8f190cb2dba9cb50531
7
- data.tar.gz: ad16630f69bd3504cce35015bd529886164d83173c32fa3ba854377212ab518bc4571c5c3e73741c5c52a1a4153e0afec1398d39c0840a0dbf0de2d394295035
6
+ metadata.gz: b4c50c7971ba93555f6155deb1da2b9e953348f86695e6d9484c72d3af1526d128e5637f5f0ce01bc7df1aa8387fcfd253fd749da079849e5786f7bf1b5e500d
7
+ data.tar.gz: 076e550586df6a84ff3ded07576731537da61e77cd630937080346efe88cf3488e5ac1c503c11c66ef555e49f34be7183a9269df209e4b613f8aa8d7dcab95d1
@@ -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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Laerad
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.6"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: laerad
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Giles Bowkett