Class: SyntaxTree::Heredoc

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

Overview

Heredoc represents a heredoc string literal.

"contents\n"

Constant Summary collapse

SEPARATOR =

This is a very specific behavior where you want to force a newline, but don’t want to force the break parent.

PrettierPrint::Breakable.new(" ", 1, indent: false, force: true).freeze

Instance Attribute Summary collapse

Attributes inherited from Node

#location

Instance Method Summary collapse

Methods inherited from Node

#construct_keys, #end_char, #pretty_print, #start_char, #to_json, #to_mermaid

Constructor Details

#initialize(beginning:, ending: nil, dedent: 0, parts: [], location:) ⇒ Heredoc

Returns a new instance of Heredoc.



5738
5739
5740
5741
5742
5743
5744
5745
# File 'lib/syntax_tree/node.rb', line 5738

def initialize(beginning:, ending: nil, dedent: 0, parts: [], location:)
  @beginning = beginning
  @ending = ending
  @dedent = dedent
  @parts = parts
  @location = location
  @comments = []
end

Instance Attribute Details

#beginningObject (readonly)

HeredocBeg

the opening of the heredoc



5723
5724
5725
# File 'lib/syntax_tree/node.rb', line 5723

def beginning
  @beginning
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



5736
5737
5738
# File 'lib/syntax_tree/node.rb', line 5736

def comments
  @comments
end

#dedentObject (readonly)

Integer

how far to dedent the heredoc



5729
5730
5731
# File 'lib/syntax_tree/node.rb', line 5729

def dedent
  @dedent
end

#endingObject (readonly)

HeredocEnd

the ending of the heredoc



5726
5727
5728
# File 'lib/syntax_tree/node.rb', line 5726

def ending
  @ending
end

#partsObject (readonly)

Array[ StringEmbExpr | StringDVar | TStringContent ]

the parts of the

heredoc string literal



5733
5734
5735
# File 'lib/syntax_tree/node.rb', line 5733

def parts
  @parts
end

Instance Method Details

#===(other) ⇒ Object



5820
5821
5822
5823
# File 'lib/syntax_tree/node.rb', line 5820

def ===(other)
  other.is_a?(Heredoc) && beginning === other.beginning &&
    ending === other.ending && ArrayMatch.call(parts, other.parts)
end

#accept(visitor) ⇒ Object



5747
5748
5749
# File 'lib/syntax_tree/node.rb', line 5747

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

#child_nodesObject Also known as: deconstruct



5751
5752
5753
# File 'lib/syntax_tree/node.rb', line 5751

def child_nodes
  [beginning, *parts, ending]
end

#copy(beginning: nil, location: nil, ending: nil, parts: nil) ⇒ Object



5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
# File 'lib/syntax_tree/node.rb', line 5755

def copy(beginning: nil, location: nil, ending: nil, parts: nil)
  node =
    Heredoc.new(
      beginning: beginning || self.beginning,
      location: location || self.location,
      ending: ending || self.ending,
      parts: parts || self.parts
    )

  node.comments.concat(comments.map(&:copy))
  node
end

#deconstruct_keys(_keys) ⇒ Object



5770
5771
5772
5773
5774
5775
5776
5777
5778
# File 'lib/syntax_tree/node.rb', line 5770

def deconstruct_keys(_keys)
  {
    beginning: beginning,
    location: location,
    ending: ending,
    parts: parts,
    comments: comments
  }
end

#format(q) ⇒ Object



5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
# File 'lib/syntax_tree/node.rb', line 5785

def format(q)
  q.group do
    q.format(beginning)

    q.line_suffix(priority: Formatter::HEREDOC_PRIORITY) do
      q.group do
        q.target << SEPARATOR

        parts.each do |part|
          if part.is_a?(TStringContent)
            value = part.value
            first = true

            value.each_line(chomp: true) do |line|
              if first
                first = false
              else
                q.target << SEPARATOR
              end

              q.text(line)
            end

            q.target << SEPARATOR if value.end_with?("\n")
          else
            q.format(part)
          end
        end

        q.format(ending)
      end
    end
  end
end