sassc4 2.4.0
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 +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +97 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +51 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +92 -0
- data/ext/libsass/VERSION +1 -0
- data/ext/libsass/contrib/plugin.cpp +60 -0
- data/ext/libsass/include/sass/base.h +97 -0
- data/ext/libsass/include/sass/context.h +174 -0
- data/ext/libsass/include/sass/functions.h +139 -0
- data/ext/libsass/include/sass/values.h +145 -0
- data/ext/libsass/include/sass/version.h +12 -0
- data/ext/libsass/include/sass.h +15 -0
- data/ext/libsass/include/sass2scss.h +120 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +953 -0
- data/ext/libsass/src/ast.hpp +1064 -0
- data/ext/libsass/src/ast2c.cpp +80 -0
- data/ext/libsass/src/ast2c.hpp +39 -0
- data/ext/libsass/src/ast_def_macros.hpp +140 -0
- data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
- data/ext/libsass/src/ast_helpers.hpp +316 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +275 -0
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +1070 -0
- data/ext/libsass/src/ast_selectors.hpp +523 -0
- data/ext/libsass/src/ast_supports.cpp +114 -0
- data/ext/libsass/src/ast_supports.hpp +121 -0
- data/ext/libsass/src/ast_values.cpp +1154 -0
- data/ext/libsass/src/ast_values.hpp +498 -0
- data/ext/libsass/src/b64/cencode.h +32 -0
- data/ext/libsass/src/b64/encode.h +79 -0
- data/ext/libsass/src/backtrace.cpp +50 -0
- data/ext/libsass/src/backtrace.hpp +29 -0
- data/ext/libsass/src/base64vlq.cpp +47 -0
- data/ext/libsass/src/base64vlq.hpp +30 -0
- data/ext/libsass/src/bind.cpp +312 -0
- data/ext/libsass/src/bind.hpp +15 -0
- data/ext/libsass/src/c2ast.cpp +64 -0
- data/ext/libsass/src/c2ast.hpp +14 -0
- data/ext/libsass/src/c99func.c +54 -0
- data/ext/libsass/src/cencode.c +106 -0
- data/ext/libsass/src/check_nesting.cpp +393 -0
- data/ext/libsass/src/check_nesting.hpp +70 -0
- data/ext/libsass/src/color_maps.cpp +652 -0
- data/ext/libsass/src/color_maps.hpp +323 -0
- data/ext/libsass/src/color_spaces.cpp +241 -0
- data/ext/libsass/src/color_spaces.hpp +227 -0
- data/ext/libsass/src/constants.cpp +199 -0
- data/ext/libsass/src/constants.hpp +200 -0
- data/ext/libsass/src/context.cpp +870 -0
- data/ext/libsass/src/context.hpp +140 -0
- data/ext/libsass/src/cssize.cpp +521 -0
- data/ext/libsass/src/cssize.hpp +71 -0
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debug.hpp +43 -0
- data/ext/libsass/src/debugger.hpp +964 -0
- data/ext/libsass/src/emitter.cpp +297 -0
- data/ext/libsass/src/emitter.hpp +101 -0
- data/ext/libsass/src/environment.cpp +260 -0
- data/ext/libsass/src/environment.hpp +124 -0
- data/ext/libsass/src/error_handling.cpp +239 -0
- data/ext/libsass/src/error_handling.hpp +248 -0
- data/ext/libsass/src/eval.cpp +1543 -0
- data/ext/libsass/src/eval.hpp +110 -0
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +875 -0
- data/ext/libsass/src/expand.hpp +98 -0
- data/ext/libsass/src/extender.cpp +1226 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +531 -0
- data/ext/libsass/src/file.hpp +124 -0
- data/ext/libsass/src/fn_colors.cpp +836 -0
- data/ext/libsass/src/fn_colors.hpp +99 -0
- data/ext/libsass/src/fn_lists.cpp +285 -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 +248 -0
- data/ext/libsass/src/fn_miscs.hpp +40 -0
- data/ext/libsass/src/fn_numbers.cpp +246 -0
- data/ext/libsass/src/fn_numbers.hpp +45 -0
- data/ext/libsass/src/fn_selectors.cpp +205 -0
- data/ext/libsass/src/fn_selectors.hpp +35 -0
- data/ext/libsass/src/fn_strings.cpp +268 -0
- data/ext/libsass/src/fn_strings.hpp +34 -0
- data/ext/libsass/src/fn_utils.cpp +159 -0
- data/ext/libsass/src/fn_utils.hpp +62 -0
- data/ext/libsass/src/inspect.cpp +1126 -0
- data/ext/libsass/src/inspect.hpp +101 -0
- data/ext/libsass/src/json.cpp +1436 -0
- data/ext/libsass/src/json.hpp +117 -0
- data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
- data/ext/libsass/src/lexer.cpp +122 -0
- data/ext/libsass/src/lexer.hpp +304 -0
- data/ext/libsass/src/listize.cpp +70 -0
- data/ext/libsass/src/listize.hpp +37 -0
- data/ext/libsass/src/mapping.hpp +19 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
- data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +223 -0
- data/ext/libsass/src/operators.cpp +267 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +320 -0
- data/ext/libsass/src/output.hpp +47 -0
- data/ext/libsass/src/parser.cpp +3059 -0
- data/ext/libsass/src/parser.hpp +395 -0
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +188 -0
- data/ext/libsass/src/plugins.hpp +57 -0
- data/ext/libsass/src/position.cpp +163 -0
- data/ext/libsass/src/position.hpp +147 -0
- data/ext/libsass/src/prelexer.cpp +1780 -0
- data/ext/libsass/src/prelexer.hpp +484 -0
- data/ext/libsass/src/remove_placeholders.cpp +86 -0
- data/ext/libsass/src/remove_placeholders.hpp +37 -0
- data/ext/libsass/src/sass.cpp +156 -0
- data/ext/libsass/src/sass.hpp +147 -0
- data/ext/libsass/src/sass2scss.cpp +895 -0
- data/ext/libsass/src/sass_context.cpp +742 -0
- data/ext/libsass/src/sass_context.hpp +129 -0
- data/ext/libsass/src/sass_functions.cpp +210 -0
- data/ext/libsass/src/sass_functions.hpp +50 -0
- data/ext/libsass/src/sass_values.cpp +362 -0
- data/ext/libsass/src/sass_values.hpp +82 -0
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +202 -0
- data/ext/libsass/src/source_map.hpp +65 -0
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +114 -0
- data/ext/libsass/src/to_value.hpp +46 -0
- data/ext/libsass/src/units.cpp +507 -0
- data/ext/libsass/src/units.hpp +110 -0
- data/ext/libsass/src/utf8/checked.h +336 -0
- data/ext/libsass/src/utf8/core.h +332 -0
- data/ext/libsass/src/utf8/unchecked.h +235 -0
- data/ext/libsass/src/utf8.h +34 -0
- data/ext/libsass/src/utf8_string.cpp +104 -0
- data/ext/libsass/src/utf8_string.hpp +38 -0
- data/ext/libsass/src/util.cpp +723 -0
- data/ext/libsass/src/util.hpp +105 -0
- data/ext/libsass/src/util_string.cpp +125 -0
- data/ext/libsass/src/util_string.hpp +73 -0
- data/ext/libsass/src/values.cpp +140 -0
- data/ext/libsass/src/values.hpp +12 -0
- data/lib/sassc/dependency.rb +17 -0
- data/lib/sassc/engine.rb +141 -0
- data/lib/sassc/error.rb +37 -0
- data/lib/sassc/functions_handler.rb +73 -0
- data/lib/sassc/import_handler.rb +50 -0
- data/lib/sassc/importer.rb +31 -0
- data/lib/sassc/native/native_context_api.rb +147 -0
- data/lib/sassc/native/native_functions_api.rb +159 -0
- data/lib/sassc/native/sass2scss_api.rb +10 -0
- data/lib/sassc/native/sass_input_style.rb +13 -0
- data/lib/sassc/native/sass_output_style.rb +12 -0
- data/lib/sassc/native/sass_value.rb +97 -0
- data/lib/sassc/native/string_list.rb +10 -0
- data/lib/sassc/native.rb +64 -0
- data/lib/sassc/sass_2_scss.rb +9 -0
- data/lib/sassc/script/functions.rb +8 -0
- data/lib/sassc/script/value/bool.rb +32 -0
- data/lib/sassc/script/value/color.rb +95 -0
- data/lib/sassc/script/value/list.rb +136 -0
- data/lib/sassc/script/value/map.rb +69 -0
- data/lib/sassc/script/value/number.rb +389 -0
- data/lib/sassc/script/value/string.rb +96 -0
- data/lib/sassc/script/value.rb +137 -0
- data/lib/sassc/script/value_conversion/base.rb +13 -0
- data/lib/sassc/script/value_conversion/bool.rb +13 -0
- data/lib/sassc/script/value_conversion/color.rb +18 -0
- data/lib/sassc/script/value_conversion/list.rb +25 -0
- data/lib/sassc/script/value_conversion/map.rb +21 -0
- data/lib/sassc/script/value_conversion/number.rb +13 -0
- data/lib/sassc/script/value_conversion/string.rb +17 -0
- data/lib/sassc/script/value_conversion.rb +69 -0
- data/lib/sassc/script.rb +17 -0
- data/lib/sassc/util/normalized_map.rb +117 -0
- data/lib/sassc/util.rb +231 -0
- data/lib/sassc/version.rb +5 -0
- data/lib/sassc.rb +57 -0
- data/sassc.gemspec +69 -0
- data/test/css_color_level4_test.rb +168 -0
- data/test/custom_importer_test.rb +127 -0
- data/test/engine_test.rb +314 -0
- data/test/error_test.rb +29 -0
- data/test/fixtures/paths.scss +10 -0
- data/test/functions_test.rb +340 -0
- data/test/native_test.rb +213 -0
- data/test/output_style_test.rb +107 -0
- data/test/sass_2_scss_test.rb +14 -0
- data/test/test_helper.rb +45 -0
- metadata +396 -0
|
@@ -0,0 +1,953 @@
|
|
|
1
|
+
// sass.hpp must go before all system headers to get the
|
|
2
|
+
// __EXTENSIONS__ fix on Solaris.
|
|
3
|
+
#include "sass.hpp"
|
|
4
|
+
|
|
5
|
+
#include "ast.hpp"
|
|
6
|
+
|
|
7
|
+
namespace Sass {
|
|
8
|
+
|
|
9
|
+
static Null sass_null(SourceSpan("null"));
|
|
10
|
+
|
|
11
|
+
const char* sass_op_to_name(enum Sass_OP op) {
|
|
12
|
+
switch (op) {
|
|
13
|
+
case AND: return "and";
|
|
14
|
+
case OR: return "or";
|
|
15
|
+
case EQ: return "eq";
|
|
16
|
+
case NEQ: return "neq";
|
|
17
|
+
case GT: return "gt";
|
|
18
|
+
case GTE: return "gte";
|
|
19
|
+
case LT: return "lt";
|
|
20
|
+
case LTE: return "lte";
|
|
21
|
+
case ADD: return "plus";
|
|
22
|
+
case SUB: return "minus";
|
|
23
|
+
case MUL: return "times";
|
|
24
|
+
case DIV: return "div";
|
|
25
|
+
case MOD: return "mod";
|
|
26
|
+
// this is only used internally!
|
|
27
|
+
case NUM_OPS: return "[OPS]";
|
|
28
|
+
default: return "invalid";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const char* sass_op_separator(enum Sass_OP op) {
|
|
33
|
+
switch (op) {
|
|
34
|
+
case AND: return "&&";
|
|
35
|
+
case OR: return "||";
|
|
36
|
+
case EQ: return "==";
|
|
37
|
+
case NEQ: return "!=";
|
|
38
|
+
case GT: return ">";
|
|
39
|
+
case GTE: return ">=";
|
|
40
|
+
case LT: return "<";
|
|
41
|
+
case LTE: return "<=";
|
|
42
|
+
case ADD: return "+";
|
|
43
|
+
case SUB: return "-";
|
|
44
|
+
case MUL: return "*";
|
|
45
|
+
case DIV: return "/";
|
|
46
|
+
case MOD: return "%";
|
|
47
|
+
// this is only used internally!
|
|
48
|
+
case NUM_OPS: return "[OPS]";
|
|
49
|
+
default: return "invalid";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/////////////////////////////////////////////////////////////////////////
|
|
54
|
+
/////////////////////////////////////////////////////////////////////////
|
|
55
|
+
|
|
56
|
+
void AST_Node::update_pstate(const SourceSpan& pstate)
|
|
57
|
+
{
|
|
58
|
+
pstate_.offset += pstate.position - pstate_.position + pstate.offset;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
sass::string AST_Node::to_string(Sass_Inspect_Options opt) const
|
|
62
|
+
{
|
|
63
|
+
Sass_Output_Options out(opt);
|
|
64
|
+
Emitter emitter(out);
|
|
65
|
+
Inspect i(emitter);
|
|
66
|
+
i.in_declaration = true;
|
|
67
|
+
// ToDo: inspect should be const
|
|
68
|
+
const_cast<AST_Node*>(this)->perform(&i);
|
|
69
|
+
return i.get_buffer();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
sass::string AST_Node::to_css(Sass_Inspect_Options opt) const
|
|
73
|
+
{
|
|
74
|
+
opt.output_style = TO_CSS;
|
|
75
|
+
Sass_Output_Options out(opt);
|
|
76
|
+
Emitter emitter(out);
|
|
77
|
+
Inspect i(emitter);
|
|
78
|
+
i.in_declaration = true;
|
|
79
|
+
// ToDo: inspect should be const
|
|
80
|
+
const_cast<AST_Node*>(this)->perform(&i);
|
|
81
|
+
return i.get_buffer();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
sass::string AST_Node::to_string() const
|
|
85
|
+
{
|
|
86
|
+
return to_string({ NESTED, 5 });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/////////////////////////////////////////////////////////////////////////
|
|
90
|
+
/////////////////////////////////////////////////////////////////////////
|
|
91
|
+
|
|
92
|
+
Statement::Statement(SourceSpan pstate, Type st, size_t t)
|
|
93
|
+
: AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
|
|
94
|
+
{ }
|
|
95
|
+
Statement::Statement(const Statement* ptr)
|
|
96
|
+
: AST_Node(ptr),
|
|
97
|
+
statement_type_(ptr->statement_type_),
|
|
98
|
+
tabs_(ptr->tabs_),
|
|
99
|
+
group_end_(ptr->group_end_)
|
|
100
|
+
{ }
|
|
101
|
+
|
|
102
|
+
bool Statement::bubbles()
|
|
103
|
+
{
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
bool Statement::has_content()
|
|
108
|
+
{
|
|
109
|
+
return statement_type_ == CONTENT;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
bool Statement::is_invisible() const
|
|
113
|
+
{
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/////////////////////////////////////////////////////////////////////////
|
|
118
|
+
/////////////////////////////////////////////////////////////////////////
|
|
119
|
+
|
|
120
|
+
Block::Block(SourceSpan pstate, size_t s, bool r)
|
|
121
|
+
: Statement(pstate),
|
|
122
|
+
Vectorized<Statement_Obj>(s),
|
|
123
|
+
is_root_(r)
|
|
124
|
+
{ }
|
|
125
|
+
Block::Block(const Block* ptr)
|
|
126
|
+
: Statement(ptr),
|
|
127
|
+
Vectorized<Statement_Obj>(*ptr),
|
|
128
|
+
is_root_(ptr->is_root_)
|
|
129
|
+
{ }
|
|
130
|
+
|
|
131
|
+
bool Block::isInvisible() const
|
|
132
|
+
{
|
|
133
|
+
for (auto& item : elements()) {
|
|
134
|
+
if (!item->is_invisible()) return false;
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
bool Block::has_content()
|
|
140
|
+
{
|
|
141
|
+
for (size_t i = 0, L = elements().size(); i < L; ++i) {
|
|
142
|
+
if (elements()[i]->has_content()) return true;
|
|
143
|
+
}
|
|
144
|
+
return Statement::has_content();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/////////////////////////////////////////////////////////////////////////
|
|
148
|
+
/////////////////////////////////////////////////////////////////////////
|
|
149
|
+
|
|
150
|
+
ParentStatement::ParentStatement(SourceSpan pstate, Block_Obj b)
|
|
151
|
+
: Statement(pstate), block_(b)
|
|
152
|
+
{ }
|
|
153
|
+
ParentStatement::ParentStatement(const ParentStatement* ptr)
|
|
154
|
+
: Statement(ptr), block_(ptr->block_)
|
|
155
|
+
{ }
|
|
156
|
+
|
|
157
|
+
bool ParentStatement::has_content()
|
|
158
|
+
{
|
|
159
|
+
return (block_ && block_->has_content()) || Statement::has_content();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/////////////////////////////////////////////////////////////////////////
|
|
163
|
+
/////////////////////////////////////////////////////////////////////////
|
|
164
|
+
|
|
165
|
+
StyleRule::StyleRule(SourceSpan pstate, SelectorListObj s, Block_Obj b)
|
|
166
|
+
: ParentStatement(pstate, b), selector_(s), schema_(), is_root_(false)
|
|
167
|
+
{ statement_type(RULESET); }
|
|
168
|
+
StyleRule::StyleRule(const StyleRule* ptr)
|
|
169
|
+
: ParentStatement(ptr),
|
|
170
|
+
selector_(ptr->selector_),
|
|
171
|
+
schema_(ptr->schema_),
|
|
172
|
+
is_root_(ptr->is_root_)
|
|
173
|
+
{ statement_type(RULESET); }
|
|
174
|
+
|
|
175
|
+
bool StyleRule::is_invisible() const {
|
|
176
|
+
if (const SelectorList * sl = Cast<SelectorList>(selector())) {
|
|
177
|
+
for (size_t i = 0, L = sl->length(); i < L; i += 1)
|
|
178
|
+
if (!(*sl)[i]->isInvisible()) return false;
|
|
179
|
+
}
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/////////////////////////////////////////////////////////////////////////
|
|
184
|
+
/////////////////////////////////////////////////////////////////////////
|
|
185
|
+
|
|
186
|
+
Bubble::Bubble(SourceSpan pstate, Statement_Obj n, Statement_Obj g, size_t t)
|
|
187
|
+
: Statement(pstate, Statement::BUBBLE, t), node_(n), group_end_(g == nullptr)
|
|
188
|
+
{ }
|
|
189
|
+
Bubble::Bubble(const Bubble* ptr)
|
|
190
|
+
: Statement(ptr),
|
|
191
|
+
node_(ptr->node_),
|
|
192
|
+
group_end_(ptr->group_end_)
|
|
193
|
+
{ }
|
|
194
|
+
|
|
195
|
+
bool Bubble::bubbles()
|
|
196
|
+
{
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/////////////////////////////////////////////////////////////////////////
|
|
201
|
+
/////////////////////////////////////////////////////////////////////////
|
|
202
|
+
|
|
203
|
+
Trace::Trace(SourceSpan pstate, sass::string n, Block_Obj b, char type)
|
|
204
|
+
: ParentStatement(pstate, b), type_(type), name_(n)
|
|
205
|
+
{ }
|
|
206
|
+
Trace::Trace(const Trace* ptr)
|
|
207
|
+
: ParentStatement(ptr),
|
|
208
|
+
type_(ptr->type_),
|
|
209
|
+
name_(ptr->name_)
|
|
210
|
+
{ }
|
|
211
|
+
|
|
212
|
+
/////////////////////////////////////////////////////////////////////////
|
|
213
|
+
/////////////////////////////////////////////////////////////////////////
|
|
214
|
+
|
|
215
|
+
AtRule::AtRule(SourceSpan pstate, sass::string kwd, SelectorListObj sel, Block_Obj b, ExpressionObj val)
|
|
216
|
+
: ParentStatement(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
|
|
217
|
+
{ statement_type(DIRECTIVE); }
|
|
218
|
+
AtRule::AtRule(const AtRule* ptr)
|
|
219
|
+
: ParentStatement(ptr),
|
|
220
|
+
keyword_(ptr->keyword_),
|
|
221
|
+
selector_(ptr->selector_),
|
|
222
|
+
value_(ptr->value_) // set value manually if needed
|
|
223
|
+
{ statement_type(DIRECTIVE); }
|
|
224
|
+
|
|
225
|
+
bool AtRule::bubbles() { return is_keyframes() || is_media(); }
|
|
226
|
+
|
|
227
|
+
bool AtRule::is_media() {
|
|
228
|
+
return keyword_.compare("@-webkit-media") == 0 ||
|
|
229
|
+
keyword_.compare("@-moz-media") == 0 ||
|
|
230
|
+
keyword_.compare("@-o-media") == 0 ||
|
|
231
|
+
keyword_.compare("@media") == 0;
|
|
232
|
+
}
|
|
233
|
+
bool AtRule::is_keyframes() {
|
|
234
|
+
return keyword_.compare("@-webkit-keyframes") == 0 ||
|
|
235
|
+
keyword_.compare("@-moz-keyframes") == 0 ||
|
|
236
|
+
keyword_.compare("@-o-keyframes") == 0 ||
|
|
237
|
+
keyword_.compare("@keyframes") == 0;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/////////////////////////////////////////////////////////////////////////
|
|
241
|
+
/////////////////////////////////////////////////////////////////////////
|
|
242
|
+
|
|
243
|
+
Keyframe_Rule::Keyframe_Rule(SourceSpan pstate, Block_Obj b)
|
|
244
|
+
: ParentStatement(pstate, b), name_()
|
|
245
|
+
{ statement_type(KEYFRAMERULE); }
|
|
246
|
+
Keyframe_Rule::Keyframe_Rule(const Keyframe_Rule* ptr)
|
|
247
|
+
: ParentStatement(ptr), name_(ptr->name_)
|
|
248
|
+
{ statement_type(KEYFRAMERULE); }
|
|
249
|
+
|
|
250
|
+
/////////////////////////////////////////////////////////////////////////
|
|
251
|
+
/////////////////////////////////////////////////////////////////////////
|
|
252
|
+
|
|
253
|
+
Declaration::Declaration(SourceSpan pstate, String_Obj prop, ExpressionObj val, bool i, bool c, Block_Obj b)
|
|
254
|
+
: ParentStatement(pstate, b), property_(prop), value_(val), is_important_(i), is_custom_property_(c), is_indented_(false)
|
|
255
|
+
{ statement_type(DECLARATION); }
|
|
256
|
+
Declaration::Declaration(const Declaration* ptr)
|
|
257
|
+
: ParentStatement(ptr),
|
|
258
|
+
property_(ptr->property_),
|
|
259
|
+
value_(ptr->value_),
|
|
260
|
+
is_important_(ptr->is_important_),
|
|
261
|
+
is_custom_property_(ptr->is_custom_property_),
|
|
262
|
+
is_indented_(ptr->is_indented_)
|
|
263
|
+
{ statement_type(DECLARATION); }
|
|
264
|
+
|
|
265
|
+
bool Declaration::is_invisible() const
|
|
266
|
+
{
|
|
267
|
+
if (is_custom_property()) return false;
|
|
268
|
+
return !(value_ && !Cast<Null>(value_));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/////////////////////////////////////////////////////////////////////////
|
|
272
|
+
/////////////////////////////////////////////////////////////////////////
|
|
273
|
+
|
|
274
|
+
Assignment::Assignment(SourceSpan pstate, sass::string var, ExpressionObj val, bool is_default, bool is_global)
|
|
275
|
+
: Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
|
|
276
|
+
{ statement_type(ASSIGNMENT); }
|
|
277
|
+
Assignment::Assignment(const Assignment* ptr)
|
|
278
|
+
: Statement(ptr),
|
|
279
|
+
variable_(ptr->variable_),
|
|
280
|
+
value_(ptr->value_),
|
|
281
|
+
is_default_(ptr->is_default_),
|
|
282
|
+
is_global_(ptr->is_global_)
|
|
283
|
+
{ statement_type(ASSIGNMENT); }
|
|
284
|
+
|
|
285
|
+
/////////////////////////////////////////////////////////////////////////
|
|
286
|
+
/////////////////////////////////////////////////////////////////////////
|
|
287
|
+
|
|
288
|
+
Import::Import(SourceSpan pstate)
|
|
289
|
+
: Statement(pstate),
|
|
290
|
+
urls_(sass::vector<ExpressionObj>()),
|
|
291
|
+
incs_(sass::vector<Include>()),
|
|
292
|
+
import_queries_()
|
|
293
|
+
{ statement_type(IMPORT); }
|
|
294
|
+
Import::Import(const Import* ptr)
|
|
295
|
+
: Statement(ptr),
|
|
296
|
+
urls_(ptr->urls_),
|
|
297
|
+
incs_(ptr->incs_),
|
|
298
|
+
import_queries_(ptr->import_queries_)
|
|
299
|
+
{ statement_type(IMPORT); }
|
|
300
|
+
|
|
301
|
+
sass::vector<Include>& Import::incs() { return incs_; }
|
|
302
|
+
sass::vector<ExpressionObj>& Import::urls() { return urls_; }
|
|
303
|
+
|
|
304
|
+
/////////////////////////////////////////////////////////////////////////
|
|
305
|
+
/////////////////////////////////////////////////////////////////////////
|
|
306
|
+
|
|
307
|
+
Import_Stub::Import_Stub(SourceSpan pstate, Include res)
|
|
308
|
+
: Statement(pstate), resource_(res)
|
|
309
|
+
{ statement_type(IMPORT_STUB); }
|
|
310
|
+
Import_Stub::Import_Stub(const Import_Stub* ptr)
|
|
311
|
+
: Statement(ptr), resource_(ptr->resource_)
|
|
312
|
+
{ statement_type(IMPORT_STUB); }
|
|
313
|
+
Include Import_Stub::resource() { return resource_; };
|
|
314
|
+
sass::string Import_Stub::imp_path() { return resource_.imp_path; };
|
|
315
|
+
sass::string Import_Stub::abs_path() { return resource_.abs_path; };
|
|
316
|
+
|
|
317
|
+
/////////////////////////////////////////////////////////////////////////
|
|
318
|
+
/////////////////////////////////////////////////////////////////////////
|
|
319
|
+
|
|
320
|
+
WarningRule::WarningRule(SourceSpan pstate, ExpressionObj msg)
|
|
321
|
+
: Statement(pstate), message_(msg)
|
|
322
|
+
{ statement_type(WARNING); }
|
|
323
|
+
WarningRule::WarningRule(const WarningRule* ptr)
|
|
324
|
+
: Statement(ptr), message_(ptr->message_)
|
|
325
|
+
{ statement_type(WARNING); }
|
|
326
|
+
|
|
327
|
+
/////////////////////////////////////////////////////////////////////////
|
|
328
|
+
/////////////////////////////////////////////////////////////////////////
|
|
329
|
+
|
|
330
|
+
ErrorRule::ErrorRule(SourceSpan pstate, ExpressionObj msg)
|
|
331
|
+
: Statement(pstate), message_(msg)
|
|
332
|
+
{ statement_type(ERROR); }
|
|
333
|
+
ErrorRule::ErrorRule(const ErrorRule* ptr)
|
|
334
|
+
: Statement(ptr), message_(ptr->message_)
|
|
335
|
+
{ statement_type(ERROR); }
|
|
336
|
+
|
|
337
|
+
/////////////////////////////////////////////////////////////////////////
|
|
338
|
+
/////////////////////////////////////////////////////////////////////////
|
|
339
|
+
|
|
340
|
+
DebugRule::DebugRule(SourceSpan pstate, ExpressionObj val)
|
|
341
|
+
: Statement(pstate), value_(val)
|
|
342
|
+
{ statement_type(DEBUGSTMT); }
|
|
343
|
+
DebugRule::DebugRule(const DebugRule* ptr)
|
|
344
|
+
: Statement(ptr), value_(ptr->value_)
|
|
345
|
+
{ statement_type(DEBUGSTMT); }
|
|
346
|
+
|
|
347
|
+
/////////////////////////////////////////////////////////////////////////
|
|
348
|
+
/////////////////////////////////////////////////////////////////////////
|
|
349
|
+
|
|
350
|
+
Comment::Comment(SourceSpan pstate, String_Obj txt, bool is_important)
|
|
351
|
+
: Statement(pstate), text_(txt), is_important_(is_important)
|
|
352
|
+
{ statement_type(COMMENT); }
|
|
353
|
+
Comment::Comment(const Comment* ptr)
|
|
354
|
+
: Statement(ptr),
|
|
355
|
+
text_(ptr->text_),
|
|
356
|
+
is_important_(ptr->is_important_)
|
|
357
|
+
{ statement_type(COMMENT); }
|
|
358
|
+
|
|
359
|
+
bool Comment::is_invisible() const
|
|
360
|
+
{
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/////////////////////////////////////////////////////////////////////////
|
|
365
|
+
/////////////////////////////////////////////////////////////////////////
|
|
366
|
+
|
|
367
|
+
If::If(SourceSpan pstate, ExpressionObj pred, Block_Obj con, Block_Obj alt)
|
|
368
|
+
: ParentStatement(pstate, con), predicate_(pred), alternative_(alt)
|
|
369
|
+
{ statement_type(IF); }
|
|
370
|
+
If::If(const If* ptr)
|
|
371
|
+
: ParentStatement(ptr),
|
|
372
|
+
predicate_(ptr->predicate_),
|
|
373
|
+
alternative_(ptr->alternative_)
|
|
374
|
+
{ statement_type(IF); }
|
|
375
|
+
|
|
376
|
+
bool If::has_content()
|
|
377
|
+
{
|
|
378
|
+
return ParentStatement::has_content() || (alternative_ && alternative_->has_content());
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/////////////////////////////////////////////////////////////////////////
|
|
382
|
+
/////////////////////////////////////////////////////////////////////////
|
|
383
|
+
|
|
384
|
+
ForRule::ForRule(SourceSpan pstate,
|
|
385
|
+
sass::string var, ExpressionObj lo, ExpressionObj hi, Block_Obj b, bool inc)
|
|
386
|
+
: ParentStatement(pstate, b),
|
|
387
|
+
variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc)
|
|
388
|
+
{ statement_type(FOR); }
|
|
389
|
+
ForRule::ForRule(const ForRule* ptr)
|
|
390
|
+
: ParentStatement(ptr),
|
|
391
|
+
variable_(ptr->variable_),
|
|
392
|
+
lower_bound_(ptr->lower_bound_),
|
|
393
|
+
upper_bound_(ptr->upper_bound_),
|
|
394
|
+
is_inclusive_(ptr->is_inclusive_)
|
|
395
|
+
{ statement_type(FOR); }
|
|
396
|
+
|
|
397
|
+
/////////////////////////////////////////////////////////////////////////
|
|
398
|
+
/////////////////////////////////////////////////////////////////////////
|
|
399
|
+
|
|
400
|
+
EachRule::EachRule(SourceSpan pstate, sass::vector<sass::string> vars, ExpressionObj lst, Block_Obj b)
|
|
401
|
+
: ParentStatement(pstate, b), variables_(vars), list_(lst)
|
|
402
|
+
{ statement_type(EACH); }
|
|
403
|
+
EachRule::EachRule(const EachRule* ptr)
|
|
404
|
+
: ParentStatement(ptr), variables_(ptr->variables_), list_(ptr->list_)
|
|
405
|
+
{ statement_type(EACH); }
|
|
406
|
+
|
|
407
|
+
/////////////////////////////////////////////////////////////////////////
|
|
408
|
+
/////////////////////////////////////////////////////////////////////////
|
|
409
|
+
|
|
410
|
+
WhileRule::WhileRule(SourceSpan pstate, ExpressionObj pred, Block_Obj b)
|
|
411
|
+
: ParentStatement(pstate, b), predicate_(pred)
|
|
412
|
+
{ statement_type(WHILE); }
|
|
413
|
+
WhileRule::WhileRule(const WhileRule* ptr)
|
|
414
|
+
: ParentStatement(ptr), predicate_(ptr->predicate_)
|
|
415
|
+
{ statement_type(WHILE); }
|
|
416
|
+
|
|
417
|
+
/////////////////////////////////////////////////////////////////////////
|
|
418
|
+
/////////////////////////////////////////////////////////////////////////
|
|
419
|
+
|
|
420
|
+
Return::Return(SourceSpan pstate, ExpressionObj val)
|
|
421
|
+
: Statement(pstate), value_(val)
|
|
422
|
+
{ statement_type(RETURN); }
|
|
423
|
+
Return::Return(const Return* ptr)
|
|
424
|
+
: Statement(ptr), value_(ptr->value_)
|
|
425
|
+
{ statement_type(RETURN); }
|
|
426
|
+
|
|
427
|
+
/////////////////////////////////////////////////////////////////////////
|
|
428
|
+
/////////////////////////////////////////////////////////////////////////
|
|
429
|
+
|
|
430
|
+
ExtendRule::ExtendRule(SourceSpan pstate, SelectorListObj s)
|
|
431
|
+
: Statement(pstate), isOptional_(false), selector_(s), schema_()
|
|
432
|
+
{ statement_type(EXTEND); }
|
|
433
|
+
ExtendRule::ExtendRule(SourceSpan pstate, Selector_Schema_Obj s)
|
|
434
|
+
: Statement(pstate), isOptional_(false), selector_(), schema_(s)
|
|
435
|
+
{
|
|
436
|
+
statement_type(EXTEND);
|
|
437
|
+
}
|
|
438
|
+
ExtendRule::ExtendRule(const ExtendRule* ptr)
|
|
439
|
+
: Statement(ptr),
|
|
440
|
+
isOptional_(ptr->isOptional_),
|
|
441
|
+
selector_(ptr->selector_),
|
|
442
|
+
schema_(ptr->schema_)
|
|
443
|
+
{ statement_type(EXTEND); }
|
|
444
|
+
|
|
445
|
+
/////////////////////////////////////////////////////////////////////////
|
|
446
|
+
/////////////////////////////////////////////////////////////////////////
|
|
447
|
+
|
|
448
|
+
Definition::Definition(const Definition* ptr)
|
|
449
|
+
: ParentStatement(ptr),
|
|
450
|
+
name_(ptr->name_),
|
|
451
|
+
parameters_(ptr->parameters_),
|
|
452
|
+
environment_(ptr->environment_),
|
|
453
|
+
type_(ptr->type_),
|
|
454
|
+
native_function_(ptr->native_function_),
|
|
455
|
+
c_function_(ptr->c_function_),
|
|
456
|
+
cookie_(ptr->cookie_),
|
|
457
|
+
is_overload_stub_(ptr->is_overload_stub_),
|
|
458
|
+
signature_(ptr->signature_)
|
|
459
|
+
{ }
|
|
460
|
+
|
|
461
|
+
Definition::Definition(SourceSpan pstate,
|
|
462
|
+
sass::string n,
|
|
463
|
+
Parameters_Obj params,
|
|
464
|
+
Block_Obj b,
|
|
465
|
+
Type t)
|
|
466
|
+
: ParentStatement(pstate, b),
|
|
467
|
+
name_(n),
|
|
468
|
+
parameters_(params),
|
|
469
|
+
environment_(0),
|
|
470
|
+
type_(t),
|
|
471
|
+
native_function_(0),
|
|
472
|
+
c_function_(0),
|
|
473
|
+
cookie_(0),
|
|
474
|
+
is_overload_stub_(false),
|
|
475
|
+
signature_(0)
|
|
476
|
+
{ }
|
|
477
|
+
|
|
478
|
+
Definition::Definition(SourceSpan pstate,
|
|
479
|
+
Signature sig,
|
|
480
|
+
sass::string n,
|
|
481
|
+
Parameters_Obj params,
|
|
482
|
+
Native_Function func_ptr,
|
|
483
|
+
bool overload_stub)
|
|
484
|
+
: ParentStatement(pstate, {}),
|
|
485
|
+
name_(n),
|
|
486
|
+
parameters_(params),
|
|
487
|
+
environment_(0),
|
|
488
|
+
type_(FUNCTION),
|
|
489
|
+
native_function_(func_ptr),
|
|
490
|
+
c_function_(0),
|
|
491
|
+
cookie_(0),
|
|
492
|
+
is_overload_stub_(overload_stub),
|
|
493
|
+
signature_(sig)
|
|
494
|
+
{ }
|
|
495
|
+
|
|
496
|
+
Definition::Definition(SourceSpan pstate,
|
|
497
|
+
Signature sig,
|
|
498
|
+
sass::string n,
|
|
499
|
+
Parameters_Obj params,
|
|
500
|
+
Sass_Function_Entry c_func)
|
|
501
|
+
: ParentStatement(pstate, {}),
|
|
502
|
+
name_(n),
|
|
503
|
+
parameters_(params),
|
|
504
|
+
environment_(0),
|
|
505
|
+
type_(FUNCTION),
|
|
506
|
+
native_function_(0),
|
|
507
|
+
c_function_(c_func),
|
|
508
|
+
cookie_(sass_function_get_cookie(c_func)),
|
|
509
|
+
is_overload_stub_(false),
|
|
510
|
+
signature_(sig)
|
|
511
|
+
{ }
|
|
512
|
+
|
|
513
|
+
/////////////////////////////////////////////////////////////////////////
|
|
514
|
+
/////////////////////////////////////////////////////////////////////////
|
|
515
|
+
|
|
516
|
+
Mixin_Call::Mixin_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, Parameters_Obj b_params, Block_Obj b)
|
|
517
|
+
: ParentStatement(pstate, b), name_(n), arguments_(args), block_parameters_(b_params)
|
|
518
|
+
{ }
|
|
519
|
+
Mixin_Call::Mixin_Call(const Mixin_Call* ptr)
|
|
520
|
+
: ParentStatement(ptr),
|
|
521
|
+
name_(ptr->name_),
|
|
522
|
+
arguments_(ptr->arguments_),
|
|
523
|
+
block_parameters_(ptr->block_parameters_)
|
|
524
|
+
{ }
|
|
525
|
+
|
|
526
|
+
/////////////////////////////////////////////////////////////////////////
|
|
527
|
+
/////////////////////////////////////////////////////////////////////////
|
|
528
|
+
|
|
529
|
+
Content::Content(SourceSpan pstate, Arguments_Obj args)
|
|
530
|
+
: Statement(pstate),
|
|
531
|
+
arguments_(args)
|
|
532
|
+
{ statement_type(CONTENT); }
|
|
533
|
+
Content::Content(const Content* ptr)
|
|
534
|
+
: Statement(ptr),
|
|
535
|
+
arguments_(ptr->arguments_)
|
|
536
|
+
{ statement_type(CONTENT); }
|
|
537
|
+
|
|
538
|
+
/////////////////////////////////////////////////////////////////////////
|
|
539
|
+
/////////////////////////////////////////////////////////////////////////
|
|
540
|
+
|
|
541
|
+
Expression::Expression(SourceSpan pstate, bool d, bool e, bool i, Type ct)
|
|
542
|
+
: AST_Node(pstate),
|
|
543
|
+
is_delayed_(d),
|
|
544
|
+
is_expanded_(e),
|
|
545
|
+
is_interpolant_(i),
|
|
546
|
+
concrete_type_(ct)
|
|
547
|
+
{ }
|
|
548
|
+
|
|
549
|
+
Expression::Expression(const Expression* ptr)
|
|
550
|
+
: AST_Node(ptr),
|
|
551
|
+
is_delayed_(ptr->is_delayed_),
|
|
552
|
+
is_expanded_(ptr->is_expanded_),
|
|
553
|
+
is_interpolant_(ptr->is_interpolant_),
|
|
554
|
+
concrete_type_(ptr->concrete_type_)
|
|
555
|
+
{ }
|
|
556
|
+
|
|
557
|
+
/////////////////////////////////////////////////////////////////////////
|
|
558
|
+
/////////////////////////////////////////////////////////////////////////
|
|
559
|
+
|
|
560
|
+
Unary_Expression::Unary_Expression(SourceSpan pstate, Type t, ExpressionObj o)
|
|
561
|
+
: Expression(pstate), optype_(t), operand_(o), hash_(0)
|
|
562
|
+
{ }
|
|
563
|
+
Unary_Expression::Unary_Expression(const Unary_Expression* ptr)
|
|
564
|
+
: Expression(ptr),
|
|
565
|
+
optype_(ptr->optype_),
|
|
566
|
+
operand_(ptr->operand_),
|
|
567
|
+
hash_(ptr->hash_)
|
|
568
|
+
{ }
|
|
569
|
+
const sass::string Unary_Expression::type_name() {
|
|
570
|
+
switch (optype_) {
|
|
571
|
+
case PLUS: return "plus";
|
|
572
|
+
case MINUS: return "minus";
|
|
573
|
+
case SLASH: return "slash";
|
|
574
|
+
case NOT: return "not";
|
|
575
|
+
default: return "invalid";
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
bool Unary_Expression::operator==(const Expression& rhs) const
|
|
579
|
+
{
|
|
580
|
+
try
|
|
581
|
+
{
|
|
582
|
+
const Unary_Expression* m = Cast<Unary_Expression>(&rhs);
|
|
583
|
+
if (m == 0) return false;
|
|
584
|
+
return type() == m->type() &&
|
|
585
|
+
*operand() == *m->operand();
|
|
586
|
+
}
|
|
587
|
+
catch (std::bad_cast&)
|
|
588
|
+
{
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
catch (...) { throw; }
|
|
592
|
+
}
|
|
593
|
+
size_t Unary_Expression::hash() const
|
|
594
|
+
{
|
|
595
|
+
if (hash_ == 0) {
|
|
596
|
+
hash_ = std::hash<size_t>()(optype_);
|
|
597
|
+
hash_combine(hash_, operand()->hash());
|
|
598
|
+
};
|
|
599
|
+
return hash_;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/////////////////////////////////////////////////////////////////////////
|
|
603
|
+
/////////////////////////////////////////////////////////////////////////
|
|
604
|
+
|
|
605
|
+
Argument::Argument(SourceSpan pstate, ExpressionObj val, sass::string n, bool rest, bool keyword)
|
|
606
|
+
: Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
|
|
607
|
+
{
|
|
608
|
+
if (!name_.empty() && is_rest_argument_) {
|
|
609
|
+
coreError("variable-length argument may not be passed by name", pstate_);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
Argument::Argument(const Argument* ptr)
|
|
613
|
+
: Expression(ptr),
|
|
614
|
+
value_(ptr->value_),
|
|
615
|
+
name_(ptr->name_),
|
|
616
|
+
is_rest_argument_(ptr->is_rest_argument_),
|
|
617
|
+
is_keyword_argument_(ptr->is_keyword_argument_),
|
|
618
|
+
hash_(ptr->hash_)
|
|
619
|
+
{
|
|
620
|
+
if (!name_.empty() && is_rest_argument_) {
|
|
621
|
+
coreError("variable-length argument may not be passed by name", pstate_);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
void Argument::set_delayed(bool delayed)
|
|
626
|
+
{
|
|
627
|
+
if (value_) value_->set_delayed(delayed);
|
|
628
|
+
is_delayed(delayed);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
bool Argument::operator==(const Expression& rhs) const
|
|
632
|
+
{
|
|
633
|
+
try
|
|
634
|
+
{
|
|
635
|
+
const Argument* m = Cast<Argument>(&rhs);
|
|
636
|
+
if (!(m && name() == m->name())) return false;
|
|
637
|
+
return *value() == *m->value();
|
|
638
|
+
}
|
|
639
|
+
catch (std::bad_cast&)
|
|
640
|
+
{
|
|
641
|
+
return false;
|
|
642
|
+
}
|
|
643
|
+
catch (...) { throw; }
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
size_t Argument::hash() const
|
|
647
|
+
{
|
|
648
|
+
if (hash_ == 0) {
|
|
649
|
+
hash_ = std::hash<sass::string>()(name());
|
|
650
|
+
hash_combine(hash_, value()->hash());
|
|
651
|
+
}
|
|
652
|
+
return hash_;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/////////////////////////////////////////////////////////////////////////
|
|
656
|
+
/////////////////////////////////////////////////////////////////////////
|
|
657
|
+
|
|
658
|
+
Arguments::Arguments(SourceSpan pstate)
|
|
659
|
+
: Expression(pstate),
|
|
660
|
+
Vectorized<Argument_Obj>(),
|
|
661
|
+
has_named_arguments_(false),
|
|
662
|
+
has_rest_argument_(false),
|
|
663
|
+
has_keyword_argument_(false)
|
|
664
|
+
{ }
|
|
665
|
+
Arguments::Arguments(const Arguments* ptr)
|
|
666
|
+
: Expression(ptr),
|
|
667
|
+
Vectorized<Argument_Obj>(*ptr),
|
|
668
|
+
has_named_arguments_(ptr->has_named_arguments_),
|
|
669
|
+
has_rest_argument_(ptr->has_rest_argument_),
|
|
670
|
+
has_keyword_argument_(ptr->has_keyword_argument_)
|
|
671
|
+
{ }
|
|
672
|
+
|
|
673
|
+
void Arguments::set_delayed(bool delayed)
|
|
674
|
+
{
|
|
675
|
+
for (Argument_Obj arg : elements()) {
|
|
676
|
+
if (arg) arg->set_delayed(delayed);
|
|
677
|
+
}
|
|
678
|
+
is_delayed(delayed);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
Argument_Obj Arguments::get_rest_argument()
|
|
682
|
+
{
|
|
683
|
+
if (this->has_rest_argument()) {
|
|
684
|
+
for (Argument_Obj arg : this->elements()) {
|
|
685
|
+
if (arg->is_rest_argument()) {
|
|
686
|
+
return arg;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
return {};
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
Argument_Obj Arguments::get_keyword_argument()
|
|
694
|
+
{
|
|
695
|
+
if (this->has_keyword_argument()) {
|
|
696
|
+
for (Argument_Obj arg : this->elements()) {
|
|
697
|
+
if (arg->is_keyword_argument()) {
|
|
698
|
+
return arg;
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
return {};
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
void Arguments::adjust_after_pushing(Argument_Obj a)
|
|
706
|
+
{
|
|
707
|
+
if (!a->name().empty()) {
|
|
708
|
+
if (has_keyword_argument()) {
|
|
709
|
+
coreError("named arguments must precede variable-length argument", a->pstate());
|
|
710
|
+
}
|
|
711
|
+
has_named_arguments(true);
|
|
712
|
+
}
|
|
713
|
+
else if (a->is_rest_argument()) {
|
|
714
|
+
if (has_rest_argument()) {
|
|
715
|
+
coreError("functions and mixins may only be called with one variable-length argument", a->pstate());
|
|
716
|
+
}
|
|
717
|
+
if (has_keyword_argument_) {
|
|
718
|
+
coreError("only keyword arguments may follow variable arguments", a->pstate());
|
|
719
|
+
}
|
|
720
|
+
has_rest_argument(true);
|
|
721
|
+
}
|
|
722
|
+
else if (a->is_keyword_argument()) {
|
|
723
|
+
if (has_keyword_argument()) {
|
|
724
|
+
coreError("functions and mixins may only be called with one keyword argument", a->pstate());
|
|
725
|
+
}
|
|
726
|
+
has_keyword_argument(true);
|
|
727
|
+
}
|
|
728
|
+
else {
|
|
729
|
+
if (has_rest_argument()) {
|
|
730
|
+
coreError("ordinal arguments must precede variable-length arguments", a->pstate());
|
|
731
|
+
}
|
|
732
|
+
if (has_named_arguments()) {
|
|
733
|
+
coreError("ordinal arguments must precede named arguments", a->pstate());
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/////////////////////////////////////////////////////////////////////////
|
|
739
|
+
/////////////////////////////////////////////////////////////////////////
|
|
740
|
+
|
|
741
|
+
Media_Query::Media_Query(SourceSpan pstate, String_Obj t, size_t s, bool n, bool r)
|
|
742
|
+
: Expression(pstate), Vectorized<Media_Query_ExpressionObj>(s),
|
|
743
|
+
media_type_(t), is_negated_(n), is_restricted_(r)
|
|
744
|
+
{ }
|
|
745
|
+
Media_Query::Media_Query(const Media_Query* ptr)
|
|
746
|
+
: Expression(ptr),
|
|
747
|
+
Vectorized<Media_Query_ExpressionObj>(*ptr),
|
|
748
|
+
media_type_(ptr->media_type_),
|
|
749
|
+
is_negated_(ptr->is_negated_),
|
|
750
|
+
is_restricted_(ptr->is_restricted_)
|
|
751
|
+
{ }
|
|
752
|
+
|
|
753
|
+
/////////////////////////////////////////////////////////////////////////
|
|
754
|
+
/////////////////////////////////////////////////////////////////////////
|
|
755
|
+
|
|
756
|
+
Media_Query_Expression::Media_Query_Expression(SourceSpan pstate,
|
|
757
|
+
ExpressionObj f, ExpressionObj v, bool i)
|
|
758
|
+
: Expression(pstate), feature_(f), value_(v), is_interpolated_(i)
|
|
759
|
+
{ }
|
|
760
|
+
Media_Query_Expression::Media_Query_Expression(const Media_Query_Expression* ptr)
|
|
761
|
+
: Expression(ptr),
|
|
762
|
+
feature_(ptr->feature_),
|
|
763
|
+
value_(ptr->value_),
|
|
764
|
+
is_interpolated_(ptr->is_interpolated_)
|
|
765
|
+
{ }
|
|
766
|
+
|
|
767
|
+
/////////////////////////////////////////////////////////////////////////
|
|
768
|
+
/////////////////////////////////////////////////////////////////////////
|
|
769
|
+
|
|
770
|
+
At_Root_Query::At_Root_Query(SourceSpan pstate, ExpressionObj f, ExpressionObj v, bool i)
|
|
771
|
+
: Expression(pstate), feature_(f), value_(v)
|
|
772
|
+
{ }
|
|
773
|
+
At_Root_Query::At_Root_Query(const At_Root_Query* ptr)
|
|
774
|
+
: Expression(ptr),
|
|
775
|
+
feature_(ptr->feature_),
|
|
776
|
+
value_(ptr->value_)
|
|
777
|
+
{ }
|
|
778
|
+
|
|
779
|
+
bool At_Root_Query::exclude(sass::string str)
|
|
780
|
+
{
|
|
781
|
+
bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
|
|
782
|
+
List* l = static_cast<List*>(value().ptr());
|
|
783
|
+
sass::string v;
|
|
784
|
+
|
|
785
|
+
if (with)
|
|
786
|
+
{
|
|
787
|
+
if (!l || l->length() == 0) return str.compare("rule") != 0;
|
|
788
|
+
for (size_t i = 0, L = l->length(); i < L; ++i)
|
|
789
|
+
{
|
|
790
|
+
v = unquote((*l)[i]->to_string());
|
|
791
|
+
if (v.compare("all") == 0 || v == str) return false;
|
|
792
|
+
}
|
|
793
|
+
return true;
|
|
794
|
+
}
|
|
795
|
+
else
|
|
796
|
+
{
|
|
797
|
+
if (!l || !l->length()) return str.compare("rule") == 0;
|
|
798
|
+
for (size_t i = 0, L = l->length(); i < L; ++i)
|
|
799
|
+
{
|
|
800
|
+
v = unquote((*l)[i]->to_string());
|
|
801
|
+
if (v.compare("all") == 0 || v == str) return true;
|
|
802
|
+
}
|
|
803
|
+
return false;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/////////////////////////////////////////////////////////////////////////
|
|
808
|
+
/////////////////////////////////////////////////////////////////////////
|
|
809
|
+
|
|
810
|
+
AtRootRule::AtRootRule(SourceSpan pstate, Block_Obj b, At_Root_Query_Obj e)
|
|
811
|
+
: ParentStatement(pstate, b), expression_(e)
|
|
812
|
+
{ statement_type(ATROOT); }
|
|
813
|
+
AtRootRule::AtRootRule(const AtRootRule* ptr)
|
|
814
|
+
: ParentStatement(ptr), expression_(ptr->expression_)
|
|
815
|
+
{ statement_type(ATROOT); }
|
|
816
|
+
|
|
817
|
+
bool AtRootRule::bubbles() {
|
|
818
|
+
return true;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
bool AtRootRule::exclude_node(Statement_Obj s) {
|
|
822
|
+
if (expression() == nullptr)
|
|
823
|
+
{
|
|
824
|
+
return s->statement_type() == Statement::RULESET;
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
if (s->statement_type() == Statement::DIRECTIVE)
|
|
828
|
+
{
|
|
829
|
+
if (AtRuleObj dir = Cast<AtRule>(s))
|
|
830
|
+
{
|
|
831
|
+
sass::string keyword(dir->keyword());
|
|
832
|
+
if (keyword.length() > 0) keyword.erase(0, 1);
|
|
833
|
+
return expression()->exclude(keyword);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
if (s->statement_type() == Statement::MEDIA)
|
|
837
|
+
{
|
|
838
|
+
return expression()->exclude("media");
|
|
839
|
+
}
|
|
840
|
+
if (s->statement_type() == Statement::RULESET)
|
|
841
|
+
{
|
|
842
|
+
return expression()->exclude("rule");
|
|
843
|
+
}
|
|
844
|
+
if (s->statement_type() == Statement::SUPPORTS)
|
|
845
|
+
{
|
|
846
|
+
return expression()->exclude("supports");
|
|
847
|
+
}
|
|
848
|
+
if (AtRuleObj dir = Cast<AtRule>(s))
|
|
849
|
+
{
|
|
850
|
+
if (dir->is_keyframes()) return expression()->exclude("keyframes");
|
|
851
|
+
}
|
|
852
|
+
return false;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
/////////////////////////////////////////////////////////////////////////
|
|
856
|
+
/////////////////////////////////////////////////////////////////////////
|
|
857
|
+
|
|
858
|
+
Parameter::Parameter(SourceSpan pstate, sass::string n, ExpressionObj def, bool rest)
|
|
859
|
+
: AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
|
|
860
|
+
{ }
|
|
861
|
+
Parameter::Parameter(const Parameter* ptr)
|
|
862
|
+
: AST_Node(ptr),
|
|
863
|
+
name_(ptr->name_),
|
|
864
|
+
default_value_(ptr->default_value_),
|
|
865
|
+
is_rest_parameter_(ptr->is_rest_parameter_)
|
|
866
|
+
{ }
|
|
867
|
+
|
|
868
|
+
/////////////////////////////////////////////////////////////////////////
|
|
869
|
+
/////////////////////////////////////////////////////////////////////////
|
|
870
|
+
|
|
871
|
+
Parameters::Parameters(SourceSpan pstate)
|
|
872
|
+
: AST_Node(pstate),
|
|
873
|
+
Vectorized<Parameter_Obj>(),
|
|
874
|
+
has_optional_parameters_(false),
|
|
875
|
+
has_rest_parameter_(false)
|
|
876
|
+
{ }
|
|
877
|
+
Parameters::Parameters(const Parameters* ptr)
|
|
878
|
+
: AST_Node(ptr),
|
|
879
|
+
Vectorized<Parameter_Obj>(*ptr),
|
|
880
|
+
has_optional_parameters_(ptr->has_optional_parameters_),
|
|
881
|
+
has_rest_parameter_(ptr->has_rest_parameter_)
|
|
882
|
+
{ }
|
|
883
|
+
|
|
884
|
+
void Parameters::adjust_after_pushing(Parameter_Obj p)
|
|
885
|
+
{
|
|
886
|
+
if (p->default_value()) {
|
|
887
|
+
if (has_rest_parameter()) {
|
|
888
|
+
coreError("optional parameters may not be combined with variable-length parameters", p->pstate());
|
|
889
|
+
}
|
|
890
|
+
has_optional_parameters(true);
|
|
891
|
+
}
|
|
892
|
+
else if (p->is_rest_parameter()) {
|
|
893
|
+
if (has_rest_parameter()) {
|
|
894
|
+
coreError("functions and mixins cannot have more than one variable-length parameter", p->pstate());
|
|
895
|
+
}
|
|
896
|
+
has_rest_parameter(true);
|
|
897
|
+
}
|
|
898
|
+
else {
|
|
899
|
+
if (has_rest_parameter()) {
|
|
900
|
+
coreError("required parameters must precede variable-length parameters", p->pstate());
|
|
901
|
+
}
|
|
902
|
+
if (has_optional_parameters()) {
|
|
903
|
+
coreError("required parameters must precede optional parameters", p->pstate());
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/////////////////////////////////////////////////////////////////////////
|
|
909
|
+
/////////////////////////////////////////////////////////////////////////
|
|
910
|
+
|
|
911
|
+
// If you forget to add a class here you will get
|
|
912
|
+
// undefined reference to `vtable for Sass::Class'
|
|
913
|
+
|
|
914
|
+
IMPLEMENT_AST_OPERATORS(StyleRule);
|
|
915
|
+
IMPLEMENT_AST_OPERATORS(MediaRule);
|
|
916
|
+
IMPLEMENT_AST_OPERATORS(CssMediaRule);
|
|
917
|
+
IMPLEMENT_AST_OPERATORS(CssMediaQuery);
|
|
918
|
+
IMPLEMENT_AST_OPERATORS(Import);
|
|
919
|
+
IMPLEMENT_AST_OPERATORS(Import_Stub);
|
|
920
|
+
IMPLEMENT_AST_OPERATORS(AtRule);
|
|
921
|
+
IMPLEMENT_AST_OPERATORS(AtRootRule);
|
|
922
|
+
IMPLEMENT_AST_OPERATORS(WhileRule);
|
|
923
|
+
IMPLEMENT_AST_OPERATORS(EachRule);
|
|
924
|
+
IMPLEMENT_AST_OPERATORS(ForRule);
|
|
925
|
+
IMPLEMENT_AST_OPERATORS(If);
|
|
926
|
+
IMPLEMENT_AST_OPERATORS(Mixin_Call);
|
|
927
|
+
IMPLEMENT_AST_OPERATORS(ExtendRule);
|
|
928
|
+
IMPLEMENT_AST_OPERATORS(Media_Query);
|
|
929
|
+
IMPLEMENT_AST_OPERATORS(Media_Query_Expression);
|
|
930
|
+
IMPLEMENT_AST_OPERATORS(DebugRule);
|
|
931
|
+
IMPLEMENT_AST_OPERATORS(ErrorRule);
|
|
932
|
+
IMPLEMENT_AST_OPERATORS(WarningRule);
|
|
933
|
+
IMPLEMENT_AST_OPERATORS(Assignment);
|
|
934
|
+
IMPLEMENT_AST_OPERATORS(Return);
|
|
935
|
+
IMPLEMENT_AST_OPERATORS(At_Root_Query);
|
|
936
|
+
IMPLEMENT_AST_OPERATORS(Comment);
|
|
937
|
+
IMPLEMENT_AST_OPERATORS(Parameters);
|
|
938
|
+
IMPLEMENT_AST_OPERATORS(Parameter);
|
|
939
|
+
IMPLEMENT_AST_OPERATORS(Arguments);
|
|
940
|
+
IMPLEMENT_AST_OPERATORS(Argument);
|
|
941
|
+
IMPLEMENT_AST_OPERATORS(Unary_Expression);
|
|
942
|
+
IMPLEMENT_AST_OPERATORS(Block);
|
|
943
|
+
IMPLEMENT_AST_OPERATORS(Content);
|
|
944
|
+
IMPLEMENT_AST_OPERATORS(Trace);
|
|
945
|
+
IMPLEMENT_AST_OPERATORS(Keyframe_Rule);
|
|
946
|
+
IMPLEMENT_AST_OPERATORS(Bubble);
|
|
947
|
+
IMPLEMENT_AST_OPERATORS(Definition);
|
|
948
|
+
IMPLEMENT_AST_OPERATORS(Declaration);
|
|
949
|
+
|
|
950
|
+
/////////////////////////////////////////////////////////////////////////
|
|
951
|
+
/////////////////////////////////////////////////////////////////////////
|
|
952
|
+
|
|
953
|
+
}
|