Class: SyntaxTree::Heredoc

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

Overview

Heredoc represents a heredoc string literal.

<<~DOC
  contents
DOC

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.



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

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



5754
5755
5756
# File 'lib/syntax_tree/node.rb', line 5754

def beginning
  @beginning
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



5767
5768
5769
# File 'lib/syntax_tree/node.rb', line 5767

def comments
  @comments
end

#dedentObject (readonly)

Integer

how far to dedent the heredoc



5760
5761
5762
# File 'lib/syntax_tree/node.rb', line 5760

def dedent
  @dedent
end

#endingObject (readonly)

HeredocEnd

the ending of the heredoc



5757
5758
5759
# File 'lib/syntax_tree/node.rb', line 5757

def ending
  @ending
end

#partsObject (readonly)

Array[ StringEmbExpr | StringDVar | TStringContent ]

the parts of the

heredoc string literal



5764
5765
5766
# File 'lib/syntax_tree/node.rb', line 5764

def parts
  @parts
end

Instance Method Details

#===(other) ⇒ Object



5851
5852
5853
5854
# File 'lib/syntax_tree/node.rb', line 5851

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

#accept(visitor) ⇒ Object



5778
5779
5780
# File 'lib/syntax_tree/node.rb', line 5778

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

#child_nodesObject Also known as: deconstruct



5782
5783
5784
# File 'lib/syntax_tree/node.rb', line 5782

def child_nodes
  [beginning, *parts, ending]
end

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



5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
# File 'lib/syntax_tree/node.rb', line 5786

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



5801
5802
5803
5804
5805
5806
5807
5808
5809
# File 'lib/syntax_tree/node.rb', line 5801

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

#format(q) ⇒ Object



5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
# File 'lib/syntax_tree/node.rb', line 5816

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