sassc 2.0.1 → 2.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|