1 | #ifndef SASS_AST_SUPPORTS_H |
2 | #define SASS_AST_SUPPORTS_H |
3 | |
4 | // sass.hpp must go before all system headers to get the |
5 | // __EXTENSIONS__ fix on Solaris. |
6 | #include "sass.hpp" |
7 | |
8 | #include <set> |
9 | #include <deque> |
10 | #include <vector> |
11 | #include <string> |
12 | #include <sstream> |
13 | #include <iostream> |
14 | #include <typeinfo> |
15 | #include <algorithm> |
16 | #include "sass/base.h" |
17 | #include "ast_fwd_decl.hpp" |
18 | |
19 | #include "util.hpp" |
20 | #include "units.hpp" |
21 | #include "context.hpp" |
22 | #include "position.hpp" |
23 | #include "constants.hpp" |
24 | #include "operation.hpp" |
25 | #include "position.hpp" |
26 | #include "inspect.hpp" |
27 | #include "source_map.hpp" |
28 | #include "environment.hpp" |
29 | #include "error_handling.hpp" |
30 | #include "ast_def_macros.hpp" |
31 | #include "ast_fwd_decl.hpp" |
32 | #include "source_map.hpp" |
33 | #include "fn_utils.hpp" |
34 | |
35 | #include "sass.h" |
36 | |
37 | namespace Sass { |
38 | |
39 | //////////////////// |
40 | // `@supports` rule. |
41 | //////////////////// |
42 | class SupportsRule : public ParentStatement { |
43 | ADD_PROPERTY(SupportsConditionObj, condition) |
44 | public: |
45 | SupportsRule(SourceSpan pstate, SupportsConditionObj condition, Block_Obj block = {}); |
46 | bool bubbles() override; |
47 | ATTACH_AST_OPERATIONS(SupportsRule) |
48 | ATTACH_CRTP_PERFORM_METHODS() |
49 | }; |
50 | |
51 | ////////////////////////////////////////////////////// |
52 | // The abstract superclass of all Supports conditions. |
53 | ////////////////////////////////////////////////////// |
54 | class SupportsCondition : public Expression { |
55 | public: |
56 | SupportsCondition(SourceSpan pstate); |
57 | virtual bool needs_parens(SupportsConditionObj cond) const { return false; } |
58 | ATTACH_AST_OPERATIONS(SupportsCondition) |
59 | ATTACH_CRTP_PERFORM_METHODS() |
60 | }; |
61 | |
62 | //////////////////////////////////////////////////////////// |
63 | // An operator condition (e.g. `CONDITION1 and CONDITION2`). |
64 | //////////////////////////////////////////////////////////// |
65 | class SupportsOperation : public SupportsCondition { |
66 | public: |
67 | enum Operand { AND, OR }; |
68 | private: |
69 | ADD_PROPERTY(SupportsConditionObj, left); |
70 | ADD_PROPERTY(SupportsConditionObj, right); |
71 | ADD_PROPERTY(Operand, operand); |
72 | public: |
73 | SupportsOperation(SourceSpan pstate, SupportsConditionObj l, SupportsConditionObj r, Operand o); |
74 | virtual bool needs_parens(SupportsConditionObj cond) const override; |
75 | ATTACH_AST_OPERATIONS(SupportsOperation) |
76 | ATTACH_CRTP_PERFORM_METHODS() |
77 | }; |
78 | |
79 | ////////////////////////////////////////// |
80 | // A negation condition (`not CONDITION`). |
81 | ////////////////////////////////////////// |
82 | class SupportsNegation : public SupportsCondition { |
83 | private: |
84 | ADD_PROPERTY(SupportsConditionObj, condition); |
85 | public: |
86 | SupportsNegation(SourceSpan pstate, SupportsConditionObj c); |
87 | virtual bool needs_parens(SupportsConditionObj cond) const override; |
88 | ATTACH_AST_OPERATIONS(SupportsNegation) |
89 | ATTACH_CRTP_PERFORM_METHODS() |
90 | }; |
91 | |
92 | ///////////////////////////////////////////////////// |
93 | // A declaration condition (e.g. `(feature: value)`). |
94 | ///////////////////////////////////////////////////// |
95 | class SupportsDeclaration : public SupportsCondition { |
96 | private: |
97 | ADD_PROPERTY(ExpressionObj, feature); |
98 | ADD_PROPERTY(ExpressionObj, value); |
99 | public: |
100 | SupportsDeclaration(SourceSpan pstate, ExpressionObj f, ExpressionObj v); |
101 | virtual bool needs_parens(SupportsConditionObj cond) const override; |
102 | ATTACH_AST_OPERATIONS(SupportsDeclaration) |
103 | ATTACH_CRTP_PERFORM_METHODS() |
104 | }; |
105 | |
106 | /////////////////////////////////////////////// |
107 | // An interpolation condition (e.g. `#{$var}`). |
108 | /////////////////////////////////////////////// |
109 | class Supports_Interpolation : public SupportsCondition { |
110 | private: |
111 | ADD_PROPERTY(ExpressionObj, value); |
112 | public: |
113 | Supports_Interpolation(SourceSpan pstate, ExpressionObj v); |
114 | virtual bool needs_parens(SupportsConditionObj cond) const override; |
115 | ATTACH_AST_OPERATIONS(Supports_Interpolation) |
116 | ATTACH_CRTP_PERFORM_METHODS() |
117 | }; |
118 | |
119 | } |
120 | |
121 | #endif |
122 | |