X7ROOT File Manager
Current Path:
/opt/alt/ruby33/share/ruby/syntax_suggest
opt
/
alt
/
ruby33
/
share
/
ruby
/
syntax_suggest
/
ðŸ“
..
📄
api.rb
(6.07 KB)
📄
around_block_scan.rb
(6.9 KB)
📄
block_expand.rb
(4.88 KB)
ðŸ“
capture
📄
capture_code_context.rb
(6.67 KB)
📄
clean_document.rb
(8.73 KB)
📄
cli.rb
(3.12 KB)
📄
code_block.rb
(2.13 KB)
📄
code_frontier.rb
(5.61 KB)
📄
code_line.rb
(6.62 KB)
📄
code_search.rb
(3.81 KB)
📄
core_ext.rb
(3.02 KB)
📄
display_code_with_line_numbers.rb
(1.77 KB)
📄
display_invalid_blocks.rb
(1.75 KB)
📄
explain_syntax.rb
(2.69 KB)
📄
left_right_lex_count.rb
(4.06 KB)
📄
lex_all.rb
(1.66 KB)
📄
lex_value.rb
(1.5 KB)
📄
parse_blocks_from_indent_line.rb
(1.5 KB)
📄
pathname_from_message.rb
(1.42 KB)
📄
priority_engulf_queue.rb
(1.26 KB)
📄
priority_queue.rb
(2 KB)
📄
ripper_errors.rb
(960 B)
📄
scan_history.rb
(2.92 KB)
📄
unvisited_lines.rb
(705 B)
📄
version.rb
(76 B)
Editing: code_search.rb
# frozen_string_literal: true module SyntaxSuggest # Searches code for a syntax error # # There are three main phases in the algorithm: # # 1. Sanitize/format input source # 2. Search for invalid blocks # 3. Format invalid blocks into something meaninful # # This class handles the part. # # The bulk of the heavy lifting is done in: # # - CodeFrontier (Holds information for generating blocks and determining if we can stop searching) # - ParseBlocksFromLine (Creates blocks into the frontier) # - BlockExpand (Expands existing blocks to search more code) # # ## Syntax error detection # # When the frontier holds the syntax error, we can stop searching # # search = CodeSearch.new(<<~EOM) # def dog # def lol # end # EOM # # search.call # # search.invalid_blocks.map(&:to_s) # => # # => ["def lol\n"] # class CodeSearch private attr_reader :frontier public attr_reader :invalid_blocks, :record_dir, :code_lines def initialize(source, record_dir: DEFAULT_VALUE) record_dir = if record_dir == DEFAULT_VALUE (ENV["SYNTAX_SUGGEST_RECORD_DIR"] || ENV["SYNTAX_SUGGEST_DEBUG"]) ? "tmp" : nil else record_dir end if record_dir @record_dir = SyntaxSuggest.record_dir(record_dir) @write_count = 0 end @tick = 0 @source = source @name_tick = Hash.new { |hash, k| hash[k] = 0 } @invalid_blocks = [] @code_lines = CleanDocument.new(source: source).call.lines @frontier = CodeFrontier.new(code_lines: @code_lines) @block_expand = BlockExpand.new(code_lines: @code_lines) @parse_blocks_from_indent_line = ParseBlocksFromIndentLine.new(code_lines: @code_lines) end # Used for debugging def record(block:, name: "record") return unless @record_dir @name_tick[name] += 1 filename = "#{@write_count += 1}-#{name}-#{@name_tick[name]}-(#{block.starts_at}__#{block.ends_at}).txt" if ENV["SYNTAX_SUGGEST_DEBUG"] puts "\n\n==== #{filename} ====" puts "\n```#{block.starts_at}..#{block.ends_at}" puts block puts "```" puts " block indent: #{block.current_indent}" end @record_dir.join(filename).open(mode: "a") do |f| document = DisplayCodeWithLineNumbers.new( lines: @code_lines.select(&:visible?), terminal: false, highlight_lines: block.lines ).call f.write(" Block lines: #{block.starts_at..block.ends_at} (#{name}) \n\n#{document}") end end def push(block, name:) record(block: block, name: name) block.mark_invisible if block.valid? frontier << block end # Parses the most indented lines into blocks that are marked # and added to the frontier def create_blocks_from_untracked_lines max_indent = frontier.next_indent_line&.indent while (line = frontier.next_indent_line) && (line.indent == max_indent) @parse_blocks_from_indent_line.each_neighbor_block(frontier.next_indent_line) do |block| push(block, name: "add") end end end # Given an already existing block in the frontier, expand it to see # if it contains our invalid syntax def expand_existing block = frontier.pop return unless block record(block: block, name: "before-expand") block = @block_expand.call(block) push(block, name: "expand") end # Main search loop def call until frontier.holds_all_syntax_errors? @tick += 1 if frontier.expand? expand_existing else create_blocks_from_untracked_lines end end @invalid_blocks.concat(frontier.detect_invalid_blocks) @invalid_blocks.sort_by! { |block| block.starts_at } self end end end
Upload File
Create Folder