класс SyntaxSuggest::ParseBlocksFromIndentLine
Этот класс отвечает за создание начальных блоков кода, которые затем будут расширены.
Самая большая проблема при угадывании блоков кода — случайное захват блока, содержащего только «конец». В этом примере:
def dog begonn # mispelled `begin` puts "bark" end end
Следующие строки будут сопоставлены (снизу вверх):
1) end 2) puts "bark" end 3) begonn puts "bark" end
В этот момент ему некуда больше расширяться, и он вернёт этот внутренний код как блок
Атрибуты
code_lines[R]
Публичные методы класса
# File lib/syntax_suggest/parse_blocks_from_indent_line.rb, line 32 def initialize(code_lines:) @code_lines = code_lines end
Публичные методы экземпляра
# File lib/syntax_suggest/parse_blocks_from_indent_line.rb, line 37
def each_neighbor_block(target_line)
scan = AroundBlockScan.new(code_lines: code_lines, block: CodeBlock.new(lines: target_line))
.force_add_empty
.force_add_hidden
.scan_while { |line| line.indent >= target_line.indent }
neighbors = scan.code_block.lines
block = CodeBlock.new(lines: neighbors)
if neighbors.length <= 2 || block.valid?
yield block
else
until neighbors.empty?
lines = [neighbors.pop]
while (block = CodeBlock.new(lines: lines)) && block.invalid? && neighbors.any?
lines.prepend neighbors.pop
end
yield block if block
end
end
end Строит блоки снизу вверх
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.