Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix to parse rb_define_global_const #1245

Merged
merged 1 commit into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/rdoc/parser/c.rb
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ def do_constants
\s*(.*?)\s*\)\s*;
%xm) do |type, var_name, const_name, definition|
var_name = "rb_cObject" if !var_name or var_name == "rb_mKernel"
type = "const" if type == "global_const"
handle_constants type, var_name, const_name, definition
end

Expand Down Expand Up @@ -760,6 +761,10 @@ def gen_const_table file_content
rb_define_(?<type>\w+)\(\s*(?:\w+),\s*
"(?<name>\w+)"\s*,
.*?\)\s*;
| (?<doc>(?>^\s*/\*.*?\*/\s+))
rb_define_global_(?<type>const)\(\s*
"(?<name>\w+)"\s*,
.*?\)\s*;
| (?<doc>(?>^\s*/\*.*?\*/\s+))
rb_file_(?<type>const)\(\s*
"(?<name>\w+)"\s*,
Expand Down
47 changes: 47 additions & 0 deletions test/rdoc/test_rdoc_parser_c.rb
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,38 @@ def test_do_constants
assert constants.empty?, constants.inspect
end

def test_do_constants_global
content = <<-'EOF'
#include <ruby.h>

void Init_foo(){

/* Toplevel const */
rb_define_global_const("ANSWER", INT2FIX(42));

}
EOF

@parser = util_parser content

@parser.do_classes_and_modules
@parser.do_constants

klass = @parser.classes['rb_cObject']
assert klass

constants = klass.constants
assert !klass.constants.empty?

assert_equal @top_level, constants.first.file

constants = constants.map { |c| [c.name, c.value, c.comment.text] }
assert_equal ['ANSWER', 'INT2FIX(42)', "Toplevel const "],
constants.shift

assert constants.empty?, constants.inspect
end

def test_do_constants_curses
content = <<-EOF
void Init_curses(){
Expand Down Expand Up @@ -1037,6 +1069,21 @@ def test_find_const_comment_rb_define
assert_equal "/*\n * A comment\n */\n", comment.text
end

def test_find_const_comment_rb_define_global
content = <<-EOF
/*
* A comment
*/
rb_define_global_const("CONST", value);
EOF

parser = util_parser content

comment = parser.find_const_comment 'const', 'CONST'

assert_equal "/*\n * A comment\n */\n", comment.text
end

def test_find_const_comment_document_const
content = <<-EOF
/*
Expand Down
Loading