ast_utils 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +27 -0
- data/Gemfile +5 -1
- data/ast_utils.gemspec +1 -6
- data/exe/ast_utils +9 -1
- data/lib/ast_utils.rb +0 -1
- data/lib/ast_utils/cli.rb +0 -2
- data/lib/ast_utils/navigation.rb +4 -4
- data/lib/ast_utils/scope.rb +30 -30
- data/lib/ast_utils/version.rb +1 -1
- metadata +9 -66
- data/lib/ast_utils/node_set.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2dcd270ef11c2c8f91cc821dcc7cff592bfd719169c7c1096f7d06f1d3cfac5b
|
4
|
+
data.tar.gz: db15a5577fc9229b477ee9fd7a660278a31efbb48e4e2bcd6f230da756883f9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab497bea22d86a24d481950b369550783ffc13aac4f55fa94d48bd6d71ec99fd18a2e2d1e1af63c62d01ce6821bafef4a9ecc1790dd29bbbe620c97bb0ee9301
|
7
|
+
data.tar.gz: 4746706461519e9cb7217f71f5ee4dd4454141ea42edc960979ff53f37d8e90920d58b254db9fbc82677ff7ac5115462e2b31c897c9d42d21fd0f066873a80b5
|
@@ -0,0 +1,27 @@
|
|
1
|
+
name: Test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
pull_request: {}
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: "ubuntu-latest"
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
container_tag:
|
15
|
+
- 3.0-focal
|
16
|
+
- 2.6-bionic
|
17
|
+
- 2.7-bionic
|
18
|
+
container:
|
19
|
+
image: rubylang/ruby:${{ matrix.container_tag }}
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v1
|
22
|
+
- name: Run test
|
23
|
+
run: |
|
24
|
+
ruby -v
|
25
|
+
gem install bundler
|
26
|
+
bundle install --jobs 4 --retry 3
|
27
|
+
bundle exec rake
|
data/Gemfile
CHANGED
data/ast_utils.gemspec
CHANGED
@@ -20,10 +20,5 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.
|
24
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
-
spec.add_development_dependency "minitest", "~> 5.0"
|
26
|
-
|
27
|
-
spec.add_runtime_dependency "parser", "~> 2.4"
|
28
|
-
spec.add_runtime_dependency "thor", ">= 0.19"
|
23
|
+
spec.add_runtime_dependency "parser", ">= 2.7.0"
|
29
24
|
end
|
data/exe/ast_utils
CHANGED
@@ -6,6 +6,14 @@ Parser::Builders::Default.emit_lambda = true
|
|
6
6
|
Parser::Builders::Default.emit_procarg0 = true
|
7
7
|
|
8
8
|
require "ast_utils"
|
9
|
-
require "ast_utils/cli"
|
10
9
|
|
10
|
+
begin
|
11
|
+
require "thor"
|
12
|
+
rescue LoadError
|
13
|
+
puts "ast_utils command requires an optional `thor` gem:"
|
14
|
+
puts "Running `gem install thor` or having `gem 'thor'` in your Gemfile will solve the problem."
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
|
18
|
+
require "ast_utils/cli"
|
11
19
|
ASTUtils::CLI.start(ARGV)
|
data/lib/ast_utils.rb
CHANGED
data/lib/ast_utils/cli.rb
CHANGED
data/lib/ast_utils/navigation.rb
CHANGED
@@ -8,8 +8,8 @@ module ASTUtils
|
|
8
8
|
|
9
9
|
def initialize(node:)
|
10
10
|
@root = node
|
11
|
-
@nodes =
|
12
|
-
@parents = {}
|
11
|
+
@nodes = Set[].compare_by_identity
|
12
|
+
@parents = {}.compare_by_identity
|
13
13
|
end
|
14
14
|
|
15
15
|
def construct
|
@@ -20,13 +20,13 @@ module ASTUtils
|
|
20
20
|
nodes << node
|
21
21
|
|
22
22
|
each_child_node(node) do |child|
|
23
|
-
parents[child
|
23
|
+
parents[child] = node
|
24
24
|
set_parent(child)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
def parent(node)
|
29
|
-
parents[node
|
29
|
+
parents[node]
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.from(node:)
|
data/lib/ast_utils/scope.rb
CHANGED
@@ -13,7 +13,7 @@ module ASTUtils
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def eql?(other)
|
16
|
-
other.is_a?(Assignment) && other.node.
|
16
|
+
other.is_a?(Assignment) && other.node.equal?(node) && other.variable == variable
|
17
17
|
end
|
18
18
|
|
19
19
|
def ==(other)
|
@@ -34,48 +34,48 @@ module ASTUtils
|
|
34
34
|
|
35
35
|
def initialize(root:)
|
36
36
|
@root = root
|
37
|
-
@all_scopes =
|
38
|
-
@child_scopes = {}
|
39
|
-
@parent_scopes = {}
|
40
|
-
@sub_scopes = {}
|
41
|
-
@super_scopes = {}
|
42
|
-
@assignment_nodes = {}
|
43
|
-
@reference_nodes = {}
|
37
|
+
@all_scopes = Set.new.compare_by_identity
|
38
|
+
@child_scopes = {}.compare_by_identity
|
39
|
+
@parent_scopes = {}.compare_by_identity
|
40
|
+
@sub_scopes = {}.compare_by_identity
|
41
|
+
@super_scopes = {}.compare_by_identity
|
42
|
+
@assignment_nodes = {}.compare_by_identity
|
43
|
+
@reference_nodes = {}.compare_by_identity
|
44
44
|
end
|
45
45
|
|
46
46
|
def children(scope)
|
47
|
-
child_scopes[scope
|
47
|
+
child_scopes[scope]
|
48
48
|
end
|
49
49
|
|
50
50
|
def parent(scope)
|
51
|
-
parent_scopes[scope
|
51
|
+
parent_scopes[scope]
|
52
52
|
end
|
53
53
|
|
54
54
|
def subs(scope)
|
55
|
-
sub_scopes[scope
|
55
|
+
sub_scopes[scope]
|
56
56
|
end
|
57
57
|
|
58
58
|
def sup(scope)
|
59
|
-
super_scopes[scope
|
59
|
+
super_scopes[scope]
|
60
60
|
end
|
61
61
|
|
62
62
|
def assignments(scope, include_subs: false)
|
63
63
|
if include_subs
|
64
|
-
subs(scope).inject(assignment_nodes[scope
|
64
|
+
subs(scope).inject(assignment_nodes[scope]) {|assignments, scope_|
|
65
65
|
assignments + assignments(scope_, include_subst: true)
|
66
66
|
}
|
67
67
|
else
|
68
|
-
assignment_nodes[scope
|
68
|
+
assignment_nodes[scope]
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
72
|
def references(scope, include_subs: false)
|
73
73
|
if include_subs
|
74
|
-
subs(scope).inject(reference_nodes[scope
|
74
|
+
subs(scope).inject(reference_nodes[scope]) {|references, scope_|
|
75
75
|
references + references(scope_, include_subs: true)
|
76
76
|
}
|
77
77
|
else
|
78
|
-
reference_nodes[scope
|
78
|
+
reference_nodes[scope]
|
79
79
|
end
|
80
80
|
|
81
81
|
end
|
@@ -95,18 +95,18 @@ module ASTUtils
|
|
95
95
|
|
96
96
|
def add_scope(scope)
|
97
97
|
all_scopes << scope
|
98
|
-
child_scopes[scope
|
99
|
-
sub_scopes[scope
|
100
|
-
assignment_nodes[scope
|
101
|
-
reference_nodes[scope
|
98
|
+
child_scopes[scope] = Set.new.compare_by_identity
|
99
|
+
sub_scopes[scope] = Set.new.compare_by_identity
|
100
|
+
assignment_nodes[scope] = Set.new.compare_by_identity
|
101
|
+
reference_nodes[scope] = Set.new.compare_by_identity
|
102
102
|
end
|
103
103
|
|
104
104
|
def child_scope!(scope, parent_scope)
|
105
105
|
add_scope(scope)
|
106
106
|
|
107
107
|
if parent_scope
|
108
|
-
parent_scopes[scope
|
109
|
-
child_scopes[parent_scope
|
108
|
+
parent_scopes[scope] = parent_scope
|
109
|
+
child_scopes[parent_scope] << scope
|
110
110
|
end
|
111
111
|
|
112
112
|
each_child_node(scope) do |child|
|
@@ -118,10 +118,10 @@ module ASTUtils
|
|
118
118
|
add_scope(scope)
|
119
119
|
|
120
120
|
if super_scope
|
121
|
-
parent_scopes[scope
|
122
|
-
child_scopes[super_scope
|
123
|
-
super_scopes[scope
|
124
|
-
sub_scopes[super_scope
|
121
|
+
parent_scopes[scope] = super_scope
|
122
|
+
child_scopes[super_scope] << scope
|
123
|
+
super_scopes[scope] = super_scope
|
124
|
+
sub_scopes[super_scope] << scope
|
125
125
|
end
|
126
126
|
|
127
127
|
each_child_node(scope) do |child|
|
@@ -136,21 +136,21 @@ module ASTUtils
|
|
136
136
|
when :block
|
137
137
|
nested_scope!(node, current_scope)
|
138
138
|
when :lvar
|
139
|
-
reference_nodes[current_scope
|
139
|
+
reference_nodes[current_scope] << node
|
140
140
|
when :lvasgn, :arg, :optarg, :restarg, :kwarg, :kwoptarg, :kwrestarg, :blockarg
|
141
|
-
assignment_nodes[current_scope
|
141
|
+
assignment_nodes[current_scope] << Assignment.new(node: node, variable: node.children[0])
|
142
142
|
construct_children(node, current_scope)
|
143
143
|
when :procarg0
|
144
144
|
case node.children[0]
|
145
145
|
when AST::Node
|
146
146
|
construct_children(node, current_scope)
|
147
147
|
else
|
148
|
-
assignment_nodes[current_scope
|
148
|
+
assignment_nodes[current_scope] << Assignment.new(node: node, variable: node.children[0])
|
149
149
|
construct_children(node, current_scope)
|
150
150
|
end
|
151
151
|
when :match_with_lvasgn
|
152
152
|
node.children[2].each do |var|
|
153
|
-
assignment_nodes[current_scope
|
153
|
+
assignment_nodes[current_scope] << Assignment.new(node: node, variable: var)
|
154
154
|
end
|
155
155
|
|
156
156
|
construct_children(node, current_scope)
|
data/lib/ast_utils/version.rb
CHANGED
metadata
CHANGED
@@ -1,85 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ast_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.13'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.13'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '10.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '10.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: minitest
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '5.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '5.0'
|
55
13
|
- !ruby/object:Gem::Dependency
|
56
14
|
name: parser
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '2.4'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '2.4'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: thor
|
71
15
|
requirement: !ruby/object:Gem::Requirement
|
72
16
|
requirements:
|
73
17
|
- - ">="
|
74
18
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
19
|
+
version: 2.7.0
|
76
20
|
type: :runtime
|
77
21
|
prerelease: false
|
78
22
|
version_requirements: !ruby/object:Gem::Requirement
|
79
23
|
requirements:
|
80
24
|
- - ">="
|
81
25
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
26
|
+
version: 2.7.0
|
83
27
|
description: Ruby AST Utility
|
84
28
|
email:
|
85
29
|
- matsumoto@soutaro.com
|
@@ -88,6 +32,7 @@ executables:
|
|
88
32
|
extensions: []
|
89
33
|
extra_rdoc_files: []
|
90
34
|
files:
|
35
|
+
- ".github/workflows/test.yml"
|
91
36
|
- ".gitignore"
|
92
37
|
- ".travis.yml"
|
93
38
|
- Gemfile
|
@@ -102,14 +47,13 @@ files:
|
|
102
47
|
- lib/ast_utils/labeling.rb
|
103
48
|
- lib/ast_utils/navigation.rb
|
104
49
|
- lib/ast_utils/node_helper.rb
|
105
|
-
- lib/ast_utils/node_set.rb
|
106
50
|
- lib/ast_utils/partial_map.rb
|
107
51
|
- lib/ast_utils/scope.rb
|
108
52
|
- lib/ast_utils/version.rb
|
109
53
|
homepage: https://github.com/soutaro/ast_utils
|
110
54
|
licenses: []
|
111
55
|
metadata: {}
|
112
|
-
post_install_message:
|
56
|
+
post_install_message:
|
113
57
|
rdoc_options: []
|
114
58
|
require_paths:
|
115
59
|
- lib
|
@@ -124,9 +68,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
68
|
- !ruby/object:Gem::Version
|
125
69
|
version: '0'
|
126
70
|
requirements: []
|
127
|
-
|
128
|
-
|
129
|
-
signing_key:
|
71
|
+
rubygems_version: 3.0.6
|
72
|
+
signing_key:
|
130
73
|
specification_version: 4
|
131
74
|
summary: Ruby AST Utility
|
132
75
|
test_files: []
|
data/lib/ast_utils/node_set.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
module ASTUtils
|
2
|
-
class NodeSet
|
3
|
-
class Item
|
4
|
-
attr_reader :object
|
5
|
-
|
6
|
-
def initialize(object)
|
7
|
-
@object = object
|
8
|
-
end
|
9
|
-
|
10
|
-
def hash
|
11
|
-
object.__id__
|
12
|
-
end
|
13
|
-
|
14
|
-
def eql?(other)
|
15
|
-
other.is_a?(Item) && other.object.__id__ == object.__id__
|
16
|
-
end
|
17
|
-
|
18
|
-
def ==(other)
|
19
|
-
eql?(other)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
attr_reader :set
|
24
|
-
|
25
|
-
def initialize(objects = [])
|
26
|
-
@set = Set.new(objects.map {|object| Item.new(object) })
|
27
|
-
end
|
28
|
-
|
29
|
-
def <<(node)
|
30
|
-
set << Item.new(node)
|
31
|
-
end
|
32
|
-
|
33
|
-
def delete(node)
|
34
|
-
set.delete Item.new(node)
|
35
|
-
end
|
36
|
-
|
37
|
-
def each(&block)
|
38
|
-
set.map(&:object).each(&block)
|
39
|
-
end
|
40
|
-
|
41
|
-
def empty?
|
42
|
-
size == 0
|
43
|
-
end
|
44
|
-
|
45
|
-
def size
|
46
|
-
set.size
|
47
|
-
end
|
48
|
-
|
49
|
-
include Enumerable
|
50
|
-
|
51
|
-
def +(other)
|
52
|
-
self.class.new(self.set + other.set)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|