[ruby/prism] Type every node field and mark on-error-only types explicitly
* For Loader.java, do not deserialize the AST if there are errors, so then Java nodes only have non-error types for fields. https://github.com/ruby/prism/commit/ae78e3c605
This commit is contained in:
parent
407f8b8716
commit
cafd666adf
220
prism/config.yml
220
prism/config.yml
@ -793,8 +793,8 @@ nodes:
|
||||
- GlobalVariableReadNode
|
||||
- BackReferenceReadNode
|
||||
- NumberedReferenceReadNode
|
||||
- SymbolNode # On parsing error of `alias $a b`
|
||||
- MissingNode # On parsing error of `alias $a 42`
|
||||
- on error: SymbolNode # alias $a b
|
||||
- on error: MissingNode # alias $a 42
|
||||
comment: |
|
||||
Represents the old name of the global variable that can be used before aliasing.
|
||||
|
||||
@ -824,8 +824,8 @@ nodes:
|
||||
kind:
|
||||
- SymbolNode
|
||||
- InterpolatedSymbolNode
|
||||
- GlobalVariableReadNode # On parsing error of `alias a $b`
|
||||
- MissingNode # On parsing error of `alias a 42`
|
||||
- on error: GlobalVariableReadNode # alias a $b
|
||||
- on error: MissingNode # alias a 42
|
||||
- name: keyword_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -837,8 +837,10 @@ nodes:
|
||||
fields:
|
||||
- name: left
|
||||
type: node
|
||||
kind: pattern expression
|
||||
- name: right
|
||||
type: node
|
||||
kind: pattern expression
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -850,6 +852,7 @@ nodes:
|
||||
fields:
|
||||
- name: left
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the left side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -860,8 +863,9 @@ nodes:
|
||||
^
|
||||
- name: right
|
||||
type: node
|
||||
kind: Node
|
||||
comment: |
|
||||
Represents the right side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
Represents the right side of the expression.
|
||||
|
||||
left && right
|
||||
^^^^^
|
||||
@ -885,6 +889,7 @@ nodes:
|
||||
fields:
|
||||
- name: arguments
|
||||
type: node[]
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents a set of arguments to a method or a keyword.
|
||||
|
||||
@ -895,6 +900,7 @@ nodes:
|
||||
fields:
|
||||
- name: elements
|
||||
type: node[]
|
||||
kind: non-void expression
|
||||
comment: Represent the list of zero or more [non-void expressions](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression) within the array.
|
||||
- name: opening_loc
|
||||
type: location?
|
||||
@ -923,12 +929,18 @@ nodes:
|
||||
fields:
|
||||
- name: constant
|
||||
type: node?
|
||||
kind:
|
||||
- ConstantReadNode
|
||||
- ConstantPathNode
|
||||
- name: requireds
|
||||
type: node[]
|
||||
kind: pattern expression
|
||||
- name: rest
|
||||
type: node?
|
||||
kind: pattern expression
|
||||
- name: posts
|
||||
type: node[]
|
||||
kind: pattern expression
|
||||
- name: opening_loc
|
||||
type: location?
|
||||
- name: closing_loc
|
||||
@ -954,6 +966,7 @@ nodes:
|
||||
fields:
|
||||
- name: key
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The key of the association. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -967,6 +980,7 @@ nodes:
|
||||
^^^^^^^^^^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value of the association, if present. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -991,6 +1005,7 @@ nodes:
|
||||
fields:
|
||||
- name: value
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to be splatted, if present. Will be missing when keyword rest argument forwarding is used.
|
||||
|
||||
@ -1053,6 +1068,7 @@ nodes:
|
||||
fields:
|
||||
- name: expression
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -1157,6 +1173,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location?
|
||||
- name: message_loc
|
||||
@ -1169,6 +1186,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator on a call.
|
||||
|
||||
@ -1179,6 +1197,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The object that the method is being called on. This can be either `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -1205,6 +1224,9 @@ nodes:
|
||||
type: location?
|
||||
- name: block
|
||||
type: node?
|
||||
kind:
|
||||
- BlockNode
|
||||
- BlockArgumentNode
|
||||
comment: |
|
||||
Represents a method call, in all of the various forms that can take.
|
||||
|
||||
@ -1230,6 +1252,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location?
|
||||
- name: message_loc
|
||||
@ -1244,6 +1267,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of an assignment operator on a call.
|
||||
|
||||
@ -1254,6 +1278,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location?
|
||||
- name: message_loc
|
||||
@ -1266,6 +1291,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator on a call.
|
||||
|
||||
@ -1276,6 +1302,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location
|
||||
- name: name
|
||||
@ -1299,8 +1326,10 @@ nodes:
|
||||
fields:
|
||||
- name: value
|
||||
type: node
|
||||
kind: pattern expression
|
||||
- name: target
|
||||
type: node
|
||||
kind: LocalVariableTargetNode
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -1312,8 +1341,10 @@ nodes:
|
||||
fields:
|
||||
- name: predicate
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: conditions
|
||||
type: node[]
|
||||
kind: InNode
|
||||
- name: else_clause
|
||||
type: node?
|
||||
kind: ElseNode
|
||||
@ -1332,8 +1363,10 @@ nodes:
|
||||
fields:
|
||||
- name: predicate
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: conditions
|
||||
type: node[]
|
||||
kind: WhenNode
|
||||
- name: else_clause
|
||||
type: node?
|
||||
kind: ElseNode
|
||||
@ -1356,12 +1389,20 @@ nodes:
|
||||
type: location
|
||||
- name: constant_path
|
||||
type: node
|
||||
kind:
|
||||
- ConstantReadNode
|
||||
- ConstantPathNode
|
||||
- on error: CallNode # class 0.X end
|
||||
- name: inheritance_operator_loc
|
||||
type: location?
|
||||
- name: superclass
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: body
|
||||
type: node?
|
||||
kind:
|
||||
- StatementsNode
|
||||
- BeginNode
|
||||
- name: end_keyword_loc
|
||||
type: location
|
||||
- name: name
|
||||
@ -1381,6 +1422,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator for assignment to a class variable.
|
||||
|
||||
@ -1396,6 +1438,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: binary_operator
|
||||
type: constant
|
||||
comment: |
|
||||
@ -1413,6 +1456,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator for assignment to a class variable.
|
||||
|
||||
@ -1461,6 +1505,7 @@ nodes:
|
||||
^^^^^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the class variable. This can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -1491,6 +1536,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator for assignment to a constant.
|
||||
|
||||
@ -1506,6 +1552,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: binary_operator
|
||||
type: constant
|
||||
comment: |
|
||||
@ -1523,6 +1570,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator for assignment to a constant.
|
||||
|
||||
@ -1537,6 +1585,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator for assignment to a constant path.
|
||||
|
||||
@ -1546,6 +1595,7 @@ nodes:
|
||||
fields:
|
||||
- name: parent
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The left-hand node of the path, if present. It can be `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression). It will be `nil` when the constant lookup is at the root of the module tree.
|
||||
|
||||
@ -1594,6 +1644,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: binary_operator
|
||||
type: constant
|
||||
comment: |
|
||||
@ -1610,6 +1661,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator for assignment to a constant path.
|
||||
|
||||
@ -1619,6 +1671,7 @@ nodes:
|
||||
fields:
|
||||
- name: parent
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: name
|
||||
type: constant?
|
||||
- name: delimiter_loc
|
||||
@ -1652,6 +1705,7 @@ nodes:
|
||||
^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the constant path. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -1711,6 +1765,7 @@ nodes:
|
||||
^^^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the constant. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -1739,11 +1794,15 @@ nodes:
|
||||
type: location
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: parameters
|
||||
type: node?
|
||||
kind: ParametersNode
|
||||
- name: body
|
||||
type: node?
|
||||
kind:
|
||||
- StatementsNode
|
||||
- BeginNode
|
||||
- name: locals
|
||||
type: constant[]
|
||||
- name: def_keyword_loc
|
||||
@ -1770,6 +1829,7 @@ nodes:
|
||||
type: location?
|
||||
- name: value
|
||||
type: node
|
||||
kind: Node # More than non-void expression as defined?(return) is allowed, yet defined?(BEGIN{}) is SyntaxError
|
||||
- name: rparen_loc
|
||||
type: location?
|
||||
- name: keyword_loc
|
||||
@ -1813,6 +1873,12 @@ nodes:
|
||||
type: location
|
||||
- name: variable
|
||||
type: node
|
||||
kind:
|
||||
- InstanceVariableReadNode
|
||||
- ClassVariableReadNode
|
||||
- GlobalVariableReadNode
|
||||
- BackReferenceReadNode
|
||||
- NumberedReferenceReadNode
|
||||
comment: |
|
||||
Represents an interpolated variable.
|
||||
|
||||
@ -1846,12 +1912,20 @@ nodes:
|
||||
fields:
|
||||
- name: constant
|
||||
type: node?
|
||||
kind:
|
||||
- ConstantReadNode
|
||||
- ConstantPathNode
|
||||
- name: left
|
||||
type: node
|
||||
kind: SplatNode
|
||||
- name: requireds
|
||||
type: node[]
|
||||
kind: pattern expression
|
||||
- name: right
|
||||
type: node
|
||||
kind:
|
||||
- SplatNode
|
||||
- on error: MissingNode
|
||||
- name: opening_loc
|
||||
type: location?
|
||||
- name: closing_loc
|
||||
@ -1872,8 +1946,10 @@ nodes:
|
||||
fields:
|
||||
- name: left
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: right
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -1895,6 +1971,19 @@ nodes:
|
||||
fields:
|
||||
- name: index
|
||||
type: node
|
||||
kind:
|
||||
- LocalVariableTargetNode
|
||||
- InstanceVariableTargetNode
|
||||
- ClassVariableTargetNode
|
||||
- GlobalVariableTargetNode
|
||||
- ConstantTargetNode
|
||||
- ConstantPathTargetNode
|
||||
- CallTargetNode
|
||||
- IndexTargetNode
|
||||
- MultiTargetNode
|
||||
- on error: BackReferenceReadNode # for $& in a end
|
||||
- on error: NumberedReferenceReadNode # for $1 in a end
|
||||
- on error: MissingNode # for in 1..10; end
|
||||
comment: |
|
||||
The index expression for `for` loops.
|
||||
|
||||
@ -1902,6 +1991,7 @@ nodes:
|
||||
^
|
||||
- name: collection
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The collection to iterate over.
|
||||
|
||||
@ -1985,6 +2075,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator for assignment to a global variable.
|
||||
|
||||
@ -2000,6 +2091,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: binary_operator
|
||||
type: constant
|
||||
comment: |
|
||||
@ -2017,6 +2109,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator for assignment to a global variable.
|
||||
|
||||
@ -2065,6 +2158,7 @@ nodes:
|
||||
^^^^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the global variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -2123,6 +2217,9 @@ nodes:
|
||||
fields:
|
||||
- name: constant
|
||||
type: node?
|
||||
kind:
|
||||
- ConstantReadNode
|
||||
- ConstantPathNode
|
||||
- name: elements
|
||||
type: node[]
|
||||
kind: AssocNode
|
||||
@ -2156,6 +2253,7 @@ nodes:
|
||||
The `if_keyword_loc` field will be `nil` when the `IfNode` represents a ternary expression.
|
||||
- name: predicate
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The node for the condition the `IfNode` is testing.
|
||||
|
||||
@ -2248,6 +2346,11 @@ nodes:
|
||||
fields:
|
||||
- name: value
|
||||
type: node
|
||||
kind:
|
||||
- LocalVariableReadNode
|
||||
- CallNode
|
||||
- ConstantReadNode
|
||||
- LocalVariableTargetNode
|
||||
comment: |
|
||||
Represents a node that is implicitly being added to the tree but doesn't correspond directly to a node in the source.
|
||||
|
||||
@ -2278,6 +2381,7 @@ nodes:
|
||||
fields:
|
||||
- name: pattern
|
||||
type: node
|
||||
kind: pattern expression
|
||||
- name: statements
|
||||
type: node?
|
||||
kind: StatementsNode
|
||||
@ -2295,6 +2399,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location?
|
||||
- name: opening_loc
|
||||
@ -2306,10 +2411,12 @@ nodes:
|
||||
type: location
|
||||
- name: block
|
||||
type: node?
|
||||
kind: BlockArgumentNode # foo[&b] &&= value, only valid on Ruby < 3.4
|
||||
- name: operator_loc
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator on a call to the `[]` method.
|
||||
|
||||
@ -2320,6 +2427,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location?
|
||||
- name: opening_loc
|
||||
@ -2331,12 +2439,14 @@ nodes:
|
||||
type: location
|
||||
- name: block
|
||||
type: node?
|
||||
kind: BlockArgumentNode # foo[&b] += value, only valid on Ruby < 3.4
|
||||
- name: binary_operator
|
||||
type: constant
|
||||
- name: binary_operator_loc
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of an assignment operator on a call to `[]`.
|
||||
|
||||
@ -2347,6 +2457,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
- name: call_operator_loc
|
||||
type: location?
|
||||
- name: opening_loc
|
||||
@ -2358,10 +2469,12 @@ nodes:
|
||||
type: location
|
||||
- name: block
|
||||
type: node?
|
||||
kind: BlockArgumentNode # foo[&b] ||= value, only valid on Ruby < 3.4
|
||||
- name: operator_loc
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator on a call to `[]`.
|
||||
|
||||
@ -2372,6 +2485,7 @@ nodes:
|
||||
fields:
|
||||
- name: receiver
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: opening_loc
|
||||
type: location
|
||||
- name: arguments
|
||||
@ -2381,6 +2495,7 @@ nodes:
|
||||
type: location
|
||||
- name: block
|
||||
type: node?
|
||||
kind: BlockArgumentNode # foo[&b], = 1, only valid on Ruby < 3.4
|
||||
comment: |
|
||||
Represents assigning to an index.
|
||||
|
||||
@ -2404,6 +2519,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `&&=` operator for assignment to an instance variable.
|
||||
|
||||
@ -2419,6 +2535,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: binary_operator
|
||||
type: constant
|
||||
comment: |
|
||||
@ -2436,6 +2553,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the `||=` operator for assignment to an instance variable.
|
||||
|
||||
@ -2484,6 +2602,7 @@ nodes:
|
||||
^^^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the instance variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -2661,8 +2780,15 @@ nodes:
|
||||
type: location
|
||||
- name: parameters
|
||||
type: node?
|
||||
kind:
|
||||
- BlockParametersNode
|
||||
- NumberedParametersNode
|
||||
- ItParametersNode
|
||||
- name: body
|
||||
type: node?
|
||||
kind:
|
||||
- StatementsNode
|
||||
- BeginNode
|
||||
comment: |
|
||||
Represents using a lambda literal (not the lambda method call).
|
||||
|
||||
@ -2676,6 +2802,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: name
|
||||
type: constant
|
||||
- name: depth
|
||||
@ -2693,6 +2820,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: name
|
||||
type: constant
|
||||
- name: binary_operator
|
||||
@ -2712,6 +2840,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: name
|
||||
type: constant
|
||||
- name: depth
|
||||
@ -2791,6 +2920,7 @@ nodes:
|
||||
^^^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the local variable. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -2835,8 +2965,10 @@ nodes:
|
||||
fields:
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: pattern
|
||||
type: node
|
||||
kind: pattern expression
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -2848,8 +2980,10 @@ nodes:
|
||||
fields:
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: pattern
|
||||
type: node
|
||||
kind: pattern expression
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -2881,8 +3015,15 @@ nodes:
|
||||
type: location
|
||||
- name: constant_path
|
||||
type: node
|
||||
kind:
|
||||
- ConstantReadNode
|
||||
- ConstantPathNode
|
||||
- on error: MissingNode # module Parent module end
|
||||
- name: body
|
||||
type: node?
|
||||
kind:
|
||||
- StatementsNode
|
||||
- BeginNode
|
||||
- name: end_keyword_loc
|
||||
type: location
|
||||
- name: name
|
||||
@ -2906,9 +3047,9 @@ nodes:
|
||||
- CallTargetNode
|
||||
- IndexTargetNode
|
||||
- MultiTargetNode
|
||||
- RequiredParameterNode
|
||||
- BackReferenceReadNode # On parsing error of `$',`
|
||||
- NumberedReferenceReadNode # On parsing error of `$1,`
|
||||
- RequiredParameterNode # def m((a,b)); end
|
||||
- on error: BackReferenceReadNode # a, (b, $&) = z
|
||||
- on error: NumberedReferenceReadNode # a, (b, $1) = z
|
||||
comment: |
|
||||
Represents the targets expressions before a splat node.
|
||||
|
||||
@ -2951,8 +3092,9 @@ nodes:
|
||||
- CallTargetNode
|
||||
- IndexTargetNode
|
||||
- MultiTargetNode
|
||||
- RequiredParameterNode
|
||||
- BackReferenceReadNode # On parsing error of `*,$'`
|
||||
- RequiredParameterNode # def m((*,b)); end
|
||||
- on error: BackReferenceReadNode # a, (*, $&) = z
|
||||
- on error: NumberedReferenceReadNode # a, (*, $1) = z
|
||||
comment: |
|
||||
Represents the targets expressions after a splat node.
|
||||
|
||||
@ -2996,6 +3138,8 @@ nodes:
|
||||
- CallTargetNode
|
||||
- IndexTargetNode
|
||||
- MultiTargetNode
|
||||
- on error: BackReferenceReadNode # $&, = z
|
||||
- on error: NumberedReferenceReadNode # $1, = z
|
||||
comment: |
|
||||
Represents the targets expressions before a splat node.
|
||||
|
||||
@ -3038,6 +3182,8 @@ nodes:
|
||||
- CallTargetNode
|
||||
- IndexTargetNode
|
||||
- MultiTargetNode
|
||||
- on error: BackReferenceReadNode # *, $& = z
|
||||
- on error: NumberedReferenceReadNode # *, $1 = z
|
||||
comment: |
|
||||
Represents the targets expressions after a splat node.
|
||||
|
||||
@ -3066,6 +3212,7 @@ nodes:
|
||||
^
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The value to write to the targets. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -3141,6 +3288,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents an optional keyword parameter to a method, block, or lambda definition.
|
||||
|
||||
@ -3158,6 +3306,7 @@ nodes:
|
||||
type: location
|
||||
- name: value
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents an optional parameter to a method, block, or lambda definition.
|
||||
|
||||
@ -3168,6 +3317,7 @@ nodes:
|
||||
fields:
|
||||
- name: left
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the left side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -3178,8 +3328,9 @@ nodes:
|
||||
^
|
||||
- name: right
|
||||
type: node
|
||||
kind: Node
|
||||
comment: |
|
||||
Represents the right side of the expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
Represents the right side of the expression.
|
||||
|
||||
left || right
|
||||
^^^^^
|
||||
@ -3219,10 +3370,10 @@ nodes:
|
||||
- RequiredParameterNode
|
||||
- MultiTargetNode
|
||||
# On parsing error of `f(**kwargs, ...)` or `f(**nil, ...)`, the keyword_rest value is moved here:
|
||||
- KeywordRestParameterNode
|
||||
- NoKeywordsParameterNode
|
||||
- on error: KeywordRestParameterNode
|
||||
- on error: NoKeywordsParameterNode
|
||||
# On parsing error of `f(..., ...)`, the first forwarding parameter is moved here:
|
||||
- ForwardingParameterNode
|
||||
- on error: ForwardingParameterNode
|
||||
- name: keywords
|
||||
type: node[]
|
||||
kind:
|
||||
@ -3247,6 +3398,7 @@ nodes:
|
||||
fields:
|
||||
- name: body
|
||||
type: node?
|
||||
kind: non-void expression # Usually a StatementsNode but not always e.g. `1 in (..10)`
|
||||
- name: opening_loc
|
||||
type: location
|
||||
- name: closing_loc
|
||||
@ -3261,6 +3413,7 @@ nodes:
|
||||
fields:
|
||||
- name: expression
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: operator_loc
|
||||
type: location
|
||||
- name: lparen_loc
|
||||
@ -3276,6 +3429,15 @@ nodes:
|
||||
fields:
|
||||
- name: variable
|
||||
type: node
|
||||
kind:
|
||||
- LocalVariableReadNode
|
||||
- InstanceVariableReadNode
|
||||
- ClassVariableReadNode
|
||||
- GlobalVariableReadNode # foo in ^$a
|
||||
- BackReferenceReadNode # foo in ^$&
|
||||
- NumberedReferenceReadNode # foo in ^$1
|
||||
- ItLocalVariableReadNode # proc { 1 in ^it }
|
||||
- on error: MissingNode # foo in ^Bar
|
||||
- name: operator_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -3328,6 +3490,7 @@ nodes:
|
||||
fields:
|
||||
- name: left
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The left-hand side of the range, if present. It can be either `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -3338,6 +3501,7 @@ nodes:
|
||||
^^^^^
|
||||
- name: right
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The right-hand side of the range, if present. It can be either `nil` or any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -3429,10 +3593,12 @@ nodes:
|
||||
fields:
|
||||
- name: expression
|
||||
type: node
|
||||
kind: Node
|
||||
- name: keyword_loc
|
||||
type: location
|
||||
- name: rescue_expression
|
||||
type: node
|
||||
kind: Node
|
||||
newline: expression
|
||||
comment: |
|
||||
Represents an expression modified with a rescue.
|
||||
@ -3445,10 +3611,23 @@ nodes:
|
||||
type: location
|
||||
- name: exceptions
|
||||
type: node[]
|
||||
kind: non-void expression
|
||||
- name: operator_loc
|
||||
type: location?
|
||||
- name: reference
|
||||
type: node?
|
||||
kind:
|
||||
- LocalVariableTargetNode
|
||||
- InstanceVariableTargetNode
|
||||
- ClassVariableTargetNode
|
||||
- GlobalVariableTargetNode
|
||||
- ConstantTargetNode
|
||||
- ConstantPathTargetNode
|
||||
- CallTargetNode
|
||||
- IndexTargetNode
|
||||
- on error: BackReferenceReadNode # => begin; rescue => $&; end
|
||||
- on error: NumberedReferenceReadNode # => begin; rescue => $1; end
|
||||
- on error: MissingNode # begin; rescue =>; end
|
||||
- name: statements
|
||||
type: node?
|
||||
kind: StatementsNode
|
||||
@ -3535,8 +3714,12 @@ nodes:
|
||||
type: location
|
||||
- name: expression
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: body
|
||||
type: node?
|
||||
kind:
|
||||
- StatementsNode
|
||||
- BeginNode
|
||||
- name: end_keyword_loc
|
||||
type: location
|
||||
comment: |
|
||||
@ -3573,6 +3756,7 @@ nodes:
|
||||
type: location
|
||||
- name: expression
|
||||
type: node?
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
Represents the use of the splat operator.
|
||||
|
||||
@ -3582,6 +3766,7 @@ nodes:
|
||||
fields:
|
||||
- name: body
|
||||
type: node[]
|
||||
kind: Node
|
||||
comment: |
|
||||
Represents a set of statements contained within some scope.
|
||||
|
||||
@ -3622,6 +3807,9 @@ nodes:
|
||||
type: location?
|
||||
- name: block
|
||||
type: node?
|
||||
kind:
|
||||
- BlockNode
|
||||
- BlockArgumentNode
|
||||
comment: |
|
||||
Represents the use of the `super` keyword with parentheses or arguments.
|
||||
|
||||
@ -3683,6 +3871,7 @@ nodes:
|
||||
^^^^^^
|
||||
- name: predicate
|
||||
type: node
|
||||
kind: non-void expression
|
||||
comment: |
|
||||
The condition to be evaluated for the unless expression. It can be any [non-void expression](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#non-void-expression).
|
||||
|
||||
@ -3740,6 +3929,7 @@ nodes:
|
||||
type: location?
|
||||
- name: predicate
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: statements
|
||||
type: node?
|
||||
kind: StatementsNode
|
||||
@ -3758,6 +3948,7 @@ nodes:
|
||||
type: location
|
||||
- name: conditions
|
||||
type: node[]
|
||||
kind: non-void expression
|
||||
- name: then_keyword_loc
|
||||
type: location?
|
||||
- name: statements
|
||||
@ -3779,6 +3970,7 @@ nodes:
|
||||
type: location?
|
||||
- name: predicate
|
||||
type: node
|
||||
kind: non-void expression
|
||||
- name: statements
|
||||
type: node?
|
||||
kind: StatementsNode
|
||||
|
@ -2990,6 +2990,7 @@ pm_index_and_write_node_create(pm_parser_t *parser, pm_call_node_t *target, cons
|
||||
|
||||
pm_index_arguments_check(parser, target->arguments, target->block);
|
||||
|
||||
assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE));
|
||||
*node = (pm_index_and_write_node_t) {
|
||||
{
|
||||
.type = PM_INDEX_AND_WRITE_NODE,
|
||||
@ -3005,7 +3006,7 @@ pm_index_and_write_node_create(pm_parser_t *parser, pm_call_node_t *target, cons
|
||||
.opening_loc = target->opening_loc,
|
||||
.arguments = target->arguments,
|
||||
.closing_loc = target->closing_loc,
|
||||
.block = target->block,
|
||||
.block = (pm_block_argument_node_t *) target->block,
|
||||
.operator_loc = PM_LOCATION_TOKEN_VALUE(operator),
|
||||
.value = value
|
||||
};
|
||||
@ -3065,6 +3066,7 @@ pm_index_operator_write_node_create(pm_parser_t *parser, pm_call_node_t *target,
|
||||
|
||||
pm_index_arguments_check(parser, target->arguments, target->block);
|
||||
|
||||
assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE));
|
||||
*node = (pm_index_operator_write_node_t) {
|
||||
{
|
||||
.type = PM_INDEX_OPERATOR_WRITE_NODE,
|
||||
@ -3080,7 +3082,7 @@ pm_index_operator_write_node_create(pm_parser_t *parser, pm_call_node_t *target,
|
||||
.opening_loc = target->opening_loc,
|
||||
.arguments = target->arguments,
|
||||
.closing_loc = target->closing_loc,
|
||||
.block = target->block,
|
||||
.block = (pm_block_argument_node_t *) target->block,
|
||||
.binary_operator = pm_parser_constant_id_location(parser, operator->start, operator->end - 1),
|
||||
.binary_operator_loc = PM_LOCATION_TOKEN_VALUE(operator),
|
||||
.value = value
|
||||
@ -3142,6 +3144,7 @@ pm_index_or_write_node_create(pm_parser_t *parser, pm_call_node_t *target, const
|
||||
|
||||
pm_index_arguments_check(parser, target->arguments, target->block);
|
||||
|
||||
assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE));
|
||||
*node = (pm_index_or_write_node_t) {
|
||||
{
|
||||
.type = PM_INDEX_OR_WRITE_NODE,
|
||||
@ -3157,7 +3160,7 @@ pm_index_or_write_node_create(pm_parser_t *parser, pm_call_node_t *target, const
|
||||
.opening_loc = target->opening_loc,
|
||||
.arguments = target->arguments,
|
||||
.closing_loc = target->closing_loc,
|
||||
.block = target->block,
|
||||
.block = (pm_block_argument_node_t *) target->block,
|
||||
.operator_loc = PM_LOCATION_TOKEN_VALUE(operator),
|
||||
.value = value
|
||||
};
|
||||
@ -3210,6 +3213,7 @@ pm_index_target_node_create(pm_parser_t *parser, pm_call_node_t *target) {
|
||||
|
||||
pm_index_arguments_check(parser, target->arguments, target->block);
|
||||
|
||||
assert(!target->block || PM_NODE_TYPE_P(target->block, PM_BLOCK_ARGUMENT_NODE));
|
||||
*node = (pm_index_target_node_t) {
|
||||
{
|
||||
.type = PM_INDEX_TARGET_NODE,
|
||||
@ -3221,7 +3225,7 @@ pm_index_target_node_create(pm_parser_t *parser, pm_call_node_t *target) {
|
||||
.opening_loc = target->opening_loc,
|
||||
.arguments = target->arguments,
|
||||
.closing_loc = target->closing_loc,
|
||||
.block = target->block
|
||||
.block = (pm_block_argument_node_t *) target->block,
|
||||
};
|
||||
|
||||
// Here we're going to free the target, since it is no longer necessary.
|
||||
@ -3236,7 +3240,7 @@ pm_index_target_node_create(pm_parser_t *parser, pm_call_node_t *target) {
|
||||
* Allocate and initialize a new CapturePatternNode node.
|
||||
*/
|
||||
static pm_capture_pattern_node_t *
|
||||
pm_capture_pattern_node_create(pm_parser_t *parser, pm_node_t *value, pm_node_t *target, const pm_token_t *operator) {
|
||||
pm_capture_pattern_node_create(pm_parser_t *parser, pm_node_t *value, pm_local_variable_target_node_t *target, const pm_token_t *operator) {
|
||||
pm_capture_pattern_node_t *node = PM_NODE_ALLOC(parser, pm_capture_pattern_node_t);
|
||||
|
||||
*node = (pm_capture_pattern_node_t) {
|
||||
@ -3245,7 +3249,7 @@ pm_capture_pattern_node_create(pm_parser_t *parser, pm_node_t *value, pm_node_t
|
||||
.node_id = PM_NODE_IDENTIFY(parser),
|
||||
.location = {
|
||||
.start = value->location.start,
|
||||
.end = target->location.end
|
||||
.end = target->base.location.end
|
||||
},
|
||||
},
|
||||
.value = value,
|
||||
@ -4037,14 +4041,25 @@ pm_find_pattern_node_create(pm_parser_t *parser, pm_node_list_t *nodes) {
|
||||
pm_find_pattern_node_t *node = PM_NODE_ALLOC(parser, pm_find_pattern_node_t);
|
||||
|
||||
pm_node_t *left = nodes->nodes[0];
|
||||
assert(PM_NODE_TYPE_P(left, PM_SPLAT_NODE));
|
||||
pm_splat_node_t *left_splat_node = (pm_splat_node_t *) left;
|
||||
|
||||
pm_node_t *right;
|
||||
|
||||
if (nodes->size == 1) {
|
||||
right = (pm_node_t *) pm_missing_node_create(parser, left->location.end, left->location.end);
|
||||
} else {
|
||||
right = nodes->nodes[nodes->size - 1];
|
||||
assert(PM_NODE_TYPE_P(right, PM_SPLAT_NODE));
|
||||
}
|
||||
|
||||
#if PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS
|
||||
// FindPatternNode#right is typed as SplatNode in this case, so replace the potential MissingNode with a SplatNode.
|
||||
// The resulting AST will anyway be ignored, but this file still needs to compile.
|
||||
pm_splat_node_t *right_splat_node = PM_NODE_TYPE_P(right, PM_SPLAT_NODE) ? (pm_splat_node_t *) right : left_splat_node;
|
||||
#else
|
||||
pm_node_t *right_splat_node = right;
|
||||
#endif
|
||||
*node = (pm_find_pattern_node_t) {
|
||||
{
|
||||
.type = PM_FIND_PATTERN_NODE,
|
||||
@ -4055,8 +4070,8 @@ pm_find_pattern_node_create(pm_parser_t *parser, pm_node_list_t *nodes) {
|
||||
},
|
||||
},
|
||||
.constant = NULL,
|
||||
.left = left,
|
||||
.right = right,
|
||||
.left = left_splat_node,
|
||||
.right = right_splat_node,
|
||||
.requireds = { 0 },
|
||||
.opening_loc = PM_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE,
|
||||
.closing_loc = PM_OPTIONAL_LOCATION_NOT_PROVIDED_VALUE
|
||||
@ -17429,7 +17444,7 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p
|
||||
}
|
||||
|
||||
parse_pattern_capture(parser, captures, constant_id, &PM_LOCATION_TOKEN_VALUE(&parser->previous));
|
||||
pm_node_t *target = (pm_node_t *) pm_local_variable_target_node_create(
|
||||
pm_local_variable_target_node_t *target = pm_local_variable_target_node_create(
|
||||
parser,
|
||||
&PM_LOCATION_TOKEN_VALUE(&parser->previous),
|
||||
constant_id,
|
||||
|
@ -218,6 +218,6 @@ typedef enum pm_<%= flag.human %> {
|
||||
* to specify that through the environment. It will never be true except for in
|
||||
* those build systems.
|
||||
*/
|
||||
#define PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS <%= Prism::Template::SERIALIZE_ONLY_SEMANTICS_FIELDS %>
|
||||
#define PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS <%= Prism::Template::SERIALIZE_ONLY_SEMANTICS_FIELDS ? 1 : 0 %>
|
||||
|
||||
#endif
|
||||
|
@ -70,10 +70,10 @@ module Prism
|
||||
def <%= node.human %>(<%= ["source: default_source", "node_id: 0", "location: default_location", "flags: 0", *node.fields.map { |field|
|
||||
case field
|
||||
when Prism::Template::NodeField
|
||||
if !field.kind?
|
||||
kind = field.specific_kind || field.union_kind&.first
|
||||
if kind.nil?
|
||||
"#{field.name}: default_node(source, location)"
|
||||
else
|
||||
kind = field.specific_kind || field.union_kind.first
|
||||
"#{field.name}: #{kind.gsub(/(?<=.)[A-Z]/, "_\\0").downcase}(source: source)"
|
||||
end
|
||||
when Prism::Template::ConstantField
|
||||
|
@ -225,7 +225,7 @@ module Prism
|
||||
@flags = flags
|
||||
<%- node.fields.each do |field| -%>
|
||||
<%- if Prism::Template::CHECK_FIELD_KIND && field.respond_to?(:check_field_kind) -%>
|
||||
raise <%= field.name %>.inspect unless <%= field.check_field_kind %>
|
||||
raise "<%= node.name %>#<%= field.name %> was of unexpected type:\n#{<%= field.name %>.inspect}" unless <%= field.check_field_kind %>
|
||||
<%- end -%>
|
||||
@<%= field.name %> = <%= field.name %>
|
||||
<%- end -%>
|
||||
|
@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env ruby
|
||||
# typed: false
|
||||
# typed: ignore
|
||||
|
||||
require "erb"
|
||||
require "fileutils"
|
||||
@ -8,6 +8,7 @@ require "yaml"
|
||||
module Prism
|
||||
module Template
|
||||
SERIALIZE_ONLY_SEMANTICS_FIELDS = ENV.fetch("PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS", false)
|
||||
REMOVE_ON_ERROR_TYPES = SERIALIZE_ONLY_SEMANTICS_FIELDS
|
||||
CHECK_FIELD_KIND = ENV.fetch("CHECK_FIELD_KIND", false)
|
||||
|
||||
JAVA_BACKEND = ENV["PRISM_JAVA_BACKEND"] || "truffleruby"
|
||||
@ -95,8 +96,9 @@ module Prism
|
||||
# Some node fields can be specialized if they point to a specific kind of
|
||||
# node and not just a generic node.
|
||||
class NodeKindField < Field
|
||||
def kind?
|
||||
options.key?(:kind)
|
||||
def initialize(kind:, **options)
|
||||
@kind = kind
|
||||
super(**options)
|
||||
end
|
||||
|
||||
def c_type
|
||||
@ -117,18 +119,18 @@ module Prism
|
||||
|
||||
def java_cast
|
||||
if specific_kind
|
||||
"(Nodes.#{options[:kind]}) "
|
||||
"(Nodes.#{@kind}) "
|
||||
else
|
||||
""
|
||||
end
|
||||
end
|
||||
|
||||
def specific_kind
|
||||
options[:kind] unless options[:kind].is_a?(Array)
|
||||
@kind unless @kind.is_a?(Array)
|
||||
end
|
||||
|
||||
def union_kind
|
||||
options[:kind] if options[:kind].is_a?(Array)
|
||||
@kind if @kind.is_a?(Array)
|
||||
end
|
||||
end
|
||||
|
||||
@ -419,6 +421,34 @@ module Prism
|
||||
# changed to use fetch instead of delete.
|
||||
comment = options.delete(:comment)
|
||||
|
||||
if kinds = options[:kind]
|
||||
kinds = [kinds] unless kinds.is_a?(Array)
|
||||
kinds = kinds.map do |kind|
|
||||
case kind
|
||||
when "non-void expression"
|
||||
# the actual list of types would be way too long
|
||||
"Node"
|
||||
when "pattern expression"
|
||||
# the list of all possible types is too long with 37+ different classes
|
||||
"Node"
|
||||
when Hash
|
||||
kind = kind.fetch("on error")
|
||||
REMOVE_ON_ERROR_TYPES ? nil : kind
|
||||
else
|
||||
kind
|
||||
end
|
||||
end.compact
|
||||
if kinds.size == 1
|
||||
kinds = kinds.first
|
||||
kinds = nil if kinds == "Node"
|
||||
end
|
||||
options[:kind] = kinds
|
||||
else
|
||||
if type < NodeKindField
|
||||
raise "Missing kind in config.yml for field #{@name}##{options.fetch(:name)}"
|
||||
end
|
||||
end
|
||||
|
||||
type.new(comment: comment, **options)
|
||||
end
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user