diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index f0c0584908..e149ea45b7 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -29,8 +29,6 @@ jobs: run: | sudo apt-get update sudo apt-get install doxygen graphviz - - name: Generate the templates - run: bundle exec rake templates - name: Check ruby coverage run: bundle exec rake rdoc:coverage - name: Check C coverage diff --git a/Gemfile.lock b/Gemfile.lock index 3efb5000fe..09e274a4c5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,10 +8,8 @@ GEM specs: ast (2.4.3) benchmark-ips (2.14.0) - date (3.5.1) - date (3.5.1-java) - erb (6.0.2) - erb (6.0.2-java) + erb (6.0.7) + erb (6.0.7-java) ffi (1.17.3) ffi (1.17.3-aarch64-linux-gnu) ffi (1.17.3-aarch64-linux-musl) @@ -26,7 +24,8 @@ GEM prism (>= 1.3.0) rdoc (>= 4.0.0) reline (>= 0.4.2) - jar-dependencies (0.5.5) + jar-dependencies (0.5.7) + logger (1.7.0) lrama (0.8.0) mini_portile2 (2.8.9) nokogiri (1.19.1) @@ -54,21 +53,25 @@ GEM pp (0.6.3) prettyprint prettyprint (0.2.0) - psych (5.3.1) - date - stringio - psych (5.3.1-java) - date - jar-dependencies (>= 0.1.7) racc (1.8.1) racc (1.8.1-java) rake (13.3.1) rake-compiler (1.3.1) rake rake-compiler-dock (1.12.0) - rdoc (7.2.0) + rbs (4.1.3) + logger + prism (>= 1.6.0) + tsort + rbs (4.1.3-java) + jar-dependencies (>= 0.1.7) + logger + prism (>= 1.6.0) + tsort + rdoc (8.0.0) erb - psych (>= 4.0.0) + prism (>= 1.6.0) + rbs (>= 4.0.0) tsort reline (0.6.3) io-console (~> 0.5) @@ -78,7 +81,6 @@ GEM racc (~> 1.5) sexp_processor (~> 4.16) sexp_processor (4.17.5) - stringio (3.2.0) test-unit (3.7.7) power_assert tsort (0.2.0) diff --git a/lib/prism/node_ext.rb b/lib/prism/node_ext.rb index 94aa3bff8e..b22b669d52 100644 --- a/lib/prism/node_ext.rb +++ b/lib/prism/node_ext.rb @@ -386,6 +386,7 @@ def full_message_loc end end + # :stopdoc: class InNode < Node #: () -> String def in # :nodoc @@ -487,4 +488,5 @@ def closing_loc # :nodoc end_keyword_loc end end + # :startdoc: end diff --git a/lib/prism/translation/ruby_parser.rb b/lib/prism/translation/ruby_parser.rb index 3602b65ddb..edb3f3bf04 100644 --- a/lib/prism/translation/ruby_parser.rb +++ b/lib/prism/translation/ruby_parser.rb @@ -1627,6 +1627,7 @@ def visit_write_value(node) # Optional scopes to pass to the parser. attr_reader :scopes #: Array[Array[Symbol]]? + # :nodoc: #: (?scopes: Array[Array[Symbol]]?) -> void def initialize(scopes: nil) super() diff --git a/rakelib/rdoc.rake b/rakelib/rdoc.rake index deb98b0730..69dee55fbc 100644 --- a/rakelib/rdoc.rake +++ b/rakelib/rdoc.rake @@ -26,4 +26,8 @@ RDoc::Task.new(:rdoc) do |rdoc| ) end -Rake::Task["rdoc"].prerequisites.unshift("templates") +%w[rdoc rerdoc rdoc:coverage].each do |name| + # rdoc:coverage available in rdoc as a default gem since ruby 3.3 only + next unless Rake::Task.task_defined?(name) + Rake::Task[name].enhance(["compile"]) +end diff --git a/src/prism.c b/src/prism.c index 0f9168ad6b..51980155e4 100644 --- a/src/prism.c +++ b/src/prism.c @@ -135,7 +135,20 @@ pm_version(void) { #define PM_NODE_LENGTH_SET_TOKEN(parser_, node_, token_) (PM_NODE_LENGTH(node_) = PM_TOKEN_END(parser_, token_) - PM_NODE_START(node_)) #define PM_NODE_LENGTH_SET_LOCATION(node_, location_) (PM_NODE_LENGTH(node_) = PM_LOCATION_END(location_) - PM_NODE_START(node_)) -#define PM_LOCATION_INIT(start_, length_) ((pm_location_t) { .start = (start_), .length = (length_) }) +/** + * A function instead of a compound literal: MSVC 19.16 (VS2017) miscompiles a + * conditional expression whose arms are both struct compound literals — it + * materializes both arms before testing the condition, so the token + * dereferences in the unselected arm of NTOK2LOC and friends fault on NULL. + * Function call arguments are only evaluated on the selected branch. + */ +static PRISM_INLINE pm_location_t +pm_location_init(uint32_t start, uint32_t length) { + pm_location_t location = { .start = start, .length = length }; + return location; +} + +#define PM_LOCATION_INIT(start_, length_) pm_location_init((start_), (length_)) #define PM_LOCATION_INIT_UNSET PM_LOCATION_INIT(0, 0) #define PM_LOCATION_INIT_TOKEN(parser_, token_) PM_LOCATION_INIT(PM_TOKEN_START(parser_, token_), PM_TOKEN_LENGTH(token_)) #define PM_LOCATION_INIT_NODE(node_) UP(node_)->location @@ -5670,12 +5683,15 @@ pm_match_write_node_create(pm_parser_t *parser, pm_call_node_t *call) { */ static pm_module_node_t * pm_module_node_create(pm_parser_t *parser, pm_constant_id_list_t *locals, const pm_token_t *module_keyword, pm_node_t *constant_path, const pm_token_t *name, pm_node_t *body, const pm_token_t *end_keyword) { + pm_constant_id_list_t module_locals = { .ids = NULL, .size = 0, .capacity = 0 }; + if (locals != NULL) module_locals = *locals; + return pm_module_node_new( parser->arena, ++parser->node_id, 0, PM_LOCATION_INIT_TOKENS(parser, module_keyword, end_keyword), - (locals == NULL ? ((pm_constant_id_list_t) { .ids = NULL, .size = 0, .capacity = 0 }) : *locals), + module_locals, TOK2LOC(parser, module_keyword), constant_path, body, @@ -17033,10 +17049,11 @@ parse_pattern_rest(pm_parser_t *parser, pm_constant_id_list_t *captures) { pm_parser_local_add(parser, constant_id, parser->previous.start, parser->previous.end, 0); } - parse_pattern_capture(parser, captures, constant_id, &TOK2LOC(parser, &parser->previous)); + pm_location_t previous_loc = TOK2LOC(parser, &parser->previous); + parse_pattern_capture(parser, captures, constant_id, &previous_loc); name = UP(pm_local_variable_target_node_create( parser, - &TOK2LOC(parser, &parser->previous), + &previous_loc, constant_id, (uint32_t) (depth == -1 ? 0 : depth) )); @@ -17069,10 +17086,11 @@ parse_pattern_keyword_rest(pm_parser_t *parser, pm_constant_id_list_t *captures) pm_parser_local_add(parser, constant_id, parser->previous.start, parser->previous.end, 0); } - parse_pattern_capture(parser, captures, constant_id, &TOK2LOC(parser, &parser->previous)); + pm_location_t previous_loc = TOK2LOC(parser, &parser->previous); + parse_pattern_capture(parser, captures, constant_id, &previous_loc); value = UP(pm_local_variable_target_node_create( parser, - &TOK2LOC(parser, &parser->previous), + &previous_loc, constant_id, (uint32_t) (depth == -1 ? 0 : depth) )); @@ -17316,10 +17334,11 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm pm_parser_local_add(parser, constant_id, parser->previous.start, parser->previous.end, 0); } - parse_pattern_capture(parser, captures, constant_id, &TOK2LOC(parser, &parser->previous)); + pm_location_t previous_loc = TOK2LOC(parser, &parser->previous); + parse_pattern_capture(parser, captures, constant_id, &previous_loc); return UP(pm_local_variable_target_node_create( parser, - &TOK2LOC(parser, &parser->previous), + &previous_loc, constant_id, (uint32_t) (depth == -1 ? 0 : depth) )); @@ -17668,10 +17687,11 @@ parse_pattern_primitives(pm_parser_t *parser, pm_constant_id_list_t *captures, p pm_parser_local_add(parser, constant_id, parser->previous.start, parser->previous.end, 0); } - parse_pattern_capture(parser, captures, constant_id, &TOK2LOC(parser, &parser->previous)); + pm_location_t previous_loc = TOK2LOC(parser, &parser->previous); + parse_pattern_capture(parser, captures, constant_id, &previous_loc); pm_local_variable_target_node_t *target = pm_local_variable_target_node_create( parser, - &TOK2LOC(parser, &parser->previous), + &previous_loc, constant_id, (uint32_t) (depth == -1 ? 0 : depth) ); @@ -21459,7 +21479,9 @@ parse_regular_expression_named_capture(pm_parser_t *parser, const pm_string_t *c // Next, create the local variable target and add it to the list of // targets for the match. - pm_node_t *target = UP(pm_local_variable_target_node_create(parser, &TOK2LOC(parser, &((pm_token_t) { .type = 0, .start = start, .end = end })), name, depth == -1 ? 0 : (uint32_t) depth)); + pm_token_t token = { .type = 0, .start = start, .end = end }; + pm_location_t token_loc = TOK2LOC(parser, &token); + pm_node_t *target = UP(pm_local_variable_target_node_create(parser, &token_loc, name, depth == -1 ? 0 : (uint32_t) depth)); pm_node_list_append(parser->arena, &callback_data->match->targets, target); }