rupkl 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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