sassc 2.2.1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +18 -0
- data/Rakefile +1 -3
- data/ext/extconf.rb +13 -5
- data/ext/libsass/VERSION +1 -1
- data/ext/libsass/include/sass/base.h +2 -1
- data/ext/libsass/include/sass/context.h +4 -0
- data/ext/libsass/src/MurmurHash2.hpp +91 -0
- data/ext/libsass/src/ast.cpp +158 -168
- data/ext/libsass/src/ast.hpp +389 -230
- data/ext/libsass/src/ast_def_macros.hpp +18 -10
- data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
- data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
- data/ext/libsass/src/ast_helpers.hpp +292 -0
- data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
- data/ext/libsass/src/ast_sel_super.cpp +539 -0
- data/ext/libsass/src/ast_sel_unify.cpp +207 -212
- data/ext/libsass/src/ast_sel_weave.cpp +616 -0
- data/ext/libsass/src/ast_selectors.cpp +594 -1026
- data/ext/libsass/src/ast_selectors.hpp +339 -385
- data/ext/libsass/src/ast_supports.cpp +36 -52
- data/ext/libsass/src/ast_supports.hpp +29 -29
- data/ext/libsass/src/ast_values.cpp +271 -84
- data/ext/libsass/src/ast_values.hpp +116 -107
- data/ext/libsass/src/backtrace.cpp +9 -9
- data/ext/libsass/src/backtrace.hpp +5 -5
- data/ext/libsass/src/base64vlq.cpp +2 -2
- data/ext/libsass/src/base64vlq.hpp +1 -1
- data/ext/libsass/src/bind.cpp +18 -18
- data/ext/libsass/src/bind.hpp +1 -1
- data/ext/libsass/src/c2ast.cpp +3 -3
- data/ext/libsass/src/c2ast.hpp +1 -1
- data/ext/libsass/src/cencode.c +4 -6
- data/ext/libsass/src/check_nesting.cpp +40 -41
- data/ext/libsass/src/check_nesting.hpp +6 -2
- data/ext/libsass/src/color_maps.cpp +14 -13
- data/ext/libsass/src/color_maps.hpp +1 -9
- data/ext/libsass/src/constants.cpp +5 -0
- data/ext/libsass/src/constants.hpp +6 -0
- data/ext/libsass/src/context.cpp +92 -119
- data/ext/libsass/src/context.hpp +41 -53
- data/ext/libsass/src/cssize.cpp +66 -149
- data/ext/libsass/src/cssize.hpp +17 -23
- data/ext/libsass/src/dart_helpers.hpp +199 -0
- data/ext/libsass/src/debugger.hpp +451 -295
- data/ext/libsass/src/emitter.cpp +15 -16
- data/ext/libsass/src/emitter.hpp +10 -12
- data/ext/libsass/src/environment.cpp +27 -27
- data/ext/libsass/src/environment.hpp +29 -24
- data/ext/libsass/src/error_handling.cpp +62 -41
- data/ext/libsass/src/error_handling.hpp +61 -51
- data/ext/libsass/src/eval.cpp +167 -281
- data/ext/libsass/src/eval.hpp +27 -29
- data/ext/libsass/src/eval_selectors.cpp +75 -0
- data/ext/libsass/src/expand.cpp +275 -222
- data/ext/libsass/src/expand.hpp +36 -16
- data/ext/libsass/src/extender.cpp +1188 -0
- data/ext/libsass/src/extender.hpp +399 -0
- data/ext/libsass/src/extension.cpp +43 -0
- data/ext/libsass/src/extension.hpp +89 -0
- data/ext/libsass/src/file.cpp +81 -72
- data/ext/libsass/src/file.hpp +28 -37
- data/ext/libsass/src/fn_colors.cpp +20 -18
- data/ext/libsass/src/fn_lists.cpp +30 -29
- data/ext/libsass/src/fn_maps.cpp +3 -3
- data/ext/libsass/src/fn_miscs.cpp +34 -46
- data/ext/libsass/src/fn_numbers.cpp +20 -13
- data/ext/libsass/src/fn_selectors.cpp +98 -128
- data/ext/libsass/src/fn_strings.cpp +47 -33
- data/ext/libsass/src/fn_utils.cpp +31 -29
- data/ext/libsass/src/fn_utils.hpp +17 -11
- data/ext/libsass/src/inspect.cpp +186 -148
- data/ext/libsass/src/inspect.hpp +31 -29
- data/ext/libsass/src/lexer.cpp +20 -82
- data/ext/libsass/src/lexer.hpp +5 -16
- data/ext/libsass/src/listize.cpp +23 -37
- data/ext/libsass/src/listize.hpp +8 -9
- data/ext/libsass/src/mapping.hpp +1 -0
- data/ext/libsass/src/memory/allocator.cpp +48 -0
- data/ext/libsass/src/memory/allocator.hpp +138 -0
- data/ext/libsass/src/memory/config.hpp +20 -0
- data/ext/libsass/src/memory/memory_pool.hpp +186 -0
- data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
- data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
- data/ext/libsass/src/memory.hpp +12 -0
- data/ext/libsass/src/operation.hpp +71 -61
- data/ext/libsass/src/operators.cpp +19 -18
- data/ext/libsass/src/operators.hpp +11 -11
- data/ext/libsass/src/ordered_map.hpp +112 -0
- data/ext/libsass/src/output.cpp +45 -64
- data/ext/libsass/src/output.hpp +6 -6
- data/ext/libsass/src/parser.cpp +512 -700
- data/ext/libsass/src/parser.hpp +89 -97
- data/ext/libsass/src/parser_selectors.cpp +189 -0
- data/ext/libsass/src/permutate.hpp +164 -0
- data/ext/libsass/src/plugins.cpp +7 -7
- data/ext/libsass/src/plugins.hpp +8 -8
- data/ext/libsass/src/position.cpp +7 -26
- data/ext/libsass/src/position.hpp +44 -21
- data/ext/libsass/src/prelexer.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.cpp +55 -56
- data/ext/libsass/src/remove_placeholders.hpp +21 -18
- data/ext/libsass/src/sass.cpp +16 -15
- data/ext/libsass/src/sass.hpp +10 -5
- data/ext/libsass/src/sass2scss.cpp +4 -4
- data/ext/libsass/src/sass_context.cpp +91 -122
- data/ext/libsass/src/sass_context.hpp +2 -2
- data/ext/libsass/src/sass_functions.cpp +1 -1
- data/ext/libsass/src/sass_values.cpp +8 -11
- data/ext/libsass/src/settings.hpp +19 -0
- data/ext/libsass/src/source.cpp +69 -0
- data/ext/libsass/src/source.hpp +95 -0
- data/ext/libsass/src/source_data.hpp +32 -0
- data/ext/libsass/src/source_map.cpp +22 -18
- data/ext/libsass/src/source_map.hpp +12 -9
- data/ext/libsass/src/stylesheet.cpp +22 -0
- data/ext/libsass/src/stylesheet.hpp +57 -0
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.cpp +24 -22
- data/ext/libsass/src/units.hpp +8 -8
- data/ext/libsass/src/utf8_string.cpp +9 -10
- data/ext/libsass/src/utf8_string.hpp +7 -6
- data/ext/libsass/src/util.cpp +48 -50
- data/ext/libsass/src/util.hpp +20 -21
- data/ext/libsass/src/util_string.cpp +111 -61
- data/ext/libsass/src/util_string.hpp +62 -8
- data/ext/libsass/src/values.cpp +12 -12
- data/lib/sassc/engine.rb +5 -3
- data/lib/sassc/functions_handler.rb +8 -8
- data/lib/sassc/native.rb +4 -6
- data/lib/sassc/script.rb +4 -4
- data/lib/sassc/version.rb +1 -1
- data/test/functions_test.rb +18 -1
- data/test/native_test.rb +4 -4
- metadata +29 -15
- data/ext/libsass/src/extend.cpp +0 -2132
- data/ext/libsass/src/extend.hpp +0 -86
- data/ext/libsass/src/node.cpp +0 -322
- data/ext/libsass/src/node.hpp +0 -118
- data/ext/libsass/src/paths.hpp +0 -71
- data/ext/libsass/src/sass_util.cpp +0 -152
- data/ext/libsass/src/sass_util.hpp +0 -256
- data/ext/libsass/src/subset_map.cpp +0 -58
- data/ext/libsass/src/subset_map.hpp +0 -76
- data/lib/sassc/native/lib_c.rb +0 -21
    
        data/ext/libsass/src/bind.cpp
    CHANGED
    
    | @@ -11,11 +11,11 @@ | |
| 11 11 |  | 
| 12 12 | 
             
            namespace Sass {
         | 
| 13 13 |  | 
| 14 | 
            -
              void bind( | 
| 14 | 
            +
              void bind(sass::string type, sass::string name, Parameters_Obj ps, Arguments_Obj as, Env* env, Eval* eval, Backtraces& traces)
         | 
| 15 15 | 
             
              {
         | 
| 16 | 
            -
                 | 
| 16 | 
            +
                sass::string callee(type + " " + name);
         | 
| 17 17 |  | 
| 18 | 
            -
                std::map< | 
| 18 | 
            +
                std::map<sass::string, Parameter_Obj> param_map;
         | 
| 19 19 | 
             
                List_Obj varargs = SASS_MEMORY_NEW(List, as->pstate());
         | 
| 20 20 | 
             
                varargs->is_arglist(true); // enable keyword size handling
         | 
| 21 21 |  | 
| @@ -52,7 +52,7 @@ namespace Sass { | |
| 52 52 | 
             
                        }
         | 
| 53 53 | 
             
                      }
         | 
| 54 54 | 
             
                    }
         | 
| 55 | 
            -
                     | 
| 55 | 
            +
                    sass::ostream msg;
         | 
| 56 56 | 
             
                    msg << "wrong number of arguments (" << LA << " for " << LP << ")";
         | 
| 57 57 | 
             
                    msg << " for `" << name << "'";
         | 
| 58 58 | 
             
                    return error(msg.str(), as->pstate(), traces);
         | 
| @@ -73,7 +73,7 @@ namespace Sass { | |
| 73 73 | 
             
                                                          rest->separator(),
         | 
| 74 74 | 
             
                                                          true);
         | 
| 75 75 | 
             
                          // wrap each item from list as an argument
         | 
| 76 | 
            -
                          for ( | 
| 76 | 
            +
                          for (ExpressionObj item : rest->elements()) {
         | 
| 77 77 | 
             
                            if (Argument_Obj arg = Cast<Argument>(item)) {
         | 
| 78 78 | 
             
                              arglist->append(SASS_MEMORY_COPY(arg)); // copy
         | 
| 79 79 | 
             
                            } else {
         | 
| @@ -100,7 +100,7 @@ namespace Sass { | |
| 100 100 | 
             
                      Map_Obj argmap = Cast<Map>(a->value());
         | 
| 101 101 | 
             
                      for (auto key : argmap->keys()) {
         | 
| 102 102 | 
             
                        if (String_Constant_Obj str = Cast<String_Constant>(key)) {
         | 
| 103 | 
            -
                           | 
| 103 | 
            +
                          sass::string param = unquote(str->value());
         | 
| 104 104 | 
             
                          arglist->append(SASS_MEMORY_NEW(Argument,
         | 
| 105 105 | 
             
                                                          key->pstate(),
         | 
| 106 106 | 
             
                                                          argmap->at(key),
         | 
| @@ -130,7 +130,7 @@ namespace Sass { | |
| 130 130 | 
             
                        // skip any list completely if empty
         | 
| 131 131 | 
             
                        if (ls && ls->empty() && a->is_rest_argument()) continue;
         | 
| 132 132 |  | 
| 133 | 
            -
                         | 
| 133 | 
            +
                        ExpressionObj value = a->value();
         | 
| 134 134 | 
             
                        if (Argument_Obj arg = Cast<Argument>(value)) {
         | 
| 135 135 | 
             
                          arglist->append(arg);
         | 
| 136 136 | 
             
                        }
         | 
| @@ -141,7 +141,7 @@ namespace Sass { | |
| 141 141 | 
             
                            arglist->separator(rest->separator());
         | 
| 142 142 |  | 
| 143 143 | 
             
                            for (size_t i = 0, L = rest->length(); i < L; ++i) {
         | 
| 144 | 
            -
                               | 
| 144 | 
            +
                              ExpressionObj obj = rest->value_at_index(i);
         | 
| 145 145 | 
             
                              arglist->append(SASS_MEMORY_NEW(Argument,
         | 
| 146 146 | 
             
                                                            obj->pstate(),
         | 
| 147 147 | 
             
                                                            obj,
         | 
| @@ -168,7 +168,7 @@ namespace Sass { | |
| 168 168 | 
             
                    }
         | 
| 169 169 | 
             
                    // consumed parameter
         | 
| 170 170 | 
             
                    ++ip;
         | 
| 171 | 
            -
                    // no more  | 
| 171 | 
            +
                    // no more parameters
         | 
| 172 172 | 
             
                    break;
         | 
| 173 173 | 
             
                  }
         | 
| 174 174 |  | 
| @@ -177,7 +177,7 @@ namespace Sass { | |
| 177 177 | 
             
                    // normal param and rest arg
         | 
| 178 178 | 
             
                    List_Obj arglist = Cast<List>(a->value());
         | 
| 179 179 | 
             
                    if (!arglist) {
         | 
| 180 | 
            -
                      if ( | 
| 180 | 
            +
                      if (ExpressionObj arg = Cast<Expression>(a->value())) {
         | 
| 181 181 | 
             
                        arglist = SASS_MEMORY_NEW(List, a->pstate(), 1);
         | 
| 182 182 | 
             
                        arglist->append(arg);
         | 
| 183 183 | 
             
                      }
         | 
| @@ -189,7 +189,7 @@ namespace Sass { | |
| 189 189 | 
             
                    } else {
         | 
| 190 190 | 
             
                      if (arglist->length() > LP - ip && !ps->has_rest_parameter()) {
         | 
| 191 191 | 
             
                        size_t arg_count = (arglist->length() + LA - 1);
         | 
| 192 | 
            -
                         | 
| 192 | 
            +
                        sass::ostream msg;
         | 
| 193 193 | 
             
                        msg << callee << " takes " << LP;
         | 
| 194 194 | 
             
                        msg << (LP == 1 ? " argument" : " arguments");
         | 
| 195 195 | 
             
                        msg << " but " << arg_count;
         | 
| @@ -202,7 +202,7 @@ namespace Sass { | |
| 202 202 | 
             
                      }
         | 
| 203 203 | 
             
                    }
         | 
| 204 204 | 
             
                    // otherwise move one of the rest args into the param, converting to argument if necessary
         | 
| 205 | 
            -
                     | 
| 205 | 
            +
                    ExpressionObj obj = arglist->at(0);
         | 
| 206 206 | 
             
                    if (!(a = Cast<Argument>(obj))) {
         | 
| 207 207 | 
             
                      Expression* a_to_convert = obj;
         | 
| 208 208 | 
             
                      a = SASS_MEMORY_NEW(Argument,
         | 
| @@ -226,10 +226,10 @@ namespace Sass { | |
| 226 226 | 
             
                        traces.push_back(Backtrace(key->pstate()));
         | 
| 227 227 | 
             
                        throw Exception::InvalidVarKwdType(key->pstate(), traces, key->inspect(), a);
         | 
| 228 228 | 
             
                      }
         | 
| 229 | 
            -
                       | 
| 229 | 
            +
                      sass::string param = "$" + unquote(val->value());
         | 
| 230 230 |  | 
| 231 231 | 
             
                      if (!param_map.count(param)) {
         | 
| 232 | 
            -
                         | 
| 232 | 
            +
                        sass::ostream msg;
         | 
| 233 233 | 
             
                        msg << callee << " has no parameter named " << param;
         | 
| 234 234 | 
             
                        error(msg.str(), a->pstate(), traces);
         | 
| 235 235 | 
             
                      }
         | 
| @@ -243,7 +243,7 @@ namespace Sass { | |
| 243 243 |  | 
| 244 244 | 
             
                  if (a->name().empty()) {
         | 
| 245 245 | 
             
                    if (env->has_local(p->name())) {
         | 
| 246 | 
            -
                       | 
| 246 | 
            +
                      sass::ostream msg;
         | 
| 247 247 | 
             
                      msg << "parameter " << p->name()
         | 
| 248 248 | 
             
                      << " provided more than once in call to " << callee;
         | 
| 249 249 | 
             
                      error(msg.str(), a->pstate(), traces);
         | 
| @@ -258,21 +258,21 @@ namespace Sass { | |
| 258 258 | 
             
                      if (ps->has_rest_parameter()) {
         | 
| 259 259 | 
             
                        varargs->append(a);
         | 
| 260 260 | 
             
                      } else {
         | 
| 261 | 
            -
                         | 
| 261 | 
            +
                        sass::ostream msg;
         | 
| 262 262 | 
             
                        msg << callee << " has no parameter named " << a->name();
         | 
| 263 263 | 
             
                        error(msg.str(), a->pstate(), traces);
         | 
| 264 264 | 
             
                      }
         | 
| 265 265 | 
             
                    }
         | 
| 266 266 | 
             
                    if (param_map[a->name()]) {
         | 
| 267 267 | 
             
                      if (param_map[a->name()]->is_rest_parameter()) {
         | 
| 268 | 
            -
                         | 
| 268 | 
            +
                        sass::ostream msg;
         | 
| 269 269 | 
             
                        msg << "argument " << a->name() << " of " << callee
         | 
| 270 270 | 
             
                            << "cannot be used as named argument";
         | 
| 271 271 | 
             
                        error(msg.str(), a->pstate(), traces);
         | 
| 272 272 | 
             
                      }
         | 
| 273 273 | 
             
                    }
         | 
| 274 274 | 
             
                    if (env->has_local(a->name())) {
         | 
| 275 | 
            -
                       | 
| 275 | 
            +
                      sass::ostream msg;
         | 
| 276 276 | 
             
                      msg << "parameter " << p->name()
         | 
| 277 277 | 
             
                          << "provided more than once in call to " << callee;
         | 
| 278 278 | 
             
                      error(msg.str(), a->pstate(), traces);
         | 
    
        data/ext/libsass/src/bind.hpp
    CHANGED
    
    | @@ -8,7 +8,7 @@ | |
| 8 8 |  | 
| 9 9 | 
             
            namespace Sass {
         | 
| 10 10 |  | 
| 11 | 
            -
              void bind( | 
| 11 | 
            +
              void bind(sass::string type, sass::string name, Parameters_Obj, Arguments_Obj, Env*, Eval*, Backtraces& traces);
         | 
| 12 12 |  | 
| 13 13 | 
             
            }
         | 
| 14 14 |  | 
    
        data/ext/libsass/src/c2ast.cpp
    CHANGED
    
    | @@ -8,7 +8,7 @@ | |
| 8 8 |  | 
| 9 9 | 
             
            namespace Sass {
         | 
| 10 10 |  | 
| 11 | 
            -
              Value* c2ast(union Sass_Value* v, Backtraces traces,  | 
| 11 | 
            +
              Value* c2ast(union Sass_Value* v, Backtraces traces, SourceSpan pstate)
         | 
| 12 12 | 
             
              {
         | 
| 13 13 | 
             
                using std::strlen;
         | 
| 14 14 | 
             
                using std::strcpy;
         | 
| @@ -51,10 +51,10 @@ namespace Sass { | |
| 51 51 | 
             
                    e = SASS_MEMORY_NEW(Null, pstate);
         | 
| 52 52 | 
             
                  } break;
         | 
| 53 53 | 
             
                  case SASS_ERROR: {
         | 
| 54 | 
            -
                    error("Error in C function: " +  | 
| 54 | 
            +
                    error("Error in C function: " + sass::string(sass_error_get_message(v)), pstate, traces);
         | 
| 55 55 | 
             
                  } break;
         | 
| 56 56 | 
             
                  case SASS_WARNING: {
         | 
| 57 | 
            -
                    error("Warning in C function: " +  | 
| 57 | 
            +
                    error("Warning in C function: " + sass::string(sass_warning_get_message(v)), pstate, traces);
         | 
| 58 58 | 
             
                  } break;
         | 
| 59 59 | 
             
                  default: break;
         | 
| 60 60 | 
             
                }
         | 
    
        data/ext/libsass/src/c2ast.hpp
    CHANGED
    
    
    
        data/ext/libsass/src/cencode.c
    CHANGED
    
    | @@ -46,9 +46,8 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, | |
| 46 46 | 
             
            			result = (fragment & 0x0fc) >> 2;
         | 
| 47 47 | 
             
            			*codechar++ = base64_encode_value(result);
         | 
| 48 48 | 
             
            			result = (fragment & 0x003) << 4;
         | 
| 49 | 
            -
            			 | 
| 50 | 
            -
             | 
| 51 | 
            -
            			#endif
         | 
| 49 | 
            +
            			/* fall through */
         | 
| 50 | 
            +
             | 
| 52 51 | 
             
            	case step_B:
         | 
| 53 52 | 
             
            			if (plainchar == plaintextend)
         | 
| 54 53 | 
             
            			{
         | 
| @@ -60,9 +59,8 @@ int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, | |
| 60 59 | 
             
            			result |= (fragment & 0x0f0) >> 4;
         | 
| 61 60 | 
             
            			*codechar++ = base64_encode_value(result);
         | 
| 62 61 | 
             
            			result = (fragment & 0x00f) << 2;
         | 
| 63 | 
            -
            			 | 
| 64 | 
            -
             | 
| 65 | 
            -
            			#endif
         | 
| 62 | 
            +
            			/* fall through */
         | 
| 63 | 
            +
             | 
| 66 64 | 
             
            	case step_C:
         | 
| 67 65 | 
             
            			if (plainchar == plaintextend)
         | 
| 68 66 | 
             
            			{
         | 
| @@ -1,20 +1,18 @@ | |
| 1 1 | 
             
            // sass.hpp must go before all system headers to get the
         | 
| 2 2 | 
             
            // __EXTENSIONS__ fix on Solaris.
         | 
| 3 3 | 
             
            #include "sass.hpp"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            #include <vector>
         | 
| 6 | 
            -
             | 
| 4 | 
            +
            #include "ast.hpp"
         | 
| 7 5 | 
             
            #include "check_nesting.hpp"
         | 
| 8 6 |  | 
| 9 7 | 
             
            namespace Sass {
         | 
| 10 8 |  | 
| 11 9 | 
             
              CheckNesting::CheckNesting()
         | 
| 12 | 
            -
              : parents( | 
| 13 | 
            -
                traces( | 
| 10 | 
            +
              : parents(sass::vector<Statement*>()),
         | 
| 11 | 
            +
                traces(sass::vector<Backtrace>()),
         | 
| 14 12 | 
             
                parent(0), current_mixin_definition(0)
         | 
| 15 13 | 
             
              { }
         | 
| 16 14 |  | 
| 17 | 
            -
              void error(AST_Node* node, Backtraces traces,  | 
| 15 | 
            +
              void error(AST_Node* node, Backtraces traces, sass::string msg) {
         | 
| 18 16 | 
             
                traces.push_back(Backtrace(node->pstate()));
         | 
| 19 17 | 
             
                throw Exception::InvalidSass(node->pstate(), traces, msg);
         | 
| 20 18 | 
             
              }
         | 
| @@ -23,9 +21,9 @@ namespace Sass { | |
| 23 21 | 
             
              {
         | 
| 24 22 | 
             
                Statement* old_parent = this->parent;
         | 
| 25 23 |  | 
| 26 | 
            -
                if ( | 
| 27 | 
            -
                   | 
| 28 | 
            -
                   | 
| 24 | 
            +
                if (AtRootRule* root = Cast<AtRootRule>(parent)) {
         | 
| 25 | 
            +
                  sass::vector<Statement*> old_parents = this->parents;
         | 
| 26 | 
            +
                  sass::vector<Statement*> new_parents;
         | 
| 29 27 |  | 
| 30 28 | 
             
                  for (size_t i = 0, L = this->parents.size(); i < L; i++) {
         | 
| 31 29 | 
             
                    Statement* p = this->parents.at(i);
         | 
| @@ -47,7 +45,7 @@ namespace Sass { | |
| 47 45 | 
             
                    }
         | 
| 48 46 | 
             
                  }
         | 
| 49 47 |  | 
| 50 | 
            -
                   | 
| 48 | 
            +
                  AtRootRule* ar = Cast<AtRootRule>(parent);
         | 
| 51 49 | 
             
                  Block* ret = ar->block();
         | 
| 52 50 |  | 
| 53 51 | 
             
                  if (ret != NULL) {
         | 
| @@ -77,7 +75,7 @@ namespace Sass { | |
| 77 75 | 
             
                }
         | 
| 78 76 |  | 
| 79 77 | 
             
                if (!b) {
         | 
| 80 | 
            -
                  if ( | 
| 78 | 
            +
                  if (ParentStatement* bb = Cast<ParentStatement>(parent)) {
         | 
| 81 79 | 
             
                    b = bb->block();
         | 
| 82 80 | 
             
                  }
         | 
| 83 81 | 
             
                }
         | 
| @@ -145,7 +143,7 @@ namespace Sass { | |
| 145 143 | 
             
                if (is_charset(node))
         | 
| 146 144 | 
             
                { this->invalid_charset_parent(this->parent, node); }
         | 
| 147 145 |  | 
| 148 | 
            -
                if (Cast< | 
| 146 | 
            +
                if (Cast<ExtendRule>(node))
         | 
| 149 147 | 
             
                { this->invalid_extend_parent(this->parent, node); }
         | 
| 150 148 |  | 
| 151 149 | 
             
                // if (Cast<Import>(node))
         | 
| @@ -194,7 +192,7 @@ namespace Sass { | |
| 194 192 | 
             
              void CheckNesting::invalid_extend_parent(Statement* parent, AST_Node* node)
         | 
| 195 193 | 
             
              {
         | 
| 196 194 | 
             
                if (!(
         | 
| 197 | 
            -
                    Cast< | 
| 195 | 
            +
                    Cast<StyleRule>(parent) ||
         | 
| 198 196 | 
             
                    Cast<Mixin_Call>(parent) ||
         | 
| 199 197 | 
             
                    is_mixin(parent)
         | 
| 200 198 | 
             
                )) {
         | 
| @@ -206,10 +204,10 @@ namespace Sass { | |
| 206 204 | 
             
              // {
         | 
| 207 205 | 
             
              //   for (auto pp : this->parents) {
         | 
| 208 206 | 
             
              //     if (
         | 
| 209 | 
            -
              //         Cast< | 
| 210 | 
            -
              //         Cast< | 
| 207 | 
            +
              //         Cast<EachRule>(pp) ||
         | 
| 208 | 
            +
              //         Cast<ForRule>(pp) ||
         | 
| 211 209 | 
             
              //         Cast<If>(pp) ||
         | 
| 212 | 
            -
              //         Cast< | 
| 210 | 
            +
              //         Cast<WhileRule>(pp) ||
         | 
| 213 211 | 
             
              //         Cast<Trace>(pp) ||
         | 
| 214 212 | 
             
              //         Cast<Mixin_Call>(pp) ||
         | 
| 215 213 | 
             
              //         is_mixin(pp)
         | 
| @@ -231,10 +229,10 @@ namespace Sass { | |
| 231 229 | 
             
              {
         | 
| 232 230 | 
             
                for (Statement* pp : this->parents) {
         | 
| 233 231 | 
             
                  if (
         | 
| 234 | 
            -
                      Cast< | 
| 235 | 
            -
                      Cast< | 
| 232 | 
            +
                      Cast<EachRule>(pp) ||
         | 
| 233 | 
            +
                      Cast<ForRule>(pp) ||
         | 
| 236 234 | 
             
                      Cast<If>(pp) ||
         | 
| 237 | 
            -
                      Cast< | 
| 235 | 
            +
                      Cast<WhileRule>(pp) ||
         | 
| 238 236 | 
             
                      Cast<Trace>(pp) ||
         | 
| 239 237 | 
             
                      Cast<Mixin_Call>(pp) ||
         | 
| 240 238 | 
             
                      is_mixin(pp)
         | 
| @@ -248,10 +246,10 @@ namespace Sass { | |
| 248 246 | 
             
              {
         | 
| 249 247 | 
             
                for (Statement* pp : this->parents) {
         | 
| 250 248 | 
             
                  if (
         | 
| 251 | 
            -
                      Cast< | 
| 252 | 
            -
                      Cast< | 
| 249 | 
            +
                      Cast<EachRule>(pp) ||
         | 
| 250 | 
            +
                      Cast<ForRule>(pp) ||
         | 
| 253 251 | 
             
                      Cast<If>(pp) ||
         | 
| 254 | 
            -
                      Cast< | 
| 252 | 
            +
                      Cast<WhileRule>(pp) ||
         | 
| 255 253 | 
             
                      Cast<Trace>(pp) ||
         | 
| 256 254 | 
             
                      Cast<Mixin_Call>(pp) ||
         | 
| 257 255 | 
             
                      is_mixin(pp)
         | 
| @@ -264,19 +262,19 @@ namespace Sass { | |
| 264 262 | 
             
              void CheckNesting::invalid_function_child(Statement* child)
         | 
| 265 263 | 
             
              {
         | 
| 266 264 | 
             
                if (!(
         | 
| 267 | 
            -
                    Cast< | 
| 268 | 
            -
                    Cast< | 
| 265 | 
            +
                    Cast<EachRule>(child) ||
         | 
| 266 | 
            +
                    Cast<ForRule>(child) ||
         | 
| 269 267 | 
             
                    Cast<If>(child) ||
         | 
| 270 | 
            -
                    Cast< | 
| 268 | 
            +
                    Cast<WhileRule>(child) ||
         | 
| 271 269 | 
             
                    Cast<Trace>(child) ||
         | 
| 272 270 | 
             
                    Cast<Comment>(child) ||
         | 
| 273 | 
            -
                    Cast< | 
| 271 | 
            +
                    Cast<DebugRule>(child) ||
         | 
| 274 272 | 
             
                    Cast<Return>(child) ||
         | 
| 275 273 | 
             
                    Cast<Variable>(child) ||
         | 
| 276 274 | 
             
                    // Ruby Sass doesn't distinguish variables and assignments
         | 
| 277 275 | 
             
                    Cast<Assignment>(child) ||
         | 
| 278 | 
            -
                    Cast< | 
| 279 | 
            -
                    Cast< | 
| 276 | 
            +
                    Cast<WarningRule>(child) ||
         | 
| 277 | 
            +
                    Cast<ErrorRule>(child)
         | 
| 280 278 | 
             
                )) {
         | 
| 281 279 | 
             
                  error(child, traces, "Functions can only contain variable declarations and control directives.");
         | 
| 282 280 | 
             
                }
         | 
| @@ -285,10 +283,10 @@ namespace Sass { | |
| 285 283 | 
             
              void CheckNesting::invalid_prop_child(Statement* child)
         | 
| 286 284 | 
             
              {
         | 
| 287 285 | 
             
                if (!(
         | 
| 288 | 
            -
                    Cast< | 
| 289 | 
            -
                    Cast< | 
| 286 | 
            +
                    Cast<EachRule>(child) ||
         | 
| 287 | 
            +
                    Cast<ForRule>(child) ||
         | 
| 290 288 | 
             
                    Cast<If>(child) ||
         | 
| 291 | 
            -
                    Cast< | 
| 289 | 
            +
                    Cast<WhileRule>(child) ||
         | 
| 292 290 | 
             
                    Cast<Trace>(child) ||
         | 
| 293 291 | 
             
                    Cast<Comment>(child) ||
         | 
| 294 292 | 
             
                    Cast<Declaration>(child) ||
         | 
| @@ -303,7 +301,7 @@ namespace Sass { | |
| 303 301 | 
             
                if (!(
         | 
| 304 302 | 
             
                    is_mixin(parent) ||
         | 
| 305 303 | 
             
                    is_directive_node(parent) ||
         | 
| 306 | 
            -
                    Cast< | 
| 304 | 
            +
                    Cast<StyleRule>(parent) ||
         | 
| 307 305 | 
             
                    Cast<Keyframe_Rule>(parent) ||
         | 
| 308 306 | 
             
                    Cast<Declaration>(parent) ||
         | 
| 309 307 | 
             
                    Cast<Mixin_Call>(parent)
         | 
| @@ -345,17 +343,17 @@ namespace Sass { | |
| 345 343 | 
             
                                         !is_at_root_node(grandparent);
         | 
| 346 344 |  | 
| 347 345 | 
             
                return Cast<Import>(parent) ||
         | 
| 348 | 
            -
                       Cast< | 
| 349 | 
            -
                       Cast< | 
| 346 | 
            +
                       Cast<EachRule>(parent) ||
         | 
| 347 | 
            +
                       Cast<ForRule>(parent) ||
         | 
| 350 348 | 
             
                       Cast<If>(parent) ||
         | 
| 351 | 
            -
                       Cast< | 
| 349 | 
            +
                       Cast<WhileRule>(parent) ||
         | 
| 352 350 | 
             
                       Cast<Trace>(parent) ||
         | 
| 353 351 | 
             
                       valid_bubble_node;
         | 
| 354 352 | 
             
              }
         | 
| 355 353 |  | 
| 356 354 | 
             
              bool CheckNesting::is_charset(Statement* n)
         | 
| 357 355 | 
             
              {
         | 
| 358 | 
            -
                 | 
| 356 | 
            +
                AtRule* d = Cast<AtRule>(n);
         | 
| 359 357 | 
             
                return d && d->keyword() == "charset";
         | 
| 360 358 | 
             
              }
         | 
| 361 359 |  | 
| @@ -373,7 +371,7 @@ namespace Sass { | |
| 373 371 |  | 
| 374 372 | 
             
              bool CheckNesting::is_root_node(Statement* n)
         | 
| 375 373 | 
             
              {
         | 
| 376 | 
            -
                if (Cast< | 
| 374 | 
            +
                if (Cast<StyleRule>(n)) return false;
         | 
| 377 375 |  | 
| 378 376 | 
             
                Block* b = Cast<Block>(n);
         | 
| 379 377 | 
             
                return b && b->is_root();
         | 
| @@ -381,14 +379,15 @@ namespace Sass { | |
| 381 379 |  | 
| 382 380 | 
             
              bool CheckNesting::is_at_root_node(Statement* n)
         | 
| 383 381 | 
             
              {
         | 
| 384 | 
            -
                return Cast< | 
| 382 | 
            +
                return Cast<AtRootRule>(n) != NULL;
         | 
| 385 383 | 
             
              }
         | 
| 386 384 |  | 
| 387 385 | 
             
              bool CheckNesting::is_directive_node(Statement* n)
         | 
| 388 386 | 
             
              {
         | 
| 389 | 
            -
                return Cast< | 
| 387 | 
            +
                return Cast<AtRule>(n) ||
         | 
| 390 388 | 
             
                       Cast<Import>(n) ||
         | 
| 391 | 
            -
             | 
| 392 | 
            -
             | 
| 389 | 
            +
                  Cast<MediaRule>(n) ||
         | 
| 390 | 
            +
                  Cast<CssMediaRule>(n) ||
         | 
| 391 | 
            +
                  Cast<SupportsRule>(n);
         | 
| 393 392 | 
             
              }
         | 
| 394 393 | 
             
            }
         | 
| @@ -1,14 +1,18 @@ | |
| 1 1 | 
             
            #ifndef SASS_CHECK_NESTING_H
         | 
| 2 2 | 
             
            #define SASS_CHECK_NESTING_H
         | 
| 3 3 |  | 
| 4 | 
            +
            // sass.hpp must go before all system headers to get the
         | 
| 5 | 
            +
            // __EXTENSIONS__ fix on Solaris.
         | 
| 6 | 
            +
            #include "sass.hpp"
         | 
| 4 7 | 
             
            #include "ast.hpp"
         | 
| 5 8 | 
             
            #include "operation.hpp"
         | 
| 9 | 
            +
            #include <vector>
         | 
| 6 10 |  | 
| 7 11 | 
             
            namespace Sass {
         | 
| 8 12 |  | 
| 9 13 | 
             
              class CheckNesting : public Operation_CRTP<Statement*, CheckNesting> {
         | 
| 10 14 |  | 
| 11 | 
            -
                 | 
| 15 | 
            +
                sass::vector<Statement*>  parents;
         | 
| 12 16 | 
             
                Backtraces                  traces;
         | 
| 13 17 | 
             
                Statement*               parent;
         | 
| 14 18 | 
             
                Definition*              current_mixin_definition;
         | 
| @@ -29,7 +33,7 @@ namespace Sass { | |
| 29 33 | 
             
                  Statement* s = Cast<Statement>(x);
         | 
| 30 34 | 
             
                  if (s && this->should_visit(s)) {
         | 
| 31 35 | 
             
                    Block* b1 = Cast<Block>(s);
         | 
| 32 | 
            -
                     | 
| 36 | 
            +
                    ParentStatement* b2 = Cast<ParentStatement>(s);
         | 
| 33 37 | 
             
                    if (b1 || b2) return visit_children(s);
         | 
| 34 38 | 
             
                  }
         | 
| 35 39 | 
             
                  return s;
         | 
| @@ -4,6 +4,7 @@ | |
| 4 4 |  | 
| 5 5 | 
             
            #include "ast.hpp"
         | 
| 6 6 | 
             
            #include "color_maps.hpp"
         | 
| 7 | 
            +
            #include "util_string.hpp"
         | 
| 7 8 |  | 
| 8 9 | 
             
            namespace Sass {
         | 
| 9 10 |  | 
| @@ -161,7 +162,7 @@ namespace Sass { | |
| 161 162 | 
             
              }
         | 
| 162 163 |  | 
| 163 164 | 
             
              namespace Colors {
         | 
| 164 | 
            -
                const  | 
| 165 | 
            +
                const SourceSpan color_table("[COLOR TABLE]");
         | 
| 165 166 | 
             
                const Color_RGBA aliceblue(color_table, 240, 248, 255, 1);
         | 
| 166 167 | 
             
                const Color_RGBA antiquewhite(color_table, 250, 235, 215, 1);
         | 
| 167 168 | 
             
                const Color_RGBA cyan(color_table, 0, 255, 255, 1);
         | 
| @@ -313,7 +314,7 @@ namespace Sass { | |
| 313 314 | 
             
                const Color_RGBA transparent(color_table, 0, 0, 0, 0);
         | 
| 314 315 | 
             
              }
         | 
| 315 316 |  | 
| 316 | 
            -
              const std:: | 
| 317 | 
            +
              static const auto* const colors_to_names = new std::unordered_map<int, const char*> {
         | 
| 317 318 | 
             
                { 240 * 0x10000 + 248 * 0x100 + 255, ColorNames::aliceblue },
         | 
| 318 319 | 
             
                { 250 * 0x10000 + 235 * 0x100 + 215, ColorNames::antiquewhite },
         | 
| 319 320 | 
             
                {   0 * 0x10000 + 255 * 0x100 + 255, ColorNames::cyan },
         | 
| @@ -455,7 +456,7 @@ namespace Sass { | |
| 455 456 | 
             
                { 102 * 0x10000 +  51 * 0x100 + 153, ColorNames::rebeccapurple }
         | 
| 456 457 | 
             
              };
         | 
| 457 458 |  | 
| 458 | 
            -
              const std:: | 
| 459 | 
            +
              static const auto *const names_to_colors = new std::unordered_map<sass::string, const Color_RGBA*>
         | 
| 459 460 | 
             
              {
         | 
| 460 461 | 
             
                { ColorNames::aliceblue, &Colors::aliceblue },
         | 
| 461 462 | 
             
                { ColorNames::antiquewhite, &Colors::antiquewhite },
         | 
| @@ -610,29 +611,29 @@ namespace Sass { | |
| 610 611 |  | 
| 611 612 | 
             
              const Color_RGBA* name_to_color(const char* key)
         | 
| 612 613 | 
             
              {
         | 
| 613 | 
            -
                return name_to_color( | 
| 614 | 
            +
                return name_to_color(sass::string(key));
         | 
| 614 615 | 
             
              }
         | 
| 615 616 |  | 
| 616 | 
            -
              const Color_RGBA* name_to_color(const  | 
| 617 | 
            +
              const Color_RGBA* name_to_color(const sass::string& key)
         | 
| 617 618 | 
             
              {
         | 
| 618 619 | 
             
                // case insensitive lookup.  See #2462
         | 
| 619 | 
            -
                 | 
| 620 | 
            -
                 | 
| 620 | 
            +
                sass::string lower = key;
         | 
| 621 | 
            +
                Util::ascii_str_tolower(&lower);
         | 
| 621 622 |  | 
| 622 | 
            -
                auto p = names_to_colors | 
| 623 | 
            -
                if (p != names_to_colors | 
| 623 | 
            +
                auto p = names_to_colors->find(lower);
         | 
| 624 | 
            +
                if (p != names_to_colors->end()) {
         | 
| 624 625 | 
             
                  return p->second;
         | 
| 625 626 | 
             
                }
         | 
| 626 | 
            -
                return  | 
| 627 | 
            +
                return nullptr;
         | 
| 627 628 | 
             
              }
         | 
| 628 629 |  | 
| 629 630 | 
             
              const char* color_to_name(const int key)
         | 
| 630 631 | 
             
              {
         | 
| 631 | 
            -
                auto p = colors_to_names | 
| 632 | 
            -
                if (p != colors_to_names | 
| 632 | 
            +
                auto p = colors_to_names->find(key);
         | 
| 633 | 
            +
                if (p != colors_to_names->end()) {
         | 
| 633 634 | 
             
                  return p->second;
         | 
| 634 635 | 
             
                }
         | 
| 635 | 
            -
                return  | 
| 636 | 
            +
                return nullptr;
         | 
| 636 637 | 
             
              }
         | 
| 637 638 |  | 
| 638 639 | 
             
              const char* color_to_name(const double key)
         | 
| @@ -7,14 +7,6 @@ | |
| 7 7 |  | 
| 8 8 | 
             
            namespace Sass {
         | 
| 9 9 |  | 
| 10 | 
            -
              struct map_cmp_str
         | 
| 11 | 
            -
              {
         | 
| 12 | 
            -
                bool operator()(char const *a, char const *b) const
         | 
| 13 | 
            -
                {
         | 
| 14 | 
            -
                  return std::strcmp(a, b) < 0;
         | 
| 15 | 
            -
                }
         | 
| 16 | 
            -
              };
         | 
| 17 | 
            -
             | 
| 18 10 | 
             
              namespace ColorNames
         | 
| 19 11 | 
             
              {
         | 
| 20 12 | 
             
                extern const char aliceblue[];
         | 
| @@ -321,7 +313,7 @@ namespace Sass { | |
| 321 313 | 
             
              }
         | 
| 322 314 |  | 
| 323 315 | 
             
              const Color_RGBA* name_to_color(const char*);
         | 
| 324 | 
            -
              const Color_RGBA* name_to_color(const  | 
| 316 | 
            +
              const Color_RGBA* name_to_color(const sass::string&);
         | 
| 325 317 | 
             
              const char* color_to_name(const int);
         | 
| 326 318 | 
             
              const char* color_to_name(const Color_RGBA&);
         | 
| 327 319 | 
             
              const char* color_to_name(const double);
         | 
| @@ -45,6 +45,7 @@ namespace Sass { | |
| 45 45 | 
             
                extern const char for_kwd[]           = "@for";
         | 
| 46 46 | 
             
                extern const char from_kwd[]          = "from";
         | 
| 47 47 | 
             
                extern const char to_kwd[]            = "to";
         | 
| 48 | 
            +
                extern const char of_kwd[]            = "of";
         | 
| 48 49 | 
             
                extern const char through_kwd[]       = "through";
         | 
| 49 50 | 
             
                extern const char each_kwd[]          = "@each";
         | 
| 50 51 | 
             
                extern const char in_kwd[]            = "in";
         | 
| @@ -161,6 +162,10 @@ namespace Sass { | |
| 161 162 | 
             
                extern const char uri_chars[]  = ":;/?!%&#@|[]{}'`^\"*+-.,_=~";
         | 
| 162 163 | 
             
                extern const char real_uri_chars[]  = "#%&";
         | 
| 163 164 |  | 
| 165 | 
            +
                extern const char selector_combinator_child[] = ">";
         | 
| 166 | 
            +
                extern const char selector_combinator_general[] = "~";
         | 
| 167 | 
            +
                extern const char selector_combinator_adjacent[] = "+";
         | 
| 168 | 
            +
             | 
| 164 169 | 
             
                // some specific constant character classes
         | 
| 165 170 | 
             
                // they must be static to be useable by lexer
         | 
| 166 171 | 
             
                extern const char static_ops[]      = "*/%";
         | 
| @@ -43,6 +43,7 @@ namespace Sass { | |
| 43 43 | 
             
                extern const char for_kwd[];
         | 
| 44 44 | 
             
                extern const char from_kwd[];
         | 
| 45 45 | 
             
                extern const char to_kwd[];
         | 
| 46 | 
            +
                extern const char of_kwd[];
         | 
| 46 47 | 
             
                extern const char through_kwd[];
         | 
| 47 48 | 
             
                extern const char each_kwd[];
         | 
| 48 49 | 
             
                extern const char in_kwd[];
         | 
| @@ -161,6 +162,11 @@ namespace Sass { | |
| 161 162 | 
             
                extern const char uri_chars[];
         | 
| 162 163 | 
             
                extern const char real_uri_chars[];
         | 
| 163 164 |  | 
| 165 | 
            +
                // constants for selector combinators
         | 
| 166 | 
            +
                extern const char selector_combinator_child[];
         | 
| 167 | 
            +
                extern const char selector_combinator_general[];
         | 
| 168 | 
            +
                extern const char selector_combinator_adjacent[];
         | 
| 169 | 
            +
             | 
| 164 170 | 
             
                // some specific constant character classes
         | 
| 165 171 | 
             
                // they must be static to be useable by lexer
         | 
| 166 172 | 
             
                extern const char static_ops[];
         |