lib/yard/parser/c/comment_parser.rb in yard-0.9.16 vs lib/yard/parser/c/comment_parser.rb in yard-0.9.17

- old
+ new

@@ -1,134 +1,134 @@ -# frozen_string_literal: true -module YARD - module Parser - module C - module CommentParser - protected - - def parse_comments(comments) - @overrides = [] - spaces = nil - comments = remove_private_comments(comments) - comments = comments.split(/\r?\n/).map do |line| - line.gsub!(%r{^\s*/?\*/?}, '') - line.gsub!(%r{\*/\s*$}, '') - if line =~ /^\s*$/ - next if spaces.nil? - next "" - end - spaces = (line[/^(\s+)/, 1] || "").size if spaces.nil? - line.gsub(/^\s{0,#{spaces}}/, '').rstrip - end.compact - - comments = parse_overrides(comments) - comments = parse_callseq(comments) - comments.join("\n") - end - - private - - def parse_overrides(comments) - comments.map do |line| - type, name = *line.scan(/^\s*Document-(class|module|method|attr|const):\s*(\S.*)\s*$/).first - if type - @overrides << [type.to_sym, name] - nil - else - line - end - end.compact - end - - def parse_callseq(comments) - return comments unless comments[0] =~ /\Acall-seq:\s*(\S.+)?/ - if $1 - comments[0] = " #{$1}" - else - comments.shift - end - overloads = [] - seen_data = false - while comments.first =~ /^\s+(\S.+)/ || comments.first =~ /^\s*$/ - line = comments.shift.strip - break if line.empty? && seen_data - next if line.empty? - seen_data = true - line.sub!(/^\w+[\.#]/, '') - signature, types = *line.split(/ [-=]> /) - types = parse_types(types) - if signature.sub!(/\[?\s*(\{(?:\s*\|(.+?)\|)?.*\})\s*\]?\s*$/, '') && $1 - blk = $1 - blkparams = $2 - else - blk = nil - blkparams = nil - end - case signature - when /^(\w+)\s*=\s+(\w+)/ - signature = "#{$1}=(#{$2})" - when /^\w+\s+\S/ - signature = signature.split(/\s+/) - signature = "#{signature[1]}#{signature[2] ? '(' + signature[2..-1].join(' ') + ')' : ''}" - when /^\w+\[(.+?)\]\s*(=)?/ - signature = "[]#{$2}(#{$1})" - when /^\w+\s+(#{CodeObjects::METHODMATCH})\s+(\w+)/ - signature = "#{$1}(#{$2})" - end - break unless signature =~ /^#{CodeObjects::METHODNAMEMATCH}/ - signature = signature.rstrip - overloads << "@overload #{signature}" - overloads << " @yield [#{blkparams}]" if blk - overloads << " @return [#{types.join(', ')}]" unless types.empty? - end - - comments + [""] + overloads - end - - def parse_types(types) - if types =~ /true or false/ - ["Boolean"] - else - (types || "").split(/,| or /).map do |t| - case t.strip.gsub(/^an?_/, '') - when "class"; "Class" - when "obj", "object", "anObject"; "Object" - when "arr", "array", "anArray", "ary", "new_ary", /^\[/; "Array" - when /^char\s*\*/, "char", "str", "string", "new_str"; "String" - when "enum", "anEnumerator"; "Enumerator" - when "exc", "exception"; "Exception" - when "proc", "proc_obj", "prc"; "Proc" - when "binding"; "Binding" - when "hsh", "hash", "aHash"; "Hash" - when "ios", "io"; "IO" - when "file"; "File" - when "float"; "Float" - when "time", "new_time"; "Time" - when "dir", "aDir"; "Dir" - when "regexp", "new_regexp"; "Regexp" - when "matchdata"; "MatchData" - when "encoding"; "Encoding" - when "fixnum", "fix"; "Fixnum" - when /^(?:un)?signed$/, /^(?:(?:un)?signed\s*)?(?:short|int|long|long\s+long)$/, "integer", "Integer"; "Integer" - when "num", "numeric", "Numeric", "number"; "Numeric" - when "aBignum"; "Bignum" - when "nil"; "nil" - when "true"; "true" - when "false"; "false" - when "bool", "boolean", "Boolean"; "Boolean" - when "self"; "self" - when /^[-+]?\d/; t - when /[A-Z][_a-z0-9]+/; t - end - end.compact - end - end - - def remove_private_comments(comment) - comment = comment.gsub(%r{/?\*--\n(.*?)/?\*\+\+}m, '') - comment = comment.sub(%r{/?\*--\n.*}m, '') - comment - end - end - end - end -end +# frozen_string_literal: true +module YARD + module Parser + module C + module CommentParser + protected + + def parse_comments(comments) + @overrides = [] + spaces = nil + comments = remove_private_comments(comments) + comments = comments.split(/\r?\n/).map do |line| + line.gsub!(%r{^\s*/?\*/?}, '') + line.gsub!(%r{\*/\s*$}, '') + if line =~ /^\s*$/ + next if spaces.nil? + next "" + end + spaces = (line[/^(\s+)/, 1] || "").size if spaces.nil? + line.gsub(/^\s{0,#{spaces}}/, '').rstrip + end.compact + + comments = parse_overrides(comments) + comments = parse_callseq(comments) + comments.join("\n") + end + + private + + def parse_overrides(comments) + comments.map do |line| + type, name = *line.scan(/^\s*Document-(class|module|method|attr|const):\s*(\S.*)\s*$/).first + if type + @overrides << [type.to_sym, name] + nil + else + line + end + end.compact + end + + def parse_callseq(comments) + return comments unless comments[0] =~ /\Acall-seq:\s*(\S.+)?/ + if $1 + comments[0] = " #{$1}" + else + comments.shift + end + overloads = [] + seen_data = false + while comments.first =~ /^\s+(\S.+)/ || comments.first =~ /^\s*$/ + line = comments.shift.strip + break if line.empty? && seen_data + next if line.empty? + seen_data = true + line.sub!(/^\w+[\.#]/, '') + signature, types = *line.split(/ [-=]> /) + types = parse_types(types) + if signature.sub!(/\[?\s*(\{(?:\s*\|(.+?)\|)?.*\})\s*\]?\s*$/, '') && $1 + blk = $1 + blkparams = $2 + else + blk = nil + blkparams = nil + end + case signature + when /^(\w+)\s*=\s+(\w+)/ + signature = "#{$1}=(#{$2})" + when /^\w+\s+\S/ + signature = signature.split(/\s+/) + signature = "#{signature[1]}#{signature[2] ? '(' + signature[2..-1].join(' ') + ')' : ''}" + when /^\w+\[(.+?)\]\s*(=)?/ + signature = "[]#{$2}(#{$1})" + when /^\w+\s+(#{CodeObjects::METHODMATCH})\s+(\w+)/ + signature = "#{$1}(#{$2})" + end + break unless signature =~ /^#{CodeObjects::METHODNAMEMATCH}/ + signature = signature.rstrip + overloads << "@overload #{signature}" + overloads << " @yield [#{blkparams}]" if blk + overloads << " @return [#{types.join(', ')}]" unless types.empty? + end + + comments + [""] + overloads + end + + def parse_types(types) + if types =~ /true or false/ + ["Boolean"] + else + (types || "").split(/,| or /).map do |t| + case t.strip.gsub(/^an?_/, '') + when "class"; "Class" + when "obj", "object", "anObject"; "Object" + when "arr", "array", "anArray", "ary", "new_ary", /^\[/; "Array" + when /^char\s*\*/, "char", "str", "string", "new_str"; "String" + when "enum", "anEnumerator"; "Enumerator" + when "exc", "exception"; "Exception" + when "proc", "proc_obj", "prc"; "Proc" + when "binding"; "Binding" + when "hsh", "hash", "aHash"; "Hash" + when "ios", "io"; "IO" + when "file"; "File" + when "float"; "Float" + when "time", "new_time"; "Time" + when "dir", "aDir"; "Dir" + when "regexp", "new_regexp"; "Regexp" + when "matchdata"; "MatchData" + when "encoding"; "Encoding" + when "fixnum", "fix"; "Fixnum" + when /^(?:un)?signed$/, /^(?:(?:un)?signed\s*)?(?:short|int|long|long\s+long)$/, "integer", "Integer"; "Integer" + when "num", "numeric", "Numeric", "number"; "Numeric" + when "aBignum"; "Bignum" + when "nil"; "nil" + when "true"; "true" + when "false"; "false" + when "bool", "boolean", "Boolean"; "Boolean" + when "self"; "self" + when /^[-+]?\d/; t + when /[A-Z][_a-z0-9]+/; t + end + end.compact + end + end + + def remove_private_comments(comment) + comment = comment.gsub(%r{/?\*--\n(.*?)/?\*\+\+}m, '') + comment = comment.sub(%r{/?\*--\n.*}m, '') + comment + end + end + end + end +end