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

Instance Attribute Summary collapse

Attributes inherited from Node

#location

Instance Method Summary collapse

Methods inherited from Node

#construct_keys, #pretty_print, #to_json

Constructor Details

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

Returns a new instance of Heredoc.



4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
# File 'lib/syntax_tree/node.rb', line 4828

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

Instance Attribute Details

#beginningObject (readonly)

HeredocBeg

the opening of the heredoc



4813
4814
4815
# File 'lib/syntax_tree/node.rb', line 4813

def beginning
  @beginning
end

#commentsObject (readonly)

Array[ Comment | EmbDoc ]

the comments attached to this node



4826
4827
4828
# File 'lib/syntax_tree/node.rb', line 4826

def comments
  @comments
end

#dedentObject (readonly)

Integer

how far to dedent the heredoc



4819
4820
4821
# File 'lib/syntax_tree/node.rb', line 4819

def dedent
  @dedent
end

#endingObject (readonly)

HeredocEnd

the ending of the heredoc



4816
4817
4818
# File 'lib/syntax_tree/node.rb', line 4816

def ending
  @ending
end

#partsObject (readonly)

Array[ StringEmbExpr | StringDVar | TStringContent ]

the parts of the

heredoc string literal



4823
4824
4825
# File 'lib/syntax_tree/node.rb', line 4823

def parts
  @parts
end

Instance Method Details

#accept(visitor) ⇒ Object



4844
4845
4846
# File 'lib/syntax_tree/node.rb', line 4844

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

#child_nodesObject Also known as: deconstruct



4848
4849
4850
# File 'lib/syntax_tree/node.rb', line 4848

def child_nodes
  [beginning, *parts, ending]
end

#deconstruct_keys(_keys) ⇒ Object



4854
4855
4856
4857
4858
4859
4860
4861
4862
# File 'lib/syntax_tree/node.rb', line 4854

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

#format(q) ⇒ Object



4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
# File 'lib/syntax_tree/node.rb', line 4864

def format(q)
  # This is a very specific behavior where you want to force a newline, but
  # don't want to force the break parent.
  breakable = -> { q.breakable(indent: false, force: :skip_break_parent) }

  q.group do
    q.format(beginning)

    q.line_suffix(priority: Formatter::HEREDOC_PRIORITY) do
      q.group do
        breakable.call

        parts.each do |part|
          if part.is_a?(TStringContent)
            texts = part.value.split(/\r?\n/, -1)
            q.seplist(texts, breakable) { |text| q.text(text) }
          else
            q.format(part)
          end
        end

        q.format(ending)
      end
    end
  end
end