Class: Chiridion::Engine::TypeMerger

Inherits:
Object
  • Object
show all
Defined in:
lib/chiridion/engine/type_merger.rb

Overview

Merges RBS type signatures with YARD documentation.

RBS is treated as authoritative for types. When YARD and RBS disagree, a warning is logged but RBS types are used. This ensures documentation reflects the actual type contracts defined in sig/*.rbs.

Constant Summary collapse

BOOLEAN_TYPES =

Known type equivalences between YARD conventions and RBS.

%w[bool TrueClass FalseClass].freeze
GENERIC_PREFIXES =
{ "Hash" => "Hash[", "Array" => "Array[" }.freeze

Instance Method Summary collapse

Constructor Details

#initialize(logger = nil) ⇒ TypeMerger

Returns a new instance of TypeMerger.



15
# File 'lib/chiridion/engine/type_merger.rb', line 15

def initialize(logger = nil) = @logger = logger

Instance Method Details

#merge_params(yard_params, rbs_data, class_path, method_name) ⇒ Array<Hash>

Merge YARD params with RBS types - RBS is authoritative.

Parameters:

  • yard_params (Array<Hash>)

    Parameters from YARD

  • rbs_data (Hash, nil)

    RBS signature data

  • class_path (String)

    Class path for warnings

  • method_name (Symbol)

    Method name for warnings

Returns:

  • (Array<Hash>)

    Merged parameters



24
25
26
27
28
29
# File 'lib/chiridion/engine/type_merger.rb', line 24

def merge_params(yard_params, rbs_data, class_path, method_name)
  return yard_params unless rbs_data&.dig(:params)

  rbs_params = rbs_data[:params]
  yard_params.map { |p| merge_single_param(p, rbs_params, class_path, method_name) }
end

#merge_return(yard_return, rbs_data, class_path, method_name) ⇒ Hash?

Merge YARD return with RBS return type - RBS is authoritative.

Parameters:

  • yard_return (Hash, nil)

    Return info from YARD

  • rbs_data (Hash, nil)

    RBS signature data

  • class_path (String)

    Class path for warnings

  • method_name (Symbol)

    Method name for warnings

Returns:

  • (Hash, nil)

    Merged return info



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/chiridion/engine/type_merger.rb', line 38

def merge_return(yard_return, rbs_data, class_path, method_name)
  return yard_return unless rbs_data&.dig(:returns)

  rbs_return_data = rbs_data[:returns]

  # Handle both old format (string) and new format ({ type:, desc: })
  rbs_type = rbs_return_data.is_a?(Hash) ? rbs_return_data[:type] : rbs_return_data
  rbs_desc = rbs_return_data.is_a?(Hash) ? rbs_return_data[:desc] : nil

  if yard_return
    check_return_mismatch(yard_return, rbs_type, class_path, method_name)
    merged_desc = merge_description(yard_return[:text], rbs_desc)
    yard_return.merge(types: [rbs_type], text: merged_desc)
  else
    { types: [rbs_type], text: rbs_desc }
  end
end