类 SyntaxSuggest::ScanHistory

从给定代码块向上/向下扫描

您可以尝试更改,将其存储或提交以供日后保存

示例

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)

属性

after_index[R]
before_index[R]

公共类方法

new(code_lines:, block:) 点击切换源代码
# File lib/syntax_suggest/scan_history.rb, line 24
def initialize(code_lines:, block:)
  @code_lines = code_lines
  @history = [block]
  refresh_index
end

公共实例方法

changed?() 点击切换源代码
# 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_changed() 点击切换源代码
# 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
lines() 点击切换源代码
# File lib/syntax_suggest/scan_history.rb, line 110
def lines
  @code_lines[@before_index..@after_index]
end
next_down() 点击切换源代码
# 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() 点击切换源代码
# 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_commit() 点击切换源代码

丢弃未提交的更改并恢复上次提交

无法恢复第一次提交

# 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:) 点击切换源代码

向上和向下迭代

每次迭代返回行、kw_count、end_count

# 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() 点击切换源代码

丢弃任何未提交的更改

# File lib/syntax_suggest/scan_history.rb, line 39
def stash_changes
  refresh_index
  self
end

私有实例方法

after_lines() 点击切换源代码

返回当前扫描块之后的所有 CodeLines 数组。

# File lib/syntax_suggest/scan_history.rb, line 120
        def after_lines
  @code_lines[@after_index.next..] || []
end
before_lines() 点击切换源代码
# File lib/syntax_suggest/scan_history.rb, line 114
        def before_lines
  @code_lines[0...@before_index] || []
end
current() 点击切换源代码
# File lib/syntax_suggest/scan_history.rb, line 124
        def current
  @history.last
end
refresh_index() 点击切换源代码
# File lib/syntax_suggest/scan_history.rb, line 128
        def refresh_index
  @before_index = current.lines.first.index
  @after_index = current.lines.last.index
  self
end