realm / realm/SwiftLint

indentation_width warning on multiple cases of switch-case

Open
#3,046 18 comments 14 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
Swift
Stars
19.7k
Forks
2.3k
Avg merge
1d 1h
Merged PRs (30d)
11

Description

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the reported switch-case example with swiftlint lint and the indentation_width rule enabled, then compare the warning on the continued case line with the correctly accepted single case. Trace the indentation rule's handling of multiline switch cases and add coverage for this sample; done means the false warning is removed without changing the valid warning behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.