Class: Prism::ParametersNode
- Inherits:
-
PrismNode
- Object
- PrismNode
- Prism::ParametersNode
- Defined in:
- lib/prism/node.rb,
lib/prism/node_ext.rb,
ext/prism/api_node.c
Overview
Represents the list of parameters on a method, block, or lambda definition.
def a(b, c, d)
^^^^^^^
end
Instance Attribute Summary collapse
-
#block ⇒ Object
readonly
attr_reader block: BlockParameterNode?.
-
#keyword_rest ⇒ Object
readonly
attr_reader keyword_rest: KeywordRestParameterNode | ForwardingParameterNode | NoKeywordsParameterNode | nil.
-
#keywords ⇒ Object
readonly
attr_reader keywords: Array[RequiredKeywordParameterNode | OptionalKeywordParameterNode].
-
#optionals ⇒ Object
readonly
attr_reader optionals: Array.
-
#posts ⇒ Object
readonly
attr_reader posts: Array[RequiredParameterNode | MultiTargetNode | KeywordRestParameterNode | NoKeywordsParameterNode | ForwardingParameterNode].
-
#requireds ⇒ Object
readonly
attr_reader requireds: Array[RequiredParameterNode | MultiTargetNode].
-
#rest ⇒ Object
readonly
attr_reader rest: RestParameterNode | ImplicitRestNode | nil.
Class Method Summary collapse
-
.type ⇒ Object
Return a symbol representation of this node type.
Instance Method Summary collapse
-
#===(other) ⇒ Object
Implements case-equality for the node.
-
#accept(visitor) ⇒ Object
def accept: (Visitor visitor) -> void.
-
#child_nodes ⇒ Object
(also: #deconstruct)
def child_nodes: () -> Array[nil | Node].
-
#comment_targets ⇒ Object
def comment_targets: () -> Array[Node | Location].
-
#compact_child_nodes ⇒ Object
def compact_child_nodes: () -> Array.
-
#copy(node_id: self.node_id, location: self.location, flags: self.flags, requireds: self.requireds, optionals: self.optionals, rest: self.rest, posts: self.posts, keywords: self.keywords, keyword_rest: self.keyword_rest, block: self.block) ⇒ Object
def copy: (?node_id: Integer, ?location: Location, ?flags: Integer, ?requireds: Array[RequiredParameterNode | MultiTargetNode], ?optionals: Array, ?rest: RestParameterNode | ImplicitRestNode | nil, ?posts: Array[RequiredParameterNode | MultiTargetNode | KeywordRestParameterNode | NoKeywordsParameterNode | ForwardingParameterNode], ?keywords: Array[RequiredKeywordParameterNode | OptionalKeywordParameterNode], ?keyword_rest: KeywordRestParameterNode | ForwardingParameterNode | NoKeywordsParameterNode | nil, ?block: BlockParameterNode?) -> ParametersNode.
-
#deconstruct_keys(keys) ⇒ Object
def deconstruct_keys: (Array keys) -> { node_id: Integer, location: Location, requireds: Array[RequiredParameterNode | MultiTargetNode], optionals: Array, rest: RestParameterNode | ImplicitRestNode | nil, posts: Array[RequiredParameterNode | MultiTargetNode | KeywordRestParameterNode | NoKeywordsParameterNode | ForwardingParameterNode], keywords: Array[RequiredKeywordParameterNode | OptionalKeywordParameterNode], keyword_rest: KeywordRestParameterNode | ForwardingParameterNode | NoKeywordsParameterNode | nil, block: BlockParameterNode? }.
-
#initialize(source, node_id, location, flags, requireds, optionals, rest, posts, keywords, keyword_rest, block) ⇒ ParametersNode
constructor
Initialize a new ParametersNode node.
-
#inspect ⇒ Object
def inspect -> String.
-
#signature ⇒ Object
Mirrors the Method#parameters method.
-
#type ⇒ Object
Return a symbol representation of this node type.
Constructor Details
#initialize(source, node_id, location, flags, requireds, optionals, rest, posts, keywords, keyword_rest, block) ⇒ ParametersNode
Initialize a new ParametersNode node.
14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 |
# File 'lib/prism/node.rb', line 14149 def initialize(source, node_id, location, flags, requireds, optionals, rest, posts, keywords, keyword_rest, block) @source = source @node_id = node_id @location = location @flags = flags @requireds = requireds @optionals = optionals @rest = rest @posts = posts @keywords = keywords @keyword_rest = keyword_rest @block = block end |
Instance Attribute Details
#block ⇒ Object (readonly)
attr_reader block: BlockParameterNode?
14223 14224 14225 |
# File 'lib/prism/node.rb', line 14223 def block @block end |
#keyword_rest ⇒ Object (readonly)
attr_reader keyword_rest: KeywordRestParameterNode | ForwardingParameterNode | NoKeywordsParameterNode | nil
14220 14221 14222 |
# File 'lib/prism/node.rb', line 14220 def keyword_rest @keyword_rest end |
#keywords ⇒ Object (readonly)
attr_reader keywords: Array[RequiredKeywordParameterNode | OptionalKeywordParameterNode]
14217 14218 14219 |
# File 'lib/prism/node.rb', line 14217 def keywords @keywords end |
#optionals ⇒ Object (readonly)
attr_reader optionals: Array
14208 14209 14210 |
# File 'lib/prism/node.rb', line 14208 def optionals @optionals end |
#posts ⇒ Object (readonly)
attr_reader posts: Array[RequiredParameterNode | MultiTargetNode | KeywordRestParameterNode | NoKeywordsParameterNode | ForwardingParameterNode]
14214 14215 14216 |
# File 'lib/prism/node.rb', line 14214 def posts @posts end |
#requireds ⇒ Object (readonly)
attr_reader requireds: Array[RequiredParameterNode | MultiTargetNode]
14205 14206 14207 |
# File 'lib/prism/node.rb', line 14205 def requireds @requireds end |
#rest ⇒ Object (readonly)
attr_reader rest: RestParameterNode | ImplicitRestNode | nil
14211 14212 14213 |
# File 'lib/prism/node.rb', line 14211 def rest @rest end |
Class Method Details
.type ⇒ Object
Return a symbol representation of this node type. See ‘Node::type`.
14236 14237 14238 |
# File 'lib/prism/node.rb', line 14236 def self.type :parameters_node end |
Instance Method Details
#===(other) ⇒ Object
Implements case-equality for the node. This is effectively == but without comparing the value of locations. Locations are checked only for presence.
14242 14243 14244 14245 14246 14247 14248 14249 14250 14251 14252 14253 14254 14255 |
# File 'lib/prism/node.rb', line 14242 def ===(other) other.is_a?(ParametersNode) && (requireds.length == other.requireds.length) && requireds.zip(other.requireds).all? { |left, right| left === right } && (optionals.length == other.optionals.length) && optionals.zip(other.optionals).all? { |left, right| left === right } && (rest === other.rest) && (posts.length == other.posts.length) && posts.zip(other.posts).all? { |left, right| left === right } && (keywords.length == other.keywords.length) && keywords.zip(other.keywords).all? { |left, right| left === right } && (keyword_rest === other.keyword_rest) && (block === other.block) end |
#accept(visitor) ⇒ Object
def accept: (Visitor visitor) -> void
14164 14165 14166 |
# File 'lib/prism/node.rb', line 14164 def accept(visitor) visitor.visit_parameters_node(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
def child_nodes: () -> Array[nil | Node]
14169 14170 14171 |
# File 'lib/prism/node.rb', line 14169 def child_nodes [*requireds, *optionals, rest, *posts, *keywords, keyword_rest, block] end |
#comment_targets ⇒ Object
def comment_targets: () -> Array[Node | Location]
14187 14188 14189 |
# File 'lib/prism/node.rb', line 14187 def comment_targets [*requireds, *optionals, *rest, *posts, *keywords, *keyword_rest, *block] #: Array[Prism::node | Location] end |
#compact_child_nodes ⇒ Object
def compact_child_nodes: () -> Array
14174 14175 14176 14177 14178 14179 14180 14181 14182 14183 14184 |
# File 'lib/prism/node.rb', line 14174 def compact_child_nodes compact = [] #: Array[Prism::node] compact.concat(requireds) compact.concat(optionals) compact << rest if rest compact.concat(posts) compact.concat(keywords) compact << keyword_rest if keyword_rest compact << block if block compact end |
#copy(node_id: self.node_id, location: self.location, flags: self.flags, requireds: self.requireds, optionals: self.optionals, rest: self.rest, posts: self.posts, keywords: self.keywords, keyword_rest: self.keyword_rest, block: self.block) ⇒ Object
def copy: (?node_id: Integer, ?location: Location, ?flags: Integer, ?requireds: Array[RequiredParameterNode | MultiTargetNode], ?optionals: Array, ?rest: RestParameterNode | ImplicitRestNode | nil, ?posts: Array[RequiredParameterNode | MultiTargetNode | KeywordRestParameterNode | NoKeywordsParameterNode | ForwardingParameterNode], ?keywords: Array[RequiredKeywordParameterNode | OptionalKeywordParameterNode], ?keyword_rest: KeywordRestParameterNode | ForwardingParameterNode | NoKeywordsParameterNode | nil, ?block: BlockParameterNode?) -> ParametersNode
14192 14193 14194 |
# File 'lib/prism/node.rb', line 14192 def copy(node_id: self.node_id, location: self.location, flags: self.flags, requireds: self.requireds, optionals: self.optionals, rest: self.rest, posts: self.posts, keywords: self.keywords, keyword_rest: self.keyword_rest, block: self.block) ParametersNode.new(source, node_id, location, flags, requireds, optionals, rest, posts, keywords, keyword_rest, block) end |
#deconstruct_keys(keys) ⇒ Object
def deconstruct_keys: (Array keys) -> { node_id: Integer, location: Location, requireds: Array[RequiredParameterNode | MultiTargetNode], optionals: Array, rest: RestParameterNode | ImplicitRestNode | nil, posts: Array[RequiredParameterNode | MultiTargetNode | KeywordRestParameterNode | NoKeywordsParameterNode | ForwardingParameterNode], keywords: Array[RequiredKeywordParameterNode | OptionalKeywordParameterNode], keyword_rest: KeywordRestParameterNode | ForwardingParameterNode | NoKeywordsParameterNode | nil, block: BlockParameterNode? }
14200 14201 14202 |
# File 'lib/prism/node.rb', line 14200 def deconstruct_keys(keys) { node_id: node_id, location: location, requireds: requireds, optionals: optionals, rest: rest, posts: posts, keywords: keywords, keyword_rest: keyword_rest, block: block } end |
#inspect ⇒ Object
def inspect -> String
14226 14227 14228 |
# File 'lib/prism/node.rb', line 14226 def inspect InspectVisitor.compose(self) end |
#signature ⇒ Object
Mirrors the Method#parameters method.
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/prism/node_ext.rb', line 269 def signature names = [] #: Array[[Symbol, Symbol] | [Symbol]] requireds.each do |param| names << (param.is_a?(MultiTargetNode) ? [:req] : [:req, param.name]) end optionals.each { |param| names << [:opt, param.name] } if rest && rest.is_a?(RestParameterNode) names << [:rest, rest.name || :*] end posts.each do |param| case param when MultiTargetNode names << [:req] when NoKeywordsParameterNode, KeywordRestParameterNode, ForwardingParameterNode # Invalid syntax, e.g. "def f(**nil, ...)" moves the NoKeywordsParameterNode to posts raise "Invalid syntax" else names << [:req, param.name] end end # Regardless of the order in which the keywords were defined, the required # keywords always come first followed by the optional keywords. keyopt = [] #: Array[OptionalKeywordParameterNode] keywords.each do |param| if param.is_a?(OptionalKeywordParameterNode) keyopt << param else names << [:keyreq, param.name] end end keyopt.each { |param| names << [:key, param.name] } case keyword_rest when ForwardingParameterNode names.concat([[:rest, :*], [:keyrest, :**], [:block, :&]]) when KeywordRestParameterNode names << [:keyrest, keyword_rest.name || :**] when NoKeywordsParameterNode names << [:nokey] end names << [:block, block.name || :&] if block names end |
#type ⇒ Object
Return a symbol representation of this node type. See ‘Node#type`.
14231 14232 14233 |
# File 'lib/prism/node.rb', line 14231 def type :parameters_node end |