123456789_123456789_123456789_123456789_123456789_

Class: SyntaxSuggest::ScanHistory

Relationships & Source Files
Inherits: Object
Defined in: lib/syntax_suggest/scan_history.rb

Overview

Scans up/down from the given block

You can try out a change, stash it, or commit it to save for later

Example:

scanner = ScanHistory.new(code_lines: code_lines, block: block)
scanner.scan(
  up: ->(_, _, _) { true },
  down: ->(_, _, _) { true }
)
scanner.changed? # => true
expect(scanner.lines).to eq(code_lines)

scanner.stash_changes

expect(scanner.lines).to_not eq(code_lines)

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(code_lines:, block:) ⇒ ScanHistory

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 24

def initialize(code_lines:, block:)
  @code_lines = code_lines
  @history = [block]
  refresh_index
end

Instance Attribute Details

#after_index (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 22

attr_reader :before_index, :after_index

#before_index (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 22

attr_reader :before_index, :after_index

#changed?Boolean (readonly)

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 56

def changed?
  @before_index != current.lines.first.index ||
    @after_index != current.lines.last.index
end

Instance Method Details

#after_lines (private)

Returns an array of all the CodeLines that exist after the currently scanned block

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 120

private def after_lines
  @code_lines[@after_index.next..] || []
end

#before_lines (private)

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 114

private def before_lines
  @code_lines[0...@before_index] || []
end

#commit_if_changed

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 30

def commit_if_changed
  if changed?
    @history << CodeBlock.new(lines: @code_lines[before_index..after_index])
  end

  self
end

#current (private)

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 124

private def current
  @history.last
end

#lines

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 110

def lines
  @code_lines[@before_index..@after_index]
end

#next_down

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 104

def next_down
  return nil if @after_index >= @code_lines.length

  @code_lines[@after_index + 1]
end

#next_up

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 98

def next_up
  return nil if @before_index <= 0

  @code_lines[@before_index - 1]
end

#refresh_index (private)

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 128

private def refresh_index
  @before_index = current.lines.first.index
  @after_index = current.lines.last.index
  self
end

#revert_last_commit

Discard changes that have not been committed and revert the last commit

Cannot revert the first commit

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 47

def revert_last_commit
  if @history.length > 1
    @history.pop
    refresh_index
  end

  self
end

#scan(up:, down:)

Iterates up and down

Returns line, kw_count, end_count for each iteration

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 64

def scan(up:, down:)
  kw_count = 0
  end_count = 0

  up_index = before_lines.reverse_each.take_while do |line|
    kw_count += 1 if line.is_kw?
    end_count += 1 if line.is_end?
    up.call(line, kw_count, end_count)
  end.last&.index

  kw_count = 0
  end_count = 0

  down_index = after_lines.each.take_while do |line|
    kw_count += 1 if line.is_kw?
    end_count += 1 if line.is_end?
    down.call(line, kw_count, end_count)
  end.last&.index

  @before_index = if up_index && up_index < @before_index
    up_index
  else
    @before_index
  end

  @after_index = if down_index && down_index > @after_index
    down_index
  else
    @after_index
  end

  self
end

#stash_changes

Discards any changes that have not been committed

[ GitHub ]

  
# File 'lib/syntax_suggest/scan_history.rb', line 39

def stash_changes
  refresh_index
  self
end