Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

indentation_width warning on multiple cases of switch-case #3046

Open
2 tasks done
bull-xu opened this issue Jan 17, 2020 · 18 comments
Open
2 tasks done

indentation_width warning on multiple cases of switch-case #3046

bull-xu opened this issue Jan 17, 2020 · 18 comments
Labels
enhancement Ideas for improvements of existing features and rules.

Comments

@bull-xu
Copy link

bull-xu commented Jan 17, 2020

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")
}
@iliaskarim
Copy link

Related, indentation_width also files warnings on the follow,

UINavigationController(nibName: nil,
                       bundle: nil)

@txaiwieser
Copy link

Facing the same thing here

@stale
Copy link

stale bot commented Nov 8, 2020

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!

@stale stale bot added the wontfix Issues that became stale and were auto-closed by a bot. label Nov 8, 2020
@fredpi fredpi removed the wontfix Issues that became stale and were auto-closed by a bot. label Nov 8, 2020
@fredpi
Copy link
Collaborator

fredpi commented Nov 8, 2020

This is still something to address

@bricker
Copy link
Contributor

bricker commented Nov 10, 2020

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.

@stale
Copy link

stale bot commented Jan 9, 2021

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!

@stale stale bot added the wontfix Issues that became stale and were auto-closed by a bot. label Jan 9, 2021
@fredpi
Copy link
Collaborator

fredpi commented Jan 9, 2021

This is still something to address

@stale stale bot removed the wontfix Issues that became stale and were auto-closed by a bot. label Jan 9, 2021
@woolsweater
Copy link

woolsweater commented Aug 6, 2021

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...

@ryanbooker
Copy link
Contributor

Ditto for guard statements.

@abdulla-allaith
Copy link

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?

@jpsim jpsim added the enhancement Ideas for improvements of existing features and rules. label Jan 20, 2022
@cristianilea-lateral
Copy link

Facing the same issue here

@brzzdev
Copy link

brzzdev commented Jun 22, 2022

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

@ohanslik-vendavo
Copy link

ohanslik-vendavo commented Jul 28, 2022

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 {
  ...
}

defagos added a commit to SRGSSR/pillarbox-apple that referenced this issue Aug 18, 2022
@wzbozon
Copy link

wzbozon commented Mar 30, 2023

Workaround for guard:

// swiftlint:disable indentation_width
guard true,
      true
else { return }

@alexanderkhitev
Copy link

Hello! Any news/updates?

@AlexandreHauber
Copy link

Also facing the same issue.

@renewedvision-kh
Copy link

renewedvision-kh commented Sep 1, 2023

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.

@michaelrevlis
Copy link

Workaround for guard-let and if-let statements:

if 
    let foo = bar(),
    let baz = quux {
    ...
}

guard
    let foo = bar(),
    let baz = quux else {
    ...
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Ideas for improvements of existing features and rules.
Projects
None yet
Development

No branches or pull requests