class SyntaxTree::Translation::Parser::HeredocBuilder

def trim!

def trim!
  return unless node.beginning.value[2] == "~"
  lines = [Line.new(+"", [])]
  segments.each do |segment|
    lines.last.segments << segment
    if segment.type == :str
      lines.last.value << segment.children.first
      lines << Line.new(+"", []) if lines.last.value.end_with?("\n")
    end
  end
  lines.pop if lines.last.value.empty?
  return if lines.empty?
  segments.clear
  lines.each do |line|
    remaining = node.dedent
    line.segments.each do |segment|
      if segment.type == :str
        if remaining > 0
          whitespace = segment.children.first[/^\s{0,#{remaining}}/]
          segment.children.first.sub!(/^#{whitespace}/, "")
          remaining -= whitespace.length
        end
        if node.beginning.value[3] != "'" && segments.any? &&
             segments.last.type == :str &&
             segments.last.children.first.end_with?("\\\n")
          segments.last.children.first.gsub!(/\\\n\z/, "")
          segments.last.children.first.concat(segment.children.first)
        elsif !segment.children.first.empty?
          segments << segment
        end
      else
        segments << segment
      end
    end
  end
end