SwiftLint
SwiftLint copied to clipboard
indentation_width warning on multiple cases of switch-case
New Issue Checklist
- [x] Updated SwiftLint to the latest version
- [x] I searched for existing GitHub issues
Describe the bug
When the indentation_width
is enabled, it would give warning on a multiple cases in different lines for switch-case statement:
Sample:
switch enumValue {
case .value1,
.value2:
print("warning above")
case .value3:
print("No warning on this")
}
Complete output when running SwiftLint, including the stack trace and command used
$ swiftlint lint
file.swift:32:1: warning: Indentation Width Violation: Code should be indented with tabs or 4 spaces, but not both in the same line. (indentation_width)
Environment
- SwiftLint version (run
swiftlint version
to be sure)?0.38.2
- Installation method used (Homebrew, CocoaPods, building from source, etc)?
CocoaPods
- Paste your configuration file:
excluded: # paths to ignore during linting. Takes precedence over `included`.
- Carthage
- Pods
opt_in_rules:
- anyobject_protocol
- array_init
- attributes
- block_based_kvo
- class_delegate_protocol
- closing_brace
- closure_body_length
- closure_end_indentation
- closure_parameter_position
- closure_spacing
- collection_alignment
- colon
- comma
- compiler_protocol_init
- conditional_returns_on_newline
- contains_over_filter_count
- contains_over_filter_is_empty
- contains_over_first_not_nil
- contains_over_range_nil_comparison
- control_statement
- convenience_type
- custom_rules
- cyclomatic_complexity
- discarded_notification_center_observer
- discouraged_direct_init
#- discouraged_object_literal
#- discouraged_optional_boolean
#- discouraged_optional_collection
- duplicate_imports
- dynamic_inline
- empty_collection_literal
- empty_count
- empty_enum_arguments
- empty_parameters
- empty_parentheses_with_trailing_closure
- empty_string
- empty_xctest_method
- enum_case_associated_values_count
- expiring_todo
#- explicit_acl
#- explicit_enum_raw_value
- explicit_init
- explicit_self
# - explicit_top_level_acl
#- explicit_type_interface
#- extension_access_modifier
- fallthrough
- fatal_error_message
#- file_header
- file_length
- file_name
- file_name_no_space
#- file_types_order
- first_where
- flatmap_over_map_reduce
- for_where
- force_cast
- force_try
- force_unwrapping
- function_body_length
- function_default_parameter_at_end
- function_parameter_count
- generic_type_name
- identical_operands
- identifier_name
- implicit_getter
- implicit_return
- implicitly_unwrapped_optional
- indentation_width
- inert_defer
- is_disjoint
- joined_default_parameter
- large_tuple
- last_where
- leading_whitespace
- legacy_cggeometry_functions
- legacy_constant
- legacy_constructor
- legacy_hashing
- legacy_multiple
- legacy_nsgeometry_functions
- legacy_random
- let_var_whitespace
- line_length
- literal_expression_end_indentation
- lower_acl_than_parent
- mark
- missing_docs
- modifier_order
- multiline_arguments
- multiline_arguments_brackets
- multiline_function_chains
- multiline_literal_brackets
- multiline_parameters
- multiline_parameters_brackets
- multiple_closures_with_trailing_closure
- nesting
- nimble_operator
#- no_extension_access_modifier
- no_fallthrough_only
- no_grouping_extension
- notification_center_detachment
- number_separator
- nslocalizedstring_key
- object_literal
- opening_brace
- operator_usage_whitespace
- operator_whitespace
- optional_enum_case_matching
- overridden_super_call
#- override_in_extension
- pattern_matching_keywords
- prefer_self_type_over_type_of_self
- prefixed_toplevel_constant
- private_action
- private_outlet
- private_over_fileprivate
- private_unit_test
# - prohibited_interface_builder
- prohibited_super_call
- protocol_property_accessors_order
- quick_discouraged_call
- quick_discouraged_focused_test
- quick_discouraged_pending_test
- raw_value_for_camel_cased_codable_enum
- reduce_boolean
- reduce_into
- redundant_discardable_let
- redundant_nil_coalescing
- redundant_objc_attribute
- redundant_optional_initialization
- redundant_set_access_control
- redundant_string_enum_value
- redundant_type_annotation
- redundant_void_return
# - required_deinit
- required_enum_case
- return_arrow_whitespace
- shorthand_operator
- single_test_class
- sorted_first_last
- sorted_imports
- statement_position
- static_operator
- strict_fileprivate
- strong_iboutlet
- superfluous_disable_command
- switch_case_alignment
- switch_case_on_newline
- syntactic_sugar
- todo
- toggle_bool
- trailing_closure
- trailing_comma
- trailing_newline
- trailing_semicolon
- trailing_whitespace
- type_body_length
#- type_contents_order
- type_name
- unavailable_function
- unneeded_break_in_switch
- unneeded_parentheses_in_closure_argument
- unowned_variable_capture
- untyped_error_in_catch
- unused_capture_list
- unused_closure_parameter
- unused_control_flow_label
- unused_declaration
- unused_enumerated
- unused_import
- unused_optional_binding
- unused_setter_value
- valid_ibinspectable
- vertical_parameter_alignment
- vertical_parameter_alignment_on_call
- vertical_whitespace
- vertical_whitespace_between_cases
- vertical_whitespace_closing_braces
- vertical_whitespace_opening_braces
- void_return
- weak_delegate
- xctfail_message
- xct_specific_matcher
- yoda_condition
# rule parameters
indentation: 4
#conditional_returns_on_newline:
# if_only: true
file_length:
warning: 600
error: 1000
ignore_comment_only_lines: true
cyclomatic_complexity:
ignores_case_statements: true
warning: 10
error: 20
nesting:
type_level:
warning: 6
statement_level:
warning: 6
function_body_length:
warning: 40
error: 100
line_length: 150
type_body_length:
warning: 400
error: 500
large_tuple:
warning: 4
error: 6
identifier_name:
excluded:
- to
- id
- by
- of
- at
- !str on
- x
- y
- L
- mr
- ms
- dr
private_outlet:
allow_private_set: true
allows_public_getter: true
indentation: tabs
multiline_arguments:
only_enforce_after_first_closure_on_first_line: true
# insert yaml contents here
- Are you using nested configurations?
If so, paste their relative paths and respective contents.
No
- Which Xcode version are you using (check
xcodebuild -version
)?Xcode 11.3
- Do you have a sample that shows the issue? Run
echo "[string here]" | swiftlint lint --no-cache --use-stdin --enable-all-rules
to quickly test if your example is really demonstrating the issue. If your example is more complex, you can useswiftlint lint --path [file here] --no-cache --enable-all-rules
.
switch enumValue {
case .value1,
.value2: // This triggers a violation:
print("warning above")
case .value3:
print("No warning on this")
}
Related, indentation_width
also files warnings on the follow,
UINavigationController(nibName: nil,
bundle: nil)
Facing the same thing here
This issue has been automatically marked as stale because it has not had any recent activity. Please comment to prevent this issue from being closed. Thank you for your contributions!
This is still something to address
indentation_width
conflicts with several of the the "alignment" rules:
- vertical_parameter_alignment
- vertical_parameter_alignment_on_call
- switch_case_alignment
- collection_alignment
... and possibly more. So you end up with either:
// indentation_width violation
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: LaunchOptions = nil) -> Bool {
or
// vertical_parameter_alignment violation (also, more generally, incorrect formatting by most standards)
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: LaunchOptions = nil) -> Bool {
Tough problem to solve! Perhaps introducing a property to a Rule to define conflicting rules, and the relative priority.
This issue has been automatically marked as stale because it has not had any recent activity. Please comment to prevent this issue from being closed. Thank you for your contributions!
This is still something to address
Just one more case that I thought was worth pointing out. Xcode's newish if let
alignment behavior triggers this rule as well. (Aligning the second and following clauses with the first indents them 3 characters from the previous indent level.) E.g.,
if let foo = bar(),
let baz = quux, // Indentation width violation...
Ditto for guard
statements.
Related,
indentation_width
also files warnings on the follow,UINavigationController(nibName: nil, bundle: nil)
Facing same issue. This rule is very useful to ensure correct indentation throughout app (especially with multi-developers). But this issue is actually causing 1000's of warnings. Any possibility to address this?
Facing the same issue here
I'm seeing this too. Impossible to satisfy both indentation_width and a number of other rules. Guess I'm going to have to disable it for now
I am against any changes to this rule. This rule works completely correct and it has no conflicts with other rules. The fact is, people expect it to not warn about indentation problem when there is in fact an indentation problem.
Why using column indentation is even a relevant argument?
This is how functions should be indented with vertical parameter alignment AND correct indentation:
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: LaunchOptions = nil
) -> Bool {
...
}
Workaround for guard
:
// swiftlint:disable indentation_width
guard true,
true
else { return }
Hello! Any news/updates?
Also facing the same issue.
I'd still like the original "indentation_width warning on multiple cases of switch-case" addressed to allow:
case .value1,
.value2:
And not demand:
case .value1,
.value2:
In the original the warning is shown on the .value2:
line because there is no specialization allowing for case labels to be aligned separately from statement continuations.