|
42 | 42 | #include "rust-early-name-resolver.h"
|
43 | 43 | #include "rust-cfg-strip.h"
|
44 | 44 | #include "rust-expand-visitor.h"
|
| 45 | +#include "rust-unicode.h" |
45 | 46 |
|
46 | 47 | #include "diagnostic.h"
|
47 | 48 | #include "input.h"
|
@@ -113,24 +114,32 @@ infer_crate_name (const std::string &filename)
|
113 | 114 | static bool
|
114 | 115 | validate_crate_name (const std::string &crate_name, Error &error)
|
115 | 116 | {
|
116 |
| - if (crate_name.empty ()) |
| 117 | + Utf8String utf8_name = {crate_name}; |
| 118 | + auto uchars = utf8_name.get_chars (); |
| 119 | + |
| 120 | + if (!uchars.has_value ()) |
| 121 | + { |
| 122 | + error = Error (UNDEF_LOCATION, "crate name is not a valid UTF-8 string"); |
| 123 | + return false; |
| 124 | + } |
| 125 | + if (uchars.value ().empty ()) |
117 | 126 | {
|
118 | 127 | error = Error (UNDEF_LOCATION, "crate name cannot be empty");
|
119 | 128 | return false;
|
120 | 129 | }
|
121 |
| - if (crate_name.length () > kMaxNameLength) |
| 130 | + if (uchars.value ().size () > kMaxNameLength) |
122 | 131 | {
|
123 | 132 | error = Error (UNDEF_LOCATION, "crate name cannot exceed %lu characters",
|
124 | 133 | (unsigned long) kMaxNameLength);
|
125 | 134 | return false;
|
126 | 135 | }
|
127 |
| - for (auto &c : crate_name) |
| 136 | + for (Codepoint &c : uchars.value ()) |
128 | 137 | {
|
129 |
| - if (!(ISALNUM (c) || c == '_')) |
| 138 | + if (!(is_alphabetic (c.value) || is_numeric (c.value) || c.value == '_')) |
130 | 139 | {
|
131 | 140 | error = Error (UNDEF_LOCATION,
|
132 |
| - "invalid character %<%c%> in crate name: %<%s%>", c, |
133 |
| - crate_name.c_str ()); |
| 141 | + "invalid character %<%s%> in crate name: %<%s%>", |
| 142 | + c.as_string ().c_str (), crate_name.c_str ()); |
134 | 143 | return false;
|
135 | 144 | }
|
136 | 145 | }
|
@@ -1230,13 +1239,16 @@ rust_crate_name_validation_test (void)
|
1230 | 1239 | ASSERT_TRUE (Rust::validate_crate_name ("example", error));
|
1231 | 1240 | ASSERT_TRUE (Rust::validate_crate_name ("abcdefg_1234", error));
|
1232 | 1241 | ASSERT_TRUE (Rust::validate_crate_name ("1", error));
|
1233 |
| - // FIXME: The next test does not pass as of current implementation |
1234 |
| - // ASSERT_TRUE (Rust::CompileOptions::validate_crate_name ("惊吓")); |
| 1242 | + ASSERT_TRUE (Rust::validate_crate_name ("クレート", error)); |
| 1243 | + ASSERT_TRUE (Rust::validate_crate_name ("Sōkrátēs", error)); |
| 1244 | + |
1235 | 1245 | // NOTE: - is not allowed in the crate name ...
|
1236 | 1246 |
|
1237 | 1247 | ASSERT_FALSE (Rust::validate_crate_name ("abcdefg-1234", error));
|
1238 | 1248 | ASSERT_FALSE (Rust::validate_crate_name ("a+b", error));
|
1239 | 1249 | ASSERT_FALSE (Rust::validate_crate_name ("/a+b/", error));
|
| 1250 | + ASSERT_FALSE (Rust::validate_crate_name ("😸++", error)); |
| 1251 | + ASSERT_FALSE (Rust::validate_crate_name ("∀", error)); |
1240 | 1252 |
|
1241 | 1253 | /* Tests for crate name inference */
|
1242 | 1254 | ASSERT_EQ (Rust::infer_crate_name ("c.rs"), "c");
|
|
0 commit comments