sassc 2.0.1 → 2.1.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +1 -1
- data/.travis.yml +7 -3
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +1 -1
- data/Rakefile +23 -8
- data/ext/extconf.rb +39 -0
- data/ext/libsass/.gitignore +1 -0
- data/ext/libsass/GNUmakefile.am +23 -39
- data/ext/libsass/Makefile +56 -91
- data/ext/libsass/Makefile.conf +16 -2
- data/ext/libsass/configure.ac +8 -12
- data/ext/libsass/include/sass/base.h +1 -0
- data/ext/libsass/include/sass/context.h +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -5
- data/ext/libsass/src/ast.cpp +747 -2010
- data/ext/libsass/src/ast.hpp +239 -2383
- data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +62 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
- data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
- data/ext/libsass/src/ast_sel_unify.cpp +280 -0
- data/ext/libsass/src/ast_selectors.cpp +1475 -0
- data/ext/libsass/src/ast_selectors.hpp +568 -0
- data/ext/libsass/src/ast_supports.cpp +130 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +967 -0
- data/ext/libsass/src/ast_values.hpp +489 -0
- data/ext/libsass/src/backtrace.cpp +4 -0
- data/ext/libsass/src/base64vlq.cpp +3 -0
- data/ext/libsass/src/bind.cpp +18 -17
- data/ext/libsass/src/bind.hpp +3 -1
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/cencode.c +2 -2
- data/ext/libsass/src/check_nesting.cpp +52 -56
- data/ext/libsass/src/check_nesting.hpp +35 -34
- data/ext/libsass/src/color_maps.cpp +156 -153
- data/ext/libsass/src/color_maps.hpp +152 -152
- data/ext/libsass/src/constants.cpp +15 -0
- data/ext/libsass/src/constants.hpp +13 -0
- data/ext/libsass/src/context.cpp +24 -14
- data/ext/libsass/src/context.hpp +6 -6
- data/ext/libsass/src/cssize.cpp +69 -71
- data/ext/libsass/src/cssize.hpp +50 -50
- data/ext/libsass/src/debugger.hpp +117 -110
- data/ext/libsass/src/emitter.cpp +13 -12
- data/ext/libsass/src/emitter.hpp +13 -9
- data/ext/libsass/src/environment.cpp +15 -1
- data/ext/libsass/src/environment.hpp +6 -0
- data/ext/libsass/src/error_handling.cpp +36 -59
- data/ext/libsass/src/error_handling.hpp +29 -16
- data/ext/libsass/src/eval.cpp +302 -323
- data/ext/libsass/src/eval.hpp +64 -55
- data/ext/libsass/src/expand.cpp +94 -88
- data/ext/libsass/src/expand.hpp +33 -37
- data/ext/libsass/src/extend.cpp +38 -36
- data/ext/libsass/src/extend.hpp +15 -15
- data/ext/libsass/src/file.cpp +34 -2
- data/ext/libsass/src/fn_colors.cpp +594 -0
- data/ext/libsass/src/fn_colors.hpp +85 -0
- data/ext/libsass/src/fn_lists.cpp +284 -0
- data/ext/libsass/src/fn_lists.hpp +34 -0
- data/ext/libsass/src/fn_maps.cpp +94 -0
- data/ext/libsass/src/fn_maps.hpp +30 -0
- data/ext/libsass/src/fn_miscs.cpp +256 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +220 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +235 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +254 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +156 -0
- data/ext/libsass/src/fn_utils.hpp +56 -0
- data/ext/libsass/src/inspect.cpp +101 -152
- data/ext/libsass/src/inspect.hpp +69 -73
- data/ext/libsass/src/json.cpp +2 -2
- data/ext/libsass/src/lexer.cpp +6 -3
- data/ext/libsass/src/listize.cpp +9 -11
- data/ext/libsass/src/listize.hpp +11 -7
- data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
- data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
- data/ext/libsass/src/node.cpp +13 -10
- data/ext/libsass/src/node.hpp +3 -3
- data/ext/libsass/src/operation.hpp +184 -144
- data/ext/libsass/src/operators.cpp +43 -17
- data/ext/libsass/src/operators.hpp +5 -5
- data/ext/libsass/src/output.cpp +21 -18
- data/ext/libsass/src/output.hpp +14 -21
- data/ext/libsass/src/parser.cpp +215 -183
- data/ext/libsass/src/parser.hpp +28 -24
- data/ext/libsass/src/plugins.cpp +5 -1
- data/ext/libsass/src/position.cpp +3 -0
- data/ext/libsass/src/prelexer.cpp +9 -3
- data/ext/libsass/src/prelexer.hpp +9 -9
- data/ext/libsass/src/remove_placeholders.cpp +14 -11
- data/ext/libsass/src/remove_placeholders.hpp +8 -9
- data/ext/libsass/src/sass.cpp +9 -3
- data/ext/libsass/src/sass.hpp +12 -9
- data/ext/libsass/src/sass2scss.cpp +45 -14
- data/ext/libsass/src/sass_context.cpp +18 -15
- data/ext/libsass/src/sass_functions.cpp +6 -3
- data/ext/libsass/src/sass_functions.hpp +1 -1
- data/ext/libsass/src/sass_util.cpp +3 -0
- data/ext/libsass/src/sass_values.cpp +21 -13
- data/ext/libsass/src/source_map.cpp +5 -2
- data/ext/libsass/src/source_map.hpp +2 -2
- data/ext/libsass/src/subset_map.cpp +4 -1
- data/ext/libsass/src/to_value.cpp +23 -21
- data/ext/libsass/src/to_value.hpp +18 -22
- data/ext/libsass/src/units.cpp +4 -0
- data/ext/libsass/src/units.hpp +1 -0
- data/ext/libsass/src/utf8/checked.h +12 -10
- data/ext/libsass/src/utf8/core.h +3 -0
- data/ext/libsass/src/utf8_string.cpp +3 -0
- data/ext/libsass/src/util.cpp +67 -75
- data/ext/libsass/src/util.hpp +64 -19
- data/ext/libsass/src/util_string.cpp +75 -0
- data/ext/libsass/src/util_string.hpp +19 -0
- data/ext/libsass/src/values.cpp +22 -13
- data/ext/libsass/src/values.hpp +2 -2
- data/ext/libsass/win/libsass.targets +30 -4
- data/ext/libsass/win/libsass.vcxproj.filters +82 -4
- data/lib/sassc.rb +24 -0
- data/lib/sassc/engine.rb +2 -2
- data/lib/sassc/native.rb +8 -1
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +19 -11
- data/test/engine_test.rb +26 -1
- data/test/native_test.rb +1 -1
- metadata +66 -72
- data/ext/Rakefile +0 -3
- data/ext/libsass/.github/CONTRIBUTING.md +0 -65
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
- data/ext/libsass/.travis.yml +0 -64
- data/ext/libsass/Readme.md +0 -104
- data/ext/libsass/SECURITY.md +0 -10
- data/ext/libsass/appveyor.yml +0 -91
- data/ext/libsass/docs/README.md +0 -20
- data/ext/libsass/docs/api-context-example.md +0 -45
- data/ext/libsass/docs/api-context-internal.md +0 -163
- data/ext/libsass/docs/api-context.md +0 -295
- data/ext/libsass/docs/api-doc.md +0 -215
- data/ext/libsass/docs/api-function-example.md +0 -67
- data/ext/libsass/docs/api-function-internal.md +0 -8
- data/ext/libsass/docs/api-function.md +0 -74
- data/ext/libsass/docs/api-importer-example.md +0 -112
- data/ext/libsass/docs/api-importer-internal.md +0 -20
- data/ext/libsass/docs/api-importer.md +0 -86
- data/ext/libsass/docs/api-value-example.md +0 -55
- data/ext/libsass/docs/api-value-internal.md +0 -76
- data/ext/libsass/docs/api-value.md +0 -154
- data/ext/libsass/docs/build-on-darwin.md +0 -27
- data/ext/libsass/docs/build-on-gentoo.md +0 -55
- data/ext/libsass/docs/build-on-windows.md +0 -139
- data/ext/libsass/docs/build-shared-library.md +0 -35
- data/ext/libsass/docs/build-with-autotools.md +0 -78
- data/ext/libsass/docs/build-with-makefiles.md +0 -68
- data/ext/libsass/docs/build-with-mingw.md +0 -107
- data/ext/libsass/docs/build-with-visual-studio.md +0 -90
- data/ext/libsass/docs/build.md +0 -97
- data/ext/libsass/docs/compatibility-plan.md +0 -48
- data/ext/libsass/docs/contributing.md +0 -17
- data/ext/libsass/docs/custom-functions-internal.md +0 -122
- data/ext/libsass/docs/dev-ast-memory.md +0 -223
- data/ext/libsass/docs/implementations.md +0 -56
- data/ext/libsass/docs/plugins.md +0 -47
- data/ext/libsass/docs/setup-environment.md +0 -68
- data/ext/libsass/docs/source-map-internals.md +0 -51
- data/ext/libsass/docs/trace.md +0 -26
- data/ext/libsass/docs/triage.md +0 -17
- data/ext/libsass/docs/unicode.md +0 -39
- data/ext/libsass/extconf.rb +0 -6
- data/ext/libsass/script/bootstrap +0 -13
- data/ext/libsass/script/branding +0 -10
- data/ext/libsass/script/ci-build-libsass +0 -134
- data/ext/libsass/script/ci-build-plugin +0 -62
- data/ext/libsass/script/ci-install-compiler +0 -6
- data/ext/libsass/script/ci-install-deps +0 -20
- data/ext/libsass/script/ci-report-coverage +0 -42
- data/ext/libsass/script/spec +0 -5
- data/ext/libsass/script/tap-driver +0 -652
- data/ext/libsass/script/tap-runner +0 -1
- data/ext/libsass/script/test-leaks.pl +0 -103
- data/ext/libsass/src/functions.cpp +0 -2234
- data/ext/libsass/src/functions.hpp +0 -198
- data/ext/libsass/src/to_c.hpp +0 -39
- data/ext/libsass/test/test_node.cpp +0 -94
- data/ext/libsass/test/test_paths.cpp +0 -28
- data/ext/libsass/test/test_selector_difference.cpp +0 -25
- data/ext/libsass/test/test_specificity.cpp +0 -25
- data/ext/libsass/test/test_subset_map.cpp +0 -472
- data/ext/libsass/test/test_superselector.cpp +0 -69
- data/ext/libsass/test/test_unification.cpp +0 -31
- data/lib/tasks/libsass.rb +0 -33
data/ext/libsass/src/eval.hpp
CHANGED
@@ -12,10 +12,7 @@ namespace Sass {
|
|
12
12
|
class Expand;
|
13
13
|
class Context;
|
14
14
|
|
15
|
-
class Eval : public Operation_CRTP<
|
16
|
-
|
17
|
-
private:
|
18
|
-
Expression_Ptr fallback_impl(AST_Node_Ptr n);
|
15
|
+
class Eval : public Operation_CRTP<Expression*, Eval> {
|
19
16
|
|
20
17
|
public:
|
21
18
|
Expand& exp;
|
@@ -32,72 +29,84 @@ namespace Sass {
|
|
32
29
|
Boolean_Obj bool_false;
|
33
30
|
|
34
31
|
Env* environment();
|
32
|
+
EnvStack& env_stack();
|
33
|
+
const std::string cwd();
|
35
34
|
Selector_List_Obj selector();
|
35
|
+
CalleeStack& callee_stack();
|
36
|
+
SelectorStack& selector_stack();
|
37
|
+
bool& old_at_root_without_rule();
|
38
|
+
struct Sass_Inspect_Options& options();
|
39
|
+
struct Sass_Inspect_Options options2();
|
40
|
+
struct Sass_Compiler* compiler();
|
36
41
|
|
37
42
|
// for evaluating function bodies
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
//
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
43
|
+
Expression* operator()(Block*);
|
44
|
+
Expression* operator()(Assignment*);
|
45
|
+
Expression* operator()(If*);
|
46
|
+
Expression* operator()(For*);
|
47
|
+
Expression* operator()(Each*);
|
48
|
+
Expression* operator()(While*);
|
49
|
+
Expression* operator()(Return*);
|
50
|
+
Expression* operator()(Warning*);
|
51
|
+
Expression* operator()(Error*);
|
52
|
+
Expression* operator()(Debug*);
|
53
|
+
|
54
|
+
Expression* operator()(List*);
|
55
|
+
Expression* operator()(Map*);
|
56
|
+
Expression* operator()(Binary_Expression*);
|
57
|
+
Expression* operator()(Unary_Expression*);
|
58
|
+
Expression* operator()(Function_Call*);
|
59
|
+
Expression* operator()(Variable*);
|
60
|
+
Expression* operator()(Number*);
|
61
|
+
Expression* operator()(Color_RGBA*);
|
62
|
+
Expression* operator()(Color_HSLA*);
|
63
|
+
Expression* operator()(Boolean*);
|
64
|
+
Expression* operator()(String_Schema*);
|
65
|
+
Expression* operator()(String_Quoted*);
|
66
|
+
Expression* operator()(String_Constant*);
|
67
|
+
// Expression* operator()(Selector_List*);
|
68
|
+
Media_Query* operator()(Media_Query*);
|
69
|
+
Expression* operator()(Media_Query_Expression*);
|
70
|
+
Expression* operator()(At_Root_Query*);
|
71
|
+
Expression* operator()(Supports_Operator*);
|
72
|
+
Expression* operator()(Supports_Negation*);
|
73
|
+
Expression* operator()(Supports_Declaration*);
|
74
|
+
Expression* operator()(Supports_Interpolation*);
|
75
|
+
Expression* operator()(Null*);
|
76
|
+
Expression* operator()(Argument*);
|
77
|
+
Expression* operator()(Arguments*);
|
78
|
+
Expression* operator()(Comment*);
|
74
79
|
|
75
80
|
// these will return selectors
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
+
Selector_List* operator()(Selector_List*);
|
82
|
+
Selector_List* operator()(Complex_Selector*);
|
83
|
+
Compound_Selector* operator()(Compound_Selector*);
|
84
|
+
Simple_Selector* operator()(Simple_Selector* s);
|
85
|
+
Wrapped_Selector* operator()(Wrapped_Selector* s);
|
86
|
+
|
81
87
|
// they don't have any specific implementation (yet)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
88
|
+
Id_Selector* operator()(Id_Selector* s) { return s; };
|
89
|
+
Class_Selector* operator()(Class_Selector* s) { return s; };
|
90
|
+
Pseudo_Selector* operator()(Pseudo_Selector* s) { return s; };
|
91
|
+
Type_Selector* operator()(Type_Selector* s) { return s; };
|
92
|
+
Attribute_Selector* operator()(Attribute_Selector* s) { return s; };
|
93
|
+
Placeholder_Selector* operator()(Placeholder_Selector* s) { return s; };
|
94
|
+
|
87
95
|
// actual evaluated selectors
|
88
|
-
|
89
|
-
|
96
|
+
Selector_List* operator()(Selector_Schema*);
|
97
|
+
Expression* operator()(Parent_Selector*);
|
98
|
+
Expression* operator()(Parent_Reference*);
|
90
99
|
|
100
|
+
// generic fallback
|
91
101
|
template <typename U>
|
92
|
-
|
102
|
+
Expression* fallback(U x)
|
103
|
+
{ return Cast<Expression>(x); }
|
93
104
|
|
94
105
|
private:
|
95
106
|
void interpolation(Context& ctx, std::string& res, Expression_Obj ex, bool into_quotes, bool was_itpl = false);
|
96
107
|
|
97
108
|
};
|
98
109
|
|
99
|
-
Expression_Ptr cval_to_astnode(union Sass_Value* v, Backtraces traces, ParserState pstate = ParserState("[AST]"));
|
100
|
-
|
101
110
|
}
|
102
111
|
|
103
112
|
#endif
|
data/ext/libsass/src/expand.cpp
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
1
3
|
#include "sass.hpp"
|
4
|
+
|
2
5
|
#include <iostream>
|
3
6
|
#include <typeinfo>
|
4
7
|
|
@@ -16,7 +19,7 @@ namespace Sass {
|
|
16
19
|
// simple endless recursion protection
|
17
20
|
const size_t maxRecursion = 500;
|
18
21
|
|
19
|
-
Expand::Expand(Context& ctx, Env* env,
|
22
|
+
Expand::Expand(Context& ctx, Env* env, SelectorStack* stack)
|
20
23
|
: ctx(ctx),
|
21
24
|
traces(ctx.traces),
|
22
25
|
eval(Eval(*this)),
|
@@ -24,19 +27,19 @@ namespace Sass {
|
|
24
27
|
in_keyframes(false),
|
25
28
|
at_root_without_rule(false),
|
26
29
|
old_at_root_without_rule(false),
|
27
|
-
env_stack(
|
28
|
-
block_stack(
|
29
|
-
call_stack(
|
30
|
-
selector_stack(
|
31
|
-
|
30
|
+
env_stack(EnvStack()),
|
31
|
+
block_stack(BlockStack()),
|
32
|
+
call_stack(CallStack()),
|
33
|
+
selector_stack(SelectorStack()),
|
34
|
+
media_stack(MediaStack())
|
32
35
|
{
|
33
|
-
env_stack.push_back(
|
36
|
+
env_stack.push_back(nullptr);
|
34
37
|
env_stack.push_back(env);
|
35
|
-
block_stack.push_back(
|
36
|
-
call_stack.push_back(
|
37
|
-
if (stack == NULL) { selector_stack.push_back(
|
38
|
+
block_stack.push_back(nullptr);
|
39
|
+
call_stack.push_back({});
|
40
|
+
if (stack == NULL) { selector_stack.push_back({}); }
|
38
41
|
else { selector_stack.insert(selector_stack.end(), stack->begin(), stack->end()); }
|
39
|
-
|
42
|
+
media_stack.push_back(nullptr);
|
40
43
|
}
|
41
44
|
|
42
45
|
Env* Expand::environment()
|
@@ -50,11 +53,11 @@ namespace Sass {
|
|
50
53
|
{
|
51
54
|
if (selector_stack.size() > 0)
|
52
55
|
return selector_stack.back();
|
53
|
-
return
|
56
|
+
return {};
|
54
57
|
}
|
55
58
|
|
56
59
|
// blocks create new variable scopes
|
57
|
-
|
60
|
+
Block* Expand::operator()(Block* b)
|
58
61
|
{
|
59
62
|
// create new local environment
|
60
63
|
// set the current env as parent
|
@@ -77,16 +80,16 @@ namespace Sass {
|
|
77
80
|
return bb.detach();
|
78
81
|
}
|
79
82
|
|
80
|
-
|
83
|
+
Statement* Expand::operator()(Ruleset* r)
|
81
84
|
{
|
82
85
|
LOCAL_FLAG(old_at_root_without_rule, at_root_without_rule);
|
83
86
|
|
84
87
|
if (in_keyframes) {
|
85
|
-
|
88
|
+
Block* bb = operator()(r->block());
|
86
89
|
Keyframe_Rule_Obj k = SASS_MEMORY_NEW(Keyframe_Rule, r->pstate(), bb);
|
87
90
|
if (r->selector()) {
|
88
|
-
if (
|
89
|
-
selector_stack.push_back(
|
91
|
+
if (Selector_List* s = r->selector()) {
|
92
|
+
selector_stack.push_back({});
|
90
93
|
k->name(s->eval(eval));
|
91
94
|
selector_stack.pop_back();
|
92
95
|
}
|
@@ -109,12 +112,12 @@ namespace Sass {
|
|
109
112
|
|
110
113
|
// check for parent selectors in base level rules
|
111
114
|
if (r->is_root() || (block_stack.back() && block_stack.back()->is_root())) {
|
112
|
-
if (
|
115
|
+
if (Selector_List* selector_list = Cast<Selector_List>(r->selector())) {
|
113
116
|
for (Complex_Selector_Obj complex_selector : selector_list->elements()) {
|
114
|
-
|
117
|
+
Complex_Selector* tail = complex_selector;
|
115
118
|
while (tail) {
|
116
119
|
if (tail->head()) for (Simple_Selector_Obj header : tail->head()->elements()) {
|
117
|
-
|
120
|
+
Parent_Selector* ptr = Cast<Parent_Selector>(header);
|
118
121
|
if (ptr == NULL || (!ptr->real() || has_parent_selector)) continue;
|
119
122
|
std::string sel_str(complex_selector->to_string(ctx.c_options));
|
120
123
|
error("Base-level rules cannot contain the parent-selector-referencing character '&'.", header->pstate(), traces);
|
@@ -139,10 +142,10 @@ namespace Sass {
|
|
139
142
|
if (block_stack.back()->is_root()) {
|
140
143
|
env_stack.push_back(&env);
|
141
144
|
}
|
142
|
-
sel->set_media_block(
|
143
|
-
Block_Obj blk
|
145
|
+
sel->set_media_block(media_stack.back());
|
146
|
+
Block_Obj blk;
|
144
147
|
if (r->block()) blk = operator()(r->block());
|
145
|
-
|
148
|
+
Ruleset* rr = SASS_MEMORY_NEW(Ruleset,
|
146
149
|
r->pstate(),
|
147
150
|
sel,
|
148
151
|
blk);
|
@@ -157,7 +160,7 @@ namespace Sass {
|
|
157
160
|
return rr;
|
158
161
|
}
|
159
162
|
|
160
|
-
|
163
|
+
Statement* Expand::operator()(Supports_Block* f)
|
161
164
|
{
|
162
165
|
Expression_Obj condition = f->condition()->perform(&eval);
|
163
166
|
Supports_Block_Obj ff = SASS_MEMORY_NEW(Supports_Block,
|
@@ -167,7 +170,7 @@ namespace Sass {
|
|
167
170
|
return ff.detach();
|
168
171
|
}
|
169
172
|
|
170
|
-
|
173
|
+
Statement* Expand::operator()(Media_Block* m)
|
171
174
|
{
|
172
175
|
Media_Block_Obj cpy = SASS_MEMORY_COPY(m);
|
173
176
|
// Media_Blocks are prone to have circular references
|
@@ -175,7 +178,7 @@ namespace Sass {
|
|
175
178
|
// Looks like we are able to reset block reference for copy
|
176
179
|
// Good as it will ensure a low memory overhead for this fix
|
177
180
|
// So this is a cheap solution with a minimal price
|
178
|
-
ctx.ast_gc.push_back(cpy); cpy->block(
|
181
|
+
ctx.ast_gc.push_back(cpy); cpy->block({});
|
179
182
|
Expression_Obj mq = eval(m->media_queries());
|
180
183
|
std::string str_mq(mq->to_string(ctx.c_options));
|
181
184
|
char* str = sass_copy_c_string(str_mq.c_str());
|
@@ -183,18 +186,18 @@ namespace Sass {
|
|
183
186
|
Parser p(Parser::from_c_str(str, ctx, traces, mq->pstate()));
|
184
187
|
mq = p.parse_media_queries(); // re-assign now
|
185
188
|
cpy->media_queries(mq);
|
186
|
-
|
189
|
+
media_stack.push_back(cpy);
|
187
190
|
Block_Obj blk = operator()(m->block());
|
188
|
-
|
191
|
+
Media_Block* mm = SASS_MEMORY_NEW(Media_Block,
|
189
192
|
m->pstate(),
|
190
193
|
mq,
|
191
194
|
blk);
|
192
|
-
|
195
|
+
media_stack.pop_back();
|
193
196
|
mm->tabs(m->tabs());
|
194
197
|
return mm;
|
195
198
|
}
|
196
199
|
|
197
|
-
|
200
|
+
Statement* Expand::operator()(At_Root_Block* a)
|
198
201
|
{
|
199
202
|
Block_Obj ab = a->block();
|
200
203
|
Expression_Obj ae = a->expression();
|
@@ -202,7 +205,7 @@ namespace Sass {
|
|
202
205
|
if (ae) ae = ae->perform(&eval);
|
203
206
|
else ae = SASS_MEMORY_NEW(At_Root_Query, a->pstate());
|
204
207
|
|
205
|
-
LOCAL_FLAG(at_root_without_rule,
|
208
|
+
LOCAL_FLAG(at_root_without_rule, Cast<At_Root_Query>(ae)->exclude("rule"));
|
206
209
|
LOCAL_FLAG(in_keyframes, false);
|
207
210
|
|
208
211
|
;
|
@@ -215,18 +218,18 @@ namespace Sass {
|
|
215
218
|
return aa.detach();
|
216
219
|
}
|
217
220
|
|
218
|
-
|
221
|
+
Statement* Expand::operator()(Directive* a)
|
219
222
|
{
|
220
223
|
LOCAL_FLAG(in_keyframes, a->is_keyframes());
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
selector_stack.push_back(
|
224
|
+
Block* ab = a->block();
|
225
|
+
Selector_List* as = a->selector();
|
226
|
+
Expression* av = a->value();
|
227
|
+
selector_stack.push_back({});
|
225
228
|
if (av) av = av->perform(&eval);
|
226
229
|
if (as) as = eval(as);
|
227
230
|
selector_stack.pop_back();
|
228
|
-
|
229
|
-
|
231
|
+
Block* bb = ab ? operator()(ab) : NULL;
|
232
|
+
Directive* aa = SASS_MEMORY_NEW(Directive,
|
230
233
|
a->pstate(),
|
231
234
|
a->keyword(),
|
232
235
|
as,
|
@@ -235,7 +238,7 @@ namespace Sass {
|
|
235
238
|
return aa;
|
236
239
|
}
|
237
240
|
|
238
|
-
|
241
|
+
Statement* Expand::operator()(Declaration* d)
|
239
242
|
{
|
240
243
|
Block_Obj ab = d->block();
|
241
244
|
String_Obj old_p = d->property();
|
@@ -246,12 +249,19 @@ namespace Sass {
|
|
246
249
|
std::string str(prop->to_string(ctx.c_options));
|
247
250
|
new_p = SASS_MEMORY_NEW(String_Constant, old_p->pstate(), str);
|
248
251
|
}
|
249
|
-
Expression_Obj value = d->value()
|
252
|
+
Expression_Obj value = d->value();
|
253
|
+
if (value) value = value->perform(&eval);
|
250
254
|
Block_Obj bb = ab ? operator()(ab) : NULL;
|
251
255
|
if (!bb) {
|
252
|
-
if (!value || (value->is_invisible() && !d->is_important()))
|
256
|
+
if (!value || (value->is_invisible() && !d->is_important())) {
|
257
|
+
if (d->is_custom_property()) {
|
258
|
+
error("Custom property values may not be empty.", d->value()->pstate(), traces);
|
259
|
+
} else {
|
260
|
+
return nullptr;
|
261
|
+
}
|
262
|
+
}
|
253
263
|
}
|
254
|
-
|
264
|
+
Declaration* decl = SASS_MEMORY_NEW(Declaration,
|
255
265
|
d->pstate(),
|
256
266
|
new_p,
|
257
267
|
value,
|
@@ -262,7 +272,7 @@ namespace Sass {
|
|
262
272
|
return decl;
|
263
273
|
}
|
264
274
|
|
265
|
-
|
275
|
+
Statement* Expand::operator()(Assignment* a)
|
266
276
|
{
|
267
277
|
Env* env = environment();
|
268
278
|
const std::string& var(a->variable());
|
@@ -323,7 +333,7 @@ namespace Sass {
|
|
323
333
|
return 0;
|
324
334
|
}
|
325
335
|
|
326
|
-
|
336
|
+
Statement* Expand::operator()(Import* imp)
|
327
337
|
{
|
328
338
|
Import_Obj result = SASS_MEMORY_NEW(Import, imp->pstate());
|
329
339
|
if (imp->import_queries() && imp->import_queries()->size()) {
|
@@ -338,7 +348,7 @@ namespace Sass {
|
|
338
348
|
return result.detach();
|
339
349
|
}
|
340
350
|
|
341
|
-
|
351
|
+
Statement* Expand::operator()(Import_Stub* i)
|
342
352
|
{
|
343
353
|
traces.push_back(Backtrace(i->pstate()));
|
344
354
|
// get parent node from call stack
|
@@ -368,28 +378,28 @@ namespace Sass {
|
|
368
378
|
return 0;
|
369
379
|
}
|
370
380
|
|
371
|
-
|
381
|
+
Statement* Expand::operator()(Warning* w)
|
372
382
|
{
|
373
383
|
// eval handles this too, because warnings may occur in functions
|
374
384
|
w->perform(&eval);
|
375
385
|
return 0;
|
376
386
|
}
|
377
387
|
|
378
|
-
|
388
|
+
Statement* Expand::operator()(Error* e)
|
379
389
|
{
|
380
390
|
// eval handles this too, because errors may occur in functions
|
381
391
|
e->perform(&eval);
|
382
392
|
return 0;
|
383
393
|
}
|
384
394
|
|
385
|
-
|
395
|
+
Statement* Expand::operator()(Debug* d)
|
386
396
|
{
|
387
397
|
// eval handles this too, because warnings may occur in functions
|
388
398
|
d->perform(&eval);
|
389
399
|
return 0;
|
390
400
|
}
|
391
401
|
|
392
|
-
|
402
|
+
Statement* Expand::operator()(Comment* c)
|
393
403
|
{
|
394
404
|
if (ctx.output_style() == COMPRESSED) {
|
395
405
|
// comments should not be evaluated in compact
|
@@ -397,13 +407,13 @@ namespace Sass {
|
|
397
407
|
if (!c->is_important()) return NULL;
|
398
408
|
}
|
399
409
|
eval.is_in_comment = true;
|
400
|
-
|
410
|
+
Comment* rv = SASS_MEMORY_NEW(Comment, c->pstate(), Cast<String>(c->text()->perform(&eval)), c->is_important());
|
401
411
|
eval.is_in_comment = false;
|
402
412
|
// TODO: eval the text, once we're parsing/storing it as a String_Schema
|
403
413
|
return rv;
|
404
414
|
}
|
405
415
|
|
406
|
-
|
416
|
+
Statement* Expand::operator()(If* i)
|
407
417
|
{
|
408
418
|
Env env(environment(), true);
|
409
419
|
env_stack.push_back(&env);
|
@@ -413,7 +423,7 @@ namespace Sass {
|
|
413
423
|
append_block(i->block());
|
414
424
|
}
|
415
425
|
else {
|
416
|
-
|
426
|
+
Block* alt = i->alternative();
|
417
427
|
if (alt) append_block(alt);
|
418
428
|
}
|
419
429
|
call_stack.pop_back();
|
@@ -423,7 +433,7 @@ namespace Sass {
|
|
423
433
|
|
424
434
|
// For does not create a new env scope
|
425
435
|
// But iteration vars are reset afterwards
|
426
|
-
|
436
|
+
Statement* Expand::operator()(For* f)
|
427
437
|
{
|
428
438
|
std::string variable(f->variable());
|
429
439
|
Expression_Obj low = f->lower_bound()->perform(&eval);
|
@@ -451,7 +461,7 @@ namespace Sass {
|
|
451
461
|
Env env(environment(), true);
|
452
462
|
env_stack.push_back(&env);
|
453
463
|
call_stack.push_back(f);
|
454
|
-
|
464
|
+
Block* body = f->block();
|
455
465
|
if (start < end) {
|
456
466
|
if (f->is_inclusive()) ++end;
|
457
467
|
for (double i = start;
|
@@ -478,16 +488,16 @@ namespace Sass {
|
|
478
488
|
|
479
489
|
// Eval does not create a new env scope
|
480
490
|
// But iteration vars are reset afterwards
|
481
|
-
|
491
|
+
Statement* Expand::operator()(Each* e)
|
482
492
|
{
|
483
493
|
std::vector<std::string> variables(e->variables());
|
484
494
|
Expression_Obj expr = e->list()->perform(&eval);
|
485
|
-
List_Obj list
|
495
|
+
List_Obj list;
|
486
496
|
Map_Obj map;
|
487
497
|
if (expr->concrete_type() == Expression::MAP) {
|
488
498
|
map = Cast<Map>(expr);
|
489
499
|
}
|
490
|
-
else if (
|
500
|
+
else if (Selector_List* ls = Cast<Selector_List>(expr)) {
|
491
501
|
Listize listize;
|
492
502
|
Expression_Obj rv = ls->perform(&listize);
|
493
503
|
list = Cast<List>(rv);
|
@@ -503,7 +513,7 @@ namespace Sass {
|
|
503
513
|
Env env(environment(), true);
|
504
514
|
env_stack.push_back(&env);
|
505
515
|
call_stack.push_back(e);
|
506
|
-
|
516
|
+
Block* body = e->block();
|
507
517
|
|
508
518
|
if (map) {
|
509
519
|
for (auto key : map->keys()) {
|
@@ -562,10 +572,10 @@ namespace Sass {
|
|
562
572
|
return 0;
|
563
573
|
}
|
564
574
|
|
565
|
-
|
575
|
+
Statement* Expand::operator()(While* w)
|
566
576
|
{
|
567
577
|
Expression_Obj pred = w->predicate();
|
568
|
-
|
578
|
+
Block* body = w->block();
|
569
579
|
Env env(environment(), true);
|
570
580
|
env_stack.push_back(&env);
|
571
581
|
call_stack.push_back(w);
|
@@ -579,7 +589,7 @@ namespace Sass {
|
|
579
589
|
return 0;
|
580
590
|
}
|
581
591
|
|
582
|
-
|
592
|
+
Statement* Expand::operator()(Return* r)
|
583
593
|
{
|
584
594
|
error("@return may only be used within a function", r->pstate(), traces);
|
585
595
|
return 0;
|
@@ -637,13 +647,13 @@ namespace Sass {
|
|
637
647
|
|
638
648
|
}
|
639
649
|
|
640
|
-
Statement* Expand::operator()(
|
650
|
+
Statement* Expand::operator()(Extension* e)
|
641
651
|
{
|
642
|
-
if (
|
643
|
-
|
652
|
+
if (Selector_List_Obj extender = selector()) {
|
653
|
+
Selector_List* sl = e->selector();
|
644
654
|
// abort on invalid selector
|
645
655
|
if (sl == NULL) return NULL;
|
646
|
-
if (
|
656
|
+
if (Selector_Schema* schema = sl->schema()) {
|
647
657
|
if (schema->has_real_parent_ref()) {
|
648
658
|
// put root block on stack again (ignore parents)
|
649
659
|
// selector schema must not connect in eval!
|
@@ -651,24 +661,24 @@ namespace Sass {
|
|
651
661
|
sl = eval(sl->schema());
|
652
662
|
block_stack.pop_back();
|
653
663
|
} else {
|
654
|
-
selector_stack.push_back(
|
664
|
+
selector_stack.push_back({});
|
655
665
|
sl = eval(sl->schema());
|
656
666
|
selector_stack.pop_back();
|
657
667
|
}
|
658
668
|
}
|
659
669
|
for (Complex_Selector_Obj cs : sl->elements()) {
|
660
670
|
if (!cs.isNull() && !cs->head().isNull()) {
|
661
|
-
cs->head()->media_block(
|
671
|
+
cs->head()->media_block(media_stack.back());
|
662
672
|
}
|
663
673
|
}
|
664
|
-
selector_stack.push_back(
|
674
|
+
selector_stack.push_back({});
|
665
675
|
expand_selector_list(sl, extender);
|
666
676
|
selector_stack.pop_back();
|
667
677
|
}
|
668
678
|
return 0;
|
669
679
|
}
|
670
680
|
|
671
|
-
|
681
|
+
Statement* Expand::operator()(Definition* d)
|
672
682
|
{
|
673
683
|
Env* env = environment();
|
674
684
|
Definition_Obj dd = SASS_MEMORY_COPY(d);
|
@@ -693,7 +703,7 @@ namespace Sass {
|
|
693
703
|
return 0;
|
694
704
|
}
|
695
705
|
|
696
|
-
|
706
|
+
Statement* Expand::operator()(Mixin_Call* c)
|
697
707
|
{
|
698
708
|
if (recursions > maxRecursion) {
|
699
709
|
throw Exception::StackError(traces, *c);
|
@@ -729,29 +739,31 @@ namespace Sass {
|
|
729
739
|
Env new_env(def->environment());
|
730
740
|
env_stack.push_back(&new_env);
|
731
741
|
if (c->block()) {
|
742
|
+
Parameters_Obj params = c->block_parameters();
|
743
|
+
if (!params) params = SASS_MEMORY_NEW(Parameters, c->pstate());
|
732
744
|
// represent mixin content blocks as thunks/closures
|
733
745
|
Definition_Obj thunk = SASS_MEMORY_NEW(Definition,
|
734
746
|
c->pstate(),
|
735
747
|
"@content",
|
736
|
-
|
748
|
+
params,
|
737
749
|
c->block(),
|
738
750
|
Definition::MIXIN);
|
739
751
|
thunk->environment(env);
|
740
752
|
new_env.local_frame()["@content[m]"] = thunk;
|
741
753
|
}
|
742
754
|
|
743
|
-
bind(std::string("Mixin"), c->name(), params, args, &
|
755
|
+
bind(std::string("Mixin"), c->name(), params, args, &new_env, &eval, traces);
|
744
756
|
|
745
757
|
Block_Obj trace_block = SASS_MEMORY_NEW(Block, c->pstate());
|
746
758
|
Trace_Obj trace = SASS_MEMORY_NEW(Trace, c->pstate(), c->name(), trace_block);
|
747
759
|
|
748
760
|
env->set_global("is_in_mixin", bool_true);
|
749
|
-
if (
|
761
|
+
if (Block* pr = block_stack.back()) {
|
750
762
|
trace_block->is_root(pr->is_root());
|
751
763
|
}
|
752
764
|
block_stack.push_back(trace_block);
|
753
765
|
for (auto bb : body->elements()) {
|
754
|
-
if (
|
766
|
+
if (Ruleset* r = Cast<Ruleset>(bb)) {
|
755
767
|
r->is_root(trace_block->is_root());
|
756
768
|
}
|
757
769
|
Statement_Obj ith = bb->perform(this);
|
@@ -768,20 +780,23 @@ namespace Sass {
|
|
768
780
|
return trace.detach();
|
769
781
|
}
|
770
782
|
|
771
|
-
|
783
|
+
Statement* Expand::operator()(Content* c)
|
772
784
|
{
|
773
785
|
Env* env = environment();
|
774
786
|
// convert @content directives into mixin calls to the underlying thunk
|
775
787
|
if (!env->has("@content[m]")) return 0;
|
776
788
|
|
777
789
|
if (block_stack.back()->is_root()) {
|
778
|
-
selector_stack.push_back(
|
790
|
+
selector_stack.push_back({});
|
779
791
|
}
|
780
792
|
|
793
|
+
Arguments_Obj args = c->arguments();
|
794
|
+
if (!args) args = SASS_MEMORY_NEW(Arguments, c->pstate());
|
795
|
+
|
781
796
|
Mixin_Call_Obj call = SASS_MEMORY_NEW(Mixin_Call,
|
782
797
|
c->pstate(),
|
783
798
|
"@content",
|
784
|
-
|
799
|
+
args);
|
785
800
|
|
786
801
|
Trace_Obj trace = Cast<Trace>(call->perform(this));
|
787
802
|
|
@@ -792,21 +807,12 @@ namespace Sass {
|
|
792
807
|
return trace.detach();
|
793
808
|
}
|
794
809
|
|
795
|
-
// produce an error if something is not implemented
|
796
|
-
inline Statement_Ptr Expand::fallback_impl(AST_Node_Ptr n)
|
797
|
-
{
|
798
|
-
std::string err =std:: string("`Expand` doesn't handle ") + typeid(*n).name();
|
799
|
-
String_Quoted_Obj msg = SASS_MEMORY_NEW(String_Quoted, ParserState("[WARN]"), err);
|
800
|
-
error("unknown internal error; please contact the LibSass maintainers", n->pstate(), traces);
|
801
|
-
return SASS_MEMORY_NEW(Warning, ParserState("[WARN]"), msg);
|
802
|
-
}
|
803
|
-
|
804
810
|
// process and add to last block on stack
|
805
|
-
inline void Expand::append_block(
|
811
|
+
inline void Expand::append_block(Block* b)
|
806
812
|
{
|
807
813
|
if (b->is_root()) call_stack.push_back(b);
|
808
814
|
for (size_t i = 0, L = b->length(); i < L; ++i) {
|
809
|
-
|
815
|
+
Statement* stm = b->at(i);
|
810
816
|
Statement_Obj ith = stm->perform(this);
|
811
817
|
if (ith) block_stack.back()->append(ith);
|
812
818
|
}
|