deep-cover 0.6.2 → 0.6.3.pre
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/.gitignore +3 -1
- data/.rspec +2 -1
- data/.rspec_all +2 -1
- data/.rubocop.yml +8 -9
- data/Gemfile +2 -0
- data/Rakefile +32 -6
- data/bin/cov +3 -3
- data/deep_cover.gemspec +3 -16
- data/exe/deep-cover +5 -0
- data/lib/deep_cover/cli/debugger.rb +1 -1
- data/lib/deep_cover/cli/exec.rb +1 -1
- data/lib/deep_cover/cli/instrumented_clone_reporter.rb +5 -3
- data/lib/deep_cover/cli/runner.rb +2 -2
- data/lib/deep_cover/{tools/dump_covered_code.rb → dump_covered_code.rb} +2 -0
- metadata +10 -203
- data/lib/deep-cover.rb +0 -3
- data/lib/deep_cover.rb +0 -22
- data/lib/deep_cover/analyser.rb +0 -23
- data/lib/deep_cover/analyser/base.rb +0 -104
- data/lib/deep_cover/analyser/branch.rb +0 -41
- data/lib/deep_cover/analyser/covered_code_source.rb +0 -21
- data/lib/deep_cover/analyser/function.rb +0 -14
- data/lib/deep_cover/analyser/node.rb +0 -54
- data/lib/deep_cover/analyser/per_char.rb +0 -38
- data/lib/deep_cover/analyser/per_line.rb +0 -41
- data/lib/deep_cover/analyser/ruby25_like_branch.rb +0 -211
- data/lib/deep_cover/analyser/statement.rb +0 -33
- data/lib/deep_cover/analyser/stats.rb +0 -54
- data/lib/deep_cover/analyser/subset.rb +0 -27
- data/lib/deep_cover/auto_run.rb +0 -71
- data/lib/deep_cover/autoload_tracker.rb +0 -215
- data/lib/deep_cover/backports.rb +0 -22
- data/lib/deep_cover/base.rb +0 -117
- data/lib/deep_cover/basics.rb +0 -22
- data/lib/deep_cover/builtin_takeover.rb +0 -10
- data/lib/deep_cover/config.rb +0 -104
- data/lib/deep_cover/config_setter.rb +0 -33
- data/lib/deep_cover/core_ext/autoload_overrides.rb +0 -112
- data/lib/deep_cover/core_ext/coverage_replacement.rb +0 -61
- data/lib/deep_cover/core_ext/exec_callbacks.rb +0 -27
- data/lib/deep_cover/core_ext/instruction_sequence_load_iseq.rb +0 -32
- data/lib/deep_cover/core_ext/load_overrides.rb +0 -19
- data/lib/deep_cover/core_ext/require_overrides.rb +0 -28
- data/lib/deep_cover/coverage.rb +0 -125
- data/lib/deep_cover/coverage/analysis.rb +0 -42
- data/lib/deep_cover/coverage/persistence.rb +0 -84
- data/lib/deep_cover/covered_code.rb +0 -145
- data/lib/deep_cover/custom_requirer.rb +0 -187
- data/lib/deep_cover/flag_comment_associator.rb +0 -68
- data/lib/deep_cover/load.rb +0 -66
- data/lib/deep_cover/memoize.rb +0 -48
- data/lib/deep_cover/module_override.rb +0 -39
- data/lib/deep_cover/node.rb +0 -23
- data/lib/deep_cover/node/arguments.rb +0 -51
- data/lib/deep_cover/node/assignments.rb +0 -273
- data/lib/deep_cover/node/base.rb +0 -155
- data/lib/deep_cover/node/begin.rb +0 -27
- data/lib/deep_cover/node/block.rb +0 -61
- data/lib/deep_cover/node/branch.rb +0 -32
- data/lib/deep_cover/node/case.rb +0 -113
- data/lib/deep_cover/node/collections.rb +0 -31
- data/lib/deep_cover/node/const.rb +0 -12
- data/lib/deep_cover/node/def.rb +0 -40
- data/lib/deep_cover/node/empty_body.rb +0 -32
- data/lib/deep_cover/node/exceptions.rb +0 -79
- data/lib/deep_cover/node/if.rb +0 -73
- data/lib/deep_cover/node/keywords.rb +0 -86
- data/lib/deep_cover/node/literals.rb +0 -100
- data/lib/deep_cover/node/loops.rb +0 -74
- data/lib/deep_cover/node/mixin/can_augment_children.rb +0 -65
- data/lib/deep_cover/node/mixin/check_completion.rb +0 -18
- data/lib/deep_cover/node/mixin/child_can_be_empty.rb +0 -27
- data/lib/deep_cover/node/mixin/executed_after_children.rb +0 -15
- data/lib/deep_cover/node/mixin/execution_location.rb +0 -66
- data/lib/deep_cover/node/mixin/filters.rb +0 -47
- data/lib/deep_cover/node/mixin/flow_accounting.rb +0 -71
- data/lib/deep_cover/node/mixin/has_child.rb +0 -145
- data/lib/deep_cover/node/mixin/has_child_handler.rb +0 -75
- data/lib/deep_cover/node/mixin/has_tracker.rb +0 -46
- data/lib/deep_cover/node/mixin/is_statement.rb +0 -20
- data/lib/deep_cover/node/mixin/rewriting.rb +0 -35
- data/lib/deep_cover/node/mixin/wrapper.rb +0 -15
- data/lib/deep_cover/node/module.rb +0 -66
- data/lib/deep_cover/node/root.rb +0 -20
- data/lib/deep_cover/node/send.rb +0 -161
- data/lib/deep_cover/node/short_circuit.rb +0 -42
- data/lib/deep_cover/node/splat.rb +0 -15
- data/lib/deep_cover/node/variables.rb +0 -16
- data/lib/deep_cover/parser_ext/range.rb +0 -21
- data/lib/deep_cover/problem_with_diagnostic.rb +0 -63
- data/lib/deep_cover/reporter.rb +0 -10
- data/lib/deep_cover/reporter/base.rb +0 -68
- data/lib/deep_cover/reporter/html.rb +0 -15
- data/lib/deep_cover/reporter/html/base.rb +0 -14
- data/lib/deep_cover/reporter/html/index.rb +0 -59
- data/lib/deep_cover/reporter/html/site.rb +0 -70
- data/lib/deep_cover/reporter/html/source.rb +0 -136
- data/lib/deep_cover/reporter/html/template/assets/32px.png +0 -0
- data/lib/deep_cover/reporter/html/template/assets/40px.png +0 -0
- data/lib/deep_cover/reporter/html/template/assets/deep_cover.css.sass +0 -336
- data/lib/deep_cover/reporter/html/template/assets/jquery-3.2.1.min.js +0 -4
- data/lib/deep_cover/reporter/html/template/assets/jquery-3.2.1.min.map +0 -1
- data/lib/deep_cover/reporter/html/template/assets/jstree.css +0 -1108
- data/lib/deep_cover/reporter/html/template/assets/jstree.js +0 -8424
- data/lib/deep_cover/reporter/html/template/assets/jstreetable.js +0 -1069
- data/lib/deep_cover/reporter/html/template/assets/throbber.gif +0 -0
- data/lib/deep_cover/reporter/html/template/index.html.erb +0 -75
- data/lib/deep_cover/reporter/html/template/source.html.erb +0 -35
- data/lib/deep_cover/reporter/istanbul.rb +0 -184
- data/lib/deep_cover/reporter/text.rb +0 -58
- data/lib/deep_cover/reporter/tree/util.rb +0 -86
- data/lib/deep_cover/tools.rb +0 -22
- data/lib/deep_cover/tools/blank.rb +0 -25
- data/lib/deep_cover/tools/builtin_coverage.rb +0 -55
- data/lib/deep_cover/tools/camelize.rb +0 -13
- data/lib/deep_cover/tools/content_tag.rb +0 -11
- data/lib/deep_cover/tools/covered.rb +0 -9
- data/lib/deep_cover/tools/execute_sample.rb +0 -34
- data/lib/deep_cover/tools/format.rb +0 -18
- data/lib/deep_cover/tools/format_char_cover.rb +0 -19
- data/lib/deep_cover/tools/format_generated_code.rb +0 -27
- data/lib/deep_cover/tools/indent_string.rb +0 -26
- data/lib/deep_cover/tools/merge.rb +0 -16
- data/lib/deep_cover/tools/number_lines.rb +0 -22
- data/lib/deep_cover/tools/our_coverage.rb +0 -11
- data/lib/deep_cover/tools/profiling.rb +0 -68
- data/lib/deep_cover/tools/render_template.rb +0 -13
- data/lib/deep_cover/tools/require_relative_dir.rb +0 -12
- data/lib/deep_cover/tools/scan_match_datas.rb +0 -10
- data/lib/deep_cover/tools/silence_warnings.rb +0 -18
- data/lib/deep_cover/tools/slice.rb +0 -9
- data/lib/deep_cover/tools/strip_heredoc.rb +0 -18
- data/lib/deep_cover/tools/truncate_backtrace.rb +0 -32
- data/lib/deep_cover/tracker_bucket.rb +0 -50
- data/lib/deep_cover/tracker_hits_per_path.rb +0 -35
- data/lib/deep_cover/tracker_storage.rb +0 -76
- data/lib/deep_cover/tracker_storage_per_path.rb +0 -34
- data/lib/deep_cover/version.rb +0 -5
data/lib/deep_cover/node/base.rb
DELETED
@@ -1,155 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module DeepCover
|
4
|
-
# Base class to handle covered nodes.
|
5
|
-
class Node
|
6
|
-
include Mixin
|
7
|
-
include HasTracker
|
8
|
-
include HasChild
|
9
|
-
include HasChildHandler
|
10
|
-
include CanAugmentChildren
|
11
|
-
include Rewriting
|
12
|
-
extend CheckCompletion
|
13
|
-
include FlowAccounting
|
14
|
-
include IsStatement
|
15
|
-
include ExecutionLocation
|
16
|
-
include ChildCanBeEmpty
|
17
|
-
include Filters
|
18
|
-
extend Filters::ClassMethods
|
19
|
-
|
20
|
-
attr_reader :index, :parent, :children, :base_node
|
21
|
-
|
22
|
-
def initialize(base_node, parent:, index: 0, base_children: base_node.children)
|
23
|
-
@base_node = base_node
|
24
|
-
@parent = parent
|
25
|
-
@index = index
|
26
|
-
@children = []
|
27
|
-
begin
|
28
|
-
@children = augment_children(base_children)
|
29
|
-
initialize_siblings
|
30
|
-
super()
|
31
|
-
rescue StandardError => e
|
32
|
-
diagnose(e)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
### Public API
|
37
|
-
|
38
|
-
# Search self and descendants for a particular Class or type
|
39
|
-
def find_all(lookup)
|
40
|
-
case lookup
|
41
|
-
when ::Module
|
42
|
-
each_node.grep(lookup)
|
43
|
-
when ::Symbol
|
44
|
-
each_node.find_all { |n| n.type == lookup }
|
45
|
-
when ::String
|
46
|
-
each_node.find_all { |n| n.source == lookup }
|
47
|
-
when ::Regexp
|
48
|
-
each_node.find_all { |n| n.source =~ lookup }
|
49
|
-
else
|
50
|
-
raise ::TypeError, "Expected class or symbol, got #{lookup.class}: #{lookup.inspect}"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Shortcut to access children
|
55
|
-
def [](lookup)
|
56
|
-
if lookup.is_a?(Integer)
|
57
|
-
children.fetch(lookup)
|
58
|
-
else
|
59
|
-
found = find_all(lookup)
|
60
|
-
case found.size
|
61
|
-
when 1
|
62
|
-
found.first
|
63
|
-
when 0
|
64
|
-
raise "No children of type #{lookup}"
|
65
|
-
else
|
66
|
-
raise "Ambiguous lookup #{lookup}, found #{found}."
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# Shortcut to create a node from source code
|
72
|
-
def self.[](source)
|
73
|
-
CoveredCode.new(source: source).execute_code.covered_ast
|
74
|
-
end
|
75
|
-
|
76
|
-
def children_nodes
|
77
|
-
children.select { |c| c.is_a? Node }
|
78
|
-
end
|
79
|
-
alias_method :children_nodes_in_flow_order, :children_nodes
|
80
|
-
|
81
|
-
attr_accessor :next_sibling
|
82
|
-
attr_accessor :previous_sibling
|
83
|
-
protected :next_sibling=, :previous_sibling=
|
84
|
-
def initialize_siblings
|
85
|
-
children_nodes_in_flow_order.each_cons(2) do |child, next_child|
|
86
|
-
child.next_sibling = next_child
|
87
|
-
next_child.previous_sibling = child
|
88
|
-
end
|
89
|
-
end
|
90
|
-
private :initialize_siblings
|
91
|
-
|
92
|
-
# Adapted from https://github.com/whitequark/ast/blob/master/lib/ast/node.rb
|
93
|
-
def to_s(indent = 0)
|
94
|
-
[
|
95
|
-
' ' * indent,
|
96
|
-
'(',
|
97
|
-
fancy_type,
|
98
|
-
*children.map do |child, idx|
|
99
|
-
if child.is_a?(Node)
|
100
|
-
"\n#{child.to_s(indent + 1)}"
|
101
|
-
else
|
102
|
-
" #{child.inspect}"
|
103
|
-
end
|
104
|
-
end,
|
105
|
-
')',
|
106
|
-
].join
|
107
|
-
end
|
108
|
-
|
109
|
-
alias_method :inspect, :to_s
|
110
|
-
### Internal API
|
111
|
-
|
112
|
-
def covered_code
|
113
|
-
parent.covered_code
|
114
|
-
end
|
115
|
-
|
116
|
-
def type
|
117
|
-
return base_node.type if base_node.respond_to? :type
|
118
|
-
self.class.name.split('::').last.to_sym
|
119
|
-
end
|
120
|
-
|
121
|
-
def each_node(order = :postorder, &block)
|
122
|
-
return to_enum :each_node, order unless block_given?
|
123
|
-
yield self unless order == :postorder
|
124
|
-
children_nodes.each do |child|
|
125
|
-
child.each_node(order, &block)
|
126
|
-
end
|
127
|
-
yield self if order == :postorder
|
128
|
-
self
|
129
|
-
end
|
130
|
-
|
131
|
-
def fancy_type
|
132
|
-
class_name = self.class.to_s.gsub(/^DeepCover::/, '').gsub(/^Node::/, '')
|
133
|
-
t = type.to_s
|
134
|
-
t.casecmp(class_name) == 0 ? t : "#{t}[#{class_name}]"
|
135
|
-
end
|
136
|
-
|
137
|
-
private
|
138
|
-
|
139
|
-
def diagnose(exception)
|
140
|
-
msg = if self.class == Node
|
141
|
-
"Unknown node type encountered: #{base_node.type}"
|
142
|
-
else
|
143
|
-
"Node class #{self.class} incorrectly defined"
|
144
|
-
end
|
145
|
-
warn [msg,
|
146
|
-
'Attempting to continue, but this node will not be handled properly',
|
147
|
-
('Its subnodes will be ignored' if children.empty?),
|
148
|
-
'Source:',
|
149
|
-
expression,
|
150
|
-
'Original exception:',
|
151
|
-
exception.inspect,
|
152
|
-
].join("\n")
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module DeepCover
|
4
|
-
class Node
|
5
|
-
class Begin < Node
|
6
|
-
has_extra_children expressions: Node,
|
7
|
-
is_statement: true
|
8
|
-
|
9
|
-
def is_statement
|
10
|
-
false
|
11
|
-
end
|
12
|
-
|
13
|
-
def executed_loc_keys
|
14
|
-
# Begin is a generic grouping used in different contexts.
|
15
|
-
case loc_hash[:begin] && loc_hash[:begin].source
|
16
|
-
when nil, '(', 'begin'
|
17
|
-
[]
|
18
|
-
when 'else', '#{'
|
19
|
-
%i[begin end]
|
20
|
-
else
|
21
|
-
warn 'Unknown context for Begin node'
|
22
|
-
[]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'send'
|
4
|
-
require_relative 'keywords'
|
5
|
-
|
6
|
-
module DeepCover
|
7
|
-
class Node
|
8
|
-
module WithBlock
|
9
|
-
def flow_completion_count
|
10
|
-
parent.flow_completion_count
|
11
|
-
end
|
12
|
-
|
13
|
-
def execution_count
|
14
|
-
last = children_nodes.last
|
15
|
-
return last.flow_completion_count if last
|
16
|
-
super
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class SendWithBlock < SendBase
|
21
|
-
include WithBlock
|
22
|
-
end
|
23
|
-
|
24
|
-
class SuperWithBlock < Node
|
25
|
-
include WithBlock
|
26
|
-
has_extra_children arguments: Node
|
27
|
-
end
|
28
|
-
|
29
|
-
class Block < Node
|
30
|
-
check_completion
|
31
|
-
has_tracker :body
|
32
|
-
has_child call: {send: SendWithBlock, zsuper: SuperWithBlock, super: SuperWithBlock, csend: Csend}
|
33
|
-
has_child args: Args
|
34
|
-
has_child body: Node,
|
35
|
-
can_be_empty: -> { base_node.loc.end.begin },
|
36
|
-
rewrite: '%{body_tracker};%{local}=nil;%{node}',
|
37
|
-
flow_entry_count: :body_tracker_hits,
|
38
|
-
is_statement: true
|
39
|
-
executed_loc_keys # none
|
40
|
-
|
41
|
-
def children_nodes_in_flow_order
|
42
|
-
[call, args] # Similarly to a def, the body is actually not part of the flow of this node...
|
43
|
-
end
|
44
|
-
|
45
|
-
alias_method :rewrite_for_completion, :rewrite
|
46
|
-
def rewrite
|
47
|
-
if call.is_a?(Csend)
|
48
|
-
rewrite_for_completion.gsub('%{node}', Csend::REWRITE_SUFFIX)
|
49
|
-
else
|
50
|
-
rewrite_for_completion
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# &foo
|
56
|
-
class BlockPass < Node
|
57
|
-
has_child block: Node
|
58
|
-
# TODO
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'empty_body'
|
4
|
-
|
5
|
-
module DeepCover
|
6
|
-
class Node
|
7
|
-
module Branch
|
8
|
-
def flow_completion_count
|
9
|
-
branches.map(&:flow_completion_count).inject(0, :+)
|
10
|
-
end
|
11
|
-
|
12
|
-
# Define in sublasses:
|
13
|
-
def branches
|
14
|
-
raise NotImplementedError
|
15
|
-
end
|
16
|
-
|
17
|
-
# Also define flow_entry_count
|
18
|
-
end
|
19
|
-
|
20
|
-
class TrivialBranch < Node::EmptyBody
|
21
|
-
def initialize(other_branch:, condition:, position: true)
|
22
|
-
@condition = condition
|
23
|
-
@other_branch = other_branch
|
24
|
-
super(nil, parent: condition.parent, position: position)
|
25
|
-
end
|
26
|
-
|
27
|
-
def flow_entry_count
|
28
|
-
@condition.flow_completion_count - @other_branch.flow_entry_count
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/lib/deep_cover/node/case.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'branch'
|
4
|
-
|
5
|
-
module DeepCover
|
6
|
-
class Node
|
7
|
-
class WhenCondition < Node
|
8
|
-
include Wrapper
|
9
|
-
has_tracker :entry
|
10
|
-
# Using && instead of ; solves a weird bug in jruby 9.1.7.0 and 9.1.9.0 (probably before too).
|
11
|
-
# The following will only print 'test' once
|
12
|
-
# class EqEqEq; def ===(other); puts 'test'; end; end
|
13
|
-
# eqeqeq = EqEqEq.new
|
14
|
-
# case 1; when eqeqeq; end
|
15
|
-
# case 1; when (3;eqeqeq); end
|
16
|
-
# See https://github.com/jruby/jruby/issues/4804
|
17
|
-
# This is solved in jruby 9.2.0.0, better keep the workaround
|
18
|
-
# for compatibility.
|
19
|
-
has_child condition: Node, rewrite: '((%{entry_tracker}) && %{node})',
|
20
|
-
flow_entry_count: :entry_tracker_hits
|
21
|
-
executed_loc_keys []
|
22
|
-
|
23
|
-
def flow_entry_count
|
24
|
-
entry_tracker_hits
|
25
|
-
end
|
26
|
-
|
27
|
-
def flow_completion_count
|
28
|
-
condition.flow_completion_count
|
29
|
-
end
|
30
|
-
|
31
|
-
def loc_hash
|
32
|
-
condition.loc_hash
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class WhenSplatCondition < Node
|
37
|
-
has_tracker :entry
|
38
|
-
check_completion inner: '(%{entry_tracker};[%{node}])', outer: '*%{node}'
|
39
|
-
has_child receiver: Node
|
40
|
-
|
41
|
-
def flow_entry_count
|
42
|
-
entry_tracker_hits
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
class When < Node
|
47
|
-
has_tracker :body_entry
|
48
|
-
has_extra_children matches: {splat: WhenSplatCondition, Parser::AST::Node => WhenCondition}
|
49
|
-
has_child body: Node,
|
50
|
-
can_be_empty: -> {
|
51
|
-
if (after_then = base_node.loc.begin)
|
52
|
-
after_then.end
|
53
|
-
else
|
54
|
-
base_node.loc.expression.end.succ
|
55
|
-
end
|
56
|
-
},
|
57
|
-
rewrite: '%{body_entry_tracker};%{local}=nil;%{node}',
|
58
|
-
is_statement: true,
|
59
|
-
flow_entry_count: :body_entry_tracker_hits
|
60
|
-
|
61
|
-
def flow_entry_count
|
62
|
-
matches.first.flow_entry_count
|
63
|
-
end
|
64
|
-
|
65
|
-
def execution_count
|
66
|
-
matches.first.flow_completion_count
|
67
|
-
end
|
68
|
-
|
69
|
-
def flow_completion_count
|
70
|
-
body.flow_completion_count + next_sibling.flow_entry_count
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
class Case < Node
|
75
|
-
include Branch
|
76
|
-
has_tracker :else_entry
|
77
|
-
has_child evaluate: [Node, nil]
|
78
|
-
has_extra_children whens: When
|
79
|
-
has_child else: Node,
|
80
|
-
can_be_empty: -> { base_node.loc.end.begin },
|
81
|
-
rewrite: -> { "#{'else;' unless has_else?}(%{else_entry_tracker};%{local}=nil;%{node})" },
|
82
|
-
executed_loc_keys: [:else],
|
83
|
-
is_statement: true,
|
84
|
-
flow_entry_count: :else_entry_tracker_hits
|
85
|
-
|
86
|
-
executed_loc_keys :begin, :keyword
|
87
|
-
|
88
|
-
def branches
|
89
|
-
whens.map(&:body) << self.else
|
90
|
-
end
|
91
|
-
|
92
|
-
def branches_summary(of_branches = branches)
|
93
|
-
texts = []
|
94
|
-
n = of_branches.size
|
95
|
-
if of_branches.include? self.else
|
96
|
-
texts << "#{'implicit ' unless has_else?}else"
|
97
|
-
n -= 1
|
98
|
-
end
|
99
|
-
texts.unshift "#{n} when clause#{'s' if n > 1}" if n > 0
|
100
|
-
texts.join(' and ')
|
101
|
-
end
|
102
|
-
|
103
|
-
def execution_count
|
104
|
-
return evaluate.flow_completion_count if evaluate
|
105
|
-
flow_entry_count
|
106
|
-
end
|
107
|
-
|
108
|
-
def has_else?
|
109
|
-
!!base_node.loc.to_hash[:else]
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'splat'
|
4
|
-
|
5
|
-
module DeepCover
|
6
|
-
class Node
|
7
|
-
module SimpleIfEmpty
|
8
|
-
def simple_literal?
|
9
|
-
children.empty?
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Array < Node
|
14
|
-
include SimpleIfEmpty
|
15
|
-
has_extra_children elements: Node
|
16
|
-
executed_loc_keys :begin, :end
|
17
|
-
end
|
18
|
-
|
19
|
-
class Pair < Node
|
20
|
-
has_child key: Node
|
21
|
-
has_child value: Node
|
22
|
-
executed_loc_keys :operator
|
23
|
-
end
|
24
|
-
|
25
|
-
class Hash < Node
|
26
|
-
include SimpleIfEmpty
|
27
|
-
has_extra_children elements: [Pair, Kwsplat]
|
28
|
-
executed_loc_keys :begin, :end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/deep_cover/node/def.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'arguments'
|
4
|
-
|
5
|
-
module DeepCover
|
6
|
-
class Node::Def < Node
|
7
|
-
check_completion
|
8
|
-
has_tracker :method_call
|
9
|
-
has_child method_name: Symbol
|
10
|
-
has_child signature: Args
|
11
|
-
has_child body: Node,
|
12
|
-
rewrite: '%{method_call_tracker};%{local}=nil;%{node}',
|
13
|
-
can_be_empty: -> { base_node.loc.end.begin },
|
14
|
-
is_statement: true,
|
15
|
-
flow_entry_count: :method_call_tracker_hits
|
16
|
-
executed_loc_keys :keyword, :name
|
17
|
-
|
18
|
-
def children_nodes_in_flow_order
|
19
|
-
[]
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
class Node::Defs < Node
|
24
|
-
check_completion
|
25
|
-
has_tracker :method_call
|
26
|
-
has_child singleton: Node, rewrite: '(%{node})'
|
27
|
-
has_child method_name: Symbol
|
28
|
-
has_child signature: Args
|
29
|
-
has_child body: Node,
|
30
|
-
rewrite: '%{method_call_tracker};%{local}=nil;%{node}',
|
31
|
-
can_be_empty: -> { base_node.loc.end.begin },
|
32
|
-
is_statement: true,
|
33
|
-
flow_entry_count: :method_call_tracker_hits
|
34
|
-
executed_loc_keys :keyword, :name, :operator
|
35
|
-
|
36
|
-
def children_nodes_in_flow_order
|
37
|
-
[singleton]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|