Class: SyntaxTree::Params

Inherits:
Node
  • Object
show all
Defined in:
lib/syntax_tree/node.rb

Overview

Params represents defining parameters on a method or lambda.

def method(param) end

Defined Under Namespace

Classes: KeywordFormatter, KeywordRestFormatter, OptionalFormatter

Instance Attribute Summary collapse

Attributes inherited from Node

#location

Instance Method Summary collapse

Methods inherited from Node

#pretty_print, #to_json

Constructor Details

#initialize(requireds: [], optionals: [], rest: nil, posts: [], keywords: [], keyword_rest: nil, block: nil, location:, comments: []) ⇒ Params

Returns a new instance of Params.



6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
# File 'lib/syntax_tree/node.rb', line 6607

def initialize(
  requireds: [],
  optionals: [],
  rest: nil,
  posts: [],
  keywords: [],
  keyword_rest: nil,
  block: nil,
  location:,
  comments: []
)
  @requireds = requireds
  @optionals = optionals
  @rest = rest
  @posts = posts
  @keywords = keywords
  @keyword_rest = keyword_rest
  @block = block
  @location = location
  @comments = comments
end

Instance Attribute Details

#blockObject (readonly)

nil | BlockArg

the optional block parameter



6602
6603
6604
# File 'lib/syntax_tree/node.rb', line 6602

def block
  @block
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



6605
6606
6607
# File 'lib/syntax_tree/node.rb', line 6605

def comments
  @comments
end

#keyword_restObject (readonly)

nil | :nil | KwRestParam

the optional keyword rest parameter



6599
6600
6601
# File 'lib/syntax_tree/node.rb', line 6599

def keyword_rest
  @keyword_rest
end

#keywordsObject (readonly)

Array[ [ Ident, nil | untyped

]] any keyword parameters and their

optional default values



6596
6597
6598
# File 'lib/syntax_tree/node.rb', line 6596

def keywords
  @keywords
end

#optionalsObject (readonly)

Array[ [ Ident, untyped

]] any optional parameters and their default

values



6584
6585
6586
# File 'lib/syntax_tree/node.rb', line 6584

def optionals
  @optionals
end

#postsObject (readonly)

Array[ Ident ]

any positional parameters that exist after a rest

parameter



6592
6593
6594
# File 'lib/syntax_tree/node.rb', line 6592

def posts
  @posts
end

#requiredsObject (readonly)

Array[ Ident ]

any required parameters



6580
6581
6582
# File 'lib/syntax_tree/node.rb', line 6580

def requireds
  @requireds
end

#restObject (readonly)

nil | ArgsForward | ExcessedComma | RestParam

the optional rest

parameter



6588
6589
6590
# File 'lib/syntax_tree/node.rb', line 6588

def rest
  @rest
end

Instance Method Details

#accept(visitor) ⇒ Object



6638
6639
6640
# File 'lib/syntax_tree/node.rb', line 6638

def accept(visitor)
  visitor.visit_params(self)
end

#child_nodesObject Also known as: deconstruct



6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
# File 'lib/syntax_tree/node.rb', line 6642

def child_nodes
  [
    *requireds,
    *optionals.flatten(1),
    rest,
    *posts,
    *keywords.flatten(1),
    (keyword_rest if keyword_rest != :nil),
    block
  ]
end

#deconstruct_keys(keys) ⇒ Object



6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
# File 'lib/syntax_tree/node.rb', line 6656

def deconstruct_keys(keys)
  {
    location: location,
    requireds: requireds,
    optionals: optionals,
    rest: rest,
    posts: posts,
    keywords: keywords,
    keyword_rest: keyword_rest,
    block: block,
    comments: comments
  }
end

#empty?Boolean

Params nodes are the most complicated in the tree. Occasionally you want to know if they are “empty”, which means not having any parameters declared. This logic accesses every kind of parameter and determines if it’s missing.

Returns:

  • (Boolean)


6633
6634
6635
6636
# File 'lib/syntax_tree/node.rb', line 6633

def empty?
  requireds.empty? && optionals.empty? && !rest && posts.empty? &&
    keywords.empty? && !keyword_rest && !block
end

#format(q) ⇒ Object



6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
# File 'lib/syntax_tree/node.rb', line 6670

def format(q)
  parts = [
    *requireds,
    *optionals.map { |(name, value)| OptionalFormatter.new(name, value) }
  ]

  parts << rest if rest && !rest.is_a?(ExcessedComma)
  parts +=
    [
      *posts,
      *keywords.map { |(name, value)| KeywordFormatter.new(name, value) }
    ]

  parts << KeywordRestFormatter.new(keyword_rest) if keyword_rest
  parts << block if block

  contents = -> do
    q.seplist(parts) { |part| q.format(part) }
    q.format(rest) if rest && rest.is_a?(ExcessedComma)
  end

  if ![Def, Defs, DefEndless].include?(q.parent.class) || parts.empty?
    q.nest(0, &contents)
  else
    q.group(0, "(", ")") do
      q.indent do
        q.breakable("")
        contents.call
      end
      q.breakable("")
    end
  end
end