diff --git a/Cargo.lock b/Cargo.lock index 146c2befe5..a7b9760a63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1056,9 +1056,11 @@ dependencies = [ name = "deno_ops" version = "0.17.0" dependencies = [ + "once_cell", "proc-macro-crate", "proc-macro2 1.0.38", "quote 1.0.18", + "regex", "syn 1.0.93", ] diff --git a/ops/Cargo.toml b/ops/Cargo.toml index 83c13c3ee6..eb98218d52 100644 --- a/ops/Cargo.toml +++ b/ops/Cargo.toml @@ -11,7 +11,9 @@ path = "./lib.rs" proc-macro = true [dependencies] +once_cell = "1.10.0" proc-macro-crate = "1.1.3" proc-macro2 = "1" quote = "1" +regex = "1.5.6" syn = { version = "1", features = ["full", "extra-traits"] } diff --git a/ops/lib.rs b/ops/lib.rs index f5af772fec..44ea1c6779 100644 --- a/ops/lib.rs +++ b/ops/lib.rs @@ -1,4 +1,5 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. +use once_cell::sync::Lazy; use proc_macro::TokenStream; use proc_macro2::Span; use proc_macro2::TokenStream as TokenStream2; @@ -6,6 +7,7 @@ use proc_macro_crate::crate_name; use proc_macro_crate::FoundCrate; use quote::quote; use quote::ToTokens; +use regex::Regex; use syn::punctuated::Punctuated; use syn::token::Comma; use syn::FnArg; @@ -412,23 +414,24 @@ fn is_unit_result(ty: impl ToTokens) -> bool { } fn is_mut_ref_opstate(arg: &syn::FnArg) -> bool { - tokens(arg).ends_with(": & mut OpState") - || tokens(arg).ends_with(": & mut deno_core :: OpState") - || tokens(arg).ends_with("mut OpState") + static RE: Lazy = + Lazy::new(|| Regex::new(r#": & mut (?:deno_core :: )?OpState$"#).unwrap()); + RE.is_match(&tokens(arg)) } fn is_rc_refcell_opstate(arg: &syn::FnArg) -> bool { - tokens(arg).ends_with(": Rc < RefCell < OpState > >") - || tokens(arg).ends_with(": Rc < RefCell < deno_core :: OpState > >") + static RE: Lazy = Lazy::new(|| { + Regex::new(r#": Rc < RefCell < (?:deno_core :: )?OpState > >$"#).unwrap() + }); + RE.is_match(&tokens(arg)) } fn is_handle_scope(arg: &syn::FnArg) -> bool { - tokens(arg).ends_with(": & mut v8 :: HandleScope") - || tokens(arg).ends_with(": & mut v8 :: HandleScope < 'a >") - || tokens(arg).ends_with(": & mut deno_core :: v8 :: HandleScope") - || tokens(arg).ends_with(": & mut deno_core :: v8 :: HandleScope < 'a >") - || tokens(arg).contains("mut v8 :: HandleScope") - || tokens(arg).ends_with(": & mut v8 :: HandeScope < 'scope >") + static RE: Lazy = Lazy::new(|| { + Regex::new(r#": & mut (?:deno_core :: )?v8 :: HandleScope(?: < '\w+ >)?$"#) + .unwrap() + }); + RE.is_match(&tokens(arg)) } fn is_future(ty: impl ToTokens) -> bool {