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:, location:, ending: nil, dedent: 0, parts: []) ⇒ Heredoc

Returns a new instance of Heredoc.



5806
5807
5808
5809
5810
5811
5812
5813
# File 'lib/syntax_tree/node.rb', line 5806

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

Instance Attribute Details

#beginningObject (readonly)

HeredocBeg

the opening of the heredoc



5791
5792
5793
# File 'lib/syntax_tree/node.rb', line 5791

def beginning
  @beginning
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



5804
5805
5806
# File 'lib/syntax_tree/node.rb', line 5804

def comments
  @comments
end

#dedentObject (readonly)

Integer

how far to dedent the heredoc



5797
5798
5799
# File 'lib/syntax_tree/node.rb', line 5797

def dedent
  @dedent
end

#endingObject (readonly)

HeredocEnd

the ending of the heredoc



5794
5795
5796
# File 'lib/syntax_tree/node.rb', line 5794

def ending
  @ending
end

#partsObject (readonly)

Array[ StringEmbExpr | StringDVar | TStringContent ]

the parts of the

heredoc string literal



5801
5802
5803
# File 'lib/syntax_tree/node.rb', line 5801

def parts
  @parts
end

Instance Method Details

#===(other) ⇒ Object



5888
5889
5890
5891
# File 'lib/syntax_tree/node.rb', line 5888

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

#accept(visitor) ⇒ Object



5815
5816
5817
# File 'lib/syntax_tree/node.rb', line 5815

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

#child_nodesObject Also known as: deconstruct



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

def child_nodes
  [beginning, *parts, ending]
end

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



5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
# File 'lib/syntax_tree/node.rb', line 5823

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



5838
5839
5840
5841
5842
5843
5844
5845
5846
# File 'lib/syntax_tree/node.rb', line 5838

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

#format(q) ⇒ Object



5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
# File 'lib/syntax_tree/node.rb', line 5853

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