From 8c23ec046e2480ee82002f0ccc968e2ae6e727ad Mon Sep 17 00:00:00 2001 From: Connor Skees Date: Sat, 25 Jul 2020 20:05:46 -0400 Subject: [PATCH] allow loading of builtin modules --- src/builtin/{ => functions}/color/hsl.rs | 0 src/builtin/{ => functions}/color/mod.rs | 0 src/builtin/{ => functions}/color/opacity.rs | 0 src/builtin/{ => functions}/color/other.rs | 0 src/builtin/{ => functions}/color/rgb.rs | 0 src/builtin/{ => functions}/list.rs | 0 src/builtin/{ => functions}/macros.rs | 0 src/builtin/{ => functions}/map.rs | 0 src/builtin/{ => functions}/math.rs | 0 src/builtin/{ => functions}/meta.rs | 0 src/builtin/functions/mod.rs | 60 ++++++++++++++++++ src/builtin/{ => functions}/selector.rs | 0 src/builtin/{ => functions}/string.rs | 0 src/builtin/mod.rs | 63 ++----------------- src/builtin/modules/color.rs | 3 + src/builtin/modules/list.rs | 3 + src/builtin/modules/map.rs | 3 + src/builtin/modules/math.rs | 3 + src/builtin/modules/meta.rs | 3 + src/builtin/modules/mod.rs | 64 ++++++++++++++++++++ src/builtin/modules/selector.rs | 3 + src/builtin/modules/string.rs | 3 + src/parse/mod.rs | 33 ++++++---- 23 files changed, 171 insertions(+), 70 deletions(-) rename src/builtin/{ => functions}/color/hsl.rs (100%) rename src/builtin/{ => functions}/color/mod.rs (100%) rename src/builtin/{ => functions}/color/opacity.rs (100%) rename src/builtin/{ => functions}/color/other.rs (100%) rename src/builtin/{ => functions}/color/rgb.rs (100%) rename src/builtin/{ => functions}/list.rs (100%) rename src/builtin/{ => functions}/macros.rs (100%) rename src/builtin/{ => functions}/map.rs (100%) rename src/builtin/{ => functions}/math.rs (100%) rename src/builtin/{ => functions}/meta.rs (100%) create mode 100644 src/builtin/functions/mod.rs rename src/builtin/{ => functions}/selector.rs (100%) rename src/builtin/{ => functions}/string.rs (100%) create mode 100644 src/builtin/modules/color.rs create mode 100644 src/builtin/modules/list.rs create mode 100644 src/builtin/modules/map.rs create mode 100644 src/builtin/modules/math.rs create mode 100644 src/builtin/modules/meta.rs create mode 100644 src/builtin/modules/mod.rs create mode 100644 src/builtin/modules/selector.rs create mode 100644 src/builtin/modules/string.rs diff --git a/src/builtin/color/hsl.rs b/src/builtin/functions/color/hsl.rs similarity index 100% rename from src/builtin/color/hsl.rs rename to src/builtin/functions/color/hsl.rs diff --git a/src/builtin/color/mod.rs b/src/builtin/functions/color/mod.rs similarity index 100% rename from src/builtin/color/mod.rs rename to src/builtin/functions/color/mod.rs diff --git a/src/builtin/color/opacity.rs b/src/builtin/functions/color/opacity.rs similarity index 100% rename from src/builtin/color/opacity.rs rename to src/builtin/functions/color/opacity.rs diff --git a/src/builtin/color/other.rs b/src/builtin/functions/color/other.rs similarity index 100% rename from src/builtin/color/other.rs rename to src/builtin/functions/color/other.rs diff --git a/src/builtin/color/rgb.rs b/src/builtin/functions/color/rgb.rs similarity index 100% rename from src/builtin/color/rgb.rs rename to src/builtin/functions/color/rgb.rs diff --git a/src/builtin/list.rs b/src/builtin/functions/list.rs similarity index 100% rename from src/builtin/list.rs rename to src/builtin/functions/list.rs diff --git a/src/builtin/macros.rs b/src/builtin/functions/macros.rs similarity index 100% rename from src/builtin/macros.rs rename to src/builtin/functions/macros.rs diff --git a/src/builtin/map.rs b/src/builtin/functions/map.rs similarity index 100% rename from src/builtin/map.rs rename to src/builtin/functions/map.rs diff --git a/src/builtin/math.rs b/src/builtin/functions/math.rs similarity index 100% rename from src/builtin/math.rs rename to src/builtin/functions/math.rs diff --git a/src/builtin/meta.rs b/src/builtin/functions/meta.rs similarity index 100% rename from src/builtin/meta.rs rename to src/builtin/functions/meta.rs diff --git a/src/builtin/functions/mod.rs b/src/builtin/functions/mod.rs new file mode 100644 index 0000000..4ec4354 --- /dev/null +++ b/src/builtin/functions/mod.rs @@ -0,0 +1,60 @@ +// A reference to the parser is only necessary for some functions +#![allow(unused_variables)] + +use std::{ + collections::HashMap, + sync::atomic::{AtomicUsize, Ordering}, +}; + +use once_cell::sync::Lazy; + +use crate::{args::CallArgs, error::SassResult, parse::Parser, value::Value}; + +#[macro_use] +mod macros; + +mod color; +mod list; +mod map; +mod math; +mod meta; +mod selector; +mod string; + +pub(crate) type GlobalFunctionMap = HashMap<&'static str, Builtin>; + +static FUNCTION_COUNT: AtomicUsize = AtomicUsize::new(0); + +// TODO: impl Fn +#[derive(Clone)] +pub(crate) struct Builtin( + pub fn(CallArgs, &mut Parser<'_>) -> SassResult, + usize, +); + +impl Builtin { + pub fn new(body: fn(CallArgs, &mut Parser<'_>) -> SassResult) -> Builtin { + let count = FUNCTION_COUNT.fetch_add(1, Ordering::Relaxed); + Self(body, count) + } +} + +impl PartialEq for Builtin { + fn eq(&self, other: &Self) -> bool { + self.1 == other.1 + } +} + +impl Eq for Builtin {} + +pub(crate) static GLOBAL_FUNCTIONS: Lazy = Lazy::new(|| { + let mut m = HashMap::new(); + color::declare(&mut m); + list::declare(&mut m); + map::declare(&mut m); + math::declare(&mut m); + meta::declare(&mut m); + selector::declare(&mut m); + string::declare(&mut m); + m +}); diff --git a/src/builtin/selector.rs b/src/builtin/functions/selector.rs similarity index 100% rename from src/builtin/selector.rs rename to src/builtin/functions/selector.rs diff --git a/src/builtin/string.rs b/src/builtin/functions/string.rs similarity index 100% rename from src/builtin/string.rs rename to src/builtin/functions/string.rs diff --git a/src/builtin/mod.rs b/src/builtin/mod.rs index 4ec4354..18bd1bf 100644 --- a/src/builtin/mod.rs +++ b/src/builtin/mod.rs @@ -1,60 +1,5 @@ -// A reference to the parser is only necessary for some functions -#![allow(unused_variables)] +mod functions; +mod modules; -use std::{ - collections::HashMap, - sync::atomic::{AtomicUsize, Ordering}, -}; - -use once_cell::sync::Lazy; - -use crate::{args::CallArgs, error::SassResult, parse::Parser, value::Value}; - -#[macro_use] -mod macros; - -mod color; -mod list; -mod map; -mod math; -mod meta; -mod selector; -mod string; - -pub(crate) type GlobalFunctionMap = HashMap<&'static str, Builtin>; - -static FUNCTION_COUNT: AtomicUsize = AtomicUsize::new(0); - -// TODO: impl Fn -#[derive(Clone)] -pub(crate) struct Builtin( - pub fn(CallArgs, &mut Parser<'_>) -> SassResult, - usize, -); - -impl Builtin { - pub fn new(body: fn(CallArgs, &mut Parser<'_>) -> SassResult) -> Builtin { - let count = FUNCTION_COUNT.fetch_add(1, Ordering::Relaxed); - Self(body, count) - } -} - -impl PartialEq for Builtin { - fn eq(&self, other: &Self) -> bool { - self.1 == other.1 - } -} - -impl Eq for Builtin {} - -pub(crate) static GLOBAL_FUNCTIONS: Lazy = Lazy::new(|| { - let mut m = HashMap::new(); - color::declare(&mut m); - list::declare(&mut m); - map::declare(&mut m); - math::declare(&mut m); - meta::declare(&mut m); - selector::declare(&mut m); - string::declare(&mut m); - m -}); +pub(crate) use functions::{Builtin, GLOBAL_FUNCTIONS}; +pub(crate) use modules::*; diff --git a/src/builtin/modules/color.rs b/src/builtin/modules/color.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/color.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/builtin/modules/list.rs b/src/builtin/modules/list.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/list.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/builtin/modules/map.rs b/src/builtin/modules/map.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/map.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/builtin/modules/math.rs b/src/builtin/modules/math.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/math.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/builtin/modules/meta.rs b/src/builtin/modules/meta.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/meta.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/builtin/modules/mod.rs b/src/builtin/modules/mod.rs new file mode 100644 index 0000000..dc248ec --- /dev/null +++ b/src/builtin/modules/mod.rs @@ -0,0 +1,64 @@ +use std::collections::BTreeMap; + +use crate::{ + atrule::Mixin, + common::Identifier, + value::{SassFunction, Value}, +}; + +mod color; +mod list; +mod map; +mod math; +mod meta; +mod selector; +mod string; + +#[derive(Debug, Default)] +pub(crate) struct Module { + vars: BTreeMap, + mixins: BTreeMap, + functions: BTreeMap, +} + +pub(crate) fn declare_module_color() -> Module { + let mut module = Module::default(); + color::declare(&mut module); + module +} + +pub(crate) fn declare_module_list() -> Module { + let mut module = Module::default(); + list::declare(&mut module); + module +} + +pub(crate) fn declare_module_map() -> Module { + let mut module = Module::default(); + map::declare(&mut module); + module +} + +pub(crate) fn declare_module_math() -> Module { + let mut module = Module::default(); + math::declare(&mut module); + module +} + +pub(crate) fn declare_module_meta() -> Module { + let mut module = Module::default(); + meta::declare(&mut module); + module +} + +pub(crate) fn declare_module_selector() -> Module { + let mut module = Module::default(); + selector::declare(&mut module); + module +} + +pub(crate) fn declare_module_string() -> Module { + let mut module = Module::default(); + string::declare(&mut module); + module +} diff --git a/src/builtin/modules/selector.rs b/src/builtin/modules/selector.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/selector.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/builtin/modules/string.rs b/src/builtin/modules/string.rs new file mode 100644 index 0000000..c3c3a05 --- /dev/null +++ b/src/builtin/modules/string.rs @@ -0,0 +1,3 @@ +use crate::builtin::Module; + +pub(crate) fn declare(_f: &mut Module) {} diff --git a/src/parse/mod.rs b/src/parse/mod.rs index b2224d3..ed4ff09 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -9,6 +9,7 @@ use crate::{ media::MediaRule, AtRuleKind, Content, SupportsRule, UnknownAtRule, }, + builtin::*, error::SassResult, scope::{Scope, Scopes}, selector::{ @@ -87,7 +88,7 @@ pub(crate) struct Parser<'a> { pub options: &'a Options<'a>, - pub modules: &'a mut HashMap, + pub modules: &'a mut HashMap, } impl<'a> Parser<'a> { @@ -149,17 +150,27 @@ impl<'a> Parser<'a> { } match module.as_ref() { - "sass:color" => todo!("builtin module `sass:color` not yet implemented"), - "sass:list" => todo!("builtin module `sass:list` not yet implemented"), - "sass:map" => todo!("builtin module `sass:map` not yet implemented"), - "sass:math" => todo!("builtin module `sass:math` not yet implemented"), - "sass:meta" => todo!("builtin module `sass:meta` not yet implemented"), - "sass:selector" => { - todo!("builtin module `sass:selector` not yet implemented") - } - "sass:string" => todo!("builtin module `sass:string` not yet implemented"), + "sass:color" => self + .modules + .insert("color".to_owned(), declare_module_color()), + "sass:list" => self + .modules + .insert("list".to_owned(), declare_module_list()), + "sass:map" => self.modules.insert("map".to_owned(), declare_module_map()), + "sass:math" => self + .modules + .insert("math".to_owned(), declare_module_math()), + "sass:meta" => self + .modules + .insert("meta".to_owned(), declare_module_meta()), + "sass:selector" => self + .modules + .insert("selector".to_owned(), declare_module_selector()), + "sass:string" => self + .modules + .insert("string".to_owned(), declare_module_string()), _ => todo!("@use not yet implemented"), - } + }; } Some(Token { kind: '/', .. }) => { self.toks.advance_cursor();