rupkl 0.1.0 → 0.2.0

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/rupkl/node/amend_expression.rb +48 -0
  4. data/lib/rupkl/node/any.rb +99 -0
  5. data/lib/rupkl/node/base.rb +45 -0
  6. data/lib/rupkl/node/boolean.rb +12 -4
  7. data/lib/rupkl/node/context.rb +27 -0
  8. data/lib/rupkl/node/declared_type.rb +32 -0
  9. data/lib/rupkl/node/dynamic.rb +28 -59
  10. data/lib/rupkl/node/identifier.rb +16 -6
  11. data/lib/rupkl/node/listing.rb +61 -0
  12. data/lib/rupkl/node/mapping.rb +47 -0
  13. data/lib/rupkl/node/member_finder.rb +55 -0
  14. data/lib/rupkl/node/member_reference.rb +44 -21
  15. data/lib/rupkl/node/method_call.rb +64 -0
  16. data/lib/rupkl/node/method_definition.rb +143 -0
  17. data/lib/rupkl/node/node_common.rb +76 -0
  18. data/lib/rupkl/node/null.rb +27 -0
  19. data/lib/rupkl/node/number.rb +136 -6
  20. data/lib/rupkl/node/object.rb +369 -73
  21. data/lib/rupkl/node/operation.rb +97 -60
  22. data/lib/rupkl/node/pkl_module.rb +16 -28
  23. data/lib/rupkl/node/reference_resolver.rb +79 -0
  24. data/lib/rupkl/node/string.rb +388 -18
  25. data/lib/rupkl/node/struct_common.rb +119 -57
  26. data/lib/rupkl/node/this.rb +17 -0
  27. data/lib/rupkl/node/type_common.rb +34 -0
  28. data/lib/rupkl/node/value_common.rb +18 -9
  29. data/lib/rupkl/parser/expression.rb +158 -41
  30. data/lib/rupkl/parser/identifier.rb +2 -2
  31. data/lib/rupkl/parser/literal.rb +18 -12
  32. data/lib/rupkl/parser/method.rb +41 -0
  33. data/lib/rupkl/parser/misc.rb +4 -0
  34. data/lib/rupkl/parser/object.rb +57 -25
  35. data/lib/rupkl/parser/pkl_class.rb +28 -8
  36. data/lib/rupkl/parser/pkl_module.rb +5 -3
  37. data/lib/rupkl/parser/type.rb +28 -0
  38. data/lib/rupkl/parser.rb +8 -0
  39. data/lib/rupkl/pkl_object.rb +26 -6
  40. data/lib/rupkl/version.rb +1 -1
  41. data/lib/rupkl.rb +25 -4
  42. metadata +33 -3
  43. data/lib/rupkl/node/pkl_class.rb +0 -30
@@ -3,24 +3,33 @@
3
3
  module RuPkl
4
4
  module Node
5
5
  module ValueCommon
6
- def initialize(value, position)
6
+ include NodeCommon
7
+
8
+ def initialize(parent, value, position)
9
+ super(parent, position)
7
10
  @value = value
8
- @position = position
9
11
  end
10
12
 
11
13
  attr_reader :value
12
- attr_reader :position
13
14
 
14
- def to_ruby(scopes)
15
- evaluate(scopes).value
15
+ def evaluate(_context = nil)
16
+ self
17
+ end
18
+
19
+ def to_ruby(context = nil)
20
+ evaluate(context).value
21
+ end
22
+
23
+ def to_string(context = nil)
24
+ to_ruby(context).to_s
16
25
  end
17
26
 
18
- def to_string(scopes)
19
- to_ruby(scopes).to_s
27
+ def to_pkl_string(context = nil)
28
+ to_string(context)
20
29
  end
21
30
 
22
- def to_pkl_string(scopes)
23
- to_string(scopes)
31
+ def copy(parent = nil)
32
+ self.class.new(parent, @value, position)
24
33
  end
25
34
 
26
35
  def ==(other)
@@ -3,46 +3,98 @@
3
3
  module RuPkl
4
4
  class Parser
5
5
  define_parser do
6
+ rule(:argument_list) do
7
+ bracketed(list(expression).maybe, '(', ')').as(:argument_list)
8
+ end
9
+
6
10
  rule(:unqualified_member_ref) do
7
- id.as(:unqualified_member_ref)
11
+ (
12
+ id.as(:name) >>
13
+ (pure_ws? >> argument_list.as(:arguments)).maybe
14
+ ).as(:unqualified_member_ref)
15
+ end
16
+
17
+ rule(:parenthesized_expression) do
18
+ bracketed(expression)
19
+ end
20
+
21
+ rule(:this_expression) do
22
+ kw_this.as(:this_expression)
23
+ end
24
+
25
+ rule(:null_expression) do
26
+ kw_null.as(:null_expression)
27
+ end
28
+
29
+ rule(:new_expression) do
30
+ (
31
+ kw_new.as(:kw_new) >>
32
+ (ws? >> type.as(:type)).maybe >>
33
+ (ws? >> object_body).repeat(1).as(:bodies)
34
+ ).as(:new_expression)
35
+ end
36
+
37
+ rule(:amend_expression) do
38
+ (
39
+ parenthesized_expression.as(:target) >>
40
+ (ws? >> object_body).repeat(1).as(:bodies)
41
+ ).as(:amend_expression)
8
42
  end
9
43
 
10
44
  rule(:primary) do
11
45
  [
12
- float_literal, integer_literal, boolean_literal, string_literal,
13
- unqualified_member_ref, bracketed(expression)
46
+ float_literal, int_literal, boolean_literal, string_literal,
47
+ this_expression, null_expression, new_expression, amend_expression,
48
+ unqualified_member_ref, parenthesized_expression
14
49
  ].inject(:|)
15
50
  end
16
51
 
52
+ rule(:qualifier) do
53
+ (str('?.') | str('.'))
54
+ end
55
+
17
56
  rule(:qualified_member_ref) do
18
57
  (
19
- primary.as(:receiver) >>
20
- (ws? >> str('.') >> ws? >> id).repeat(1).as(:member)
21
- ).as(:qualified_member_ref) | primary
58
+ ws? >> qualifier.as(:qualifier) >> ws? >>
59
+ id.as(:member) >> (pure_ws? >> argument_list.as(:arguments)).maybe
60
+ ).as(:qualified_member_ref)
61
+ end
62
+
63
+ rule(:subscript_key) do
64
+ (
65
+ pure_ws? >> bracketed(expression, '[', ']') >>
66
+ (ws? >> str('=')).absent?
67
+ ).as(:subscript_key)
22
68
  end
23
69
 
24
- rule(:subscript_operation) do
70
+ rule(:qualified_member_ref_or_subscript_operation) do
25
71
  (
26
- qualified_member_ref.as(:receiver) >>
72
+ primary.as(:receiver) >>
27
73
  (
28
- pure_ws? >> bracketed(expression, '[', ']') >>
29
- (ws? >> str('=')).absent?
30
- ).repeat(1).as(:key)
31
- ).as(:subscript_operation) | qualified_member_ref
74
+ qualified_member_ref | subscript_key
75
+ ).repeat(1).as(:member_ref_or_subscript_key)
76
+ ).as(:qualified_member_ref_or_subscript_operation) | primary
77
+ end
78
+
79
+ rule(:non_null_operation) do
80
+ (
81
+ qualified_member_ref_or_subscript_operation.as(:operand) >>
82
+ ws? >> str(:'!!').as(:non_null_operator)
83
+ ) | qualified_member_ref_or_subscript_operation
32
84
  end
33
85
 
34
86
  rule(:unary_operation) do
35
87
  (
36
88
  (str(:-) | str(:!)).as(:unary_operator) >>
37
- ws? >> subscript_operation.as(:operand)
38
- ) | subscript_operation
89
+ ws? >> non_null_operation.as(:operand)
90
+ ) | non_null_operation
39
91
  end
40
92
 
41
93
  rule(:binary_operation) do
42
94
  expression = unary_operation
43
95
  operators = binary_operators
44
96
  reducer = proc { |l, o, r| { binary_operator: o, l_operand: l, r_operand: r } }
45
- infix_expression(expression, *operators, &reducer) | unary_operation
97
+ infix_expression(expression, *operators, &reducer)
46
98
  end
47
99
 
48
100
  rule(:expression) do
@@ -53,12 +105,13 @@ module RuPkl
53
105
 
54
106
  def binary_operators
55
107
  operators = {
56
- '||': 1, '&&': 2,
57
- '==': 3, '!=': 3,
58
- '<': 4, '>': 4, '<=': 4, '>=': 4,
59
- '+': 5, '-': 5,
60
- '*': 6, '/': 6, '~/': 6, '%': 6,
61
- '**': 7
108
+ '??': 1,
109
+ '||': 2, '&&': 3,
110
+ '==': 4, '!=': 4,
111
+ '<': 5, '>': 5, '<=': 5, '>=': 5,
112
+ '+': 6, '-': 6,
113
+ '*': 7, '/': 7, '~/': 7, '%': 7,
114
+ '**': 8
62
115
  }
63
116
  operators
64
117
  .sort_by { |op, _| op.length }.reverse
@@ -72,48 +125,112 @@ module RuPkl
72
125
  else
73
126
  ws? >> str(operator) >> ws?
74
127
  end
75
- if operator == :**
76
- [atom, priority, :right]
77
- else
78
- [atom, priority, :left]
79
- end
128
+ associativity =
129
+ (operator in :** | :'??') && :right || :left
130
+ [atom, priority, associativity]
80
131
  end
81
132
  end
82
133
 
83
134
  define_transform do
84
- rule(unqualified_member_ref: simple(:member)) do
85
- Node::MemberReference.new(nil, member, member.position)
135
+ rule(argument_list: subtree(:arguments)) do
136
+ arguments == '' ? nil : Array(arguments)
86
137
  end
87
138
 
88
139
  rule(
89
- qualified_member_ref:
90
- { receiver: simple(:receiver), member: sequence(:member) }
140
+ unqualified_member_ref:
141
+ { name: simple(:name) }
91
142
  ) do
92
- member.inject(receiver) do |r, m|
93
- Node::MemberReference.new(r, m, r.position)
94
- end
143
+ Node::MemberReference.new(nil, nil, name, false, name.position)
95
144
  end
96
145
 
97
146
  rule(
98
- subscript_operation:
99
- { receiver: simple(:receiver), key: sequence(:key) }
147
+ unqualified_member_ref:
148
+ { name: simple(:name), arguments: subtree(:arguments) }
100
149
  ) do
101
- key.inject(receiver) do |r, k|
102
- Node::SubscriptOperation.new(r, k, r.position)
150
+ Node::MethodCall.new(nil, nil, name, arguments, false, name.position)
151
+ end
152
+
153
+ rule(
154
+ qualified_member_ref_or_subscript_operation:
155
+ {
156
+ receiver: simple(:receiver),
157
+ member_ref_or_subscript_key: subtree(:member_ref_or_subscript_key)
158
+ }
159
+ ) do
160
+ member_ref_or_subscript_key.inject(receiver) do |r, ref_or_key|
161
+ if ref_or_key.key?(:subscript_key)
162
+ process_subscript_operation(r, ref_or_key[:subscript_key])
163
+ else
164
+ process_member_ref(r, ref_or_key[:qualified_member_ref])
165
+ end
103
166
  end
104
167
  end
105
168
 
169
+ define_helper(:process_subscript_operation) do |receiver, key|
170
+ Node::SubscriptOperation.new(nil, :[], receiver, key, receiver.position)
171
+ end
172
+
173
+ define_helper(:process_member_ref) do |receiver, member_ref|
174
+ nullable = member_ref[:qualifier] == '?.'
175
+ if member_ref.key?(:arguments)
176
+ Node::MethodCall.new(
177
+ nil, receiver, member_ref[:member], member_ref[:arguments],
178
+ nullable, receiver.position
179
+ )
180
+ else
181
+ Node::MemberReference.new(
182
+ nil, receiver, member_ref[:member], nullable, receiver.position
183
+ )
184
+ end
185
+ end
186
+
187
+ rule(this_expression: simple(:this)) do
188
+ Node::This.new(nil, node_position(this))
189
+ end
190
+
191
+ rule(null_expression: simple(:null)) do
192
+ Node::Null.new(nil, node_position(null))
193
+ end
194
+
195
+ rule(
196
+ new_expression:
197
+ { kw_new: simple(:n), bodies: subtree(:b) }
198
+ ) do
199
+ Node::UnresolvedObject.new(nil, nil, b, node_position(n))
200
+ end
201
+
202
+ rule(
203
+ new_expression:
204
+ { kw_new: simple(:n), type: simple(:t), bodies: subtree(:b) }
205
+ ) do
206
+ Node::UnresolvedObject.new(nil, t, b, node_position(n))
207
+ end
208
+
209
+ rule(
210
+ amend_expression:
211
+ { target: simple(:t), bodies: subtree(:b) }
212
+ ) do
213
+ Node::AmendExpression.new(nil, t, Array(b), t.position)
214
+ end
215
+
216
+ rule(operand: simple(:operand), non_null_operator: simple(:operator)) do
217
+ Node::NonNullOperation.new(nil, operator.to_sym, operand, operand.position)
218
+ end
219
+
106
220
  rule(unary_operator: simple(:operator), operand: simple(:operand)) do
107
- Node::UnaryOperation.new(operator.to_sym, operand, node_position(operator))
221
+ Node::UnaryOperation.new(nil, operator.to_sym, operand, node_position(operator))
108
222
  end
109
223
 
110
224
  rule(
111
225
  binary_operator: simple(:operator),
112
226
  l_operand: simple(:l_operand), r_operand: simple(:r_operand)
113
227
  ) do
114
- Node::BinaryOperation.new(
115
- operator.to_sym, l_operand, r_operand, l_operand.position
116
- )
228
+ klass =
229
+ case operator.to_sym
230
+ when :'??' then Node::NullCoalescingOperation
231
+ else Node::BinaryOperation
232
+ end
233
+ klass.new(nil, operator.to_sym, l_operand, r_operand, l_operand.position)
117
234
  end
118
235
  end
119
236
  end
@@ -41,11 +41,11 @@ module RuPkl
41
41
  parse_error(message, node_position(id))
42
42
  end
43
43
 
44
- Node::Identifier.new(id.to_sym, node_position(id))
44
+ Node::Identifier.new(nil, id.to_sym, node_position(id))
45
45
  end
46
46
 
47
47
  rule(quoted_id: simple(:id)) do
48
- Node::Identifier.new(id.to_s[1..-2].to_sym, node_position(id))
48
+ Node::Identifier.new(nil, id.to_s[1..-2].to_sym, node_position(id))
49
49
  end
50
50
 
51
51
  private
@@ -13,16 +13,16 @@ module RuPkl
13
13
 
14
14
  define_transform do
15
15
  rule(true_value: simple(:v)) do
16
- Node::Boolean.new(true, node_position(v))
16
+ Node::Boolean.new(nil, true, node_position(v))
17
17
  end
18
18
 
19
19
  rule(false_value: simple(:v)) do
20
- Node::Boolean.new(false, node_position(v))
20
+ Node::Boolean.new(nil, false, node_position(v))
21
21
  end
22
22
  end
23
23
 
24
24
  #
25
- # Integer literal
25
+ # Int literal
26
26
  #
27
27
  define_parser do
28
28
  rule(:bin_literal) do
@@ -41,18 +41,18 @@ module RuPkl
41
41
  str('0x') >> match('[\h]') >> match('[_\h]').repeat
42
42
  end
43
43
 
44
- rule(:integer_literal) do
44
+ rule(:int_literal) do
45
45
  (
46
46
  bin_literal | oct_literal | hex_literal | dec_literal
47
- ).as(:integer_literal)
47
+ ).as(:int_literal)
48
48
  end
49
49
  end
50
50
 
51
51
  define_transform do
52
- rule(integer_literal: simple(:v)) do
52
+ rule(int_literal: simple(:v)) do
53
53
  base = { 'b' => 2, 'o' => 8, 'x' => 16 }.fetch(v.to_s[1], 10)
54
54
  value = v.to_s.tr('_', '').to_i(base)
55
- Node::Integer.new(value, node_position(v))
55
+ Node::Int.new(nil, value, node_position(v))
56
56
  end
57
57
  end
58
58
 
@@ -75,7 +75,7 @@ module RuPkl
75
75
  define_transform do
76
76
  rule(float_literal: simple(:f)) do
77
77
  v = f.to_s.tr('_', '').to_f
78
- Node::Float.new(v, node_position(f))
78
+ Node::Float.new(nil, v, node_position(f))
79
79
  end
80
80
  end
81
81
 
@@ -225,19 +225,25 @@ module RuPkl
225
225
 
226
226
  define_transform do
227
227
  rule(ss_bq: simple(:bq), ss_eq: simple(:eq)) do
228
- Node::String.new(nil, nil, node_position(bq))
228
+ Node::String.new(nil, nil, nil, node_position(bq))
229
229
  end
230
230
 
231
231
  rule(ss_bq: simple(:bq), ss_portions: subtree(:portions), ss_eq: simple(:eq)) do
232
- Node::String.new(nil, process_ss_portions(portions, bq), node_position(bq))
232
+ Node::String.new(
233
+ nil, nil, process_ss_portions(portions, bq),
234
+ node_position(bq)
235
+ )
233
236
  end
234
237
 
235
238
  rule(ms_bq: simple(:bq), ms_eq: simple(:eq)) do
236
- Node::String.new(nil, nil, node_position(bq))
239
+ Node::String.new(nil, nil, nil, node_position(bq))
237
240
  end
238
241
 
239
242
  rule(ms_bq: simple(:bq), ms_portions: subtree(:portions), ms_eq: simple(:eq)) do
240
- Node::String.new(nil, process_ms_portions(portions, bq, eq), node_position(bq))
243
+ Node::String.new(
244
+ nil, nil, process_ms_portions(portions, bq, eq),
245
+ node_position(bq)
246
+ )
241
247
  end
242
248
 
243
249
  private
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuPkl
4
+ class Parser
5
+ define_parser do
6
+ rule(:method_header) do
7
+ kw_function.as(:kw_function) >> ws >>
8
+ id.as(:name) >> ws? >> method_params.as(:params) >>
9
+ (ws? >> type_annotation.as(:type)).maybe
10
+ end
11
+
12
+ rule(:method_params) do
13
+ bracketed(list(method_param).maybe, '(', ')').as(:method_params)
14
+ end
15
+
16
+ rule(:method_param) do
17
+ (
18
+ id.as(:name) >> (ws? >> type_annotation.as(:type)).maybe
19
+ ).as(:method_param)
20
+ end
21
+ end
22
+
23
+ define_transform do
24
+ rule(method_params: subtree(:params)) do
25
+ params == '' ? nil : Array(params)
26
+ end
27
+
28
+ rule(
29
+ method_param: { name: simple(:name) }
30
+ ) do
31
+ Node::MethodParam.new(nil, name, nil, name.position)
32
+ end
33
+
34
+ rule(
35
+ method_param: { name: simple(:name), type: simple(:type) }
36
+ ) do
37
+ Node::MethodParam.new(nil, name, type, name.position)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -45,6 +45,10 @@ module RuPkl
45
45
  .map { _1.is_a?(String) && str(_1).ignore || _1 }
46
46
  bra_matcher >> ws? >> atom >> ws? >> cket_matcher
47
47
  end
48
+
49
+ def list(atom, delimiter = ',')
50
+ atom >> (ws? >> str(delimiter).ignore >> ws? >> atom).repeat
51
+ end
48
52
  end
49
53
  end
50
54
  end
@@ -4,27 +4,30 @@ module RuPkl
4
4
  class Parser
5
5
  define_parser do
6
6
  rule(:object) do
7
- bracketed(
8
- object_members.as(:members).maybe,
9
- str('{').as(:start), '}'
10
- ).as(:object)
7
+ (object_body >> (ws? >> object_body).repeat).as(:bodies).as(:object)
11
8
  end
12
9
 
13
- rule(:object_members) do
14
- object_member >> (ws >> object_member).repeat
10
+ rule(:object_body) do
11
+ members = object_member >> (ws >> object_member).repeat
12
+ bracketed(
13
+ members.as(:members).maybe,
14
+ str('{').as(:body_begin), '}'
15
+ ).as(:object_body)
15
16
  end
16
17
 
17
18
  rule(:object_member) do
18
- object_property | object_entry | object_element
19
+ [
20
+ object_method, object_element,
21
+ object_property, object_entry
22
+ ].inject(:|)
19
23
  end
20
24
 
21
25
  rule(:object_property) do
22
26
  (
23
27
  id.as(:name) >> ws? >>
24
28
  (
25
- (str('=').ignore >> ws? >> expression.as(:value)) |
26
- (object >> (ws? >> object).repeat).as(:objects)
27
- )
29
+ (str('=').ignore >> ws? >> expression) | object
30
+ ).as(:value)
28
31
  ).as(:object_property)
29
32
  end
30
33
 
@@ -32,40 +35,69 @@ module RuPkl
32
35
  (
33
36
  bracketed(expression.as(:key), '[', ']') >> ws? >>
34
37
  (
35
- (str('=').ignore >> ws? >> expression.as(:value)) |
36
- (object >> (ws? >> object).repeat).as(:objects)
37
- )
38
+ (str('=').ignore >> ws? >> expression) | object
39
+ ).as(:value)
38
40
  ).as(:object_entry)
39
41
  end
40
42
 
41
43
  rule(:object_element) do
42
- expression
44
+ (
45
+ expression >> (ws? >> match('[={]')).absent?
46
+ ).as(:object_element)
47
+ end
48
+
49
+ rule(:object_method) do
50
+ (
51
+ method_header >> ws? >>
52
+ str('=').ignore >> ws? >> expression.as(:body)
53
+ ).as(:object_method)
43
54
  end
44
55
  end
45
56
 
46
57
  define_transform do
47
- rule(object: { start: simple(:s) }) do
48
- Node::UnresolvedObject.new(nil, node_position(s))
58
+ rule(object: { bodies: subtree(:b) }) do
59
+ bodies = Array(b)
60
+ Node::UnresolvedObject.new(nil, nil, bodies, bodies.first.position)
49
61
  end
50
62
 
51
- rule(object: { start: simple(:s), members: subtree(:m) }) do
52
- Node::UnresolvedObject.new(Array(m), node_position(s))
63
+ rule(object_body: { body_begin: simple(:b) }) do
64
+ Node::ObjectBody.new(nil, nil, node_position(b))
53
65
  end
54
66
 
55
- rule(object_property: { name: simple(:n), value: simple(:v) }) do
56
- Node::ObjectProperty.new(n, v, nil, n.position)
67
+ rule(object_body: { body_begin: simple(:b), members: subtree(:m) }) do
68
+ Node::ObjectBody.new(nil, Array(m), node_position(b))
57
69
  end
58
70
 
59
- rule(object_property: { name: simple(:n), objects: subtree(:o) }) do
60
- Node::ObjectProperty.new(n, nil, Array(o), n.position)
71
+ rule(object_property: { name: simple(:n), value: simple(:v) }) do
72
+ Node::ObjectProperty.new(nil, n, v, n.position)
61
73
  end
62
74
 
63
75
  rule(object_entry: { key: simple(:k), value: simple(:v) }) do
64
- Node::ObjectEntry.new(k, v, nil, k.position)
76
+ Node::ObjectEntry.new(nil, k, v, k.position)
77
+ end
78
+
79
+ rule(object_element: simple(:e)) do
80
+ Node::ObjectElement.new(nil, e, e.position)
81
+ end
82
+
83
+ rule(
84
+ object_method:
85
+ {
86
+ kw_function: simple(:kw), name: simple(:name),
87
+ params: subtree(:params), body: simple(:body)
88
+ }
89
+ ) do
90
+ Node::MethodDefinition.new(nil, name, params, nil, body, node_position(kw))
65
91
  end
66
92
 
67
- rule(object_entry: { key: simple(:k), objects: subtree(:o) }) do
68
- Node::ObjectEntry.new(k, nil, Array(o), k.position)
93
+ rule(
94
+ object_method:
95
+ {
96
+ kw_function: simple(:kw), name: simple(:name),
97
+ params: subtree(:params), type: simple(:type), body: simple(:body)
98
+ }
99
+ ) do
100
+ Node::MethodDefinition.new(nil, name, params, type, body, node_position(kw))
69
101
  end
70
102
  end
71
103
  end
@@ -7,22 +7,42 @@ module RuPkl
7
7
  (
8
8
  id.as(:name) >> ws? >>
9
9
  (
10
- (str('=').ignore >> ws? >> expression.as(:value)) |
11
- (object >> (ws? >> object).repeat).as(:objects)
12
- )
10
+ (str('=').ignore >> ws? >> expression) | object
11
+ ).as(:value)
13
12
  ).as(:class_property)
14
13
  end
14
+
15
+ rule(:pkl_class_method) do
16
+ (
17
+ method_header >> ws? >>
18
+ str('=').ignore >> ws? >> expression.as(:body)
19
+ ).as(:pkl_class_method)
20
+ end
15
21
  end
16
22
 
17
23
  define_transform do
18
24
  rule(class_property: { name: simple(:n), value: simple(:v) }) do
19
- Node::PklClassProperty.new(n, v, nil, n.position)
25
+ Node::ObjectProperty.new(nil, n, v, n.position)
20
26
  end
21
- end
22
27
 
23
- define_transform do
24
- rule(class_property: { name: simple(:n), objects: subtree(:o) }) do
25
- Node::PklClassProperty.new(n, nil, Array(o), n.position)
28
+ rule(
29
+ pkl_class_method:
30
+ {
31
+ kw_function: simple(:kw), name: simple(:name),
32
+ params: subtree(:params), body: simple(:body)
33
+ }
34
+ ) do
35
+ Node::MethodDefinition.new(nil, name, params, nil, body, node_position(kw))
36
+ end
37
+
38
+ rule(
39
+ pkl_class_method:
40
+ {
41
+ kw_function: simple(:kw), name: simple(:name),
42
+ params: subtree(:params), type: simple(:type), body: simple(:body)
43
+ }
44
+ ) do
45
+ Node::MethodDefinition.new(nil, name, params, type, body, node_position(kw))
26
46
  end
27
47
  end
28
48
  end
@@ -14,18 +14,20 @@ module RuPkl
14
14
  end
15
15
 
16
16
  rule(:pkl_module_item) do
17
- pkl_class_property
17
+ pkl_class_method | pkl_class_property
18
18
  end
19
19
  end
20
20
 
21
21
  define_transform do
22
22
  rule(pkl_module: simple(:_)) do
23
- Node::PklModule.new(nil, sof_position)
23
+ body = Node::ObjectBody.new(nil, nil, sof_position)
24
+ Node::PklModule.new(nil, body, sof_position)
24
25
  end
25
26
 
26
27
  rule(pkl_module: { items: subtree(:items) }) do
27
28
  Array(items)
28
- .then { Node::PklModule.new(_1, _1.first.position) }
29
+ .then { Node::ObjectBody.new(nil, _1, _1.first.position) }
30
+ .then { Node::PklModule.new(nil, _1, _1.position) }
29
31
  end
30
32
  end
31
33
  end