sassc 1.11.4 → 1.12.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 +5 -5
- data/.travis.yml +2 -2
- data/CODE_OF_CONDUCT.md +10 -0
- data/README.md +4 -1
- data/ext/libsass/.editorconfig +1 -1
- data/ext/libsass/.github/CONTRIBUTING.md +7 -7
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +31 -6
- data/ext/libsass/.gitignore +3 -0
- data/ext/libsass/.travis.yml +37 -18
- data/ext/libsass/GNUmakefile.am +23 -37
- data/ext/libsass/Makefile +10 -6
- data/ext/libsass/Makefile.conf +3 -0
- data/ext/libsass/Readme.md +68 -63
- data/ext/libsass/appveyor.yml +7 -3
- data/ext/libsass/configure.ac +10 -14
- data/ext/libsass/docs/api-context-internal.md +29 -21
- data/ext/libsass/docs/api-context.md +26 -6
- data/ext/libsass/docs/api-doc.md +49 -16
- data/ext/libsass/docs/api-function-example.md +1 -1
- data/ext/libsass/docs/api-function.md +31 -7
- data/ext/libsass/docs/api-importer.md +19 -19
- data/ext/libsass/docs/api-value.md +4 -2
- data/ext/libsass/docs/build-on-windows.md +4 -4
- data/ext/libsass/docs/build-with-mingw.md +3 -3
- data/ext/libsass/docs/build.md +9 -9
- data/ext/libsass/docs/custom-functions-internal.md +10 -8
- data/ext/libsass/docs/implementations.md +20 -8
- data/ext/libsass/docs/unicode.md +16 -10
- data/ext/libsass/include/sass/base.h +0 -3
- data/ext/libsass/include/sass/context.h +20 -2
- data/ext/libsass/include/sass/functions.h +31 -0
- data/ext/libsass/include/sass/values.h +3 -1
- data/ext/libsass/include/sass/version.h +1 -1
- data/ext/libsass/include/sass/version.h.in +1 -1
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/res/resource.rc +6 -6
- data/ext/libsass/script/ci-build-libsass +10 -5
- data/ext/libsass/script/ci-build-plugin +62 -0
- data/ext/libsass/script/ci-install-compiler +1 -1
- data/ext/libsass/script/ci-install-deps +4 -7
- data/ext/libsass/script/ci-report-coverage +13 -3
- data/ext/libsass/script/tap-driver +1 -1
- data/ext/libsass/script/tap-runner +1 -1
- data/ext/libsass/src/GNUmakefile.am +1 -1
- data/ext/libsass/src/ast.cpp +537 -762
- data/ext/libsass/src/ast.hpp +377 -419
- data/ext/libsass/src/ast_def_macros.hpp +26 -1
- data/ext/libsass/src/ast_fwd_decl.cpp +29 -0
- data/ext/libsass/src/ast_fwd_decl.hpp +94 -21
- data/ext/libsass/src/b64/encode.h +3 -1
- data/ext/libsass/src/backtrace.cpp +46 -0
- data/ext/libsass/src/backtrace.hpp +7 -54
- data/ext/libsass/src/bind.cpp +72 -50
- data/ext/libsass/src/bind.hpp +0 -1
- data/ext/libsass/src/cencode.c +6 -0
- data/ext/libsass/src/check_nesting.cpp +157 -135
- data/ext/libsass/src/check_nesting.hpp +11 -10
- data/ext/libsass/src/color_maps.cpp +10 -6
- data/ext/libsass/src/color_maps.hpp +6 -8
- data/ext/libsass/src/constants.cpp +4 -3
- data/ext/libsass/src/constants.hpp +4 -3
- data/ext/libsass/src/context.cpp +110 -47
- data/ext/libsass/src/context.hpp +11 -1
- data/ext/libsass/src/cssize.cpp +105 -94
- data/ext/libsass/src/cssize.hpp +4 -5
- data/ext/libsass/src/debugger.hpp +247 -244
- data/ext/libsass/src/emitter.cpp +30 -6
- data/ext/libsass/src/emitter.hpp +7 -0
- data/ext/libsass/src/environment.cpp +67 -16
- data/ext/libsass/src/environment.hpp +28 -7
- data/ext/libsass/src/error_handling.cpp +92 -64
- data/ext/libsass/src/error_handling.hpp +64 -43
- data/ext/libsass/src/eval.cpp +494 -544
- data/ext/libsass/src/eval.hpp +17 -23
- data/ext/libsass/src/expand.cpp +182 -154
- data/ext/libsass/src/expand.hpp +4 -5
- data/ext/libsass/src/extend.cpp +299 -291
- data/ext/libsass/src/extend.hpp +46 -11
- data/ext/libsass/src/file.cpp +103 -36
- data/ext/libsass/src/file.hpp +21 -4
- data/ext/libsass/src/functions.cpp +561 -312
- data/ext/libsass/src/functions.hpp +8 -5
- data/ext/libsass/src/inspect.cpp +108 -53
- data/ext/libsass/src/inspect.hpp +5 -2
- data/ext/libsass/src/lexer.cpp +15 -7
- data/ext/libsass/src/lexer.hpp +13 -4
- data/ext/libsass/src/listize.cpp +3 -2
- data/ext/libsass/src/listize.hpp +0 -1
- data/ext/libsass/src/memory/SharedPtr.cpp +16 -18
- data/ext/libsass/src/memory/SharedPtr.hpp +47 -43
- data/ext/libsass/src/node.cpp +34 -38
- data/ext/libsass/src/node.hpp +6 -8
- data/ext/libsass/src/operation.hpp +2 -2
- data/ext/libsass/src/operators.cpp +240 -0
- data/ext/libsass/src/operators.hpp +30 -0
- data/ext/libsass/src/output.cpp +22 -20
- data/ext/libsass/src/parser.cpp +719 -358
- data/ext/libsass/src/parser.hpp +57 -22
- data/ext/libsass/src/plugins.cpp +28 -10
- data/ext/libsass/src/position.cpp +21 -3
- data/ext/libsass/src/position.hpp +2 -1
- data/ext/libsass/src/prelexer.cpp +104 -19
- data/ext/libsass/src/prelexer.hpp +10 -3
- data/ext/libsass/src/remove_placeholders.cpp +9 -10
- data/ext/libsass/src/remove_placeholders.hpp +1 -5
- data/ext/libsass/src/sass.cpp +62 -4
- data/ext/libsass/src/sass.hpp +5 -2
- data/ext/libsass/src/sass_context.cpp +96 -58
- data/ext/libsass/src/sass_context.hpp +7 -5
- data/ext/libsass/src/sass_functions.cpp +63 -1
- data/ext/libsass/src/sass_functions.hpp +19 -1
- data/ext/libsass/src/sass_util.cpp +3 -3
- data/ext/libsass/src/sass_util.hpp +4 -4
- data/ext/libsass/src/sass_values.cpp +42 -39
- data/ext/libsass/src/sass_values.hpp +2 -1
- data/ext/libsass/src/source_map.cpp +16 -18
- data/ext/libsass/src/subset_map.cpp +6 -8
- data/ext/libsass/src/subset_map.hpp +6 -6
- data/ext/libsass/src/to_c.cpp +2 -2
- data/ext/libsass/src/to_value.cpp +8 -3
- data/ext/libsass/src/to_value.hpp +1 -0
- data/ext/libsass/src/units.cpp +349 -45
- data/ext/libsass/src/units.hpp +39 -22
- data/ext/libsass/src/utf8/checked.h +7 -0
- data/ext/libsass/src/utf8/unchecked.h +7 -0
- data/ext/libsass/src/utf8_string.cpp +1 -1
- data/ext/libsass/src/util.cpp +139 -45
- data/ext/libsass/src/util.hpp +4 -7
- data/ext/libsass/src/values.cpp +15 -23
- data/ext/libsass/win/libsass.sln +13 -2
- data/ext/libsass/win/libsass.sln.DotSettings +9 -0
- data/ext/libsass/win/libsass.targets +3 -0
- data/ext/libsass/win/libsass.vcxproj.filters +9 -0
- data/lib/sassc/version.rb +1 -1
- data/sassc.gemspec +1 -1
- data/test/native_test.rb +1 -1
- metadata +11 -4
data/ext/libsass/src/emitter.cpp
CHANGED
|
@@ -14,7 +14,9 @@ namespace Sass {
|
|
|
14
14
|
scheduled_space(0),
|
|
15
15
|
scheduled_linefeed(0),
|
|
16
16
|
scheduled_delimiter(false),
|
|
17
|
+
scheduled_crutch(0),
|
|
17
18
|
scheduled_mapping(0),
|
|
19
|
+
in_custom_property(false),
|
|
18
20
|
in_comment(false),
|
|
19
21
|
in_wrapped(false),
|
|
20
22
|
in_media_block(false),
|
|
@@ -101,10 +103,30 @@ namespace Sass {
|
|
|
101
103
|
// prepend some text or token to the buffer
|
|
102
104
|
void Emitter::prepend_string(const std::string& text)
|
|
103
105
|
{
|
|
104
|
-
|
|
106
|
+
// do not adjust mappings for utf8 bom
|
|
107
|
+
// seems they are not counted in any UA
|
|
108
|
+
if (text.compare("\xEF\xBB\xBF") != 0) {
|
|
109
|
+
wbuf.smap.prepend(Offset(text));
|
|
110
|
+
}
|
|
105
111
|
wbuf.buffer = text + wbuf.buffer;
|
|
106
112
|
}
|
|
107
113
|
|
|
114
|
+
char Emitter::last_char()
|
|
115
|
+
{
|
|
116
|
+
return wbuf.buffer.back();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// append a single char to the buffer
|
|
120
|
+
void Emitter::append_char(const char chr)
|
|
121
|
+
{
|
|
122
|
+
// write space/lf
|
|
123
|
+
flush_schedules();
|
|
124
|
+
// add to buffer
|
|
125
|
+
wbuf.buffer += chr;
|
|
126
|
+
// account for data in source-maps
|
|
127
|
+
wbuf.smap.append(Offset(chr));
|
|
128
|
+
}
|
|
129
|
+
|
|
108
130
|
// append some text or token to the buffer
|
|
109
131
|
void Emitter::append_string(const std::string& text)
|
|
110
132
|
{
|
|
@@ -145,9 +167,9 @@ namespace Sass {
|
|
|
145
167
|
add_open_mapping(node);
|
|
146
168
|
// hotfix for browser issues
|
|
147
169
|
// this is pretty ugly indeed
|
|
148
|
-
if (
|
|
149
|
-
add_open_mapping(
|
|
150
|
-
|
|
170
|
+
if (scheduled_crutch) {
|
|
171
|
+
add_open_mapping(scheduled_crutch);
|
|
172
|
+
scheduled_crutch = 0;
|
|
151
173
|
}
|
|
152
174
|
append_string(text);
|
|
153
175
|
add_close_mapping(node);
|
|
@@ -193,7 +215,7 @@ namespace Sass {
|
|
|
193
215
|
{
|
|
194
216
|
scheduled_space = 0;
|
|
195
217
|
append_string(":");
|
|
196
|
-
append_optional_space();
|
|
218
|
+
if (!in_custom_property) append_optional_space();
|
|
197
219
|
}
|
|
198
220
|
|
|
199
221
|
void Emitter::append_mandatory_space()
|
|
@@ -206,7 +228,9 @@ namespace Sass {
|
|
|
206
228
|
if ((output_style() != COMPRESSED) && buffer().size()) {
|
|
207
229
|
unsigned char lst = buffer().at(buffer().length() - 1);
|
|
208
230
|
if (!isspace(lst) || scheduled_delimiter) {
|
|
209
|
-
|
|
231
|
+
if (last_char() != '(') {
|
|
232
|
+
append_mandatory_space();
|
|
233
|
+
}
|
|
210
234
|
}
|
|
211
235
|
}
|
|
212
236
|
}
|
data/ext/libsass/src/emitter.hpp
CHANGED
|
@@ -37,9 +37,12 @@ namespace Sass {
|
|
|
37
37
|
size_t scheduled_space;
|
|
38
38
|
size_t scheduled_linefeed;
|
|
39
39
|
bool scheduled_delimiter;
|
|
40
|
+
AST_Node_Ptr scheduled_crutch;
|
|
40
41
|
AST_Node_Ptr scheduled_mapping;
|
|
41
42
|
|
|
42
43
|
public:
|
|
44
|
+
// output strings different in custom css properties
|
|
45
|
+
bool in_custom_property;
|
|
43
46
|
// output strings different in comments
|
|
44
47
|
bool in_comment;
|
|
45
48
|
// selector list does not get linefeeds
|
|
@@ -66,11 +69,15 @@ namespace Sass {
|
|
|
66
69
|
void prepend_output(const OutputBuffer& out);
|
|
67
70
|
// append some text or token to the buffer
|
|
68
71
|
void append_string(const std::string& text);
|
|
72
|
+
// append a single character to buffer
|
|
73
|
+
void append_char(const char chr);
|
|
69
74
|
// append some white-space only text
|
|
70
75
|
void append_wspace(const std::string& text);
|
|
71
76
|
// append some text or token to the buffer
|
|
72
77
|
// this adds source-mappings for node start and end
|
|
73
78
|
void append_token(const std::string& text, const AST_Node_Ptr node);
|
|
79
|
+
// query last appended character
|
|
80
|
+
char last_char();
|
|
74
81
|
|
|
75
82
|
public: // syntax sugar
|
|
76
83
|
void append_indentation();
|
|
@@ -6,17 +6,17 @@ namespace Sass {
|
|
|
6
6
|
|
|
7
7
|
template <typename T>
|
|
8
8
|
Environment<T>::Environment(bool is_shadow)
|
|
9
|
-
: local_frame_(
|
|
9
|
+
: local_frame_(environment_map<std::string, T>()),
|
|
10
10
|
parent_(0), is_shadow_(false)
|
|
11
11
|
{ }
|
|
12
12
|
template <typename T>
|
|
13
13
|
Environment<T>::Environment(Environment<T>* env, bool is_shadow)
|
|
14
|
-
: local_frame_(
|
|
14
|
+
: local_frame_(environment_map<std::string, T>()),
|
|
15
15
|
parent_(env), is_shadow_(is_shadow)
|
|
16
16
|
{ }
|
|
17
17
|
template <typename T>
|
|
18
18
|
Environment<T>::Environment(Environment<T>& env, bool is_shadow)
|
|
19
|
-
: local_frame_(
|
|
19
|
+
: local_frame_(environment_map<std::string, T>()),
|
|
20
20
|
parent_(&env), is_shadow_(is_shadow)
|
|
21
21
|
{ }
|
|
22
22
|
|
|
@@ -45,7 +45,7 @@ namespace Sass {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
template <typename T>
|
|
48
|
-
|
|
48
|
+
environment_map<std::string, T>& Environment<T>::local_frame() {
|
|
49
49
|
return local_frame_;
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -53,12 +53,25 @@ namespace Sass {
|
|
|
53
53
|
bool Environment<T>::has_local(const std::string& key) const
|
|
54
54
|
{ return local_frame_.find(key) != local_frame_.end(); }
|
|
55
55
|
|
|
56
|
+
template <typename T> EnvResult
|
|
57
|
+
Environment<T>::find_local(const std::string& key)
|
|
58
|
+
{
|
|
59
|
+
auto end = local_frame_.end();
|
|
60
|
+
auto it = local_frame_.find(key);
|
|
61
|
+
return EnvResult(it, it != end);
|
|
62
|
+
}
|
|
63
|
+
|
|
56
64
|
template <typename T>
|
|
57
65
|
T& Environment<T>::get_local(const std::string& key)
|
|
58
66
|
{ return local_frame_[key]; }
|
|
59
67
|
|
|
60
68
|
template <typename T>
|
|
61
|
-
void Environment<T>::set_local(const std::string& key, T val)
|
|
69
|
+
void Environment<T>::set_local(const std::string& key, const T& val)
|
|
70
|
+
{
|
|
71
|
+
local_frame_[key] = val;
|
|
72
|
+
}
|
|
73
|
+
template <typename T>
|
|
74
|
+
void Environment<T>::set_local(const std::string& key, T&& val)
|
|
62
75
|
{
|
|
63
76
|
local_frame_[key] = val;
|
|
64
77
|
}
|
|
@@ -86,7 +99,12 @@ namespace Sass {
|
|
|
86
99
|
{ return (*global_env())[key]; }
|
|
87
100
|
|
|
88
101
|
template <typename T>
|
|
89
|
-
void Environment<T>::set_global(const std::string& key, T val)
|
|
102
|
+
void Environment<T>::set_global(const std::string& key, const T& val)
|
|
103
|
+
{
|
|
104
|
+
global_env()->local_frame_[key] = val;
|
|
105
|
+
}
|
|
106
|
+
template <typename T>
|
|
107
|
+
void Environment<T>::set_global(const std::string& key, T&& val)
|
|
90
108
|
{
|
|
91
109
|
global_env()->local_frame_[key] = val;
|
|
92
110
|
}
|
|
@@ -126,12 +144,31 @@ namespace Sass {
|
|
|
126
144
|
// either update already existing lexical value
|
|
127
145
|
// or if flag is set, we create one if no lexical found
|
|
128
146
|
template <typename T>
|
|
129
|
-
void Environment<T>::set_lexical(const std::string& key, T val)
|
|
147
|
+
void Environment<T>::set_lexical(const std::string& key, const T& val)
|
|
130
148
|
{
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
149
|
+
Environment<T>* cur = this;
|
|
150
|
+
bool shadow = false;
|
|
151
|
+
while ((cur && cur->is_lexical()) || shadow) {
|
|
152
|
+
EnvResult rv(cur->find_local(key));
|
|
153
|
+
if (rv.found) {
|
|
154
|
+
rv.it->second = val;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
shadow = cur->is_shadow();
|
|
158
|
+
cur = cur->parent_;
|
|
159
|
+
}
|
|
160
|
+
set_local(key, val);
|
|
161
|
+
}
|
|
162
|
+
// this one moves the value
|
|
163
|
+
template <typename T>
|
|
164
|
+
void Environment<T>::set_lexical(const std::string& key, T&& val)
|
|
165
|
+
{
|
|
166
|
+
Environment<T>* cur = this;
|
|
167
|
+
bool shadow = false;
|
|
168
|
+
while ((cur && cur->is_lexical()) || shadow) {
|
|
169
|
+
EnvResult rv(cur->find_local(key));
|
|
170
|
+
if (rv.found) {
|
|
171
|
+
rv.it->second = val;
|
|
135
172
|
return;
|
|
136
173
|
}
|
|
137
174
|
shadow = cur->is_shadow();
|
|
@@ -155,6 +192,20 @@ namespace Sass {
|
|
|
155
192
|
return false;
|
|
156
193
|
}
|
|
157
194
|
|
|
195
|
+
// look on the full stack for key
|
|
196
|
+
// include all scopes available
|
|
197
|
+
template <typename T> EnvResult
|
|
198
|
+
Environment<T>::find(const std::string& key)
|
|
199
|
+
{
|
|
200
|
+
auto cur = this;
|
|
201
|
+
while (true) {
|
|
202
|
+
EnvResult rv(cur->find_local(key));
|
|
203
|
+
if (rv.found) return rv;
|
|
204
|
+
cur = cur->parent_;
|
|
205
|
+
if (!cur) return rv;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
|
|
158
209
|
// use array access for getter and setter functions
|
|
159
210
|
template <typename T>
|
|
160
211
|
T& Environment<T>::operator[](const std::string& key)
|
|
@@ -168,7 +219,7 @@ namespace Sass {
|
|
|
168
219
|
}
|
|
169
220
|
return get_local(key);
|
|
170
221
|
}
|
|
171
|
-
|
|
222
|
+
/*
|
|
172
223
|
#ifdef DEBUG
|
|
173
224
|
template <typename T>
|
|
174
225
|
size_t Environment<T>::print(std::string prefix)
|
|
@@ -176,10 +227,10 @@ namespace Sass {
|
|
|
176
227
|
size_t indent = 0;
|
|
177
228
|
if (parent_) indent = parent_->print(prefix) + 1;
|
|
178
229
|
std::cerr << prefix << std::string(indent, ' ') << "== " << this << std::endl;
|
|
179
|
-
for (typename
|
|
230
|
+
for (typename environment_map<std::string, T>::iterator i = local_frame_.begin(); i != local_frame_.end(); ++i) {
|
|
180
231
|
if (!ends_with(i->first, "[f]") && !ends_with(i->first, "[f]4") && !ends_with(i->first, "[f]2")) {
|
|
181
|
-
std::cerr << prefix << std::string(indent, ' ') << i->first << " "
|
|
182
|
-
if (Value_Ptr val =
|
|
232
|
+
std::cerr << prefix << std::string(indent, ' ') << i->first << " " << i->second;
|
|
233
|
+
if (Value_Ptr val = Cast<Value>(i->second))
|
|
183
234
|
{ std::cerr << " : " << val->to_string(); }
|
|
184
235
|
std::cerr << std::endl;
|
|
185
236
|
}
|
|
@@ -187,7 +238,7 @@ namespace Sass {
|
|
|
187
238
|
return indent ;
|
|
188
239
|
}
|
|
189
240
|
#endif
|
|
190
|
-
|
|
241
|
+
*/
|
|
191
242
|
// compile implementation for AST_Node
|
|
192
243
|
template class Environment<AST_Node_Obj>;
|
|
193
244
|
|
|
@@ -2,17 +2,26 @@
|
|
|
2
2
|
#define SASS_ENVIRONMENT_H
|
|
3
3
|
|
|
4
4
|
#include <string>
|
|
5
|
-
#include <map>
|
|
6
|
-
|
|
7
5
|
#include "ast_fwd_decl.hpp"
|
|
8
6
|
#include "ast_def_macros.hpp"
|
|
9
7
|
|
|
10
8
|
namespace Sass {
|
|
11
9
|
|
|
10
|
+
typedef environment_map<std::string, AST_Node_Obj>::iterator EnvIter;
|
|
11
|
+
|
|
12
|
+
class EnvResult {
|
|
13
|
+
public:
|
|
14
|
+
EnvIter it;
|
|
15
|
+
bool found;
|
|
16
|
+
public:
|
|
17
|
+
EnvResult(EnvIter it, bool found)
|
|
18
|
+
: it(it), found(found) {}
|
|
19
|
+
};
|
|
20
|
+
|
|
12
21
|
template <typename T>
|
|
13
22
|
class Environment {
|
|
14
23
|
// TODO: test with map
|
|
15
|
-
|
|
24
|
+
environment_map<std::string, T> local_frame_;
|
|
16
25
|
ADD_PROPERTY(Environment*, parent)
|
|
17
26
|
ADD_PROPERTY(bool, is_shadow)
|
|
18
27
|
|
|
@@ -37,14 +46,17 @@ namespace Sass {
|
|
|
37
46
|
|
|
38
47
|
// scope operates on the current frame
|
|
39
48
|
|
|
40
|
-
|
|
49
|
+
environment_map<std::string, T>& local_frame();
|
|
41
50
|
|
|
42
51
|
bool has_local(const std::string& key) const;
|
|
43
52
|
|
|
53
|
+
EnvResult find_local(const std::string& key);
|
|
54
|
+
|
|
44
55
|
T& get_local(const std::string& key);
|
|
45
56
|
|
|
46
57
|
// set variable on the current frame
|
|
47
|
-
void set_local(const std::string& key, T val);
|
|
58
|
+
void set_local(const std::string& key, const T& val);
|
|
59
|
+
void set_local(const std::string& key, T&& val);
|
|
48
60
|
|
|
49
61
|
void del_local(const std::string& key);
|
|
50
62
|
|
|
@@ -60,7 +72,8 @@ namespace Sass {
|
|
|
60
72
|
T& get_global(const std::string& key);
|
|
61
73
|
|
|
62
74
|
// set a variable on the global frame
|
|
63
|
-
void set_global(const std::string& key, T val);
|
|
75
|
+
void set_global(const std::string& key, const T& val);
|
|
76
|
+
void set_global(const std::string& key, T&& val);
|
|
64
77
|
|
|
65
78
|
void del_global(const std::string& key);
|
|
66
79
|
|
|
@@ -72,12 +85,17 @@ namespace Sass {
|
|
|
72
85
|
// see if we have a lexical we could update
|
|
73
86
|
// either update already existing lexical value
|
|
74
87
|
// or we create a new one on the current frame
|
|
75
|
-
void set_lexical(const std::string& key, T val);
|
|
88
|
+
void set_lexical(const std::string& key, T&& val);
|
|
89
|
+
void set_lexical(const std::string& key, const T& val);
|
|
76
90
|
|
|
77
91
|
// look on the full stack for key
|
|
78
92
|
// include all scopes available
|
|
79
93
|
bool has(const std::string& key) const;
|
|
80
94
|
|
|
95
|
+
// look on the full stack for key
|
|
96
|
+
// include all scopes available
|
|
97
|
+
EnvResult find(const std::string& key);
|
|
98
|
+
|
|
81
99
|
// use array access for getter and setter functions
|
|
82
100
|
T& operator[](const std::string& key);
|
|
83
101
|
|
|
@@ -87,6 +105,9 @@ namespace Sass {
|
|
|
87
105
|
|
|
88
106
|
};
|
|
89
107
|
|
|
108
|
+
// define typedef for our use case
|
|
109
|
+
typedef Environment<AST_Node_Obj> Env;
|
|
110
|
+
|
|
90
111
|
}
|
|
91
112
|
|
|
92
113
|
#endif
|
|
@@ -10,19 +10,18 @@ namespace Sass {
|
|
|
10
10
|
|
|
11
11
|
namespace Exception {
|
|
12
12
|
|
|
13
|
-
Base::Base(ParserState pstate, std::string msg,
|
|
13
|
+
Base::Base(ParserState pstate, std::string msg, Backtraces traces)
|
|
14
14
|
: std::runtime_error(msg), msg(msg),
|
|
15
|
-
prefix("Error"), pstate(pstate),
|
|
16
|
-
import_stack(import_stack)
|
|
15
|
+
prefix("Error"), pstate(pstate), traces(traces)
|
|
17
16
|
{ }
|
|
18
17
|
|
|
19
|
-
InvalidSass::InvalidSass(ParserState pstate, std::string msg)
|
|
20
|
-
: Base(pstate, msg)
|
|
18
|
+
InvalidSass::InvalidSass(ParserState pstate, Backtraces traces, std::string msg)
|
|
19
|
+
: Base(pstate, msg, traces)
|
|
21
20
|
{ }
|
|
22
21
|
|
|
23
22
|
|
|
24
|
-
InvalidParent::InvalidParent(Selector_Ptr parent, Selector_Ptr selector)
|
|
25
|
-
: Base(selector->pstate()), parent(parent), selector(selector)
|
|
23
|
+
InvalidParent::InvalidParent(Selector_Ptr parent, Backtraces traces, Selector_Ptr selector)
|
|
24
|
+
: Base(selector->pstate(), def_msg, traces), parent(parent), selector(selector)
|
|
26
25
|
{
|
|
27
26
|
msg = "Invalid parent selector for \"";
|
|
28
27
|
msg += selector->to_string(Sass_Inspect_Options());
|
|
@@ -31,8 +30,15 @@ namespace Sass {
|
|
|
31
30
|
msg += "\"";
|
|
32
31
|
}
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
: Base(pstate
|
|
33
|
+
InvalidVarKwdType::InvalidVarKwdType(ParserState pstate, Backtraces traces, std::string name, const Argument_Ptr arg)
|
|
34
|
+
: Base(pstate, def_msg, traces), name(name), arg(arg)
|
|
35
|
+
{
|
|
36
|
+
msg = "Variable keyword argument map must have string keys.\n";
|
|
37
|
+
msg += name + " is not a string in " + arg->to_string() + ".";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
InvalidArgumentType::InvalidArgumentType(ParserState pstate, Backtraces traces, std::string fn, std::string arg, std::string type, const Value_Ptr value)
|
|
41
|
+
: Base(pstate, def_msg, traces), fn(fn), arg(arg), type(type), value(value)
|
|
36
42
|
{
|
|
37
43
|
msg = arg + ": \"";
|
|
38
44
|
if (value) msg += value->to_string(Sass_Inspect_Options());
|
|
@@ -40,46 +46,24 @@ namespace Sass {
|
|
|
40
46
|
msg += " for `" + fn + "'";
|
|
41
47
|
}
|
|
42
48
|
|
|
43
|
-
MissingArgument::MissingArgument(ParserState pstate, std::string fn, std::string arg, std::string fntype)
|
|
44
|
-
: Base(pstate), fn(fn), arg(arg), fntype(fntype)
|
|
49
|
+
MissingArgument::MissingArgument(ParserState pstate, Backtraces traces, std::string fn, std::string arg, std::string fntype)
|
|
50
|
+
: Base(pstate, def_msg, traces), fn(fn), arg(arg), fntype(fntype)
|
|
45
51
|
{
|
|
46
52
|
msg = fntype + " " + fn;
|
|
47
53
|
msg += " is missing argument ";
|
|
48
54
|
msg += arg + ".";
|
|
49
55
|
}
|
|
50
56
|
|
|
51
|
-
InvalidSyntax::InvalidSyntax(ParserState pstate,
|
|
52
|
-
: Base(pstate, msg,
|
|
57
|
+
InvalidSyntax::InvalidSyntax(ParserState pstate, Backtraces traces, std::string msg)
|
|
58
|
+
: Base(pstate, msg, traces)
|
|
53
59
|
{ }
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
:
|
|
57
|
-
{
|
|
58
|
-
msg = def_op_msg + ": \"";
|
|
59
|
-
msg += lhs->to_string({ NESTED, 5 });
|
|
60
|
-
msg += " " + op + " ";
|
|
61
|
-
msg += rhs->to_string({ TO_SASS, 5 });
|
|
62
|
-
msg += "\".";
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
InvalidNullOperation::InvalidNullOperation(Expression_Ptr_Const lhs, Expression_Ptr_Const rhs, const std::string& op)
|
|
66
|
-
: UndefinedOperation(lhs, rhs, op)
|
|
67
|
-
{
|
|
68
|
-
msg = def_op_null_msg + ": \"";
|
|
69
|
-
msg += lhs->inspect();
|
|
70
|
-
msg += " " + op + " ";
|
|
71
|
-
msg += rhs->inspect();
|
|
72
|
-
msg += "\".";
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
ZeroDivisionError::ZeroDivisionError(const Expression& lhs, const Expression& rhs)
|
|
76
|
-
: lhs(lhs), rhs(rhs)
|
|
77
|
-
{
|
|
78
|
-
msg = "divided by 0";
|
|
79
|
-
}
|
|
61
|
+
NestingLimitError::NestingLimitError(ParserState pstate, Backtraces traces, std::string msg)
|
|
62
|
+
: Base(pstate, msg, traces)
|
|
63
|
+
{ }
|
|
80
64
|
|
|
81
|
-
DuplicateKeyError::DuplicateKeyError(const Map& dup, const Expression& org)
|
|
82
|
-
: Base(org.pstate()), dup(dup), org(org)
|
|
65
|
+
DuplicateKeyError::DuplicateKeyError(Backtraces traces, const Map& dup, const Expression& org)
|
|
66
|
+
: Base(org.pstate(), def_msg, traces), dup(dup), org(org)
|
|
83
67
|
{
|
|
84
68
|
msg = "Duplicate key ";
|
|
85
69
|
msg += dup.get_duplicate_key()->inspect();
|
|
@@ -88,8 +72,8 @@ namespace Sass {
|
|
|
88
72
|
msg += ").";
|
|
89
73
|
}
|
|
90
74
|
|
|
91
|
-
TypeMismatch::TypeMismatch(const Expression& var, const std::string type)
|
|
92
|
-
: Base(var.pstate()), var(var), type(type)
|
|
75
|
+
TypeMismatch::TypeMismatch(Backtraces traces, const Expression& var, const std::string type)
|
|
76
|
+
: Base(var.pstate(), def_msg, traces), var(var), type(type)
|
|
93
77
|
{
|
|
94
78
|
msg = var.to_string();
|
|
95
79
|
msg += " is not an ";
|
|
@@ -97,21 +81,20 @@ namespace Sass {
|
|
|
97
81
|
msg += ".";
|
|
98
82
|
}
|
|
99
83
|
|
|
100
|
-
InvalidValue::InvalidValue(const Expression& val)
|
|
101
|
-
: Base(val.pstate()), val(val)
|
|
84
|
+
InvalidValue::InvalidValue(Backtraces traces, const Expression& val)
|
|
85
|
+
: Base(val.pstate(), def_msg, traces), val(val)
|
|
102
86
|
{
|
|
103
87
|
msg = val.to_string();
|
|
104
88
|
msg += " isn't a valid CSS value.";
|
|
105
89
|
}
|
|
106
90
|
|
|
107
|
-
StackError::StackError(const AST_Node& node)
|
|
108
|
-
: Base(node.pstate()), node(node)
|
|
91
|
+
StackError::StackError(Backtraces traces, const AST_Node& node)
|
|
92
|
+
: Base(node.pstate(), def_msg, traces), node(node)
|
|
109
93
|
{
|
|
110
94
|
msg = "stack level too deep";
|
|
111
95
|
}
|
|
112
96
|
|
|
113
|
-
IncompatibleUnits::IncompatibleUnits(const
|
|
114
|
-
: lhs(lhs), rhs(rhs)
|
|
97
|
+
IncompatibleUnits::IncompatibleUnits(const Units& lhs, const Units& rhs)
|
|
115
98
|
{
|
|
116
99
|
msg = "Incompatible units: '";
|
|
117
100
|
msg += rhs.unit();
|
|
@@ -120,19 +103,53 @@ namespace Sass {
|
|
|
120
103
|
msg += "'.";
|
|
121
104
|
}
|
|
122
105
|
|
|
123
|
-
|
|
124
|
-
|
|
106
|
+
IncompatibleUnits::IncompatibleUnits(const UnitType lhs, const UnitType rhs)
|
|
107
|
+
{
|
|
108
|
+
msg = "Incompatible units: '";
|
|
109
|
+
msg += unit_to_string(rhs);
|
|
110
|
+
msg += "' and '";
|
|
111
|
+
msg += unit_to_string(lhs);
|
|
112
|
+
msg += "'.";
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
AlphaChannelsNotEqual::AlphaChannelsNotEqual(Expression_Ptr_Const lhs, Expression_Ptr_Const rhs, enum Sass_OP op)
|
|
116
|
+
: OperationError(), lhs(lhs), rhs(rhs), op(op)
|
|
125
117
|
{
|
|
126
118
|
msg = "Alpha channels must be equal: ";
|
|
127
119
|
msg += lhs->to_string({ NESTED, 5 });
|
|
128
|
-
msg += " " + op + " ";
|
|
120
|
+
msg += " " + sass_op_to_name(op) + " ";
|
|
129
121
|
msg += rhs->to_string({ NESTED, 5 });
|
|
130
122
|
msg += ".";
|
|
131
123
|
}
|
|
132
124
|
|
|
125
|
+
ZeroDivisionError::ZeroDivisionError(const Expression& lhs, const Expression& rhs)
|
|
126
|
+
: OperationError(), lhs(lhs), rhs(rhs)
|
|
127
|
+
{
|
|
128
|
+
msg = "divided by 0";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
UndefinedOperation::UndefinedOperation(Expression_Ptr_Const lhs, Expression_Ptr_Const rhs, enum Sass_OP op)
|
|
132
|
+
: OperationError(), lhs(lhs), rhs(rhs), op(op)
|
|
133
|
+
{
|
|
134
|
+
msg = def_op_msg + ": \"";
|
|
135
|
+
msg += lhs->to_string({ NESTED, 5 });
|
|
136
|
+
msg += " " + sass_op_to_name(op) + " ";
|
|
137
|
+
msg += rhs->to_string({ TO_SASS, 5 });
|
|
138
|
+
msg += "\".";
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
InvalidNullOperation::InvalidNullOperation(Expression_Ptr_Const lhs, Expression_Ptr_Const rhs, enum Sass_OP op)
|
|
142
|
+
: UndefinedOperation(lhs, rhs, op)
|
|
143
|
+
{
|
|
144
|
+
msg = def_op_null_msg + ": \"";
|
|
145
|
+
msg += lhs->inspect();
|
|
146
|
+
msg += " " + sass_op_to_name(op) + " ";
|
|
147
|
+
msg += rhs->inspect();
|
|
148
|
+
msg += "\".";
|
|
149
|
+
}
|
|
133
150
|
|
|
134
|
-
SassValueError::SassValueError(ParserState pstate, OperationError& err)
|
|
135
|
-
: Base(pstate, err.what())
|
|
151
|
+
SassValueError::SassValueError(Backtraces traces, ParserState pstate, OperationError& err)
|
|
152
|
+
: Base(pstate, err.what(), traces)
|
|
136
153
|
{
|
|
137
154
|
msg = err.what();
|
|
138
155
|
prefix = err.errtype();
|
|
@@ -143,13 +160,22 @@ namespace Sass {
|
|
|
143
160
|
|
|
144
161
|
void warn(std::string msg, ParserState pstate)
|
|
145
162
|
{
|
|
146
|
-
std::cerr << "Warning: " << msg<< std::endl;
|
|
163
|
+
std::cerr << "Warning: " << msg << std::endl;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
void warning(std::string msg, ParserState pstate)
|
|
167
|
+
{
|
|
168
|
+
std::string cwd(Sass::File::get_cwd());
|
|
169
|
+
std::string abs_path(Sass::File::rel2abs(pstate.path, cwd, cwd));
|
|
170
|
+
std::string rel_path(Sass::File::abs2rel(pstate.path, cwd, cwd));
|
|
171
|
+
std::string output_path(Sass::File::path_for_console(rel_path, abs_path, pstate.path));
|
|
172
|
+
|
|
173
|
+
std::cerr << "WARNING on line " << pstate.line+1 << ", column " << pstate.column+1 << " of " << output_path << ":" << std::endl;
|
|
174
|
+
std::cerr << msg << std::endl << std::endl;
|
|
147
175
|
}
|
|
148
176
|
|
|
149
177
|
void warn(std::string msg, ParserState pstate, Backtrace* bt)
|
|
150
178
|
{
|
|
151
|
-
Backtrace top(bt, pstate, "");
|
|
152
|
-
msg += top.to_string();
|
|
153
179
|
warn(msg, pstate);
|
|
154
180
|
}
|
|
155
181
|
|
|
@@ -165,7 +191,7 @@ namespace Sass {
|
|
|
165
191
|
std::cerr << " on line " << pstate.line+1 << " of " << output_path << std::endl;
|
|
166
192
|
}
|
|
167
193
|
|
|
168
|
-
void deprecated(std::string msg, std::string msg2, ParserState pstate)
|
|
194
|
+
void deprecated(std::string msg, std::string msg2, bool with_column, ParserState pstate)
|
|
169
195
|
{
|
|
170
196
|
std::string cwd(Sass::File::get_cwd());
|
|
171
197
|
std::string abs_path(Sass::File::rel2abs(pstate.path, cwd, cwd));
|
|
@@ -173,9 +199,10 @@ namespace Sass {
|
|
|
173
199
|
std::string output_path(Sass::File::path_for_console(rel_path, pstate.path, pstate.path));
|
|
174
200
|
|
|
175
201
|
std::cerr << "DEPRECATION WARNING on line " << pstate.line + 1;
|
|
202
|
+
if (with_column) std::cerr << ", column " << pstate.column + pstate.offset.column + 1;
|
|
176
203
|
if (output_path.length()) std::cerr << " of " << output_path;
|
|
177
204
|
std::cerr << ":" << std::endl;
|
|
178
|
-
std::cerr << msg <<
|
|
205
|
+
std::cerr << msg << std::endl;
|
|
179
206
|
if (msg2.length()) std::cerr << msg2 << std::endl;
|
|
180
207
|
std::cerr << std::endl;
|
|
181
208
|
}
|
|
@@ -192,16 +219,17 @@ namespace Sass {
|
|
|
192
219
|
std::cerr << "This will be an error in future versions of Sass." << std::endl;
|
|
193
220
|
}
|
|
194
221
|
|
|
195
|
-
|
|
222
|
+
// should be replaced with error with backtraces
|
|
223
|
+
void coreError(std::string msg, ParserState pstate)
|
|
196
224
|
{
|
|
197
|
-
|
|
225
|
+
Backtraces traces;
|
|
226
|
+
throw Exception::InvalidSyntax(pstate, traces, msg);
|
|
198
227
|
}
|
|
199
228
|
|
|
200
|
-
void error(std::string msg, ParserState pstate,
|
|
229
|
+
void error(std::string msg, ParserState pstate, Backtraces& traces)
|
|
201
230
|
{
|
|
202
|
-
Backtrace
|
|
203
|
-
|
|
204
|
-
error(msg, pstate);
|
|
231
|
+
traces.push_back(Backtrace(pstate));
|
|
232
|
+
throw Exception::InvalidSyntax(pstate, traces, msg);
|
|
205
233
|
}
|
|
206
234
|
|
|
207
235
|
}
|