From bb7fb5e5ce9e0fc09da3e5a1086561f0a9e2adb4 Mon Sep 17 00:00:00 2001 From: Yiffy Dev Date: Wed, 30 Oct 2024 16:33:50 +0500 Subject: [PATCH] first-approach implementation of nesting selectors --- examples/use-styles/Cargo.lock | 8 +++--- examples/use-styles/src/main.rs | 4 +++ sabry_intrnl/src/scoper/mod.rs | 2 +- sabry_procmacro_impl/src/impls/styly.rs | 33 +++++++++++++++++++++++-- 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/examples/use-styles/Cargo.lock b/examples/use-styles/Cargo.lock index 7e7c03c..00f3e98 100644 --- a/examples/use-styles/Cargo.lock +++ b/examples/use-styles/Cargo.lock @@ -1003,7 +1003,7 @@ dependencies = [ [[package]] name = "sabry_build" -version = "0.0.0" +version = "0.0.1" dependencies = [ "proc-macro2", "sabry_intrnl", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "sabry_intrnl" -version = "0.0.0" +version = "0.0.1" dependencies = [ "base64", "blake3", @@ -1033,14 +1033,14 @@ dependencies = [ [[package]] name = "sabry_procmacro" -version = "0.0.0" +version = "0.0.1" dependencies = [ "sabry_procmacro_impl", ] [[package]] name = "sabry_procmacro_impl" -version = "0.0.0" +version = "0.0.1" dependencies = [ "proc-macro2", "quote", diff --git a/examples/use-styles/src/main.rs b/examples/use-styles/src/main.rs index 6751b2c..6cdf59d 100644 --- a/examples/use-styles/src/main.rs +++ b/examples/use-styles/src/main.rs @@ -5,6 +5,9 @@ styly!(pub const bundlemod { .someth { @include tokens.clickable; background-color: black; + &-dark { + background-color: white; + } } }); @@ -13,5 +16,6 @@ styly!(pub const filemod:sass "src/main.sass"); fn main(){ println!("someth class codemod styles: {}", bundlemod::someth); println!("someth class filemod styles: {}", filemod::someth); + println!("someth-dark selector will be: {}", bundlemod::_dark(bundlemod::someth)); println!("Thats how we used the styles! Good luck!!"); } diff --git a/sabry_intrnl/src/scoper/mod.rs b/sabry_intrnl/src/scoper/mod.rs index 824aed7..658e8f0 100644 --- a/sabry_intrnl/src/scoper/mod.rs +++ b/sabry_intrnl/src/scoper/mod.rs @@ -294,7 +294,7 @@ impl ScopedSelector { } } -fn apply_basic_rusty_member_gen_rules(source: &str) -> String { +pub fn apply_basic_rusty_member_gen_rules(source: &str) -> String { let omit_regex = Regex::new(r"(^\-)|(\-$)|[^a-zA-Z0-9\-\_]") .expect("BUG: can not build omition regex for rusty member generation"); diff --git a/sabry_procmacro_impl/src/impls/styly.rs b/sabry_procmacro_impl/src/impls/styly.rs index 9d6b0ed..56a977c 100644 --- a/sabry_procmacro_impl/src/impls/styly.rs +++ b/sabry_procmacro_impl/src/impls/styly.rs @@ -3,7 +3,7 @@ use quote::quote; use sabry_intrnl::{ compiler::CompilerAdapter, config::SabryConfig, - scoper::{ArbitraryScope, ScopedSelector}, + scoper::{apply_basic_rusty_member_gen_rules, ArbitraryScope, ScopedSelector}, }; use syn::{parse::Parse, Ident, Token}; @@ -67,7 +67,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { match ms.generator { ScopeGenerator::Module { public, constant } => { let scope_hash = scope.hash.as_str(); - let scope_ident = scope.original_scope.name; + let scope_ident = scope.original_scope.name.clone(); let scope_wrapper_ident = syn::parse_str::(&scope_ident.to_string().to_uppercase()) .expect("BUG: We just converted valid Ident to string and uppercased"); @@ -77,6 +77,33 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { quote! {} }; + let nests = scope.original_scope.adapter().nesting_selectors(); + let special_nesting_members = nests + .iter() + .filter_map(|ns| { + ns.suffix.clone().and_then(|s| { + let interp = s + .as_sass_interpolated() + .and_then(|i| i.elements.first()) + .and_then(|e| e.as_static()) + .and_then(|s| Some(s.raw.to_string())); + + interp + }) + }) + .map(|s| { + let ident = apply_basic_rusty_member_gen_rules(&s); + let fnident = syn::parse_str::(format!("_{ident}").as_str()) + .expect("BUG: invalid ident for nesting selector formed"); + let formatstr = format!("{{c}}{}", &s); + let doc = format!("Nesting selector. Originated from '&{s}'"); + + quote! { + #[doc = #doc] + pub fn #fnident(c: &str) -> String {format!(#formatstr)} + } + }); + let scope_members = scope .hashed_selectors .iter() @@ -133,6 +160,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { #[doc = #mod_docs] #scope_vis mod #scope_ident { #(#scope_members)* + #(#special_nesting_members)* } } } else { @@ -142,6 +170,7 @@ pub fn styly_macro_impl(input: TokenStream) -> TokenStream { #[doc = #mod_docs] #scope_vis mod #scope_ident { #(#scope_members)* + #(#special_nesting_members)* } } }