Method: RDoc::Parser::C#rb_scan_args

Defined in:
lib/rdoc/parser/c.rb

#rb_scan_args(method_body) ⇒ Object

Extracts parameters from the method_body and returns a method parameter string. Follows 1.9.3dev’s scan-arg-spec, see README.EXT



1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
# File 'lib/rdoc/parser/c.rb', line 1144

def rb_scan_args method_body
  method_body =~ /rb_scan_args\((.*?)\)/m
  return '(*args)' unless $1

  $1.split(/,/)[2] =~ /"(.*?)"/ # format argument
  format = $1.split(//)

  lead = opt = trail = 0

  if format.first =~ /\d/ then
    lead = $&.to_i
    format.shift
    if format.first =~ /\d/ then
      opt = $&.to_i
      format.shift
      if format.first =~ /\d/ then
        trail = $&.to_i
        format.shift
        block_arg = true
      end
    end
  end

  if format.first == '*' and not block_arg then
    var = true
    format.shift
    if format.first =~ /\d/ then
      trail = $&.to_i
      format.shift
    end
  end

  if format.first == ':' then
    hash = true
    format.shift
  end

  if format.first == '&' then
    block = true
    format.shift
  end

  # if the format string is not empty there's a bug in the C code, ignore it

  args = []
  position = 1

  (1...(position + lead)).each do |index|
    args << "p#{index}"
  end

  position += lead

  (position...(position + opt)).each do |index|
    args << "p#{index} = v#{index}"
  end

  position += opt

  if var then
    args << '*args'
    position += 1
  end

  (position...(position + trail)).each do |index|
    args << "p#{index}"
  end

  position += trail

  if hash then
    args << "p#{position} = {}"
  end

  args << '&block' if block

  "(#{args.join ', '})"
end