sass 3.5.0.pre.rc.1 → 3.5.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/README.md +1 -1
  4. data/Rakefile +40 -11
  5. data/VERSION +1 -1
  6. data/VERSION_DATE +1 -1
  7. data/extra/sass-spec-ref.sh +32 -0
  8. data/lib/sass.rb +3 -3
  9. data/lib/sass/css.rb +1 -1
  10. data/lib/sass/deprecation.rb +55 -0
  11. data/lib/sass/engine.rb +16 -12
  12. data/lib/sass/environment.rb +1 -1
  13. data/lib/sass/error.rb +3 -3
  14. data/lib/sass/exec/base.rb +1 -1
  15. data/lib/sass/plugin.rb +1 -1
  16. data/lib/sass/plugin/compiler.rb +1 -1
  17. data/lib/sass/plugin/configuration.rb +2 -2
  18. data/lib/sass/plugin/rack.rb +3 -3
  19. data/lib/sass/plugin/staleness_checker.rb +3 -3
  20. data/lib/sass/script.rb +3 -3
  21. data/lib/sass/script/functions.rb +23 -22
  22. data/lib/sass/script/lexer.rb +17 -8
  23. data/lib/sass/script/parser.rb +8 -7
  24. data/lib/sass/script/tree/node.rb +2 -2
  25. data/lib/sass/script/tree/operation.rb +43 -16
  26. data/lib/sass/script/value/base.rb +3 -3
  27. data/lib/sass/script/value/color.rb +15 -10
  28. data/lib/sass/script/value/helpers.rb +13 -2
  29. data/lib/sass/script/value/list.rb +2 -2
  30. data/lib/sass/script/value/number.rb +4 -4
  31. data/lib/sass/script/value/string.rb +5 -12
  32. data/lib/sass/scss/parser.rb +7 -4
  33. data/lib/sass/scss/rx.rb +1 -1
  34. data/lib/sass/scss/static_parser.rb +12 -24
  35. data/lib/sass/selector/abstract_sequence.rb +12 -11
  36. data/lib/sass/selector/comma_sequence.rb +18 -3
  37. data/lib/sass/selector/pseudo.rb +15 -2
  38. data/lib/sass/selector/sequence.rb +9 -7
  39. data/lib/sass/selector/simple.rb +5 -4
  40. data/lib/sass/selector/simple_sequence.rb +7 -3
  41. data/lib/sass/shared.rb +5 -3
  42. data/lib/sass/source/map.rb +2 -2
  43. data/lib/sass/source/position.rb +4 -4
  44. data/lib/sass/tree/comment_node.rb +1 -1
  45. data/lib/sass/tree/node.rb +3 -3
  46. data/lib/sass/tree/prop_node.rb +1 -1
  47. data/lib/sass/tree/rule_node.rb +15 -6
  48. data/lib/sass/tree/visitors/cssize.rb +3 -5
  49. data/lib/sass/tree/visitors/deep_copy.rb +1 -1
  50. data/lib/sass/tree/visitors/extend.rb +2 -8
  51. data/lib/sass/tree/visitors/perform.rb +3 -2
  52. data/lib/sass/tree/visitors/to_css.rb +3 -3
  53. data/lib/sass/util.rb +32 -5
  54. data/lib/sass/version.rb +2 -4
  55. data/test/sass/cache_test.rb +0 -1
  56. data/test/sass/callbacks_test.rb +0 -1
  57. data/test/sass/compiler_test.rb +0 -1
  58. data/test/sass/conversion_test.rb +3 -4
  59. data/test/sass/css2sass_test.rb +1 -2
  60. data/test/sass/css_variable_test.rb +0 -1
  61. data/test/sass/encoding_test.rb +0 -1
  62. data/test/sass/engine_test.rb +63 -60
  63. data/test/sass/exec_test.rb +0 -1
  64. data/test/sass/extend_test.rb +40 -81
  65. data/test/sass/functions_test.rb +8 -6
  66. data/test/sass/importer_test.rb +0 -1
  67. data/test/sass/logger_test.rb +0 -1
  68. data/test/sass/more_templates/more1.sass +10 -10
  69. data/test/sass/more_templates/more_import.sass +2 -2
  70. data/test/sass/plugin_test.rb +3 -4
  71. data/test/sass/results/script.css +1 -1
  72. data/test/sass/results/units.css +2 -2
  73. data/test/sass/script_conversion_test.rb +1 -2
  74. data/test/sass/script_test.rb +55 -47
  75. data/test/sass/scss/css_test.rb +2 -3
  76. data/test/sass/scss/rx_test.rb +0 -1
  77. data/test/sass/scss/scss_test.rb +26 -12
  78. data/test/sass/source_map_test.rb +13 -14
  79. data/test/sass/superselector_test.rb +0 -1
  80. data/test/sass/templates/_partial.sass +1 -1
  81. data/test/sass/templates/basic.sass +10 -10
  82. data/test/sass/templates/bork1.sass +1 -1
  83. data/test/sass/templates/bork5.sass +1 -1
  84. data/test/sass/templates/compact.sass +10 -10
  85. data/test/sass/templates/complex.sass +187 -187
  86. data/test/sass/templates/compressed.sass +10 -10
  87. data/test/sass/templates/expanded.sass +10 -10
  88. data/test/sass/templates/import.sass +2 -2
  89. data/test/sass/templates/importee.sass +3 -3
  90. data/test/sass/templates/mixins.sass +22 -22
  91. data/test/sass/templates/multiline.sass +4 -4
  92. data/test/sass/templates/nested.sass +13 -13
  93. data/test/sass/templates/parent_ref.sass +12 -12
  94. data/test/sass/templates/script.sass +70 -70
  95. data/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +1 -1
  96. data/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +2 -2
  97. data/test/sass/templates/subdir/subdir.sass +3 -3
  98. data/test/sass/templates/units.sass +10 -10
  99. data/test/sass/util/multibyte_string_scanner_test.rb +10 -3
  100. data/test/sass/util/normalized_map_test.rb +0 -1
  101. data/test/sass/util/subset_map_test.rb +0 -1
  102. data/test/sass/util_test.rb +4 -3
  103. data/test/sass/value_helpers_test.rb +0 -1
  104. metadata +15 -13
@@ -16,12 +16,12 @@ module Sass
16
16
  # Parses a string of SassScript
17
17
  #
18
18
  # @param value [String] The SassScript
19
- # @param line [Fixnum] The number of the line on which the SassScript appeared.
19
+ # @param line [Integer] The number of the line on which the SassScript appeared.
20
20
  # Used for error reporting
21
- # @param offset [Fixnum] The number of characters in on `line` that the SassScript started.
21
+ # @param offset [Integer] The number of characters in on `line` that the SassScript started.
22
22
  # Used for error reporting
23
23
  # @param options [{Symbol => Object}] An options hash;
24
- # see {file:SASS_REFERENCE.md#options the Sass options documentation}
24
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
25
25
  # @return [Script::Tree::Node] The root node of the parse tree
26
26
  def self.parse(value, line, offset, options = {})
27
27
  Parser.parse(value, line, offset, options)
@@ -300,7 +300,7 @@ module Sass::Script
300
300
  # \{#call call($function, $args...)}
301
301
  # : Dynamically calls a Sass function reference returned by `get-function`.
302
302
  #
303
- # \{#get_function get-function($name)}
303
+ # \{#get_function get-function($name, $css: false)}
304
304
  # : Looks up a function with the given name in the current lexical scope
305
305
  # and returns a reference to it.
306
306
  #
@@ -441,8 +441,8 @@ module Sass::Script
441
441
  # If no signatures match, the first signature is returned for error messaging.
442
442
  #
443
443
  # @param method_name [Symbol] The name of the Ruby function to be called.
444
- # @param arg_arity [Fixnum] The number of unnamed arguments the function was passed.
445
- # @param kwarg_arity [Fixnum] The number of keyword arguments the function was passed.
444
+ # @param arg_arity [Integer] The number of unnamed arguments the function was passed.
445
+ # @param kwarg_arity [Integer] The number of keyword arguments the function was passed.
446
446
  #
447
447
  # @return [{Symbol => Object}, nil]
448
448
  # The signature options for the matching signature,
@@ -654,7 +654,7 @@ module Sass::Script
654
654
  # @return [Sass::Script::Value::Color]
655
655
  # @raise [ArgumentError] if any parameter is the wrong type or out of bounds
656
656
  def rgb(red, green, blue)
657
- if calc?(red) || calc?(green) || calc?(blue)
657
+ if special_number?(red) || special_number?(green) || special_number?(blue)
658
658
  return unquoted_string("rgb(#{red}, #{green}, #{blue})")
659
659
  end
660
660
  assert_type red, :Number, :red
@@ -715,7 +715,7 @@ module Sass::Script
715
715
  color, alpha = args
716
716
 
717
717
  assert_type color, :Color, :color
718
- if calc?(alpha)
718
+ if special_number?(alpha)
719
719
  unquoted_string("rgba(#{color.red}, #{color.green}, #{color.blue}, #{alpha})")
720
720
  else
721
721
  assert_type alpha, :Number, :alpha
@@ -724,7 +724,8 @@ module Sass::Script
724
724
  end
725
725
  when 4
726
726
  red, green, blue, alpha = args
727
- if calc?(red) || calc?(green) || calc?(blue) || calc?(alpha)
727
+ if special_number?(red) || special_number?(green) ||
728
+ special_number?(blue) || special_number?(alpha)
728
729
  unquoted_string("rgba(#{red}, #{green}, #{blue}, #{alpha})")
729
730
  else
730
731
  rgba(rgb(red, green, blue), alpha)
@@ -753,7 +754,7 @@ module Sass::Script
753
754
  # @raise [ArgumentError] if `$saturation` or `$lightness` are out of bounds
754
755
  # or any parameter is the wrong type
755
756
  def hsl(hue, saturation, lightness)
756
- if calc?(hue) || calc?(saturation) || calc?(lightness)
757
+ if special_number?(hue) || special_number?(saturation) || special_number?(lightness)
757
758
  unquoted_string("hsl(#{hue}, #{saturation}, #{lightness})")
758
759
  else
759
760
  hsla(hue, saturation, lightness, number(1))
@@ -781,7 +782,8 @@ module Sass::Script
781
782
  # @raise [ArgumentError] if `$saturation`, `$lightness`, or `$alpha` are out
782
783
  # of bounds or any parameter is the wrong type
783
784
  def hsla(hue, saturation, lightness, alpha)
784
- if calc?(hue) || calc?(saturation) || calc?(lightness) || calc?(alpha)
785
+ if special_number?(hue) || special_number?(saturation) ||
786
+ special_number?(lightness) || special_number?(alpha)
785
787
  return unquoted_string("hsla(#{hue}, #{saturation}, #{lightness}, #{alpha})")
786
788
  end
787
789
  assert_type hue, :Number, :hue
@@ -1324,7 +1326,7 @@ module Sass::Script
1324
1326
  # @param $color1 [Sass::Script::Value::Color]
1325
1327
  # @param $color2 [Sass::Script::Value::Color]
1326
1328
  # @param $weight [Sass::Script::Value::Number] The relative weight of each
1327
- # color. Closer to `0%` gives more weight to `$color1`, closer to `100%`
1329
+ # color. Closer to `100%` gives more weight to `$color1`, closer to `0%`
1328
1330
  # gives more weight to `$color2`
1329
1331
  # @return [Sass::Script::Value::Color]
1330
1332
  # @raise [ArgumentError] if `$weight` is out of bounds or any parameter is
@@ -1573,7 +1575,7 @@ MESSAGE
1573
1575
  # @param $start-at [Sass::Script::Value::Number] The index of the first
1574
1576
  # character of the substring. If this is negative, it counts from the end
1575
1577
  # of `$string`
1576
- # @param $end-before [Sass::Script::Value::Number] The index of the last
1578
+ # @param $end-at [Sass::Script::Value::Number] The index of the last
1577
1579
  # character of the substring. If this is negative, it counts from the end
1578
1580
  # of `$string`. Defaults to -1
1579
1581
  # @return [Sass::Script::Value::String] The substring. This will be quoted
@@ -1592,7 +1594,7 @@ MESSAGE
1592
1594
  s = string.value.length + s if s < 0
1593
1595
  s = 0 if s < 0
1594
1596
  e = string.value.length + e if e < 0
1595
- e = 0 if s < 0
1597
+ return Sass::Script::Value::String.new("", string.type) if e < 0
1596
1598
  extracted = string.value.slice(s..e)
1597
1599
  Sass::Script::Value::String.new(extracted || "", string.type)
1598
1600
  end
@@ -1610,7 +1612,7 @@ MESSAGE
1610
1612
  # @raise [ArgumentError] if `$string` isn't a string
1611
1613
  def to_upper_case(string)
1612
1614
  assert_type string, :String, :string
1613
- Sass::Script::Value::String.new(string.value.upcase, string.type)
1615
+ Sass::Script::Value::String.new(Sass::Util.upcase(string.value), string.type)
1614
1616
  end
1615
1617
  declare :to_upper_case, [:string]
1616
1618
 
@@ -1625,7 +1627,7 @@ MESSAGE
1625
1627
  # @raise [ArgumentError] if `$string` isn't a string
1626
1628
  def to_lower_case(string)
1627
1629
  assert_type string, :String, :string
1628
- Sass::Script::Value::String.new(string.value.downcase, string.type)
1630
+ Sass::Script::Value::String.new(Sass::Util.downcase(string.value), string.type)
1629
1631
  end
1630
1632
  declare :to_lower_case, [:string]
1631
1633
 
@@ -1690,13 +1692,11 @@ MESSAGE
1690
1692
  end
1691
1693
  declare :feature_exists, [:feature]
1692
1694
 
1693
- # Returns a reference to a function for later invocation with the `call` function.
1695
+ # Returns a reference to a function for later invocation with the `call()` function.
1694
1696
  #
1695
- # The function reference created may refer to a function defined in
1696
- # your stylesheet, built-in to the host environment, or a CSS native
1697
- # function. As such, this function never returns an error, but the
1698
- # you can use `function-exists()` to check if the function reference
1699
- # created points at a Sass function.
1697
+ # If `$css` is `false`, the function reference may refer to a function
1698
+ # defined in your stylesheet or built-in to the host environment. If it's
1699
+ # `true` it will refer to a plain-CSS function.
1700
1700
  #
1701
1701
  # @example
1702
1702
  # get-function("rgb")
@@ -1704,8 +1704,9 @@ MESSAGE
1704
1704
  # @function myfunc { @return "something"; }
1705
1705
  # get-function("myfunc")
1706
1706
  #
1707
- # @overload get_function($name)
1707
+ # @overload get_function($name, $css: false)
1708
1708
  # @param name [Sass::Script::Value::String] The name of the function being referenced.
1709
+ # @param css [Sass::Script::Value::Bool] Whether to get a plain CSS function.
1709
1710
  #
1710
1711
  # @return [Sass::Script::Value::Function] A function reference.
1711
1712
  def get_function(name, kwargs = {})
@@ -2701,7 +2702,7 @@ WARNING
2701
2702
 
2702
2703
  extends = Sass::Util::SubsetMap.new
2703
2704
  begin
2704
- extender.populate_extends(extends, extendee)
2705
+ extender.populate_extends(extends, extendee, nil, [], true)
2705
2706
  selector.do_extend(extends).to_sass_script
2706
2707
  rescue Sass::SyntaxError => e
2707
2708
  raise ArgumentError.new(e.to_s)
@@ -2744,7 +2745,7 @@ WARNING
2744
2745
 
2745
2746
  extends = Sass::Util::SubsetMap.new
2746
2747
  begin
2747
- replacement.populate_extends(extends, original)
2748
+ replacement.populate_extends(extends, original, nil, [], true)
2748
2749
  selector.do_extend(extends, [], true).to_sass_script
2749
2750
  rescue Sass::SyntaxError => e
2750
2751
  raise ArgumentError.new(e.to_s)
@@ -19,13 +19,13 @@ module Sass
19
19
  # `source_range`: \[`Sass::Source::Range`\]
20
20
  # : The range in the source file in which the token appeared.
21
21
  #
22
- # `pos`: \[`Fixnum`\]
22
+ # `pos`: \[`Integer`\]
23
23
  # : The scanner position at which the SassScript token appeared.
24
24
  Token = Struct.new(:type, :value, :source_range, :pos)
25
25
 
26
26
  # The line number of the lexer's current position.
27
27
  #
28
- # @return [Fixnum]
28
+ # @return [Integer]
29
29
  def line
30
30
  return @line unless @tok
31
31
  @tok.source_range.start_pos.line
@@ -34,7 +34,7 @@ module Sass
34
34
  # The number of bytes into the current line
35
35
  # of the lexer's current position (1-based).
36
36
  #
37
- # @return [Fixnum]
37
+ # @return [Integer]
38
38
  def offset
39
39
  return @offset unless @tok
40
40
  @tok.source_range.start_pos.offset
@@ -144,12 +144,12 @@ module Sass
144
144
  }
145
145
 
146
146
  # @param str [String, StringScanner] The source text to lex
147
- # @param line [Fixnum] The 1-based line on which the SassScript appears.
147
+ # @param line [Integer] The 1-based line on which the SassScript appears.
148
148
  # Used for error reporting and sourcemap building
149
- # @param offset [Fixnum] The 1-based character (not byte) offset in the line in the source.
149
+ # @param offset [Integer] The 1-based character (not byte) offset in the line in the source.
150
150
  # Used for error reporting and sourcemap building
151
151
  # @param options [{Symbol => Object}] An options hash;
152
- # see {file:SASS_REFERENCE.md#options the Sass options documentation}
152
+ # see {file:SASS_REFERENCE.md#Options the Sass options documentation}
153
153
  def initialize(str, line, offset, options)
154
154
  @scanner = str.is_a?(StringScanner) ? str : Sass::Util::MultibyteStringScanner.new(str)
155
155
  @line = line
@@ -368,8 +368,17 @@ MESSAGE
368
368
  # IDs in properties are used in the Basic User Interface Module
369
369
  # (http://www.w3.org/TR/css3-ui/).
370
370
  return unless scan(REGULAR_EXPRESSIONS[:id])
371
- if @scanner[0] =~ /^\#[0-9a-fA-F]+$/ && (@scanner[0].length == 4 || @scanner[0].length == 7)
372
- return [:color, Script::Value::Color.from_hex(@scanner[0])]
371
+ if @scanner[0] =~ /^\#[0-9a-fA-F]+$/
372
+ if @scanner[0].length == 4 || @scanner[0].length == 7
373
+ return [:color, Script::Value::Color.from_hex(@scanner[0])]
374
+ elsif @scanner[0].length == 5 || @scanner[0].length == 9
375
+ filename = @options[:filename]
376
+ Sass::Util.sass_warn <<MESSAGE
377
+ DEPRECATION WARNING on line #{line}, column #{offset}#{" of #{filename}" if filename}:
378
+ The value "#{@scanner[0]}" is currently parsed as a string, but it will be parsed as a color in
379
+ future versions of Sass. Use "unquote('#{@scanner[0]}')" to continue parsing it as a string.
380
+ MESSAGE
381
+ end
373
382
  end
374
383
  [:ident, @scanner[0]]
375
384
  end
@@ -7,25 +7,25 @@ module Sass
7
7
  class Parser
8
8
  # The line number of the parser's current position.
9
9
  #
10
- # @return [Fixnum]
10
+ # @return [Integer]
11
11
  def line
12
12
  @lexer.line
13
13
  end
14
14
 
15
15
  # The column number of the parser's current position.
16
16
  #
17
- # @return [Fixnum]
17
+ # @return [Integer]
18
18
  def offset
19
19
  @lexer.offset
20
20
  end
21
21
 
22
22
  # @param str [String, StringScanner] The source text to parse
23
- # @param line [Fixnum] The line on which the SassScript appears.
23
+ # @param line [Integer] The line on which the SassScript appears.
24
24
  # Used for error reporting and sourcemap building
25
- # @param offset [Fixnum] The character (not byte) offset where the script starts in the line.
25
+ # @param offset [Integer] The character (not byte) offset where the script starts in the line.
26
26
  # Used for error reporting and sourcemap building
27
27
  # @param options [{Symbol => Object}] An options hash; see
28
- # {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
28
+ # {file:SASS_REFERENCE.md#Options the Sass options documentation}.
29
29
  # This supports an additional `:allow_extra_text` option that controls
30
30
  # whether the parser throws an error when extra text is encountered
31
31
  # after the parsed construct.
@@ -820,8 +820,9 @@ RUBY
820
820
  location = "on line #{interpolation.line}"
821
821
  location << " of #{interpolation.filename}" if interpolation.filename
822
822
  Sass::Util.sass_warn <<WARNING
823
- DEPRECATION WARNING #{location}: \#{} interpolation near operators will be simplified
824
- in a future version of Sass. To preserve the current behavior, use quotes:
823
+ DEPRECATION WARNING #{location}:
824
+ \#{} interpolation near operators will be simplified in a future version of Sass.
825
+ To preserve the current behavior, use quotes:
825
826
 
826
827
  #{interpolation.to_quoted_equivalent.to_sass}
827
828
 
@@ -10,7 +10,7 @@ module Sass::Script::Tree
10
10
 
11
11
  # The line of the document on which this node appeared.
12
12
  #
13
- # @return [Fixnum]
13
+ # @return [Integer]
14
14
  attr_accessor :line
15
15
 
16
16
  # The source range in the document on which this node appeared.
@@ -25,7 +25,7 @@ module Sass::Script::Tree
25
25
 
26
26
  # Sets the options hash for this node,
27
27
  # as well as for all child nodes.
28
- # See {file:SASS_REFERENCE.md#options the Sass options documentation}.
28
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
29
29
  #
30
30
  # @param options [{Symbol => Object}] The options
31
31
  def options=(options)
@@ -2,6 +2,9 @@ module Sass::Script::Tree
2
2
  # A SassScript parse node representing a binary operation,
3
3
  # such as `$a + $b` or `"foo" + 1`.
4
4
  class Operation < Node
5
+ @@color_arithmetic_deprecation = Sass::Deprecation.new
6
+ @@unitless_equals_deprecation = Sass::Deprecation.new
7
+
5
8
  attr_reader :operand1
6
9
  attr_reader :operand2
7
10
  attr_reader :operator
@@ -85,28 +88,52 @@ module Sass::Script::Tree
85
88
  raise Sass::SyntaxError.new("Undefined operation: \"#{value1} #{@operator} #{value2}\".")
86
89
  end
87
90
 
88
- if (@operator == :eq || @operator == :neq) && value1.is_a?(Sass::Script::Value::Number) &&
89
- value2.is_a?(Sass::Script::Value::Number) && value1.unitless? != value2.unitless? &&
90
- result == (if @operator == :eq
91
- Sass::Script::Value::Bool::TRUE
92
- else
93
- Sass::Script::Value::Bool::FALSE
94
- end)
95
-
96
- operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}"
97
- future_value = @operator == :neq
98
- Sass::Util.sass_warn <<WARNING
99
- DEPRECATION WARNING on line #{line}#{" of #{filename}" if filename}:
100
- The result of `#{operation}` will be `#{future_value}` in future releases of Sass.
101
- Unitless numbers will no longer be equal to the same numbers with units.
102
- WARNING
103
- end
91
+ warn_for_color_arithmetic(value1, value2)
92
+ warn_for_unitless_equals(value1, value2, result)
104
93
 
105
94
  result
106
95
  end
107
96
 
108
97
  private
109
98
 
99
+ def warn_for_color_arithmetic(value1, value2)
100
+ return unless @operator == :plus || @operator == :times || @operator == :minus ||
101
+ @operator == :div || @operator == :mod
102
+
103
+ if value1.is_a?(Sass::Script::Value::Number)
104
+ return unless value2.is_a?(Sass::Script::Value::Color)
105
+ elsif value1.is_a?(Sass::Script::Value::Color)
106
+ return unless value2.is_a?(Sass::Script::Value::Color) || value2.is_a?(Sass::Script::Value::Number)
107
+ else
108
+ return
109
+ end
110
+
111
+ @@color_arithmetic_deprecation.warn(filename, line, <<WARNING)
112
+ The operation `#{value1} #{@operator} #{value2}` is deprecated and will be an error in future versions.
113
+ Consider using Sass's color functions instead.
114
+ http://sass-lang.com/documentation/Sass/Script/Functions.html#other_color_functions
115
+ WARNING
116
+ end
117
+
118
+ def warn_for_unitless_equals(value1, value2, result)
119
+ return unless @operator == :eq || @operator == :neq
120
+ return unless value1.is_a?(Sass::Script::Value::Number)
121
+ return unless value2.is_a?(Sass::Script::Value::Number)
122
+ return unless value1.unitless? != value2.unitless?
123
+ return unless result == (if @operator == :eq
124
+ Sass::Script::Value::Bool::TRUE
125
+ else
126
+ Sass::Script::Value::Bool::FALSE
127
+ end)
128
+
129
+ operation = "#{value1.to_sass} #{@operator == :eq ? '==' : '!='} #{value2.to_sass}"
130
+ future_value = @operator == :neq
131
+ @@unitless_equals_deprecation.warn(filename, line, <<WARNING)
132
+ The result of `#{operation}` will be `#{future_value}` in future releases of Sass.
133
+ Unitless numbers will no longer be equal to the same numbers with units.
134
+ WARNING
135
+ end
136
+
110
137
  def operand_to_sass(op, side, opts)
111
138
  return "(#{op.to_sass(opts)})" if op.is_a?(Sass::Script::Tree::ListLiteral)
112
139
  return op.to_sass(opts) unless op.is_a?(Operation)
@@ -27,7 +27,7 @@ module Sass::Script::Value
27
27
 
28
28
  # Sets the options hash for this node,
29
29
  # as well as for all child nodes.
30
- # See {file:SASS_REFERENCE.md#options the Sass options documentation}.
30
+ # See {file:SASS_REFERENCE.md#Options the Sass options documentation}.
31
31
  #
32
32
  # @param options [{Symbol => Object}] The options
33
33
  attr_writer :options
@@ -149,7 +149,7 @@ MSG
149
149
  # Returns the hash code of this value. Two objects' hash codes should be
150
150
  # equal if the objects are equal.
151
151
  #
152
- # @return [Fixnum] The hash code.
152
+ # @return [Integer for Ruby 2.4.0+, Fixnum for earlier Ruby versions] The hash code.
153
153
  def hash
154
154
  value.hash
155
155
  end
@@ -176,7 +176,7 @@ MSG
176
176
  eq(other).to_bool
177
177
  end
178
178
 
179
- # @return [Fixnum] The integer value of this value
179
+ # @return [Integer] The integer value of this value
180
180
  # @raise [Sass::SyntaxError] if this value isn't an integer
181
181
  def to_i
182
182
  raise Sass::SyntaxError.new("#{inspect} is not an integer.")
@@ -17,8 +17,8 @@ module Sass::Script::Value
17
17
  # @private
18
18
  #
19
19
  # Convert a ruby integer to a rgba components
20
- # @param color [Fixnum]
21
- # @return [Array<Fixnum>] Array of 4 numbers representing r,g,b and alpha
20
+ # @param color [Integer]
21
+ # @return [Array<Integer>] Array of 4 numbers representing r,g,b and alpha
22
22
  def self.int_to_rgba(color)
23
23
  rgba = (0..3).map {|n| color >> (n << 3) & 0xff}.reverse
24
24
  rgba[-1] = rgba[-1] / 255.0
@@ -293,7 +293,7 @@ module Sass::Script::Value
293
293
 
294
294
  # The red component of the color.
295
295
  #
296
- # @return [Fixnum]
296
+ # @return [Integer]
297
297
  def red
298
298
  hsl_to_rgb!
299
299
  @attrs[:red]
@@ -301,7 +301,7 @@ module Sass::Script::Value
301
301
 
302
302
  # The green component of the color.
303
303
  #
304
- # @return [Fixnum]
304
+ # @return [Integer]
305
305
  def green
306
306
  hsl_to_rgb!
307
307
  @attrs[:green]
@@ -309,7 +309,7 @@ module Sass::Script::Value
309
309
 
310
310
  # The blue component of the color.
311
311
  #
312
- # @return [Fixnum]
312
+ # @return [Integer]
313
313
  def blue
314
314
  hsl_to_rgb!
315
315
  @attrs[:blue]
@@ -342,7 +342,7 @@ module Sass::Script::Value
342
342
  # The alpha channel (opacity) of the color.
343
343
  # This is 1 unless otherwise defined.
344
344
  #
345
- # @return [Fixnum]
345
+ # @return [Integer]
346
346
  def alpha
347
347
  @attrs[:alpha].to_f
348
348
  end
@@ -357,7 +357,7 @@ module Sass::Script::Value
357
357
 
358
358
  # Returns the red, green, and blue components of the color.
359
359
  #
360
- # @return [Array<Fixnum>] A frozen three-element array of the red, green, and blue
360
+ # @return [Array<Integer>] A frozen three-element array of the red, green, and blue
361
361
  # values (respectively) of the color
362
362
  def rgb
363
363
  [red, green, blue].freeze
@@ -365,7 +365,7 @@ module Sass::Script::Value
365
365
 
366
366
  # Returns the red, green, blue, and alpha components of the color.
367
367
  #
368
- # @return [Array<Fixnum>] A frozen four-element array of the red, green,
368
+ # @return [Array<Integer>] A frozen four-element array of the red, green,
369
369
  # blue, and alpha values (respectively) of the color
370
370
  def rgba
371
371
  [red, green, blue, alpha].freeze
@@ -373,7 +373,7 @@ module Sass::Script::Value
373
373
 
374
374
  # Returns the hue, saturation, and lightness components of the color.
375
375
  #
376
- # @return [Array<Fixnum>] A frozen three-element array of the
376
+ # @return [Array<Integer>] A frozen three-element array of the
377
377
  # hue, saturation, and lightness values (respectively) of the color
378
378
  def hsl
379
379
  [hue, saturation, lightness].freeze
@@ -381,7 +381,7 @@ module Sass::Script::Value
381
381
 
382
382
  # Returns the hue, saturation, lightness, and alpha components of the color.
383
383
  #
384
- # @return [Array<Fixnum>] A frozen four-element array of the hue,
384
+ # @return [Array<Integer>] A frozen four-element array of the hue,
385
385
  # saturation, lightness, and alpha values (respectively) of the color
386
386
  def hsla
387
387
  [hue, saturation, lightness, alpha].freeze
@@ -563,6 +563,11 @@ module Sass::Script::Value
563
563
  def to_s(opts = {})
564
564
  return smallest if options[:style] == :compressed
565
565
  return representation if representation
566
+
567
+ # IE10 doesn't properly support the color name "transparent", so we emit
568
+ # generated transparent colors as rgba(0, 0, 0, 0) in favor of that. See
569
+ # #1782.
570
+ return rgba_str if Number.basically_equal?(alpha, 0)
566
571
  return name if name
567
572
  alpha? ? rgba_str : hex_str
568
573
  end