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