Class: SyntaxSuggest::ScanHistory

Inherits:
Object
  • Object
show all
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)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(code_lines:, block:) ⇒ ScanHistory

Returns a new instance of ScanHistory.



24
25
26
27
28
# 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_indexObject (readonly)

Returns the value of attribute after_index.



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

def after_index
  @after_index
end

#before_indexObject (readonly)

Returns the value of attribute before_index.



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

def before_index
  @before_index
end

Instance Method Details

#changed?Boolean

Returns:

  • (Boolean)


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

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

#commit_if_changedObject



30
31
32
33
34
35
36
# 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

#linesObject



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

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

#next_downObject



104
105
106
107
108
# 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_upObject



98
99
100
101
102
# File 'lib/syntax_suggest/scan_history.rb', line 98

def next_up
  return nil if @before_index <= 0

  @code_lines[@before_index - 1]
end

#revert_last_commitObject

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

Cannot revert the first commit



47
48
49
50
51
52
53
54
# 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:) ⇒ Object

Iterates up and down

Returns line, kw_count, end_count for each iteration



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 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_changesObject

Discards any changes that have not been committed



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

def stash_changes
  refresh_index
  self
end