Skip to content

Commit ccfc8e2

Browse files
committed
feat: initial support for safe_kw in extern blocks
1 parent 0c37404 commit ccfc8e2

12 files changed

Lines changed: 264 additions & 9 deletions

File tree

‎src/tools/rust-analyzer/crates/hir-def/src/data.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ impl FunctionData {
148148
self.flags.contains(FnFlags::HAS_UNSAFE_KW)
149149
}
150150

151+
pubfnis_safe(&self) -> bool{
152+
self.flags.contains(FnFlags::HAS_SAFE_KW)
153+
}
154+
151155
pubfnis_varargs(&self) -> bool{
152156
self.flags.contains(FnFlags::IS_VARARGS)
153157
}

‎src/tools/rust-analyzer/crates/hir-def/src/item_tree.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,7 @@ bitflags::bitflags! {
754754
constHAS_ASYNC_KW = 1 << 4;
755755
constHAS_UNSAFE_KW = 1 << 5;
756756
constIS_VARARGS = 1 << 6;
757+
constHAS_SAFE_KW = 1 << 7;
757758
}
758759
}
759760

‎src/tools/rust-analyzer/crates/hir-def/src/item_tree/lower.rs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ impl<'a> Ctx<'a> {
440440
if func.unsafe_token().is_some(){
441441
flags |= FnFlags::HAS_UNSAFE_KW;
442442
}
443+
if func.safe_token().is_some(){
444+
flags |= FnFlags::HAS_SAFE_KW;
445+
}
443446
if has_var_args {
444447
flags |= FnFlags::IS_VARARGS;
445448
}

‎src/tools/rust-analyzer/crates/hir-def/src/item_tree/pretty.rs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,9 @@ impl Printer<'_> {
278278
if flags.contains(FnFlags::HAS_UNSAFE_KW){
279279
w!(self,"unsafe ");
280280
}
281+
if flags.contains(FnFlags::HAS_SAFE_KW){
282+
w!(self,"safe ");
283+
}
281284
ifletSome(abi) = abi {
282285
w!(self,"extern \"{}\" ", abi);
283286
}

‎src/tools/rust-analyzer/crates/hir-ty/src/utils.rs‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,12 @@ pub fn is_fn_unsafe_to_call(db: &dyn HirDatabase, func: FunctionId) -> bool {
257257
returntrue;
258258
}
259259

260-
match func.lookup(db.upcast()).container{
260+
let loc = func.lookup(db.upcast());
261+
match loc.container{
261262
hir_def::ItemContainerId::ExternBlockId(block) => {
262-
// Function in an `extern` block are always unsafe to call, except when it has
263-
// `"rust-intrinsic"` ABI there are a few exceptions.
263+
// Function in an `extern` block are always unsafe to call, except when
264+
// it is marked as `safe` or it has `"rust-intrinsic"` ABI there are a
265+
// few exceptions.
264266
let id = block.lookup(db.upcast()).id;
265267

266268
let is_intrinsic =
@@ -270,8 +272,8 @@ pub fn is_fn_unsafe_to_call(db: &dyn HirDatabase, func: FunctionId) -> bool {
270272
// Intrinsics are unsafe unless they have the rustc_safe_intrinsic attribute
271273
!data.attrs.by_key(&sym::rustc_safe_intrinsic).exists()
272274
}else{
273-
// Extern items are always unsafe
274-
true
275+
// Extern items without `safe` modifier are always unsafe
276+
!db.function_data(func).is_safe()
275277
}
276278
}
277279
_ => false,

‎src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ fn main() {
554554
r#"
555555
//- /ed2021.rs crate:ed2021 edition:2021
556556
#[rustc_deprecated_safe_2024]
557-
unsafe fn safe() -> u8 {
557+
unsafe fn safe_fn() -> u8 {
558558
0
559559
}
560560
//- /ed2024.rs crate:ed2024 edition:2024
@@ -564,7 +564,7 @@ unsafe fn not_safe() -> u8 {
564564
}
565565
//- /main.rs crate:main deps:ed2021,ed2024
566566
fn main() {
567-
ed2021::safe();
567+
ed2021::safe_fn();
568568
ed2024::not_safe();
569569
//^^^^^^^^^^^^^^^^^^💡 error: this operation is unsafe and requires an unsafe function or block
570570
}

‎src/tools/rust-analyzer/crates/parser/src/grammar/items.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@ pub(super) fn opt_item(p: &mut Parser<'_>, m: Marker) -> Result<(), Marker> {
135135
has_mods = true;
136136
}
137137

138+
if p.at(T![safe]){
139+
p.eat(T![safe]);
140+
has_mods = true;
141+
}
142+
138143
if p.at(T![extern]){
139144
has_extern = true;
140145
has_mods = true;
@@ -189,6 +194,7 @@ pub(super) fn opt_item(p: &mut Parser<'_>, m: Marker) -> Result<(), Marker> {
189194
T![fn] => fn_(p, m),
190195

191196
T![const]if p.nth(1) != T!['{'] => consts::konst(p, m),
197+
T![static]ifmatches!(p.nth(1),IDENT | T![_] | T![mut]) => consts::static_(p, m),
192198

193199
T![trait] => traits::trait_(p, m),
194200
T![impl] => traits::impl_(p, m),

‎src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ pub enum SyntaxKind {
9494
PUB_KW,
9595
REF_KW,
9696
RETURN_KW,
97+
SAFE_KW,
9798
SELF_KW,
9899
STATIC_KW,
99100
STRUCT_KW,
@@ -364,6 +365,7 @@ impl SyntaxKind {
364365
| PUB_KW
365366
| REF_KW
366367
| RETURN_KW
368+
| SAFE_KW
367369
| SELF_KW
368370
| STATIC_KW
369371
| STRUCT_KW
@@ -458,6 +460,7 @@ impl SyntaxKind {
458460
| PUB_KW
459461
| REF_KW
460462
| RETURN_KW
463+
| SAFE_KW
461464
| SELF_KW
462465
| STATIC_KW
463466
| STRUCT_KW
@@ -614,6 +617,7 @@ impl SyntaxKind {
614617
"pub" => PUB_KW,
615618
"ref" => REF_KW,
616619
"return" => RETURN_KW,
620+
"safe" => SAFE_KW,
617621
"self" => SELF_KW,
618622
"static" => STATIC_KW,
619623
"struct" => STRUCT_KW,
@@ -707,4 +711,4 @@ impl SyntaxKind {
707711
}
708712
}
709713
#[macro_export]
710-
macro_rules!T{[$] => { $ crate::SyntaxKind::DOLLAR};[;] => { $ crate::SyntaxKind::SEMICOLON};[,] => { $ crate::SyntaxKind::COMMA};['('] => { $ crate::SyntaxKind::L_PAREN};[')'] => { $ crate::SyntaxKind::R_PAREN};['{'] => { $ crate::SyntaxKind::L_CURLY};['}'] => { $ crate::SyntaxKind::R_CURLY};['['] => { $ crate::SyntaxKind::L_BRACK};[']'] => { $ crate::SyntaxKind::R_BRACK};[<] => { $ crate::SyntaxKind::L_ANGLE};[>] => { $ crate::SyntaxKind::R_ANGLE};[@] => { $ crate::SyntaxKind::AT};[#] => { $ crate::SyntaxKind::POUND};[~] => { $ crate::SyntaxKind::TILDE};[?] => { $ crate::SyntaxKind::QUESTION};[&] => { $ crate::SyntaxKind::AMP};[|] => { $ crate::SyntaxKind::PIPE};[+] => { $ crate::SyntaxKind::PLUS};[*] => { $ crate::SyntaxKind::STAR};[/] => { $ crate::SyntaxKind::SLASH};[^] => { $ crate::SyntaxKind::CARET};[%] => { $ crate::SyntaxKind::PERCENT};[_] => { $ crate::SyntaxKind::UNDERSCORE};[.] => { $ crate::SyntaxKind::DOT};[..] => { $ crate::SyntaxKind::DOT2};[...] => { $ crate::SyntaxKind::DOT3};[..=] => { $ crate::SyntaxKind::DOT2EQ};[:] => { $ crate::SyntaxKind::COLON};[::] => { $ crate::SyntaxKind::COLON2};[=] => { $ crate::SyntaxKind::EQ};[==] => { $ crate::SyntaxKind::EQ2};[=>] => { $ crate::SyntaxKind::FAT_ARROW};[!] => { $ crate::SyntaxKind::BANG};[!=] => { $ crate::SyntaxKind::NEQ};[-] => { $ crate::SyntaxKind::MINUS};[->] => { $ crate::SyntaxKind::THIN_ARROW};[<=] => { $ crate::SyntaxKind::LTEQ};[>=] => { $ crate::SyntaxKind::GTEQ};[+=] => { $ crate::SyntaxKind::PLUSEQ};[-=] => { $ crate::SyntaxKind::MINUSEQ};[|=] => { $ crate::SyntaxKind::PIPEEQ};[&=] => { $ crate::SyntaxKind::AMPEQ};[^=] => { $ crate::SyntaxKind::CARETEQ};[/=] => { $ crate::SyntaxKind::SLASHEQ};[*=] => { $ crate::SyntaxKind::STAREQ};[%=] => { $ crate::SyntaxKind::PERCENTEQ};[&&] => { $ crate::SyntaxKind::AMP2};[||] => { $ crate::SyntaxKind::PIPE2};[<<] => { $ crate::SyntaxKind::SHL};[>>] => { $ crate::SyntaxKind::SHR};[<<=] => { $ crate::SyntaxKind::SHLEQ};[>>=] => { $ crate::SyntaxKind::SHREQ};[Self] => { $ crate::SyntaxKind::SELF_TYPE_KW};[abstract] => { $ crate::SyntaxKind::ABSTRACT_KW};[as] => { $ crate::SyntaxKind::AS_KW};[become] => { $ crate::SyntaxKind::BECOME_KW};[box] => { $ crate::SyntaxKind::BOX_KW};[break] => { $ crate::SyntaxKind::BREAK_KW};[const] => { $ crate::SyntaxKind::CONST_KW};[continue] => { $ crate::SyntaxKind::CONTINUE_KW};[crate] => { $ crate::SyntaxKind::CRATE_KW};[do] => { $ crate::SyntaxKind::DO_KW};[else] => { $ crate::SyntaxKind::ELSE_KW};[enum] => { $ crate::SyntaxKind::ENUM_KW};[extern] => { $ crate::SyntaxKind::EXTERN_KW};[false] => { $ crate::SyntaxKind::FALSE_KW};[final] => { $ crate::SyntaxKind::FINAL_KW};[fn] => { $ crate::SyntaxKind::FN_KW};[for] => { $ crate::SyntaxKind::FOR_KW};[if] => { $ crate::SyntaxKind::IF_KW};[impl] => { $ crate::SyntaxKind::IMPL_KW};[in] => { $ crate::SyntaxKind::IN_KW};[let] => { $ crate::SyntaxKind::LET_KW};[loop] => { $ crate::SyntaxKind::LOOP_KW};[macro] => { $ crate::SyntaxKind::MACRO_KW};[match] => { $ crate::SyntaxKind::MATCH_KW};[mod] => { $ crate::SyntaxKind::MOD_KW};[move] => { $ crate::SyntaxKind::MOVE_KW};[mut] => { $ crate::SyntaxKind::MUT_KW};[override] => { $ crate::SyntaxKind::OVERRIDE_KW};[priv] => { $ crate::SyntaxKind::PRIV_KW};[pub] => { $ crate::SyntaxKind::PUB_KW};[ref] => { $ crate::SyntaxKind::REF_KW};[return] => { $ crate::SyntaxKind::RETURN_KW};[self] => { $ crate::SyntaxKind::SELF_KW};[static] => { $ crate::SyntaxKind::STATIC_KW};[struct] => { $ crate::SyntaxKind::STRUCT_KW};[super] => { $ crate::SyntaxKind::SUPER_KW};[trait] => { $ crate::SyntaxKind::TRAIT_KW};[true] => { $ crate::SyntaxKind::TRUE_KW};[type] => { $ crate::SyntaxKind::TYPE_KW};[typeof] => { $ crate::SyntaxKind::TYPEOF_KW};[unsafe] => { $ crate::SyntaxKind::UNSAFE_KW};[unsized] => { $ crate::SyntaxKind::UNSIZED_KW};[use] => { $ crate::SyntaxKind::USE_KW};[virtual] => { $ crate::SyntaxKind::VIRTUAL_KW};[where] => { $ crate::SyntaxKind::WHERE_KW};[while] => { $ crate::SyntaxKind::WHILE_KW};[yield] => { $ crate::SyntaxKind::YIELD_KW};[asm] => { $ crate::SyntaxKind::ASM_KW};[att_syntax] => { $ crate::SyntaxKind::ATT_SYNTAX_KW};[auto] => { $ crate::SyntaxKind::AUTO_KW};[builtin] => { $ crate::SyntaxKind::BUILTIN_KW};[clobber_abi] => { $ crate::SyntaxKind::CLOBBER_ABI_KW};[default] => { $ crate::SyntaxKind::DEFAULT_KW};[dyn] => { $ crate::SyntaxKind::DYN_KW};[format_args] => { $ crate::SyntaxKind::FORMAT_ARGS_KW};[inlateout] => { $ crate::SyntaxKind::INLATEOUT_KW};[inout] => { $ crate::SyntaxKind::INOUT_KW};[label] => { $ crate::SyntaxKind::LABEL_KW};[lateout] => { $ crate::SyntaxKind::LATEOUT_KW};[macro_rules] => { $ crate::SyntaxKind::MACRO_RULES_KW};[may_unwind] => { $ crate::SyntaxKind::MAY_UNWIND_KW};[nomem] => { $ crate::SyntaxKind::NOMEM_KW};[noreturn] => { $ crate::SyntaxKind::NORETURN_KW};[nostack] => { $ crate::SyntaxKind::NOSTACK_KW};[offset_of] => { $ crate::SyntaxKind::OFFSET_OF_KW};[options] => { $ crate::SyntaxKind::OPTIONS_KW};[out] => { $ crate::SyntaxKind::OUT_KW};[preserves_flags] => { $ crate::SyntaxKind::PRESERVES_FLAGS_KW};[pure] => { $ crate::SyntaxKind::PURE_KW};[raw] => { $ crate::SyntaxKind::RAW_KW};[readonly] => { $ crate::SyntaxKind::READONLY_KW};[sym] => { $ crate::SyntaxKind::SYM_KW};[union] => { $ crate::SyntaxKind::UNION_KW};[yeet] => { $ crate::SyntaxKind::YEET_KW};[async] => { $ crate::SyntaxKind::ASYNC_KW};[await] => { $ crate::SyntaxKind::AWAIT_KW};[dyn] => { $ crate::SyntaxKind::DYN_KW};[gen] => { $ crate::SyntaxKind::GEN_KW};[try] => { $ crate::SyntaxKind::TRY_KW};[lifetime_ident] => { $ crate::SyntaxKind::LIFETIME_IDENT};[int_number] => { $ crate::SyntaxKind::INT_NUMBER};[ident] => { $ crate::SyntaxKind::IDENT};[string] => { $ crate::SyntaxKind::STRING};[shebang] => { $ crate::SyntaxKind::SHEBANG};}
714+
macro_rules!T{[$] => { $ crate::SyntaxKind::DOLLAR};[;] => { $ crate::SyntaxKind::SEMICOLON};[,] => { $ crate::SyntaxKind::COMMA};['('] => { $ crate::SyntaxKind::L_PAREN};[')'] => { $ crate::SyntaxKind::R_PAREN};['{'] => { $ crate::SyntaxKind::L_CURLY};['}'] => { $ crate::SyntaxKind::R_CURLY};['['] => { $ crate::SyntaxKind::L_BRACK};[']'] => { $ crate::SyntaxKind::R_BRACK};[<] => { $ crate::SyntaxKind::L_ANGLE};[>] => { $ crate::SyntaxKind::R_ANGLE};[@] => { $ crate::SyntaxKind::AT};[#] => { $ crate::SyntaxKind::POUND};[~] => { $ crate::SyntaxKind::TILDE};[?] => { $ crate::SyntaxKind::QUESTION};[&] => { $ crate::SyntaxKind::AMP};[|] => { $ crate::SyntaxKind::PIPE};[+] => { $ crate::SyntaxKind::PLUS};[*] => { $ crate::SyntaxKind::STAR};[/] => { $ crate::SyntaxKind::SLASH};[^] => { $ crate::SyntaxKind::CARET};[%] => { $ crate::SyntaxKind::PERCENT};[_] => { $ crate::SyntaxKind::UNDERSCORE};[.] => { $ crate::SyntaxKind::DOT};[..] => { $ crate::SyntaxKind::DOT2};[...] => { $ crate::SyntaxKind::DOT3};[..=] => { $ crate::SyntaxKind::DOT2EQ};[:] => { $ crate::SyntaxKind::COLON};[::] => { $ crate::SyntaxKind::COLON2};[=] => { $ crate::SyntaxKind::EQ};[==] => { $ crate::SyntaxKind::EQ2};[=>] => { $ crate::SyntaxKind::FAT_ARROW};[!] => { $ crate::SyntaxKind::BANG};[!=] => { $ crate::SyntaxKind::NEQ};[-] => { $ crate::SyntaxKind::MINUS};[->] => { $ crate::SyntaxKind::THIN_ARROW};[<=] => { $ crate::SyntaxKind::LTEQ};[>=] => { $ crate::SyntaxKind::GTEQ};[+=] => { $ crate::SyntaxKind::PLUSEQ};[-=] => { $ crate::SyntaxKind::MINUSEQ};[|=] => { $ crate::SyntaxKind::PIPEEQ};[&=] => { $ crate::SyntaxKind::AMPEQ};[^=] => { $ crate::SyntaxKind::CARETEQ};[/=] => { $ crate::SyntaxKind::SLASHEQ};[*=] => { $ crate::SyntaxKind::STAREQ};[%=] => { $ crate::SyntaxKind::PERCENTEQ};[&&] => { $ crate::SyntaxKind::AMP2};[||] => { $ crate::SyntaxKind::PIPE2};[<<] => { $ crate::SyntaxKind::SHL};[>>] => { $ crate::SyntaxKind::SHR};[<<=] => { $ crate::SyntaxKind::SHLEQ};[>>=] => { $ crate::SyntaxKind::SHREQ};[Self] => { $ crate::SyntaxKind::SELF_TYPE_KW};[abstract] => { $ crate::SyntaxKind::ABSTRACT_KW};[as] => { $ crate::SyntaxKind::AS_KW};[become] => { $ crate::SyntaxKind::BECOME_KW};[box] => { $ crate::SyntaxKind::BOX_KW};[break] => { $ crate::SyntaxKind::BREAK_KW};[const] => { $ crate::SyntaxKind::CONST_KW};[continue] => { $ crate::SyntaxKind::CONTINUE_KW};[crate] => { $ crate::SyntaxKind::CRATE_KW};[do] => { $ crate::SyntaxKind::DO_KW};[else] => { $ crate::SyntaxKind::ELSE_KW};[enum] => { $ crate::SyntaxKind::ENUM_KW};[extern] => { $ crate::SyntaxKind::EXTERN_KW};[false] => { $ crate::SyntaxKind::FALSE_KW};[final] => { $ crate::SyntaxKind::FINAL_KW};[fn] => { $ crate::SyntaxKind::FN_KW};[for] => { $ crate::SyntaxKind::FOR_KW};[if] => { $ crate::SyntaxKind::IF_KW};[impl] => { $ crate::SyntaxKind::IMPL_KW};[in] => { $ crate::SyntaxKind::IN_KW};[let] => { $ crate::SyntaxKind::LET_KW};[loop] => { $ crate::SyntaxKind::LOOP_KW};[macro] => { $ crate::SyntaxKind::MACRO_KW};[match] => { $ crate::SyntaxKind::MATCH_KW};[mod] => { $ crate::SyntaxKind::MOD_KW};[move] => { $ crate::SyntaxKind::MOVE_KW};[mut] => { $ crate::SyntaxKind::MUT_KW};[override] => { $ crate::SyntaxKind::OVERRIDE_KW};[priv] => { $ crate::SyntaxKind::PRIV_KW};[pub] => { $ crate::SyntaxKind::PUB_KW};[ref] => { $ crate::SyntaxKind::REF_KW};[return] => { $ crate::SyntaxKind::RETURN_KW};[safe] => { $ crate::SyntaxKind::SAFE_KW};[self] => { $ crate::SyntaxKind::SELF_KW};[static] => { $ crate::SyntaxKind::STATIC_KW};[struct] => { $ crate::SyntaxKind::STRUCT_KW};[super] => { $ crate::SyntaxKind::SUPER_KW};[trait] => { $ crate::SyntaxKind::TRAIT_KW};[true] => { $ crate::SyntaxKind::TRUE_KW};[type] => { $ crate::SyntaxKind::TYPE_KW};[typeof] => { $ crate::SyntaxKind::TYPEOF_KW};[unsafe] => { $ crate::SyntaxKind::UNSAFE_KW};[unsized] => { $ crate::SyntaxKind::UNSIZED_KW};[use] => { $ crate::SyntaxKind::USE_KW};[virtual] => { $ crate::SyntaxKind::VIRTUAL_KW};[where] => { $ crate::SyntaxKind::WHERE_KW};[while] => { $ crate::SyntaxKind::WHILE_KW};[yield] => { $ crate::SyntaxKind::YIELD_KW};[asm] => { $ crate::SyntaxKind::ASM_KW};[att_syntax] => { $ crate::SyntaxKind::ATT_SYNTAX_KW};[auto] => { $ crate::SyntaxKind::AUTO_KW};[builtin] => { $ crate::SyntaxKind::BUILTIN_KW};[clobber_abi] => { $ crate::SyntaxKind::CLOBBER_ABI_KW};[default] => { $ crate::SyntaxKind::DEFAULT_KW};[dyn] => { $ crate::SyntaxKind::DYN_KW};[format_args] => { $ crate::SyntaxKind::FORMAT_ARGS_KW};[inlateout] => { $ crate::SyntaxKind::INLATEOUT_KW};[inout] => { $ crate::SyntaxKind::INOUT_KW};[label] => { $ crate::SyntaxKind::LABEL_KW};[lateout] => { $ crate::SyntaxKind::LATEOUT_KW};[macro_rules] => { $ crate::SyntaxKind::MACRO_RULES_KW};[may_unwind] => { $ crate::SyntaxKind::MAY_UNWIND_KW};[nomem] => { $ crate::SyntaxKind::NOMEM_KW};[noreturn] => { $ crate::SyntaxKind::NORETURN_KW};[nostack] => { $ crate::SyntaxKind::NOSTACK_KW};[offset_of] => { $ crate::SyntaxKind::OFFSET_OF_KW};[options] => { $ crate::SyntaxKind::OPTIONS_KW};[out] => { $ crate::SyntaxKind::OUT_KW};[preserves_flags] => { $ crate::SyntaxKind::PRESERVES_FLAGS_KW};[pure] => { $ crate::SyntaxKind::PURE_KW};[raw] => { $ crate::SyntaxKind::RAW_KW};[readonly] => { $ crate::SyntaxKind::READONLY_KW};[sym] => { $ crate::SyntaxKind::SYM_KW};[union] => { $ crate::SyntaxKind::UNION_KW};[yeet] => { $ crate::SyntaxKind::YEET_KW};[async] => { $ crate::SyntaxKind::ASYNC_KW};[await] => { $ crate::SyntaxKind::AWAIT_KW};[dyn] => { $ crate::SyntaxKind::DYN_KW};[gen] => { $ crate::SyntaxKind::GEN_KW};[try] => { $ crate::SyntaxKind::TRY_KW};[lifetime_ident] => { $ crate::SyntaxKind::LIFETIME_IDENT};[int_number] => { $ crate::SyntaxKind::INT_NUMBER};[ident] => { $ crate::SyntaxKind::IDENT};[string] => { $ crate::SyntaxKind::STRING};[shebang] => { $ crate::SyntaxKind::SHEBANG};}

0 commit comments

Comments
 (0)