sirop 0.2 → 0.3

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: 1641ee60187094fe9dcdeebefbfc5283c0d2ea535aa161b17f7bf6f720d63854
4
- data.tar.gz: c9abaef1a8b7116760f92e143bcb2e58fbc4424fe3d4afe110bc10bf552852cf
3
+ metadata.gz: 5a44761c6907c2bd7358e0b7d6c4079b8582949121ff32161b508a0950d0032c
4
+ data.tar.gz: 99cf621e80d420ec1a4245e8fd9efdbb06633614982d804d45f545f0a1966a0b
5
5
  SHA512:
6
- metadata.gz: 3900ece58c932df6181676abb597fa6deedfbd8801e28f4993cc36cce7584a188e88b73e6ef2b0fea33b5dbc8a8d284949159973cb108e149dd0d9b3ea5dd762
7
- data.tar.gz: 7f848b0e842792a33e3fc7c9b7d6cf72e924040307e2db5ccb0cff16af1e947e7053ee81e54ab688c131532b66432dc1283651ceeef5820ded58c3b8447d193a
6
+ metadata.gz: de992959d865f0ace64d1be7b9c0149a10d193f54e2bfa0e9b20dcd2fe70f7bf4fe3ec5984c29a75cf89bc70dc385d29747ba372174bfe4286654b3543e0f946
7
+ data.tar.gz: '00393520ab9df84615c35a104411d4aad118c07ac4d4212debbf21df536f90883dd924e31e4d9064d4ce7344fa425716c292d4f9fbe3e1fb3b675ccea054fe95'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 2024-04-19 0.3
2
+
3
+ - Add support for injecting (prefixed) parameters to a lambda node
4
+ - Fix whitespace adjustment in DSL compiler
5
+ - Improve DSL compiler to support embedded string expressions
6
+ - Correctly handle eval'd proc
7
+
1
8
  # 2024-02-27 0.2
2
9
 
3
10
  - Update README
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sirop
4
+ class Injection
5
+ attr_reader :slice
6
+
7
+ def initialize(slice)
8
+ @slice = slice
9
+ end
10
+ end
11
+ end
@@ -8,3 +8,27 @@ class Prism::BasicVisitor
8
8
  self
9
9
  end
10
10
  end
11
+
12
+ class Prism::ParametersNode
13
+ attr_accessor :injected_prefix
14
+ end
15
+
16
+ class Prism::BlockParametersNode
17
+ attr_accessor :injected_parameters
18
+ end
19
+
20
+ class Prism::LambdaNode
21
+ # @param params [String] injected parameters
22
+ # @return [void]
23
+ def inject_parameters(params)
24
+ if parameters
25
+ if parameters.parameters
26
+ parameters.parameters.injected_prefix = Sirop::Injection.new(params)
27
+ else
28
+ parameters.injected_parameters = Sirop::Injection.new(params)
29
+ end
30
+ else
31
+ instance_variable_set(:@parameters, Sirop::Injection.new("(#{params})"))
32
+ end
33
+ end
34
+ end
@@ -30,11 +30,14 @@ module Sirop
30
30
  end
31
31
 
32
32
  def adjust_whitespace(loc)
33
+ return if loc.is_a?(Sirop::Injection)
34
+
33
35
  if @last_loc_start
34
- if @last_loc_end.first != loc.start_line
35
- @buffer << "\n" * (loc.start_line - @last_loc_end.first)
36
+ line_diff = loc.start_line - @last_loc_end.first
37
+ if line_diff > 0
38
+ @buffer << "\n" * line_diff
36
39
  @buffer << ' ' * loc.start_column
37
- else
40
+ elsif line_diff == 0
38
41
  ofs = loc.start_column - @last_loc_end.last
39
42
  if ofs > 0
40
43
  @buffer << ' ' * ofs
@@ -85,38 +88,41 @@ module Sirop
85
88
  end
86
89
 
87
90
  VISIT_PLANS = {
88
- and: [:left, :operator_loc, :right],
89
- assoc: :visit_child_nodes,
90
- assoc_splat: [:operator_loc, :value],
91
- block: [:opening_loc, :parameters, :body, :closing_loc],
92
- block_argument: [:operator_loc, :expression],
93
- block_parameter: [:operator_loc, :name_loc],
94
- block_parameters: [:opening_loc, :parameters, :closing_loc],
95
- break: [:keyword_loc, :arguments],
96
- constant_path: [:parent, :delimiter_loc, :child],
97
- constant_read: :emit_verbatim,
98
- else: [:else_keyword_loc, :statements],
99
- embedded_statements: [:opening_loc, :statements, :closing_loc],
100
- false: :emit_verbatim,
101
- integer: :emit_verbatim,
102
- keyword_rest_parameter: [:operator_loc, :name_loc],
103
- lambda: [:operator_loc, :parameters, :opening_loc, :body,
104
- :closing_loc],
105
- local_variable_read: :emit_verbatim,
106
- local_variable_write: [:name_loc, :operator_loc, :value],
107
- next: [:keyword_loc, :arguments],
108
- nil: :emit_verbatim,
109
- optional_parameter: [:name_loc, :operator_loc, :value],
110
- or: [:left, :operator_loc, :right],
111
- parentheses: [:opening_loc, :body, :closing_loc],
112
- required_parameter: :emit_verbatim,
113
- rest_parameter: [:operator_loc, :name_loc],
114
- splat: [:operator_loc, :expression],
115
- statements: :visit_child_nodes,
116
- string: :emit_verbatim,
117
- symbol: :emit_verbatim,
118
- true: :emit_verbatim,
119
- yield: [:keyword_loc, :lparen_loc, :arguments, :rparen_loc],
91
+ and: [:left, :operator_loc, :right],
92
+ assoc: :visit_child_nodes,
93
+ assoc_splat: [:operator_loc, :value],
94
+ block: [:opening_loc, :parameters, :body, :closing_loc],
95
+ block_argument: [:operator_loc, :expression],
96
+ block_parameter: [:operator_loc, :name_loc],
97
+ block_parameters: [:opening_loc, :injected_parameters, :parameters, :closing_loc],
98
+ break: [:keyword_loc, :arguments],
99
+ constant_path: [:parent, :delimiter_loc, :child],
100
+ constant_read: :emit_verbatim,
101
+ else: [:else_keyword_loc, :statements],
102
+ embedded_statements: [:opening_loc, :statements, :closing_loc],
103
+ false: :emit_verbatim,
104
+ integer: :emit_verbatim,
105
+ keyword_rest_parameter: [:operator_loc, :name_loc],
106
+ keyword_parameter: :emit_verbatim,
107
+ lambda: [:operator_loc, :parameters, :opening_loc, :body,
108
+ :closing_loc],
109
+ local_variable_read: :emit_verbatim,
110
+ local_variable_write: [:name_loc, :operator_loc, :value],
111
+ next: [:keyword_loc, :arguments],
112
+ nil: :emit_verbatim,
113
+ optional_parameter: [:name_loc, :operator_loc, :value],
114
+ optional_keyword_parameter: [:name_loc, :value],
115
+ or: [:left, :operator_loc, :right],
116
+ parentheses: [:opening_loc, :body, :closing_loc],
117
+ required_parameter: :emit_verbatim,
118
+ required_keyword_parameter: :emit_verbatim,
119
+ rest_parameter: [:operator_loc, :name_loc],
120
+ splat: [:operator_loc, :expression],
121
+ statements: :visit_child_nodes,
122
+ string: :emit_verbatim,
123
+ symbol: :emit_verbatim,
124
+ true: :emit_verbatim,
125
+ yield: [:keyword_loc, :lparen_loc, :arguments, :rparen_loc],
120
126
  }
121
127
 
122
128
  VISIT_PLANS.each do |key, plan|
@@ -152,9 +158,21 @@ module Sirop
152
158
  end
153
159
 
154
160
  def visit_parameters_node(node)
155
- comma = visit_comma_separated_nodes(node.requireds)
161
+ comma = false
162
+ # injected_prefix is a custom attribute added by Sirop to the
163
+ # ParametersNode class (in lib/sirop/prism_ext.rb). It is used
164
+ # as a way to add a first parameter to a block or method.
165
+ if node.injected_prefix
166
+ emit_code(node.injected_prefix)
167
+ # adjust last_loc_end for proper whitespace after comma
168
+ @last_loc_end[1] -= 2 if @last_loc_end
169
+ # binding.irb
170
+ comma = true
171
+ end
172
+ comma = visit_comma_separated_nodes(node.requireds, comma)
156
173
  comma = visit_comma_separated_nodes(node.optionals, comma)
157
174
  comma = visit_comma_separated_nodes(node.posts, comma)
175
+ comma = visit_comma_separated_nodes(node.keywords, comma)
158
176
  if node.rest
159
177
  emit_comma if comma
160
178
  comma = true
data/lib/sirop/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sirop
2
2
  # Sirop version
3
- VERSION = '0.2'
3
+ VERSION = '0.3'
4
4
  end
data/lib/sirop.rb CHANGED
@@ -1,11 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'prism'
4
+ require 'sirop/injection'
4
5
  require 'sirop/prism_ext'
5
6
  require 'sirop/finder'
6
7
  require 'sirop/sourcifier'
7
8
 
8
9
  module Sirop
10
+ class Error < StandardError
11
+ end
12
+
9
13
  class << self
10
14
  def to_ast(obj)
11
15
  case obj
@@ -43,6 +47,8 @@ module Sirop
43
47
  super(node)
44
48
  end
45
49
  end
50
+ rescue Errno::ENOENT
51
+ raise Sirop::Error, "Could not get source for proc"
46
52
  end
47
53
 
48
54
  def method_ast(method)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sirop
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-27 00:00:00.000000000 Z
11
+ date: 2024-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prism
@@ -49,6 +49,7 @@ files:
49
49
  - README.md
50
50
  - lib/sirop.rb
51
51
  - lib/sirop/finder.rb
52
+ - lib/sirop/injection.rb
52
53
  - lib/sirop/prism_ext.rb
53
54
  - lib/sirop/sourcifier.rb
54
55
  - lib/sirop/version.rb