forked from rubocop/rubocop
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
…n quoted symbols. Like `Style/StringLiterals`, this cop checks for the quoting style for symbols to be consistent. Checking whether a symbol _should_ be quoted or not is still handled by `Lint/SymbolConversion`. This cop shares as much as possible with `Style/StringLiterals` for ease of maintainabilty. As well, for simple configuration, the default "style" is `same_as_string_literals` which will automatically apply the same configuration set up for `Style/StringLiterals` to this cop as well (it defaults to `single_quotes` if `StringLiterals` is not enabled).
- Loading branch information
1 parent
ac00a83
commit 2fabcd8
Showing
10 changed files
with
367 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
* [#9793](https://github.com/rubocop/rubocop/issues/9793): Add `Style/QuotedSymbols` to enforce consistency in quoted symbols. ([@dvandersluis][]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# frozen_string_literal: true | ||
|
||
module RuboCop | ||
module Cop | ||
# Classes that include this module just implement functions for working | ||
# with symbol nodes. | ||
module SymbolHelp | ||
def hash_key?(node) | ||
node.parent&.pair_type? && node == node.parent.child_nodes.first | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
# frozen_string_literal: true | ||
|
||
module RuboCop | ||
module Cop | ||
module Style | ||
# Checks if the quotes used for quoted symbols match the configured defaults. | ||
# By default uses the same configuration as `Style/StringLiterals`. | ||
# | ||
# String interpolation is always kept in double quotes. | ||
# | ||
# Note: `Lint/SymbolConversion` can be used in parallel to ensure that symbols | ||
# are not quoted that don't need to be. This cop is for configuring the quoting | ||
# style to use for symbols that require quotes. | ||
# | ||
# @example EnforcedStyle: same_as_string_literals (default) / single_quotes | ||
# # bad | ||
# :"abc-def" | ||
# | ||
# # good | ||
# :'abc-def' | ||
# :"#{str}" | ||
# :"a\'b" | ||
# | ||
# @example EnforcedStyle: double_quotes | ||
# # bad | ||
# :'abc-def' | ||
# | ||
# # good | ||
# :"abc-def" | ||
# :"#{str}" | ||
# :"a\'b" | ||
class QuotedSymbols < Base | ||
include ConfigurableEnforcedStyle | ||
include SymbolHelp | ||
include StringLiteralsHelp | ||
extend AutoCorrector | ||
|
||
MSG_SINGLE = "Prefer single-quoted symbols when you don't need string interpolation " \ | ||
'or special symbols.' | ||
MSG_DOUBLE = 'Prefer double-quoted symbols unless you need single quotes to ' \ | ||
'avoid extra backslashes for escaping.' | ||
|
||
def on_sym(node) | ||
return unless quoted?(node) | ||
|
||
message = style == :single_quotes ? MSG_SINGLE : MSG_DOUBLE | ||
|
||
if wrong_quotes?(node) | ||
add_offense(node, message: message) do |corrector| | ||
opposite_style_detected | ||
autocorrect(corrector, node) | ||
end | ||
else | ||
correct_style_detected | ||
end | ||
end | ||
|
||
private | ||
|
||
def autocorrect(corrector, node) | ||
str = if hash_key?(node) | ||
# strip quotes | ||
correct_quotes(node.source[1..-2]) | ||
else | ||
# strip leading `:` and quotes | ||
":#{correct_quotes(node.source[2..-2])}" | ||
end | ||
|
||
corrector.replace(node, str) | ||
end | ||
|
||
def correct_quotes(str) | ||
if style == :single_quotes | ||
to_string_literal(str) | ||
else | ||
str.inspect | ||
end | ||
end | ||
|
||
def style | ||
return super unless super == :same_as_string_literals | ||
|
||
string_literals_config = config.for_cop('Style/StringLiterals') | ||
return :single_quotes unless string_literals_config['Enabled'] | ||
|
||
string_literals_config['EnforcedStyle'].to_sym | ||
end | ||
|
||
def alternative_style | ||
(supported_styles - [style, :same_as_string_literals]).first | ||
end | ||
|
||
def quoted?(sym_node) | ||
sym_node.source.match?(/\A:?(['"]).*?\1\z/m) | ||
end | ||
|
||
def wrong_quotes?(node) | ||
return super if hash_key?(node) | ||
|
||
super(node.source[1..-1]) | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.