synvert-core 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -4
  3. data/CHANGELOG.md +6 -0
  4. data/Gemfile +0 -3
  5. data/Guardfile +0 -9
  6. data/README.md +30 -12
  7. data/Rakefile +1 -15
  8. data/lib/synvert/core/engine/erb.rb +1 -1
  9. data/lib/synvert/core/engine.rb +1 -1
  10. data/lib/synvert/core/node_ext.rb +0 -466
  11. data/lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb +20 -17
  12. data/lib/synvert/core/rewriter/condition/if_exist_condition.rb +1 -1
  13. data/lib/synvert/core/rewriter/condition/unless_exist_condition.rb +1 -1
  14. data/lib/synvert/core/rewriter/instance.rb +83 -133
  15. data/lib/synvert/core/rewriter/scope/query_scope.rb +2 -2
  16. data/lib/synvert/core/rewriter/scope/within_scope.rb +4 -4
  17. data/lib/synvert/core/rewriter.rb +0 -10
  18. data/lib/synvert/core/version.rb +1 -1
  19. data/lib/synvert/core.rb +4 -6
  20. data/spec/synvert/core/engine/erb_spec.rb +3 -3
  21. data/spec/synvert/core/node_ext_spec.rb +0 -795
  22. data/spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb +21 -1
  23. data/spec/synvert/core/rewriter/instance_spec.rb +47 -115
  24. data/spec/synvert/core/rewriter/scope/goto_scope_spec.rb +1 -4
  25. data/spec/synvert/core/rewriter/scope/query_scope_spec.rb +1 -4
  26. data/spec/synvert/core/rewriter/scope/within_scope_spec.rb +1 -4
  27. data/synvert-core-ruby.gemspec +4 -2
  28. metadata +44 -61
  29. data/lib/synvert/core/array_ext.rb +0 -48
  30. data/lib/synvert/core/node_query/compiler/array.rb +0 -34
  31. data/lib/synvert/core/node_query/compiler/attribute.rb +0 -39
  32. data/lib/synvert/core/node_query/compiler/attribute_list.rb +0 -24
  33. data/lib/synvert/core/node_query/compiler/basic_selector.rb +0 -28
  34. data/lib/synvert/core/node_query/compiler/boolean.rb +0 -23
  35. data/lib/synvert/core/node_query/compiler/comparable.rb +0 -86
  36. data/lib/synvert/core/node_query/compiler/dynamic_attribute.rb +0 -51
  37. data/lib/synvert/core/node_query/compiler/expression.rb +0 -41
  38. data/lib/synvert/core/node_query/compiler/float.rb +0 -23
  39. data/lib/synvert/core/node_query/compiler/identifier.rb +0 -41
  40. data/lib/synvert/core/node_query/compiler/integer.rb +0 -23
  41. data/lib/synvert/core/node_query/compiler/invalid_operator_error.rb +0 -7
  42. data/lib/synvert/core/node_query/compiler/nil.rb +0 -23
  43. data/lib/synvert/core/node_query/compiler/parse_error.rb +0 -7
  44. data/lib/synvert/core/node_query/compiler/regexp.rb +0 -37
  45. data/lib/synvert/core/node_query/compiler/selector.rb +0 -113
  46. data/lib/synvert/core/node_query/compiler/string.rb +0 -23
  47. data/lib/synvert/core/node_query/compiler/symbol.rb +0 -23
  48. data/lib/synvert/core/node_query/compiler.rb +0 -25
  49. data/lib/synvert/core/node_query/lexer.rex +0 -99
  50. data/lib/synvert/core/node_query/lexer.rex.rb +0 -299
  51. data/lib/synvert/core/node_query/parser.racc.rb +0 -306
  52. data/lib/synvert/core/node_query/parser.y +0 -60
  53. data/lib/synvert/core/node_query.rb +0 -36
  54. data/lib/synvert/core/rewriter/action/append_action.rb +0 -28
  55. data/lib/synvert/core/rewriter/action/delete_action.rb +0 -34
  56. data/lib/synvert/core/rewriter/action/insert_action.rb +0 -34
  57. data/lib/synvert/core/rewriter/action/insert_after_action.rb +0 -22
  58. data/lib/synvert/core/rewriter/action/prepend_action.rb +0 -44
  59. data/lib/synvert/core/rewriter/action/remove_action.rb +0 -56
  60. data/lib/synvert/core/rewriter/action/replace_action.rb +0 -33
  61. data/lib/synvert/core/rewriter/action/replace_with_action.rb +0 -36
  62. data/lib/synvert/core/rewriter/action/wrap_action.rb +0 -37
  63. data/lib/synvert/core/rewriter/action.rb +0 -102
  64. data/spec/synvert/core/node_query/lexer_spec.rb +0 -580
  65. data/spec/synvert/core/node_query/parser_spec.rb +0 -337
  66. data/spec/synvert/core/rewriter/action/append_action_spec.rb +0 -70
  67. data/spec/synvert/core/rewriter/action/delete_action_spec.rb +0 -26
  68. data/spec/synvert/core/rewriter/action/insert_action_spec.rb +0 -70
  69. data/spec/synvert/core/rewriter/action/insert_after_action_spec.rb +0 -26
  70. data/spec/synvert/core/rewriter/action/prepend_action_spec.rb +0 -175
  71. data/spec/synvert/core/rewriter/action/remove_action_spec.rb +0 -26
  72. data/spec/synvert/core/rewriter/action/replace_action_spec.rb +0 -28
  73. data/spec/synvert/core/rewriter/action/replace_with_action_spec.rb +0 -59
  74. data/spec/synvert/core/rewriter/action/wrap_action_spec.rb +0 -31
  75. data/spec/synvert/core/rewriter/action_spec.rb +0 -14
@@ -3,6 +3,26 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  module Synvert::Core
6
- describe Rewriter::ReplaceErbStmtWithExprAction do
6
+ RSpec.describe Rewriter::ReplaceErbStmtWithExprAction do
7
+ context 'replace with single line' do
8
+ subject {
9
+ source = "<% form_for post do |f| %>\n<% end %>"
10
+ source = Engine::Erb.encode(source)
11
+ node = Parser::CurrentRuby.parse(source).children[1]
12
+ described_class.new(node).process
13
+ }
14
+
15
+ it 'gets start' do
16
+ expect(subject.start).to eq '@output_buffer = output_buffer || ActionView::OutputBuffer.new;'.length
17
+ end
18
+
19
+ it 'gets end' do
20
+ expect(subject.end).to eq '@output_buffer = output_buffer || ActionView::OutputBuffer.new;; ; form_for post do |f| ; ;'.length
21
+ end
22
+
23
+ it 'gets new_code' do
24
+ expect(subject.new_code).to eq '@output_buffer.append= form_for post do |f| ; ;'
25
+ end
26
+ end
7
27
  end
8
28
  end
@@ -4,8 +4,6 @@ require 'spec_helper'
4
4
 
5
5
  module Synvert::Core
6
6
  describe Rewriter::Instance do
7
- before { Rewriter::Instance.reset }
8
-
9
7
  let(:instance) {
10
8
  rewriter = Rewriter.new('foo', 'bar')
11
9
  Rewriter::Instance.new(rewriter, ['file pattern'])
@@ -98,97 +96,83 @@ module Synvert::Core
98
96
  end
99
97
 
100
98
  it 'parses append' do
101
- action = double
102
- expect(Rewriter::AppendAction).to receive(:new).with(
103
- instance,
104
- 'include FactoryGirl::Syntax::Methods'
105
- ).and_return(action)
106
- expect(action).to receive(:process)
107
- instance.append 'include FactoryGirl::Syntax::Methods'
99
+ instance.current_mutation = double
100
+ instance.current_node = double
101
+ expect(instance.current_mutation).to receive(:append).with(instance.current_node, 'Foobar')
102
+ instance.append 'Foobar'
108
103
  end
109
104
 
110
105
  it 'parses prepend' do
111
- action = double
112
- expect(Rewriter::PrependAction).to receive(:new).with(
113
- instance,
114
- '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
115
- ).and_return(action)
116
- expect(action).to receive(:process)
117
- instance.prepend '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
106
+ instance.current_mutation = double
107
+ instance.current_node = double
108
+ expect(instance.current_mutation).to receive(:prepend).with(instance.current_node, 'Foobar')
109
+ instance.prepend 'Foobar'
118
110
  end
119
111
 
120
112
  it 'parses insert at end' do
121
- action = double
122
- expect(Rewriter::InsertAction).to receive(:new).with(
123
- instance,
124
- '.first',
125
- at: 'end',
126
- to: 'receiver'
127
- ).and_return(action)
128
- expect(action).to receive(:process)
129
- instance.insert '.first', to: 'receiver'
113
+ instance.current_mutation = double
114
+ instance.current_node = double
115
+ expect(instance.current_mutation).to receive(:insert).with(instance.current_node, 'Foobar', at: 'end', to: 'receiver')
116
+ instance.insert 'Foobar', to: 'receiver'
130
117
  end
131
118
 
132
119
  it 'parses insert at beginning' do
133
- action = double
134
- expect(Rewriter::InsertAction).to receive(:new).with(
135
- instance,
136
- 'URI.',
137
- at: 'beginning',
138
- to: nil
139
- ).and_return(action)
140
- expect(action).to receive(:process)
141
- instance.insert 'URI.', at: 'beginning'
120
+ instance.current_mutation = double
121
+ instance.current_node = double
122
+ expect(instance.current_mutation).to receive(:insert).with(instance.current_node, 'Foobar', at: 'beginning', to: nil)
123
+ instance.insert 'Foobar', at: 'beginning'
142
124
  end
143
125
 
144
126
  it 'parses insert_after' do
127
+ instance.current_mutation = double
128
+ instance.current_node = double
129
+ expect(instance.current_mutation).to receive(:insert_after).with(instance.current_node, 'Foobar')
130
+ instance.insert_after 'Foobar'
131
+ end
132
+
133
+ it 'parses replace_erb_stmt_with_expr' do
134
+ instance.current_mutation = double
135
+ instance.current_node = double
145
136
  action = double
146
- expect(Rewriter::InsertAfterAction).to receive(:new).with(
147
- instance,
148
- '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
149
- ).and_return(action)
137
+ expect(instance.current_mutation).to receive(:actions).and_return([])
138
+ expect(Rewriter::ReplaceErbStmtWithExprAction).to receive(:new).with(instance.current_node).and_return(action)
150
139
  expect(action).to receive(:process)
151
- instance.insert_after '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
140
+ instance.replace_erb_stmt_with_expr
152
141
  end
153
142
 
154
143
  it 'parses replace_with' do
155
- action = double
156
- expect(Rewriter::ReplaceWithAction).to receive(:new).with(instance, 'create {{arguments}}').and_return(action)
157
- expect(action).to receive(:process)
158
- instance.replace_with 'create {{arguments}}'
144
+ instance.current_mutation = double
145
+ instance.current_node = double
146
+ expect(instance.current_mutation).to receive(:replace_with).with(instance.current_node, 'Foobar')
147
+ instance.replace_with 'Foobar'
159
148
  end
160
149
 
161
150
  it 'parses replace with' do
162
- action = double
163
- expect(Rewriter::ReplaceAction).to receive(:new).with(instance, :message, with: 'test').and_return(action)
164
- expect(action).to receive(:process)
165
- instance.replace :message, with: 'test'
151
+ instance.current_mutation = double
152
+ instance.current_node = double
153
+ expect(instance.current_mutation).to receive(:replace).with(instance.current_node, :message, with: 'Foobar')
154
+ instance.replace :message, with: 'Foobar'
166
155
  end
167
156
 
168
157
  it 'parses remove' do
169
- action = double
170
- expect(Rewriter::RemoveAction).to receive(:new).with(instance, { and_comma: true }).and_return(action)
171
- expect(action).to receive(:process)
158
+ instance.current_mutation = double
159
+ instance.current_node = double
160
+ expect(instance.current_mutation).to receive(:remove).with(instance.current_node, and_comma: true)
172
161
  instance.remove and_comma: true
173
162
  end
174
163
 
175
- it 'parses remove' do
176
- action = double
177
- expect(Rewriter::DeleteAction).to receive(:new).with(
178
- instance,
179
- :dot,
180
- :message,
181
- { and_comma: true }
182
- ).and_return(action)
183
- expect(action).to receive(:process)
164
+ it 'parses delete' do
165
+ instance.current_mutation = double
166
+ instance.current_node = double
167
+ expect(instance.current_mutation).to receive(:delete).with(instance.current_node, :dot, :message, and_comma: true)
184
168
  instance.delete :dot, :message, and_comma: true
185
169
  end
186
170
 
187
171
  it 'parses wrap with' do
188
- action = double
189
- expect(Rewriter::WrapAction).to receive(:new).with(instance, with: 'module Foo', indent: nil).and_return(action)
190
- expect(action).to receive(:process)
191
- instance.wrap with: 'module Foo'
172
+ instance.current_mutation = double
173
+ instance.current_node = double
174
+ expect(instance.current_mutation).to receive(:wrap).with(instance.current_node, with: 'module Foobar')
175
+ instance.wrap with: 'module Foobar'
192
176
  end
193
177
 
194
178
  it 'parses warn' do
@@ -251,32 +235,6 @@ module Synvert::Core
251
235
  instance.process
252
236
  end
253
237
 
254
- it 'does not read file if already read' do
255
- instance =
256
- Rewriter::Instance.new rewriter, ['spec/spec_helper.rb'] do
257
- with_node type: 'block', caller: { receiver: 'RSpec', message: 'configure' } do
258
- unless_exist_node type: 'send', message: 'include', arguments: ['FactoryGirl::Syntax::Methods'] do
259
- insert '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
260
- end
261
- end
262
- end
263
- input = <<~EOS
264
- RSpec.configure do |config|
265
- config.include FactoryGirl::Syntax::Methods
266
- end
267
- EOS
268
- output = <<~EOS
269
- RSpec.configure do |config|
270
- config.include FactoryGirl::Syntax::Methods
271
- end
272
- EOS
273
- expect(Dir).to receive(:glob).with('./spec/spec_helper.rb').and_return(['spec/spec_helper.rb']).twice
274
- expect(File).to receive(:read).with('spec/spec_helper.rb', encoding: 'UTF-8').and_return(input).once
275
- expect(File).not_to receive(:write).with('spec/spec_helper.rb', output)
276
- instance.process
277
- instance.process
278
- end
279
-
280
238
  it 'updates file_source and file_ast when writing a file' do
281
239
  instance =
282
240
  Rewriter::Instance.new rewriter, ['spec/**/*_spec.rb'] do
@@ -308,32 +266,6 @@ module Synvert::Core
308
266
  end
309
267
  end
310
268
 
311
- describe '#get_conflict_actions' do
312
- let(:rewriter) { Rewriter.new('foo', 'bar') }
313
-
314
- it 'has no conflict' do
315
- action1 = double(begin_pos: 10, end_pos: 20)
316
- action2 = double(begin_pos: 30, end_pos: 40)
317
- action3 = double(begin_pos: 50, end_pos: 60)
318
- instance = Rewriter::Instance.new rewriter, ['spec/spec_helper.rb']
319
- instance.instance_variable_set :@actions, [action1, action2, action3]
320
- conflict_actions = instance.send(:get_conflict_actions)
321
- expect(conflict_actions).to eq []
322
- expect(instance.instance_variable_get(:@actions)).to eq [action1, action2, action3]
323
- end
324
-
325
- it 'has no conflict' do
326
- action1 = double(begin_pos: 30, end_pos: 40)
327
- action2 = double(begin_pos: 50, end_pos: 60)
328
- action3 = double(begin_pos: 10, end_pos: 20)
329
- instance = Rewriter::Instance.new rewriter, ['spec/spec_helper.rb']
330
- instance.instance_variable_set :@actions, [action1, action2, action3]
331
- conflict_actions = instance.send(:get_conflict_actions)
332
- expect(conflict_actions).to eq [action2, action1]
333
- expect(instance.instance_variable_get(:@actions)).to eq [action3]
334
- end
335
- end
336
-
337
269
  describe '#process_with_node' do
338
270
  it 'resets current_node' do
339
271
  node1 = double
@@ -14,10 +14,7 @@ module Synvert::Core
14
14
  EOS
15
15
 
16
16
  let(:node) { Parser::CurrentRuby.parse(source) }
17
- before do
18
- Rewriter::Instance.reset
19
- instance.current_node = node
20
- end
17
+ before { instance.current_node = node }
21
18
 
22
19
  describe '#process' do
23
20
  it 'call block with child node' do
@@ -18,10 +18,7 @@ module Synvert::Core
18
18
 
19
19
  let(:node) { Parser::CurrentRuby.parse(source) }
20
20
 
21
- before do
22
- Rewriter::Instance.reset
23
- instance.current_node = node
24
- end
21
+ before { instance.current_node = node }
25
22
 
26
23
  describe '#process' do
27
24
  it 'not call block if no matching node' do
@@ -18,10 +18,7 @@ module Synvert::Core
18
18
 
19
19
  let(:node) { Parser::CurrentRuby.parse(source) }
20
20
 
21
- before do
22
- Rewriter::Instance.reset
23
- instance.current_node = node
24
- end
21
+ before { instance.current_node = node }
25
22
 
26
23
  describe '#process' do
27
24
  it 'not call block if no matching node' do
@@ -14,13 +14,15 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/xinminlabs/synvert-core-ruby"
15
15
  spec.license = "MIT"
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0") +
18
- %w[lib/synvert/core/node_query/lexer.rex.rb lib/synvert/core/node_query/parser.racc.rb]
17
+ spec.files = `git ls-files -z`.split("\x0")
19
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
20
  spec.require_paths = ["lib"]
22
21
 
23
22
  spec.add_runtime_dependency "activesupport"
24
23
  spec.add_runtime_dependency "erubis"
24
+ spec.add_runtime_dependency "node_query"
25
+ spec.add_runtime_dependency "node_mutation"
25
26
  spec.add_runtime_dependency "parser"
27
+ spec.add_runtime_dependency "parser_node_ext"
26
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synvert-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-21 00:00:00.000000000 Z
11
+ date: 2022-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: node_query
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: node_mutation
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: parser
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,20 @@ dependencies:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: parser_node_ext
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  description: convert ruby code to better syntax automatically.
56
98
  email:
57
99
  - flyerhzm@gmail.com
@@ -69,48 +111,13 @@ files:
69
111
  - README.md
70
112
  - Rakefile
71
113
  - lib/synvert/core.rb
72
- - lib/synvert/core/array_ext.rb
73
114
  - lib/synvert/core/configuration.rb
74
115
  - lib/synvert/core/engine.rb
75
116
  - lib/synvert/core/engine/erb.rb
76
117
  - lib/synvert/core/exceptions.rb
77
118
  - lib/synvert/core/node_ext.rb
78
- - lib/synvert/core/node_query.rb
79
- - lib/synvert/core/node_query/compiler.rb
80
- - lib/synvert/core/node_query/compiler/array.rb
81
- - lib/synvert/core/node_query/compiler/attribute.rb
82
- - lib/synvert/core/node_query/compiler/attribute_list.rb
83
- - lib/synvert/core/node_query/compiler/basic_selector.rb
84
- - lib/synvert/core/node_query/compiler/boolean.rb
85
- - lib/synvert/core/node_query/compiler/comparable.rb
86
- - lib/synvert/core/node_query/compiler/dynamic_attribute.rb
87
- - lib/synvert/core/node_query/compiler/expression.rb
88
- - lib/synvert/core/node_query/compiler/float.rb
89
- - lib/synvert/core/node_query/compiler/identifier.rb
90
- - lib/synvert/core/node_query/compiler/integer.rb
91
- - lib/synvert/core/node_query/compiler/invalid_operator_error.rb
92
- - lib/synvert/core/node_query/compiler/nil.rb
93
- - lib/synvert/core/node_query/compiler/parse_error.rb
94
- - lib/synvert/core/node_query/compiler/regexp.rb
95
- - lib/synvert/core/node_query/compiler/selector.rb
96
- - lib/synvert/core/node_query/compiler/string.rb
97
- - lib/synvert/core/node_query/compiler/symbol.rb
98
- - lib/synvert/core/node_query/lexer.rex
99
- - lib/synvert/core/node_query/lexer.rex.rb
100
- - lib/synvert/core/node_query/parser.racc.rb
101
- - lib/synvert/core/node_query/parser.y
102
119
  - lib/synvert/core/rewriter.rb
103
- - lib/synvert/core/rewriter/action.rb
104
- - lib/synvert/core/rewriter/action/append_action.rb
105
- - lib/synvert/core/rewriter/action/delete_action.rb
106
- - lib/synvert/core/rewriter/action/insert_action.rb
107
- - lib/synvert/core/rewriter/action/insert_after_action.rb
108
- - lib/synvert/core/rewriter/action/prepend_action.rb
109
- - lib/synvert/core/rewriter/action/remove_action.rb
110
- - lib/synvert/core/rewriter/action/replace_action.rb
111
120
  - lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
112
- - lib/synvert/core/rewriter/action/replace_with_action.rb
113
- - lib/synvert/core/rewriter/action/wrap_action.rb
114
121
  - lib/synvert/core/rewriter/any_value.rb
115
122
  - lib/synvert/core/rewriter/condition.rb
116
123
  - lib/synvert/core/rewriter/condition/if_exist_condition.rb
@@ -130,19 +137,7 @@ files:
130
137
  - spec/support/parser_helper.rb
131
138
  - spec/synvert/core/engine/erb_spec.rb
132
139
  - spec/synvert/core/node_ext_spec.rb
133
- - spec/synvert/core/node_query/lexer_spec.rb
134
- - spec/synvert/core/node_query/parser_spec.rb
135
- - spec/synvert/core/rewriter/action/append_action_spec.rb
136
- - spec/synvert/core/rewriter/action/delete_action_spec.rb
137
- - spec/synvert/core/rewriter/action/insert_action_spec.rb
138
- - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
139
- - spec/synvert/core/rewriter/action/prepend_action_spec.rb
140
- - spec/synvert/core/rewriter/action/remove_action_spec.rb
141
- - spec/synvert/core/rewriter/action/replace_action_spec.rb
142
140
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
143
- - spec/synvert/core/rewriter/action/replace_with_action_spec.rb
144
- - spec/synvert/core/rewriter/action/wrap_action_spec.rb
145
- - spec/synvert/core/rewriter/action_spec.rb
146
141
  - spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
147
142
  - spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb
148
143
  - spec/synvert/core/rewriter/condition/unless_exist_condition_spec.rb
@@ -186,19 +181,7 @@ test_files:
186
181
  - spec/support/parser_helper.rb
187
182
  - spec/synvert/core/engine/erb_spec.rb
188
183
  - spec/synvert/core/node_ext_spec.rb
189
- - spec/synvert/core/node_query/lexer_spec.rb
190
- - spec/synvert/core/node_query/parser_spec.rb
191
- - spec/synvert/core/rewriter/action/append_action_spec.rb
192
- - spec/synvert/core/rewriter/action/delete_action_spec.rb
193
- - spec/synvert/core/rewriter/action/insert_action_spec.rb
194
- - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
195
- - spec/synvert/core/rewriter/action/prepend_action_spec.rb
196
- - spec/synvert/core/rewriter/action/remove_action_spec.rb
197
- - spec/synvert/core/rewriter/action/replace_action_spec.rb
198
184
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
199
- - spec/synvert/core/rewriter/action/replace_with_action_spec.rb
200
- - spec/synvert/core/rewriter/action/wrap_action_spec.rb
201
- - spec/synvert/core/rewriter/action_spec.rb
202
185
  - spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
203
186
  - spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb
204
187
  - spec/synvert/core/rewriter/condition/unless_exist_condition_spec.rb
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Extend Array.
4
- class Array
5
- # Get child node by the name.
6
- #
7
- # @param child_name [String] name of child node.
8
- # @return [Parser::AST::Node] the child node.
9
- def child_node_by_name(child_name)
10
- direct_child_name, nested_child_name = child_name.split('.', 2)
11
- child_direct_child_node = direct_child_name =~ /\A\d+\z/ ? self[direct_child_name.to_i - 1] : self.send(direct_child_name)
12
- return child_direct_child_node.child_node_by_name(nested_child_name) if nested_child_name
13
- return child_direct_child_node if child_direct_child_node
14
-
15
- raise Synvert::Core::MethodNotSupported,
16
- "child_node_by_name is not handled for #{debug_info}, child_name: #{child_name}"
17
- end
18
-
19
- # Get the source range of child node.
20
- #
21
- # @param child_name [String] name of child node.
22
- # @return [Parser::Source::Range] source range of child node.
23
- def child_node_range(child_name)
24
- direct_child_name, nested_child_name = child_name.split('.', 2)
25
- child_direct_child_node = direct_child_name =~ /\A\d+\z/ ? self[direct_child_name.to_i - 1] : self.send(direct_child_name)
26
- if nested_child_name
27
- return child_direct_child_node.child_node_range(nested_child_name)
28
- elsif child_direct_child_node
29
- return (
30
- Parser::Source::Range.new(
31
- '(string)',
32
- child_direct_child_node.loc.expression.begin_pos,
33
- child_direct_child_node.loc.expression.end_pos
34
- )
35
- )
36
- else
37
- raise Synvert::Core::MethodNotSupported,
38
- "child_node_range is not handled for #{debug_info}, child_name: #{child_name}"
39
- end
40
- end
41
-
42
- # Return the debug info.
43
- #
44
- # @return [String] file, line, source and node.
45
- def debug_info
46
- map(&:debug_info).join("\n")
47
- end
48
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # Array represents a ruby array value.
5
- class Array
6
- include Comparable
7
-
8
- # Initialize an Array.
9
- # @param value the first value of the array
10
- # @param rest the rest value of the array
11
- def initialize(value: nil, rest: nil)
12
- @value = value
13
- @rest = rest
14
- end
15
-
16
- # Get the expected value.
17
- # @return [Array]
18
- def expected_value
19
- expected = []
20
- expected.push(@value) if @value
21
- expected += @rest.expected_value if @rest
22
- expected
23
- end
24
-
25
- # Get valid operators.
26
- def valid_operators
27
- ARRAY_VALID_OPERATORS
28
- end
29
-
30
- def to_s
31
- [@value, @rest].compact.join(' ')
32
- end
33
- end
34
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # Attribute is a pair of key, value and operator,
5
- class Attribute
6
- # Initialize a Attribute.
7
- # @param key [String] the key
8
- # @param value the value can be any class implement {Synvert::Core::NodeQuery::Compiler::Comparable}
9
- # @param operator [Symbol] the operator
10
- def initialize(key:, value:, operator: '==')
11
- @key = key
12
- @value = value
13
- @operator = operator
14
- end
15
-
16
- # Check if the node matches the attribute.
17
- # @param node [Parser::AST::Node] the node
18
- # @return [Boolean]
19
- def match?(node)
20
- @value.base_node = node if @value.is_a?(DynamicAttribute)
21
- node && @value.match?(node.child_node_by_name(@key), @operator)
22
- end
23
-
24
- def to_s
25
- case @operator
26
- when '^=', '$=', '*=', '!=', '=~', '!~', '>=', '>', '<=', '<'
27
- "#{@key}#{@operator}#{@value}"
28
- when 'in'
29
- "#{@key} in (#{@value})"
30
- when 'not_in'
31
- "#{@key} not in (#{@value})"
32
- when 'includes'
33
- "#{@key} includes #{@value}"
34
- else
35
- "#{@key}=#{@value}"
36
- end
37
- end
38
- end
39
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # AttributeList contains one or more {Synvert::Core::NodeQuery::Compiler::Attribute}.
5
- class AttributeList
6
- # Initialize a AttributeList.
7
- # @param attribute [Synvert::Core::NodeQuery::Compiler::Attribute] the attribute
8
- # @param rest [Synvert::Core::NodeQuery::Compiler::AttributeList] the rest attribute list
9
- def initialize(attribute:, rest: nil)
10
- @attribute = attribute
11
- @rest = rest
12
- end
13
-
14
- # Check if the node matches the attribute list.
15
- # @return [Boolean]
16
- def match?(node)
17
- @attribute.match?(node) && (!@rest || @rest.match?(node))
18
- end
19
-
20
- def to_s
21
- "[#{@attribute}]#{@rest}"
22
- end
23
- end
24
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # BasicSelector used to match nodes, it combines by node type and/or attribute list.
5
- class BasicSelector
6
- # Initialize a BasicSelector.
7
- # @param node_type [String] the node type
8
- # @param attribute_list [Synvert::Core::NodeQuery::Compiler::AttributeList] the attribute list
9
- def initialize(node_type:, attribute_list: nil)
10
- @node_type = node_type
11
- @attribute_list = attribute_list
12
- end
13
-
14
- # Check if node matches the selector.
15
- # @param node [Parser::AST::Node] the node
16
- def match?(node, _operator = '==')
17
- return false unless node
18
-
19
- @node_type.to_sym == node.type && (!@attribute_list || @attribute_list.match?(node))
20
- end
21
-
22
- def to_s
23
- result = [".#{@node_type}"]
24
- result << @attribute_list.to_s if @attribute_list
25
- result.join('')
26
- end
27
- end
28
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # Boolean represents a ruby boolean value.
5
- class Boolean
6
- include Comparable
7
-
8
- # Initialize a Boolean.
9
- # @param value [Boolean] the boolean value
10
- def initialize(value:)
11
- @value = value
12
- end
13
-
14
- # Get valid operators.
15
- def valid_operators
16
- SIMPLE_VALID_OPERATORS
17
- end
18
-
19
- def to_s
20
- @value.to_s
21
- end
22
- end
23
- end