On this page
class SyntaxSuggest::CodeBlock
Multiple lines form a singular CodeBlock
Source code is made of multiple CodeBlocks.
Example:
code_block.to_s # =>
# def foo
# puts "foo"
# end
code_block.valid? # => true
code_block.in_valid? # => false
Constants
- UNSET
Attributes
ends_at[R]
lines[R]
starts_at[R]
Public Class Methods
# File lib/syntax_suggest/code_block.rb, line 23
def initialize(lines: [])
@lines = Array(lines)
@valid = UNSET
@deleted = false
@starts_at = @lines.first.number
@ends_at = @lines.last.number
end
Public Instance Methods
# File lib/syntax_suggest/code_block.rb, line 59
def <=>(other)
out = current_indent <=> other.current_indent
return out if out != 0
# Stable sort
starts_at <=> other.starts_at
end
This is used for frontier ordering, we are searching from the largest indentation to the smallest. This allows us to populate an array with multiple code blocks then call ‘sort!` on it without having to specify the sorting criteria
# File lib/syntax_suggest/code_block.rb, line 67
def current_indent
@current_indent ||= lines.select(&:not_empty?).map(&:indent).min || 0
end
# File lib/syntax_suggest/code_block.rb, line 31
def delete
@deleted = true
end
# File lib/syntax_suggest/code_block.rb, line 35
def deleted?
@deleted
end
# File lib/syntax_suggest/code_block.rb, line 71
def invalid?
!valid?
end
# File lib/syntax_suggest/code_block.rb, line 47
def is_end?
to_s.strip == "end"
end
# File lib/syntax_suggest/code_block.rb, line 43
def mark_invisible
@lines.map(&:mark_invisible)
end
# File lib/syntax_suggest/code_block.rb, line 96
def to_s
@lines.join
end
# File lib/syntax_suggest/code_block.rb, line 75
def valid?
if @valid == UNSET
# Performance optimization
#
# If all the lines were previously hidden
# and we expand to capture additional empty
# lines then the result cannot be invalid
#
# That means there's no reason to re-check all
# lines with ripper (which is expensive).
# Benchmark in commit message
@valid = if lines.all? { |l| l.hidden? || l.empty? }
true
else
SyntaxSuggest.valid?(lines.map(&:original).join)
end
else
@valid
end
end
# File lib/syntax_suggest/code_block.rb, line 39
def visible_lines
@lines.select(&:visible?).select(&:not_empty?)
end
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.