[ruby/prism] Accept version shorthand like 3.4
https://github.com/ruby/prism/commit/098f1c4607
This commit is contained in:
parent
e02a6097e6
commit
414a848cc6
@ -416,9 +416,9 @@ module Prism
|
|||||||
case version
|
case version
|
||||||
when nil, "latest"
|
when nil, "latest"
|
||||||
0
|
0
|
||||||
when /\A3\.3\.\d+\z/
|
when /\A3\.3(\.\d+)?\z/
|
||||||
1
|
1
|
||||||
when /\A3\.4\.\d+\z/
|
when /\A3\.4(\.\d+)?\z/
|
||||||
0
|
0
|
||||||
else
|
else
|
||||||
raise ArgumentError, "invalid version: #{version}"
|
raise ArgumentError, "invalid version: #{version}"
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#include "prism/options.h"
|
#include "prism/options.h"
|
||||||
#include "prism/util/pm_char.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the shebang callback option on the given options struct.
|
* Set the shebang callback option on the given options struct.
|
||||||
@ -58,7 +57,11 @@ pm_options_command_line_set(pm_options_t *options, uint8_t command_line) {
|
|||||||
options->command_line = command_line;
|
options->command_line = command_line;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_number(const char *string, size_t length) {
|
/**
|
||||||
|
* Checks if the given slice represents a number.
|
||||||
|
*/
|
||||||
|
static inline bool
|
||||||
|
is_number(const char *string, size_t length) {
|
||||||
return pm_strspn_decimal_digit((const uint8_t *) string, (ptrdiff_t) length) == length;
|
return pm_strspn_decimal_digit((const uint8_t *) string, (ptrdiff_t) length) == length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,6 +77,20 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (length == 3) {
|
||||||
|
if (strncmp(version, "3.3", 3) == 0) {
|
||||||
|
options->version = PM_OPTIONS_VERSION_CRUBY_3_3;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(version, "3.4", 3) == 0) {
|
||||||
|
options->version = PM_OPTIONS_VERSION_LATEST;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (length >= 4) {
|
if (length >= 4) {
|
||||||
if (strncmp(version, "3.3.", 4) == 0 && is_number(version + 4, length - 4)) {
|
if (strncmp(version, "3.3.", 4) == 0 && is_number(version + 4, length - 4)) {
|
||||||
options->version = PM_OPTIONS_VERSION_CRUBY_3_3;
|
options->version = PM_OPTIONS_VERSION_CRUBY_3_3;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#define PRISM_OPTIONS_H
|
#define PRISM_OPTIONS_H
|
||||||
|
|
||||||
#include "prism/defines.h"
|
#include "prism/defines.h"
|
||||||
|
#include "prism/util/pm_char.h"
|
||||||
#include "prism/util/pm_string.h"
|
#include "prism/util/pm_string.h"
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
@ -104,6 +104,39 @@ module Prism
|
|||||||
assert Prism.parse_success?("yield", partial_script: true)
|
assert Prism.parse_success?("yield", partial_script: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_version
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.3")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.3.0")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.3.1")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.3.9")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.3.10")
|
||||||
|
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.4")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.4.0")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.4.9")
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "3.4.10")
|
||||||
|
|
||||||
|
assert Prism.parse_success?("1 + 1", version: "latest")
|
||||||
|
|
||||||
|
# Test edge case
|
||||||
|
error = assert_raise(ArgumentError) { Prism.parse("1 + 1", version: "latest2") }
|
||||||
|
assert_equal "invalid version: latest2", error.message
|
||||||
|
|
||||||
|
assert_raise ArgumentError do
|
||||||
|
Prism.parse("1 + 1", version: "3.3.a")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Not supported version (too old)
|
||||||
|
assert_raise ArgumentError do
|
||||||
|
Prism.parse("1 + 1", version: "3.2.0")
|
||||||
|
end
|
||||||
|
|
||||||
|
# Not supported version (too new)
|
||||||
|
assert_raise ArgumentError do
|
||||||
|
Prism.parse("1 + 1", version: "3.5.0")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def find_source_file_node(program)
|
def find_source_file_node(program)
|
||||||
|
@ -7,43 +7,5 @@ module Prism
|
|||||||
def test_prism_version_is_set
|
def test_prism_version_is_set
|
||||||
refute_nil VERSION
|
refute_nil VERSION
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_syntax_versions
|
|
||||||
assert Prism.parse("1 + 1", version: "3.3.0").success?
|
|
||||||
assert Prism.parse("1 + 1", version: "3.3.1").success?
|
|
||||||
assert Prism.parse("1 + 1", version: "3.3.9").success?
|
|
||||||
assert Prism.parse("1 + 1", version: "3.3.10").success?
|
|
||||||
|
|
||||||
assert Prism.parse("1 + 1", version: "3.4.0").success?
|
|
||||||
assert Prism.parse("1 + 1", version: "3.4.9").success?
|
|
||||||
assert Prism.parse("1 + 1", version: "3.4.10").success?
|
|
||||||
|
|
||||||
assert Prism.parse("1 + 1", version: "latest").success?
|
|
||||||
|
|
||||||
# Test edge case
|
|
||||||
error = assert_raise ArgumentError do
|
|
||||||
Prism.parse("1 + 1", version: "latest2")
|
|
||||||
end
|
|
||||||
assert_equal "invalid version: latest2", error.message
|
|
||||||
|
|
||||||
assert_raise ArgumentError do
|
|
||||||
Prism.parse("1 + 1", version: "3.3.a")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Not supported version syntax
|
|
||||||
assert_raise ArgumentError do
|
|
||||||
Prism.parse("1 + 1", version: "3.3")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Not supported version (too old)
|
|
||||||
assert_raise ArgumentError do
|
|
||||||
Prism.parse("1 + 1", version: "3.2.0")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Not supported version (too new)
|
|
||||||
assert_raise ArgumentError do
|
|
||||||
Prism.parse("1 + 1", version: "3.5.0")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user