sassc 1.10.1 → 1.11.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 +4 -4
- data/README.md +5 -2
- data/ext/libsass/.github/CONTRIBUTING.md +65 -0
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +29 -0
- data/ext/libsass/Makefile +8 -3
- data/ext/libsass/Makefile.conf +28 -22
- data/ext/libsass/Readme.md +14 -7
- data/ext/libsass/configure.ac +5 -8
- data/ext/libsass/docs/api-context-internal.md +3 -0
- data/ext/libsass/docs/api-context.md +7 -0
- data/ext/libsass/docs/api-doc.md +4 -0
- data/ext/libsass/docs/api-importer.md +2 -0
- data/ext/libsass/docs/api-value-example.md +55 -0
- data/ext/libsass/docs/api-value.md +49 -22
- data/ext/libsass/docs/implementations.md +4 -0
- data/ext/libsass/include/sass/base.h +5 -4
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/include/sass/values.h +28 -27
- data/ext/libsass/include/sass/version.h +1 -1
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-deps +12 -3
- data/ext/libsass/src/ast.cpp +321 -212
- data/ext/libsass/src/ast.hpp +273 -165
- data/ext/libsass/src/ast_factory.hpp +4 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +8 -7
- data/ext/libsass/src/bind.cpp +2 -7
- data/ext/libsass/src/bind.hpp +0 -1
- data/ext/libsass/src/check_nesting.cpp +379 -0
- data/ext/libsass/src/check_nesting.hpp +60 -0
- data/ext/libsass/src/constants.cpp +7 -6
- data/ext/libsass/src/constants.hpp +2 -1
- data/ext/libsass/src/context.cpp +7 -1
- data/ext/libsass/src/context.hpp +1 -1
- data/ext/libsass/src/cssize.cpp +76 -32
- data/ext/libsass/src/cssize.hpp +7 -8
- data/ext/libsass/src/debugger.hpp +70 -40
- data/ext/libsass/src/error_handling.cpp +15 -2
- data/ext/libsass/src/error_handling.hpp +19 -0
- data/ext/libsass/src/eval.cpp +107 -161
- data/ext/libsass/src/eval.hpp +12 -8
- data/ext/libsass/src/expand.cpp +81 -74
- data/ext/libsass/src/expand.hpp +13 -12
- data/ext/libsass/src/extend.cpp +149 -142
- data/ext/libsass/src/extend.hpp +10 -3
- data/ext/libsass/src/file.cpp +2 -1
- data/ext/libsass/src/functions.cpp +96 -59
- data/ext/libsass/src/functions.hpp +2 -2
- data/ext/libsass/src/inspect.cpp +33 -45
- data/ext/libsass/src/inspect.hpp +7 -7
- data/ext/libsass/src/json.cpp +17 -5
- data/ext/libsass/src/lexer.cpp +3 -3
- data/ext/libsass/src/listize.cpp +10 -10
- data/ext/libsass/src/listize.hpp +3 -3
- data/ext/libsass/src/node.cpp +30 -30
- data/ext/libsass/src/node.hpp +13 -13
- data/ext/libsass/src/operation.hpp +21 -19
- data/ext/libsass/src/output.cpp +48 -103
- data/ext/libsass/src/output.hpp +0 -1
- data/ext/libsass/src/parser.cpp +161 -133
- data/ext/libsass/src/parser.hpp +10 -7
- data/ext/libsass/src/remove_placeholders.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.hpp +1 -1
- data/ext/libsass/src/sass.cpp +21 -0
- data/ext/libsass/src/sass.hpp +8 -1
- data/ext/libsass/src/sass2scss.cpp +14 -3
- data/ext/libsass/src/sass_context.cpp +69 -24
- data/ext/libsass/src/sass_context.hpp +3 -0
- data/ext/libsass/src/source_map.cpp +22 -10
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.hpp +3 -1
- data/ext/libsass/src/util.cpp +20 -16
- data/ext/libsass/src/util.hpp +2 -1
- data/ext/libsass/win/libsass.targets +2 -0
- data/ext/libsass/win/libsass.vcxproj.filters +6 -0
- data/lib/sassc/engine.rb +5 -0
- data/lib/sassc/native/native_functions_api.rb +13 -1
- data/lib/sassc/script/value_conversion.rb +11 -1
- data/lib/sassc/script/value_conversion/list.rb +23 -0
- data/lib/sassc/version.rb +1 -1
- data/test/engine_test.rb +18 -2
- data/test/functions_test.rb +30 -0
- data/test/native_test.rb +1 -1
- metadata +8 -3
@@ -0,0 +1,60 @@
|
|
1
|
+
#ifndef SASS_CHECK_NESTING_H
|
2
|
+
#define SASS_CHECK_NESTING_H
|
3
|
+
|
4
|
+
#include "ast.hpp"
|
5
|
+
#include "operation.hpp"
|
6
|
+
|
7
|
+
namespace Sass {
|
8
|
+
|
9
|
+
typedef Environment<AST_Node*> Env;
|
10
|
+
|
11
|
+
class CheckNesting : public Operation_CRTP<Statement*, CheckNesting> {
|
12
|
+
|
13
|
+
std::vector<Statement*> parents;
|
14
|
+
Statement* parent;
|
15
|
+
Definition* current_mixin_definition;
|
16
|
+
|
17
|
+
Statement* fallback_impl(Statement*);
|
18
|
+
Statement* before(Statement*);
|
19
|
+
Statement* visit_children(Statement*);
|
20
|
+
|
21
|
+
public:
|
22
|
+
CheckNesting();
|
23
|
+
~CheckNesting() { }
|
24
|
+
|
25
|
+
Statement* operator()(Block*);
|
26
|
+
Statement* operator()(Definition*);
|
27
|
+
|
28
|
+
template <typename U>
|
29
|
+
Statement* fallback(U x) {
|
30
|
+
return fallback_impl(this->before(dynamic_cast<Statement*>(x)));
|
31
|
+
}
|
32
|
+
|
33
|
+
private:
|
34
|
+
void invalid_content_parent(Statement*);
|
35
|
+
void invalid_charset_parent(Statement*);
|
36
|
+
void invalid_extend_parent(Statement*);
|
37
|
+
// void invalid_import_parent(Statement*);
|
38
|
+
void invalid_mixin_definition_parent(Statement*);
|
39
|
+
void invalid_function_parent(Statement*);
|
40
|
+
|
41
|
+
void invalid_function_child(Statement*);
|
42
|
+
void invalid_prop_child(Statement*);
|
43
|
+
void invalid_prop_parent(Statement*);
|
44
|
+
void invalid_return_parent(Statement*);
|
45
|
+
|
46
|
+
bool is_transparent_parent(Statement*, Statement*);
|
47
|
+
|
48
|
+
bool should_visit(Statement*);
|
49
|
+
|
50
|
+
bool is_charset(Statement*);
|
51
|
+
bool is_mixin(Statement*);
|
52
|
+
bool is_function(Statement*);
|
53
|
+
bool is_root_node(Statement*);
|
54
|
+
bool is_at_root_node(Statement*);
|
55
|
+
bool is_directive_node(Statement*);
|
56
|
+
};
|
57
|
+
|
58
|
+
}
|
59
|
+
|
60
|
+
#endif
|
@@ -10,12 +10,13 @@ namespace Sass {
|
|
10
10
|
// https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity
|
11
11
|
// https://github.com/sass/sass/issues/1495#issuecomment-61189114
|
12
12
|
extern const unsigned long Specificity_Star = 0;
|
13
|
-
extern const unsigned long Specificity_Universal =
|
14
|
-
extern const unsigned long
|
15
|
-
extern const unsigned long
|
16
|
-
extern const unsigned long
|
17
|
-
extern const unsigned long
|
18
|
-
extern const unsigned long
|
13
|
+
extern const unsigned long Specificity_Universal = 0;
|
14
|
+
extern const unsigned long Specificity_Element = 1;
|
15
|
+
extern const unsigned long Specificity_Base = 1000;
|
16
|
+
extern const unsigned long Specificity_Class = 1000;
|
17
|
+
extern const unsigned long Specificity_Attr = 1000;
|
18
|
+
extern const unsigned long Specificity_Pseudo = 1000;
|
19
|
+
extern const unsigned long Specificity_ID = 1000000;
|
19
20
|
|
20
21
|
// sass keywords
|
21
22
|
extern const char at_root_kwd[] = "@at-root";
|
@@ -11,7 +11,8 @@ namespace Sass {
|
|
11
11
|
// The following list of selectors is by increasing specificity:
|
12
12
|
extern const unsigned long Specificity_Star;
|
13
13
|
extern const unsigned long Specificity_Universal;
|
14
|
-
extern const unsigned long
|
14
|
+
extern const unsigned long Specificity_Element;
|
15
|
+
extern const unsigned long Specificity_Base;
|
15
16
|
extern const unsigned long Specificity_Class;
|
16
17
|
extern const unsigned long Specificity_Attr;
|
17
18
|
extern const unsigned long Specificity_Pseudo;
|
data/ext/libsass/src/context.cpp
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
#include "output.hpp"
|
19
19
|
#include "expand.hpp"
|
20
20
|
#include "eval.hpp"
|
21
|
+
#include "check_nesting.hpp"
|
21
22
|
#include "cssize.hpp"
|
22
23
|
#include "listize.hpp"
|
23
24
|
#include "extend.hpp"
|
@@ -398,7 +399,7 @@ namespace Sass {
|
|
398
399
|
const Importer importer(imp_path, ctx_path);
|
399
400
|
Include include(load_import(importer, pstate));
|
400
401
|
if (include.abs_path.empty()) {
|
401
|
-
error("File to import not found or unreadable: " + imp_path + "
|
402
|
+
error("File to import not found or unreadable: " + imp_path + ".\nParent style sheet: " + ctx_path, pstate);
|
402
403
|
}
|
403
404
|
imp->incs().push_back(include);
|
404
405
|
}
|
@@ -648,8 +649,13 @@ namespace Sass {
|
|
648
649
|
// create crtp visitor objects
|
649
650
|
Expand expand(*this, &global, &backtrace);
|
650
651
|
Cssize cssize(*this, &backtrace);
|
652
|
+
CheckNesting check_nesting;
|
653
|
+
// check nesting
|
654
|
+
root->perform(&check_nesting)->block();
|
651
655
|
// expand and eval the tree
|
652
656
|
root = root->perform(&expand)->block();
|
657
|
+
// check nesting
|
658
|
+
root->perform(&check_nesting)->block();
|
653
659
|
// merge and bubble certain rules
|
654
660
|
root = root->perform(&cssize)->block();
|
655
661
|
// should we extend something?
|
data/ext/libsass/src/context.hpp
CHANGED
@@ -50,7 +50,7 @@ namespace Sass {
|
|
50
50
|
std::vector<char*> strings;
|
51
51
|
std::vector<Resource> resources;
|
52
52
|
std::map<const std::string, const StyleSheet> sheets;
|
53
|
-
Subset_Map<std::string, std::pair<
|
53
|
+
Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > subset_map;
|
54
54
|
std::vector<Sass_Import_Entry> import_stack;
|
55
55
|
|
56
56
|
struct Sass_Compiler* c_compiler;
|
data/ext/libsass/src/cssize.cpp
CHANGED
@@ -13,22 +13,14 @@ namespace Sass {
|
|
13
13
|
: ctx(ctx),
|
14
14
|
block_stack(std::vector<Block*>()),
|
15
15
|
p_stack(std::vector<Statement*>()),
|
16
|
-
s_stack(std::vector<Selector_List*>()),
|
17
16
|
backtrace(bt)
|
18
|
-
{
|
19
|
-
s_stack.push_back(NULL);
|
20
|
-
}
|
17
|
+
{ }
|
21
18
|
|
22
19
|
Statement* Cssize::parent()
|
23
20
|
{
|
24
21
|
return p_stack.size() ? p_stack.back() : block_stack.front();
|
25
22
|
}
|
26
23
|
|
27
|
-
Selector_List* Cssize::selector()
|
28
|
-
{
|
29
|
-
return s_stack.size() ? s_stack.back() : NULL;
|
30
|
-
}
|
31
|
-
|
32
24
|
Statement* Cssize::operator()(Block* b)
|
33
25
|
{
|
34
26
|
Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, b->pstate(), b->length(), b->is_root());
|
@@ -39,6 +31,50 @@ namespace Sass {
|
|
39
31
|
return bb;
|
40
32
|
}
|
41
33
|
|
34
|
+
Statement* Cssize::operator()(Trace* t)
|
35
|
+
{
|
36
|
+
return t->block()->perform(this);
|
37
|
+
}
|
38
|
+
|
39
|
+
Statement* Cssize::operator()(Declaration* d)
|
40
|
+
{
|
41
|
+
String* property = dynamic_cast<String*>(d->property());
|
42
|
+
|
43
|
+
if (Declaration* dd = dynamic_cast<Declaration*>(parent())) {
|
44
|
+
String* parent_property = dynamic_cast<String*>(dd->property());
|
45
|
+
property = SASS_MEMORY_NEW(ctx.mem, String_Constant,
|
46
|
+
d->property()->pstate(),
|
47
|
+
parent_property->to_string() + "-" + property->to_string());
|
48
|
+
if (!dd->value()) {
|
49
|
+
d->tabs(dd->tabs() + 1);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
Declaration* dd = SASS_MEMORY_NEW(ctx.mem, Declaration,
|
54
|
+
d->pstate(),
|
55
|
+
property,
|
56
|
+
d->value(),
|
57
|
+
d->is_important());
|
58
|
+
dd->is_indented(d->is_indented());
|
59
|
+
dd->tabs(d->tabs());
|
60
|
+
|
61
|
+
p_stack.push_back(dd);
|
62
|
+
Block* bb = d->block() ? d->block()->perform(this)->block() : 0;
|
63
|
+
p_stack.pop_back();
|
64
|
+
|
65
|
+
if (bb && bb->length()) {
|
66
|
+
if (dd->value() && !dd->value()->is_invisible()) {
|
67
|
+
bb->unshift(dd);
|
68
|
+
}
|
69
|
+
return bb;
|
70
|
+
}
|
71
|
+
else if (dd->value() && !dd->value()->is_invisible()) {
|
72
|
+
return dd;
|
73
|
+
}
|
74
|
+
|
75
|
+
return 0;
|
76
|
+
}
|
77
|
+
|
42
78
|
Statement* Cssize::operator()(Directive* r)
|
43
79
|
{
|
44
80
|
if (!r->block() || !r->block()->length()) return r;
|
@@ -101,14 +137,22 @@ namespace Sass {
|
|
101
137
|
Statement* Cssize::operator()(Ruleset* r)
|
102
138
|
{
|
103
139
|
p_stack.push_back(r);
|
104
|
-
|
140
|
+
// this can return a string schema
|
141
|
+
// string schema is not a statement!
|
142
|
+
// r->block() is already a string schema
|
143
|
+
// and that is comming from propset expand
|
144
|
+
Statement* stmt = r->block()->perform(this);
|
145
|
+
// this should protect us (at least a bit) from our mess
|
146
|
+
// fixing this properly is harder that it should be ...
|
147
|
+
if (dynamic_cast<Statement*>((AST_Node*)stmt) == NULL) {
|
148
|
+
error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
|
149
|
+
}
|
105
150
|
Ruleset* rr = SASS_MEMORY_NEW(ctx.mem, Ruleset,
|
106
151
|
r->pstate(),
|
107
152
|
r->selector(),
|
108
|
-
|
153
|
+
stmt->block());
|
109
154
|
rr->is_root(r->is_root());
|
110
155
|
// rr->tabs(r->block()->tabs());
|
111
|
-
s_stack.pop_back();
|
112
156
|
p_stack.pop_back();
|
113
157
|
|
114
158
|
if (!rr->block()) {
|
@@ -419,46 +463,40 @@ namespace Sass {
|
|
419
463
|
}
|
420
464
|
else {
|
421
465
|
previous_parent = static_cast<Has_Block*>(shallow_copy(parent));
|
466
|
+
previous_parent->block(slice);
|
422
467
|
previous_parent->tabs(parent->tabs());
|
423
468
|
|
424
|
-
Has_Block* new_parent =
|
425
|
-
new_parent->block(slice);
|
426
|
-
new_parent->tabs(parent->tabs());
|
469
|
+
Has_Block* new_parent = previous_parent;
|
427
470
|
|
428
471
|
*result << new_parent;
|
429
472
|
}
|
430
473
|
continue;
|
431
474
|
}
|
432
475
|
|
433
|
-
Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
|
434
|
-
children->block()->pstate(),
|
435
|
-
children->block()->length(),
|
436
|
-
children->block()->is_root());
|
437
|
-
|
438
476
|
for (size_t j = 0, K = slice->length(); j < K; ++j)
|
439
477
|
{
|
440
478
|
Statement* ss = 0;
|
441
|
-
Bubble*
|
479
|
+
Bubble* node = static_cast<Bubble*>((*slice)[j]);
|
442
480
|
|
443
481
|
if (!parent ||
|
444
482
|
parent->statement_type() != Statement::MEDIA ||
|
445
|
-
|
446
|
-
static_cast<Media_Block*>(
|
483
|
+
node->node()->statement_type() != Statement::MEDIA ||
|
484
|
+
static_cast<Media_Block*>(node->node())->media_queries() == static_cast<Media_Block*>(parent)->media_queries())
|
447
485
|
{
|
448
|
-
ss =
|
486
|
+
ss = node->node();
|
449
487
|
}
|
450
488
|
else
|
451
489
|
{
|
452
|
-
List* mq = merge_media_queries(static_cast<Media_Block*>(
|
490
|
+
List* mq = merge_media_queries(static_cast<Media_Block*>(node->node()), static_cast<Media_Block*>(parent));
|
453
491
|
if (!mq->length()) continue;
|
454
|
-
static_cast<Media_Block*>(
|
455
|
-
ss =
|
492
|
+
static_cast<Media_Block*>(node->node())->media_queries(mq);
|
493
|
+
ss = node->node();
|
456
494
|
}
|
457
495
|
|
458
496
|
if (!ss) continue;
|
459
497
|
|
460
|
-
ss->tabs(ss->tabs() +
|
461
|
-
ss->group_end(
|
498
|
+
ss->tabs(ss->tabs() + node->tabs());
|
499
|
+
ss->group_end(node->group_end());
|
462
500
|
|
463
501
|
if (!ss) continue;
|
464
502
|
|
@@ -467,16 +505,22 @@ namespace Sass {
|
|
467
505
|
children->block()->length(),
|
468
506
|
children->block()->is_root());
|
469
507
|
*bb << ss->perform(this);
|
508
|
+
|
509
|
+
Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
|
510
|
+
children->block()->pstate(),
|
511
|
+
children->block()->length(),
|
512
|
+
children->block()->is_root());
|
513
|
+
|
470
514
|
Statement* wrapper = flatten(bb);
|
471
515
|
*wrapper_block << wrapper;
|
472
516
|
|
473
517
|
if (wrapper->block()->length()) {
|
474
518
|
previous_parent = 0;
|
475
519
|
}
|
476
|
-
}
|
477
520
|
|
478
|
-
|
479
|
-
|
521
|
+
if (wrapper_block) {
|
522
|
+
*result << wrapper_block;
|
523
|
+
}
|
480
524
|
}
|
481
525
|
}
|
482
526
|
|
data/ext/libsass/src/cssize.hpp
CHANGED
@@ -13,11 +13,10 @@ namespace Sass {
|
|
13
13
|
|
14
14
|
class Cssize : public Operation_CRTP<Statement*, Cssize> {
|
15
15
|
|
16
|
-
Context&
|
17
|
-
std::vector<Block*>
|
18
|
-
std::vector<Statement*>
|
19
|
-
|
20
|
-
Backtrace* backtrace;
|
16
|
+
Context& ctx;
|
17
|
+
std::vector<Block*> block_stack;
|
18
|
+
std::vector<Statement*> p_stack;
|
19
|
+
Backtrace* backtrace;
|
21
20
|
|
22
21
|
Statement* fallback_impl(AST_Node* n);
|
23
22
|
|
@@ -25,18 +24,18 @@ namespace Sass {
|
|
25
24
|
Cssize(Context&, Backtrace*);
|
26
25
|
~Cssize() { }
|
27
26
|
|
28
|
-
|
27
|
+
CommaSequence_Selector* selector();
|
29
28
|
|
30
29
|
Statement* operator()(Block*);
|
31
30
|
Statement* operator()(Ruleset*);
|
32
|
-
// Statement* operator()(Propset*);
|
33
31
|
// Statement* operator()(Bubble*);
|
34
32
|
Statement* operator()(Media_Block*);
|
35
33
|
Statement* operator()(Supports_Block*);
|
36
34
|
Statement* operator()(At_Root_Block*);
|
37
35
|
Statement* operator()(Directive*);
|
38
36
|
Statement* operator()(Keyframe_Rule*);
|
39
|
-
|
37
|
+
Statement* operator()(Trace*);
|
38
|
+
Statement* operator()(Declaration*);
|
40
39
|
// Statement* operator()(Assignment*);
|
41
40
|
// Statement* operator()(Import*);
|
42
41
|
// Statement* operator()(Import_Stub*);
|
@@ -65,6 +65,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
65
65
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
66
66
|
std::cerr << " " << bubble->tabs();
|
67
67
|
std::cerr << std::endl;
|
68
|
+
debug_ast(bubble->node(), ind + " ", env);
|
69
|
+
} else if (dynamic_cast<Trace*>(node)) {
|
70
|
+
Trace* trace = dynamic_cast<Trace*>(node);
|
71
|
+
std::cerr << ind << "Trace " << trace;
|
72
|
+
std::cerr << " (" << pstate_source_position(node) << ")"
|
73
|
+
<< " [name:" << trace->name() << "]"
|
74
|
+
<< std::endl;
|
75
|
+
debug_ast(trace->block(), ind + " ", env);
|
68
76
|
} else if (dynamic_cast<At_Root_Block*>(node)) {
|
69
77
|
At_Root_Block* root_block = dynamic_cast<At_Root_Block*>(node);
|
70
78
|
std::cerr << ind << "At_Root_Block " << root_block;
|
@@ -73,12 +81,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
73
81
|
std::cerr << std::endl;
|
74
82
|
debug_ast(root_block->expression(), ind + ":", env);
|
75
83
|
debug_ast(root_block->block(), ind + " ", env);
|
76
|
-
} else if (dynamic_cast<
|
77
|
-
|
78
|
-
std::cerr << ind << "
|
84
|
+
} else if (dynamic_cast<CommaSequence_Selector*>(node)) {
|
85
|
+
CommaSequence_Selector* selector = dynamic_cast<CommaSequence_Selector*>(node);
|
86
|
+
std::cerr << ind << "CommaSequence_Selector " << selector;
|
79
87
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
80
88
|
std::cerr << " <" << selector->hash() << ">";
|
81
89
|
std::cerr << " [@media:" << selector->media_block() << "]";
|
90
|
+
std::cerr << (selector->is_invisible() ? " [INVISIBLE]": " -");
|
91
|
+
std::cerr << (selector->has_placeholder() ? " [PLACEHOLDER]": " -");
|
82
92
|
std::cerr << (selector->is_optional() ? " [is_optional]": " -");
|
83
93
|
std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
|
84
94
|
std::cerr << (selector->has_line_break() ? " [line-break]": " -");
|
@@ -97,16 +107,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
97
107
|
// if (selector->not_selector()) cerr << " [in_declaration]";
|
98
108
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
99
109
|
std::cerr << " <" << selector->hash() << ">";
|
110
|
+
std::cerr << " [" << (selector->is_real_parent_ref() ? "REAL" : "FAKE") << "]";
|
100
111
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
|
101
112
|
// debug_ast(selector->selector(), ind + "->", env);
|
102
113
|
|
103
|
-
} else if (dynamic_cast<
|
104
|
-
|
105
|
-
std::cerr << ind << "
|
114
|
+
} else if (dynamic_cast<Sequence_Selector*>(node)) {
|
115
|
+
Sequence_Selector* selector = dynamic_cast<Sequence_Selector*>(node);
|
116
|
+
std::cerr << ind << "Sequence_Selector " << selector
|
106
117
|
<< " (" << pstate_source_position(node) << ")"
|
107
118
|
<< " <" << selector->hash() << ">"
|
119
|
+
<< " [length:" << longToHex(selector->length()) << "]"
|
108
120
|
<< " [weight:" << longToHex(selector->specificity()) << "]"
|
109
121
|
<< " [@media:" << selector->media_block() << "]"
|
122
|
+
<< (selector->is_invisible() ? " [INVISIBLE]": " -")
|
123
|
+
<< (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
|
110
124
|
<< (selector->is_optional() ? " [is_optional]": " -")
|
111
125
|
<< (selector->has_parent_ref() ? " [has parent]": " -")
|
112
126
|
<< (selector->has_line_feed() ? " [line-feed]": " -")
|
@@ -114,11 +128,11 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
114
128
|
<< " -- ";
|
115
129
|
std::string del;
|
116
130
|
switch (selector->combinator()) {
|
117
|
-
case
|
118
|
-
case
|
119
|
-
case
|
120
|
-
case
|
121
|
-
case
|
131
|
+
case Sequence_Selector::PARENT_OF: del = ">"; break;
|
132
|
+
case Sequence_Selector::PRECEDES: del = "~"; break;
|
133
|
+
case Sequence_Selector::ADJACENT_TO: del = "+"; break;
|
134
|
+
case Sequence_Selector::ANCESTOR_OF: del = " "; break;
|
135
|
+
case Sequence_Selector::REFERENCE: del = "//"; break;
|
122
136
|
}
|
123
137
|
// if (del = "/") del += selector->reference()->perform(&to_string) + "/";
|
124
138
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
|
@@ -130,9 +144,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
130
144
|
}
|
131
145
|
SourcesSet set = selector->sources();
|
132
146
|
// debug_sources_set(set, ind + " @--> ");
|
133
|
-
} else if (dynamic_cast<
|
134
|
-
|
135
|
-
std::cerr << ind << "
|
147
|
+
} else if (dynamic_cast<SimpleSequence_Selector*>(node)) {
|
148
|
+
SimpleSequence_Selector* selector = dynamic_cast<SimpleSequence_Selector*>(node);
|
149
|
+
std::cerr << ind << "SimpleSequence_Selector " << selector;
|
136
150
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
137
151
|
std::cerr << " <" << selector->hash() << ">";
|
138
152
|
std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
|
@@ -144,12 +158,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
144
158
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
145
159
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
|
146
160
|
for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
|
147
|
-
} else if (dynamic_cast<Propset*>(node)) {
|
148
|
-
Propset* selector = dynamic_cast<Propset*>(node);
|
149
|
-
std::cerr << ind << "Propset " << selector;
|
150
|
-
std::cerr << " (" << pstate_source_position(node) << ")";
|
151
|
-
std::cerr << " " << selector->tabs() << std::endl;
|
152
|
-
if (selector->block()) for(auto i : selector->block()->elements()) { debug_ast(i, ind + " ", env); }
|
153
161
|
} else if (dynamic_cast<Wrapped_Selector*>(node)) {
|
154
162
|
Wrapped_Selector* selector = dynamic_cast<Wrapped_Selector*>(node);
|
155
163
|
std::cerr << ind << "Wrapped_Selector " << selector;
|
@@ -186,9 +194,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
186
194
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
187
195
|
std::cerr << std::endl;
|
188
196
|
debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
|
189
|
-
} else if (dynamic_cast<
|
190
|
-
|
191
|
-
std::cerr << ind << "
|
197
|
+
} else if (dynamic_cast<Class_Selector*>(node)) {
|
198
|
+
Class_Selector* selector = dynamic_cast<Class_Selector*>(node);
|
199
|
+
std::cerr << ind << "Class_Selector " << selector;
|
200
|
+
std::cerr << " (" << pstate_source_position(node) << ")";
|
201
|
+
std::cerr << " <" << selector->hash() << ">";
|
202
|
+
std::cerr << " <<" << selector->ns_name() << ">>";
|
203
|
+
std::cerr << (selector->is_optional() ? " [is_optional]": " -");
|
204
|
+
std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
|
205
|
+
std::cerr << (selector->has_line_break() ? " [line-break]": " -");
|
206
|
+
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
207
|
+
std::cerr << std::endl;
|
208
|
+
} else if (dynamic_cast<Id_Selector*>(node)) {
|
209
|
+
Id_Selector* selector = dynamic_cast<Id_Selector*>(node);
|
210
|
+
std::cerr << ind << "Id_Selector " << selector;
|
192
211
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
193
212
|
std::cerr << " <" << selector->hash() << ">";
|
194
213
|
std::cerr << " <<" << selector->ns_name() << ">>";
|
@@ -197,9 +216,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
197
216
|
std::cerr << (selector->has_line_break() ? " [line-break]": " -");
|
198
217
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
199
218
|
std::cerr << std::endl;
|
200
|
-
} else if (dynamic_cast<
|
201
|
-
|
202
|
-
std::cerr << ind << "
|
219
|
+
} else if (dynamic_cast<Element_Selector*>(node)) {
|
220
|
+
Element_Selector* selector = dynamic_cast<Element_Selector*>(node);
|
221
|
+
std::cerr << ind << "Element_Selector " << selector;
|
203
222
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
204
223
|
std::cerr << " <" << selector->hash() << ">";
|
205
224
|
std::cerr << " <<" << selector->ns_name() << ">>";
|
@@ -209,10 +228,10 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
209
228
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
210
229
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
|
211
230
|
std::cerr << std::endl;
|
212
|
-
} else if (dynamic_cast<
|
231
|
+
} else if (dynamic_cast<Placeholder_Selector*>(node)) {
|
213
232
|
|
214
|
-
|
215
|
-
std::cerr << ind << "
|
233
|
+
Placeholder_Selector* selector = dynamic_cast<Placeholder_Selector*>(node);
|
234
|
+
std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector
|
216
235
|
<< " <" << selector->hash() << ">"
|
217
236
|
<< " [@media:" << selector->media_block() << "]"
|
218
237
|
<< (selector->is_optional() ? " [is_optional]": " -")
|
@@ -279,6 +298,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
279
298
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
280
299
|
std::cerr << " " << block->tabs() << std::endl;
|
281
300
|
debug_ast(block->condition(), ind + " =@ ");
|
301
|
+
debug_ast(block->block(), ind + " <>");
|
282
302
|
} else if (dynamic_cast<Supports_Operator*>(node)) {
|
283
303
|
Supports_Operator* block = dynamic_cast<Supports_Operator*>(node);
|
284
304
|
std::cerr << ind << "Supports_Operator " << block;
|
@@ -292,6 +312,13 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
292
312
|
std::cerr << " (" << pstate_source_position(node) << ")"
|
293
313
|
<< std::endl;
|
294
314
|
debug_ast(block->condition(), ind + " condition) ");
|
315
|
+
} else if (dynamic_cast<At_Root_Query*>(node)) {
|
316
|
+
At_Root_Query* block = dynamic_cast<At_Root_Query*>(node);
|
317
|
+
std::cerr << ind << "At_Root_Query " << block;
|
318
|
+
std::cerr << " (" << pstate_source_position(node) << ")"
|
319
|
+
<< std::endl;
|
320
|
+
debug_ast(block->feature(), ind + " feature) ");
|
321
|
+
debug_ast(block->value(), ind + " value) ");
|
295
322
|
} else if (dynamic_cast<Supports_Declaration*>(node)) {
|
296
323
|
Supports_Declaration* block = dynamic_cast<Supports_Declaration*>(node);
|
297
324
|
std::cerr << ind << "Supports_Declaration " << block;
|
@@ -311,6 +338,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
311
338
|
std::cerr << ind << "Warning " << block;
|
312
339
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
313
340
|
std::cerr << " " << block->tabs() << std::endl;
|
341
|
+
debug_ast(block->message(), ind + " : ");
|
314
342
|
} else if (dynamic_cast<Error*>(node)) {
|
315
343
|
Error* block = dynamic_cast<Error*>(node);
|
316
344
|
std::cerr << ind << "Error " << block;
|
@@ -381,6 +409,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
381
409
|
std::cerr << " " << block->tabs() << std::endl;
|
382
410
|
debug_ast(block->property(), ind + " prop: ", env);
|
383
411
|
debug_ast(block->value(), ind + " value: ", env);
|
412
|
+
debug_ast(block->block(), ind + " ", env);
|
384
413
|
} else if (dynamic_cast<Keyframe_Rule*>(node)) {
|
385
414
|
Keyframe_Rule* has_block = dynamic_cast<Keyframe_Rule*>(node);
|
386
415
|
std::cerr << ind << "Keyframe_Rule " << has_block;
|
@@ -425,18 +454,19 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
425
454
|
std::cerr << " [native: " << block->native_function() << "] ";
|
426
455
|
std::cerr << " " << block->tabs() << std::endl;
|
427
456
|
debug_ast(block->parameters(), ind + " params: ", env);
|
428
|
-
if (block->block())
|
457
|
+
if (block->block()) debug_ast(block->block(), ind + " ", env);
|
429
458
|
} else if (dynamic_cast<Mixin_Call*>(node)) {
|
430
459
|
Mixin_Call* block = dynamic_cast<Mixin_Call*>(node);
|
431
460
|
std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
|
432
461
|
std::cerr << " [" << block->name() << "]";
|
433
462
|
std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
|
434
463
|
debug_ast(block->arguments(), ind + " args: ");
|
435
|
-
if (block->block())
|
464
|
+
if (block->block()) debug_ast(block->block(), ind + " ", env);
|
436
465
|
} else if (Ruleset* ruleset = dynamic_cast<Ruleset*>(node)) {
|
437
466
|
std::cerr << ind << "Ruleset " << ruleset;
|
438
467
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
439
468
|
std::cerr << " [indent: " << ruleset->tabs() << "]";
|
469
|
+
std::cerr << (ruleset->is_invisible() ? " [INVISIBLE]" : "");
|
440
470
|
std::cerr << (ruleset->at_root() ? " [@ROOT]" : "");
|
441
471
|
std::cerr << (ruleset->is_root() ? " [root]" : "");
|
442
472
|
std::cerr << std::endl;
|
@@ -446,6 +476,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
446
476
|
Block* block = dynamic_cast<Block*>(node);
|
447
477
|
std::cerr << ind << "Block " << block;
|
448
478
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
479
|
+
std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
|
449
480
|
std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
|
450
481
|
for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }
|
451
482
|
} else if (dynamic_cast<Textual*>(node)) {
|
@@ -523,6 +554,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
523
554
|
Unary_Expression* expression = dynamic_cast<Unary_Expression*>(node);
|
524
555
|
std::cerr << ind << "Unary_Expression " << expression;
|
525
556
|
std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
|
557
|
+
std::cerr << " [delayed: " << expression->is_delayed() << "] ";
|
526
558
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
527
559
|
std::cerr << " [" << expression->type() << "]" << std::endl;
|
528
560
|
debug_ast(expression->operand(), ind + " operand: ", env);
|
@@ -578,6 +610,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
578
610
|
Color* expression = dynamic_cast<Color*>(node);
|
579
611
|
std::cerr << ind << "Color " << expression;
|
580
612
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
613
|
+
std::cerr << " [delayed: " << expression->is_delayed() << "] ";
|
581
614
|
std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
|
582
615
|
std::cerr << " [" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
|
583
616
|
} else if (dynamic_cast<Number*>(node)) {
|
@@ -594,7 +627,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
594
627
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
595
628
|
std::cerr << " [" << prettyprint(expression->value()) << "]";
|
596
629
|
if (expression->is_delayed()) std::cerr << " [delayed]";
|
597
|
-
if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
|
598
630
|
if (expression->is_interpolant()) std::cerr << " [interpolant]";
|
599
631
|
if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
|
600
632
|
std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
|
@@ -607,7 +639,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
607
639
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
608
640
|
std::cerr << " [" << prettyprint(expression->value()) << "]";
|
609
641
|
if (expression->is_delayed()) std::cerr << " [delayed]";
|
610
|
-
if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
|
611
642
|
if (expression->is_interpolant()) std::cerr << " [interpolant]";
|
612
643
|
std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
|
613
644
|
} else if (dynamic_cast<String_Schema*>(node)) {
|
@@ -626,7 +657,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
626
657
|
std::cerr << ind << "String " << expression;
|
627
658
|
std::cerr << " " << expression->concrete_type();
|
628
659
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
629
|
-
if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
|
630
660
|
if (expression->is_interpolant()) std::cerr << " [interpolant]";
|
631
661
|
std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
|
632
662
|
} else if (dynamic_cast<Expression*>(node)) {
|
@@ -673,11 +703,11 @@ inline void debug_node(Node* node, std::string ind = "")
|
|
673
703
|
std::cerr << node << " ";
|
674
704
|
if (node->got_line_feed) std::cerr << "[LF] ";
|
675
705
|
switch (node->combinator()) {
|
676
|
-
case
|
677
|
-
case
|
678
|
-
case
|
679
|
-
case
|
680
|
-
case
|
706
|
+
case Sequence_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
|
707
|
+
case Sequence_Selector::PARENT_OF: std::cerr << "{>} "; break;
|
708
|
+
case Sequence_Selector::PRECEDES: std::cerr << "{~} "; break;
|
709
|
+
case Sequence_Selector::REFERENCE: std::cerr << "{@} "; break;
|
710
|
+
case Sequence_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
|
681
711
|
}
|
682
712
|
std::cerr << std::endl;
|
683
713
|
// debug_ast(node->combinator(), ind + " ");
|
@@ -733,7 +763,7 @@ inline void debug_subset_map(Sass::ExtensionSubsetMap& map, std::string ind = ""
|
|
733
763
|
if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
|
734
764
|
}
|
735
765
|
|
736
|
-
typedef std::pair<
|
766
|
+
typedef std::pair<Sequence_Selector*, SimpleSequence_Selector*> ExtensionPair;
|
737
767
|
typedef std::vector<ExtensionPair> SubsetMapEntries;
|
738
768
|
|
739
769
|
inline void debug_subset_entries(SubsetMapEntries* entries, std::string ind = "")
|