Class: Unparser::Comments

Inherits:
Object
  • Object
show all
Defined in:
lib/unparser/comments.rb

Overview

Holds the comments that remain to be emitted

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(comments) ⇒ undefined

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initialize object

Parameters:

  • comments (Array)


30
31
32
33
# File 'lib/unparser/comments.rb', line 30

def initialize(comments)
  @comments = comments.dup
  @last_range_consumed = nil
end

Class Method Details

.source_range(node, part) ⇒ Parser::Source::Range?

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Return source location part

FIXME: This method should not be needed. It does to much inline signalling.

Parameters:

  • node (Parser::AST::Node)
  • part (Symbol)

Returns:

  • (Parser::Source::Range)

    if present

  • (nil)

    otherwise



104
105
106
107
108
109
# File 'lib/unparser/comments.rb', line 104

def self.source_range(node, part)
  location = node.location
  if location && location.respond_to?(part)
    location.public_send(part)
  end
end

Instance Method Details

#consume(node, source_part = :expression) ⇒ undefined

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Consume part or all of the node

Parameters:

  • node (Parser::AST::Node)
  • source_part (Symbol) (defaults to: :expression)

Returns:

  • (undefined)


44
45
46
47
# File 'lib/unparser/comments.rb', line 44

def consume(node, source_part = :expression)
  range = source_range(node, source_part)
  @last_range_consumed = range if range
end

#source_range(*arguments) ⇒ undefined

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Proxy to singleton

NOTICE:

Delegating to stateless helpers is a pattern I saw many times in our code.
Maybe we should make another helper module? include SingletonDelegator.new(:source_range) ?

Returns:

  • (undefined)


18
19
20
# File 'lib/unparser/comments.rb', line 18

def source_range(*arguments)
  self.class.source_range(*arguments)
end

#take_allArray

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Take all remaining comments

Returns:

  • (Array)


67
68
69
# File 'lib/unparser/comments.rb', line 67

def take_all
  take_while { true }
end

#take_before(node, source_part) ⇒ Array

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Take comments appear in the source before the specified part of the node

Parameters:

  • node (Parser::AST::Node)
  • source_part (Symbol)

Returns:

  • (Array)


80
81
82
83
84
85
86
87
# File 'lib/unparser/comments.rb', line 80

def take_before(node, source_part)
  range = source_range(node, source_part)
  if range
    take_while { |comment| comment.location.expression.end_pos <= range.begin_pos }
  else
    EMPTY_ARRAY
  end
end

#take_eol_commentsArray

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Take end-of-line comments

Returns:

  • (Array)


55
56
57
58
59
# File 'lib/unparser/comments.rb', line 55

def take_eol_comments
  return EMPTY_ARRAY unless @last_range_consumed
  comments = take_up_to_line(@last_range_consumed.end.line)
  unshift_documents(comments)
end