Module: BitClust::RbsSignatures

Included in:
RDCompiler
Defined in:
lib/bitclust/rbs_signatures.rb

Instance Method Summary collapse

Instance Method Details

#prepare_rbs_signatures(entry, source) ⇒ Object

compile_method 冒頭で呼ぶ。rbs_sig property があれば、source の シグネチャ行からチャンク列を作りオーバーロードを振り分けておく



37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/bitclust/rbs_signatures.rb', line 37

def prepare_rbs_signatures(entry, source)
  reset_rbs_signatures
  overloads = entry.rbs_signature_overloads
  return unless overloads
  chunks = rbs_scan_signature_chunks(source)
  if chunks.empty?
    no_signatures = [] #: Array[String]
    chunks = [no_signatures]
  end
  assignment = RbsOverloadMatcher.assign(overloads, chunks)
  @rbs_sig_by_chunk = assignment.map {|indexes|
    indexes.filter_map {|i| overloads[i]['segments'] }
  }
end

#rbs_signature_dts_for_chunkObject

現在のチャンクに割り当てられたオーバーロードの

行(改行連結)を 返し、チャンクカウンタを進める。メソッド以外のコンパイル (prepare が呼ばれていない)や割り当てが無いチャンクでは nil



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/bitclust/rbs_signatures.rb', line 55

def rbs_signature_dts_for_chunk
  by_chunk = @rbs_sig_by_chunk
  return nil unless by_chunk
  lines = by_chunk[@rbs_chunk_index]
  @rbs_chunk_index += 1
  return nil unless lines && !lines.empty?
  lines.map {|line|
    html = line.map {|kind, text| rbs_segment_html(kind, text) }.join
    %Q(<dt class="rbs-signature"><code>#{html}</code></dt>)
  }.join("\n")
end

#reset_rbs_signaturesObject

振り分け状態はメソッドのコンパイル専用(compile_method が prepare_rbs_signatures で作り直す)なので、他のコンパイルへ 持ち越さないよう setup(全コンパイル共通)からリセットする



30
31
32
33
# File 'lib/bitclust/rbs_signatures.rb', line 30

def reset_rbs_signatures
  @rbs_sig_by_chunk = nil
  @rbs_chunk_index = 0
end