Swiftlint: indentation_width warning on multiple cases of switch-case

Created on 17 Jan 2020  路  5Comments  路  Source: realm/SwiftLint

New Issue Checklist

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 use swiftlint 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")
}

Most helpful comment

Related, indentation_width also files warnings on the follow,

UINavigationController(nibName: nil,
                       bundle: nil)

All 5 comments

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.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

muzamilhassan1987 picture muzamilhassan1987  路  3Comments

ArthurMaroulier picture ArthurMaroulier  路  3Comments

rajohns08 picture rajohns08  路  3Comments

bourquep picture bourquep  路  3Comments

jcarroll-mediafly picture jcarroll-mediafly  路  3Comments