override def customizeSettings()

in scala/scala-impl/src/org/jetbrains/plugins/scala/lang/formatting/settings/ScalaLanguageCodeStyleSettingsProvider.scala [64:364]


  override def customizeSettings(consumer: CodeStyleSettingsCustomizable, settingsType: SettingsType): Unit = {
    val settingsToEnable: ArrayBuffer[String] = new ArrayBuffer

    def enableSettings(@NonNls fieldNames: String*): Unit = settingsToEnable ++= fieldNames

    //spacing
    if (settingsType == SettingsType.SPACING_SETTINGS) {
      consumer.renameStandardOption("SPACE_BEFORE_TYPE_PARAMETER_LIST", ScalaBundle.message("spaces.panel.before.opening.square.bracket"))

      enableSettings(
        // After
        "SPACE_AFTER_COMMA",
        "SPACE_AFTER_SEMICOLON",

        // Before
        "SPACE_BEFORE_IF_PARENTHESES",
        "SPACE_BEFORE_FOR_PARENTHESES",
        "SPACE_BEFORE_WHILE_PARENTHESES",
        "SPACE_BEFORE_METHOD_PARENTHESES",
        "SPACE_BEFORE_METHOD_CALL_PARENTHESES",
        "SPACE_BEFORE_CLASS_LBRACE",
        "SPACE_BEFORE_METHOD_LBRACE",
        "SPACE_BEFORE_TYPE_PARAMETER_LIST",

        // Within
        "SPACE_WITHIN_FOR_PARENTHESES",
        "SPACE_WITHIN_IF_PARENTHESES",
        "SPACE_WITHIN_WHILE_PARENTHESES",
        "SPACE_WITHIN_PARENTHESES",
        "SPACE_WITHIN_METHOD_PARENTHESES",
        "SPACE_WITHIN_METHOD_CALL_PARENTHESES",
        "SPACE_WITHIN_BRACKETS",
        "SPACE_WITHIN_EMPTY_METHOD_CALL_PARENTHESES",
      )
    }

    //blank lines
    if (settingsType == SettingsType.BLANK_LINES_SETTINGS) {
      enableSettings(
        "KEEP_BLANK_LINES_IN_CODE",
        "BLANK_LINES_AFTER_CLASS_HEADER",
        "BLANK_LINES_BEFORE_CLASS_END",
        "KEEP_BLANK_LINES_BEFORE_RBRACE",
        "KEEP_BLANK_LINES_IN_DECLARATIONS",
        "BLANK_LINES_BEFORE_PACKAGE",
        "BLANK_LINES_AFTER_PACKAGE",
        "BLANK_LINES_BEFORE_IMPORTS",
        "BLANK_LINES_AFTER_IMPORTS",
        "BLANK_LINES_AROUND_CLASS",
        "BLANK_LINES_AFTER_ANONYMOUS_CLASS_HEADER",
        "BLANK_LINES_AROUND_FIELD_IN_INTERFACE",
        "BLANK_LINES_AROUND_FIELD",
        "BLANK_LINES_AROUND_METHOD_IN_INTERFACE",
        "BLANK_LINES_AROUND_METHOD",
        "BLANK_LINES_BEFORE_METHOD_BODY"
      )
    }

    //wrapping and Braces
    if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) {
      consumer.renameStandardOption("BINARY_OPERATION_WRAP", ScalaBundle.message("wrapping.and.braces.panel.renamed.infix.expressions"))
      consumer.renameStandardOption("EXTENDS_LIST_WRAP"    , ScalaBundle.message("wrapping.and.braces.panel.renamed.extends.with.list"))
      consumer.renameStandardOption("EXTENDS_KEYWORD_WRAP" , ScalaBundle.message("wrapping.and.braces.panel.renamed.extends.keyword"))
      // TODO: since in Scala 3 braces can be optional for both `for` and `yield` keyword,
      //  this is a bad naming, because FOR_BRACE_FORCE kinda implies that it's about `for`, but actually affects `yield`
      //  we could create 2 dedicated Scala3 setting and migrate old setting value
      consumer.renameStandardOption("FOR_BRACE_FORCE"      , ScalaBundle.message("wrapping.and.braces.panel.renamed.force.yield.braces"))

      //Binary expression section
      enableSettings(
        "BINARY_OPERATION_WRAP",
        "ALIGN_MULTILINE_BINARY_OPERATION",
        "ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION",
        "PARENTHESES_EXPRESSION_LPAREN_WRAP",
        "PARENTHESES_EXPRESSION_RPAREN_WRAP"
      )

      //Method calls section
      enableSettings(
        "CALL_PARAMETERS_WRAP",
        "ALIGN_MULTILINE_PARAMETERS_IN_CALLS",
        "PREFER_PARAMETERS_WRAP",
        "CALL_PARAMETERS_RPAREN_ON_NEXT_LINE"
      )

      //method call chain
      enableSettings(
        "METHOD_CALL_CHAIN_WRAP",
        "WRAP_FIRST_METHOD_IN_CALL_CHAIN",
        "ALIGN_MULTILINE_CHAINED_METHODS",
        "KEEP_LINE_BREAKS"
      )

      //brace placement
      enableSettings(
        "CLASS_BRACE_STYLE",
        "METHOD_BRACE_STYLE",
        "BRACE_STYLE"
      )

      //extends list wrap
      enableSettings(
        "EXTENDS_LIST_WRAP",
        "EXTENDS_KEYWORD_WRAP"
      )

      //method parameters
      enableSettings(
        "METHOD_PARAMETERS_WRAP",
        "ALIGN_MULTILINE_PARAMETERS",
        "METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE",
        "METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE"
      )

      //if statement
      enableSettings(
        "IF_BRACE_FORCE",
        "ELSE_ON_NEW_LINE",
        "SPECIAL_ELSE_IF_TREATMENT"
      )

      //brace forces
      enableSettings(
        "FOR_BRACE_FORCE",
        "WHILE_BRACE_FORCE",
        "DOWHILE_BRACE_FORCE",
        "WHILE_ON_NEW_LINE",
        "INDENT_CASE_FROM_SWITCH",
        "CATCH_ON_NEW_LINE",
        "FINALLY_ON_NEW_LINE",
        "FOR_STATEMENT_WRAP",
        "ALIGN_MULTILINE_FOR"
      )

      //modifier list wrap
      enableSettings("MODIFIER_LIST_WRAP")

      //align in columns
      enableSettings("ALIGN_GROUP_FIELD_DECLARATIONS")

      enableSettings("WRAP_LONG_LINES")

      //annotations wrap
      enableSettings(
        "CLASS_ANNOTATION_WRAP",
        "METHOD_ANNOTATION_WRAP",
        "FIELD_ANNOTATION_WRAP",
        "PARAMETER_ANNOTATION_WRAP",
        "VARIABLE_ANNOTATION_WRAP"
      )

      enableSettings(
        "KEEP_SIMPLE_BLOCKS_IN_ONE_LINE",
        "KEEP_SIMPLE_METHODS_IN_ONE_LINE",
        "KEEP_FIRST_COLUMN_COMMENT"
      )
    }

    //comments generation
    if (settingsType == SettingsType.COMMENTER_SETTINGS) {
      enableSettings(
        CodeGenerationPanel.SupportedCommenterStandardOptionNames.asScala.toSeq: _*
      )
    }

    consumer.showStandardOptions(settingsToEnable.toArray: _*)

    def opt(@NonNls fieldName: String, @Nls title: String, @Nls groupName: String,
            keysAndValues: Array[(String, Int)] = Array()): Unit = {
      val options: Array[AnyRef] = if (keysAndValues.nonEmpty)
        Array(keysAndValues.map(_._1), keysAndValues.map(_._2))
      else
        Array()
      consumer.showCustomOption(classOf[ScalaCodeStyleSettings], fieldName, title, groupName, options: _*)
    }

    //noinspection SpellCheckingInspection
    def opta(@NonNls fieldName: String, @Nls title: String, @Nls groupName: String,
             anchor: OptionAnchor, @NonNls anchorField: String,
             keysAndValues: Array[(String, Int)] = Array()): Unit = {
      val options: Array[AnyRef] = if (keysAndValues.nonEmpty)
        Array(keysAndValues.map(_._1), keysAndValues.map(_._2))
      else
        Array()
      consumer.showCustomOption(classOf[ScalaCodeStyleSettings], fieldName, title, groupName, anchor, anchorField, options: _*)
    }

    import ApplicationBundle.{message => appMessage}
//    import com.intellij.psi.codeStyle.{CodeStyleSettingsCustomizable => options}

    val options = CodeStyleSettingsCustomizableOptions.getInstance
    //Custom options
    if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) {

      import WrappingAndBracesCustomGroupNames._
      val ExtendsWithList = appMessage("wrapping.extends.implements.list")
      opt("ALIGN_EXTENDS_WITH", appMessage("wrapping.align.when.multiline"), ExtendsWithList,
        ScalaCodeStyleSettings.EXTENDS_ALIGN_STRING zip ScalaCodeStyleSettings.EXTENDS_ALIGN_VALUES)
      opt("WRAP_BEFORE_WITH_KEYWORD", ScalaBundle.message("wrapping.and.braces.panel.wrap.before.with.keyword"), ExtendsWithList)
      opt("ALIGN_IF_ELSE", ScalaBundle.message("wrapping.and.braces.panel.align.if.else.statements"), appMessage("wrapping.if.statement"))
      opt("METHOD_BRACE_FORCE", ScalaBundle.message("wrapping.and.braces.panel.force.braces"), METHOD_DEFINITION, BRACE_OPTION_AND_VALUES)
      opt("TRY_BRACE_FORCE", ScalaBundle.message("wrapping.and.braces.panel.force.try.braces"), options.WRAPPING_TRY_STATEMENT, BRACE_OPTION_AND_VALUES)
      opt("FINALLY_BRACE_FORCE", ScalaBundle.message("wrapping.and.braces.panel.force.finally.braces"), options.WRAPPING_TRY_STATEMENT, BRACE_OPTION_AND_VALUES)

      opt("CLOSURE_BRACE_FORCE", ScalaBundle.message("wrapping.and.braces.panel.force.braces"), ANONYMOUS_METHOD, BRACE_OPTION_AND_VALUES)
      opt("PLACE_CLOSURE_PARAMETERS_ON_NEW_LINE", ScalaBundle.message("wrapping.and.braces.panel.parameters.on.new.line"), ANONYMOUS_METHOD)

      opt("NOT_CONTINUATION_INDENT_FOR_PARAMS", ScalaBundle.message("wrapping.and.braces.panel.use.normal.indent.for.parameters"), options.WRAPPING_METHOD_PARAMETERS)
      opt("ALIGN_PARAMETER_TYPES_IN_MULTILINE_DECLARATIONS", ScalaBundle.message("wrapping.and.braces.panel.align.parameter.types.in.multiline.declarations"), options.WRAPPING_METHOD_PARAMETERS, {
        import ScalaCodeStyleSettings._
        TYPE_ANNOTATION_ALIGN_STRING.zip(TYPE_ANNOTATION_ALIGN_VALUES)
      })
      opt("INDENT_FIRST_PARAMETER", ScalaBundle.message("wrapping.and.braces.panel.indent.first.parameter.if.on.new.line"), options.WRAPPING_METHOD_PARAMETERS)
      opt("INDENT_FIRST_PARAMETER_CLAUSE", ScalaBundle.message("wrapping.and.braces.panel.indent.first.parameter.clause.if.on.new.line"), options.WRAPPING_METHOD_PARAMETERS)

      consumer.renameStandardOption(options.WRAPPING_SWITCH_STATEMENT, ScalaBundle.message("wrapping.and.braces.panel.match.statement"))
      opt("DO_NOT_INDENT_CASE_CLAUSE_BODY", ScalaBundle.message("wrapping.and.braces.panel.do.not.indent.case.clause.body"), options.WRAPPING_SWITCH_STATEMENT)
      opt("ALIGN_IN_COLUMNS_CASE_BRANCH", ScalaBundle.message("wrapping.and.braces.panel.align.in.columns.case.branches"), options.WRAPPING_SWITCH_STATEMENT)
      opt("ALIGN_COMPOSITE_PATTERN", ScalaBundle.message("wrapping.and.braces.panel.align.multiline.pattern.alternatives"), options.WRAPPING_SWITCH_STATEMENT)
      opt("CASE_CLAUSE_BRACE_FORCE", ScalaBundle.message("wrapping.and.braces.panel.force.case.branch.braces"), options.WRAPPING_SWITCH_STATEMENT, BRACE_OPTION_AND_VALUES)

      opt("PLACE_SELF_TYPE_ON_NEW_LINE", ScalaBundle.message("wrapping.and.braces.panel.place.self.type.on.new.line"), CLASS_DEFINITION)
      opt("KEEP_XML_FORMATTING", ScalaBundle.message("wrapping.and.braces.panel.keep.xml.formatting"), XML_FORMATTING)
      opt("KEEP_ONE_LINE_LAMBDAS_IN_ARG_LIST", ScalaBundle.message("wrapping.and.braces.panel.simple.one.line.lambdas.in.arg.list"), options.WRAPPING_KEEP)

      opt("INDENT_BRACED_FUNCTION_ARGS", ScalaBundle.message("wrapping.and.braces.panel.indent.braced.arguments"), options.WRAPPING_METHOD_ARGUMENTS_WRAPPING)
      opt("DO_NOT_ALIGN_BLOCK_EXPR_PARAMS", ScalaBundle.message("wrapping.and.braces.panel.do.not.align.block.expression.parameters"), options.WRAPPING_METHOD_ARGUMENTS_WRAPPING)

      opt("INDENT_YIELD_AFTER_ONE_LINE_ENUMERATORS", ScalaBundle.message("wrapping.and.braces.panel.for.indent.yield.after.one.line.enumerators"), options.WRAPPING_FOR_STATEMENT)

      val newLinesOptions: Array[(String, Int)] = {
        import ScalaCodeStyleSettings._
        Array(
          ScalaBundle.message("wrapping.and.braces.panel.new.line.options.no.new.line") -> NO_NEW_LINE,
          ScalaBundle.message("wrapping.and.braces.panel.new.line.options.new.line.always") -> NEW_LINE_ALWAYS,
          ScalaBundle.message("wrapping.and.braces.panel.new.line.options.new.line.for.multiple.arguments") -> NEW_LINE_FOR_MULTIPLE_ARGUMENTS
        )
      }
      opta("CALL_PARAMETERS_NEW_LINE_AFTER_LPAREN", appMessage("wrapping.new.line.after.lpar"), options.WRAPPING_METHOD_ARGUMENTS_WRAPPING,
        OptionAnchor.BEFORE, "CALL_PARAMETERS_RPAREN_ON_NEXT_LINE", newLinesOptions
      )
      opt("DO_NOT_INDENT_TUPLES_CLOSE_BRACE", ScalaBundle.message("wrapping.and.braces.panel.do.not.indent.tuples.closing.parenthesis"), TUPLES_WRAP)
      opt("ALIGN_TUPLE_ELEMENTS", ScalaBundle.message("wrapping.and.braces.panel.align.tuple.elements"), TUPLES_WRAP)

      opt("INDENT_TYPE_ARGUMENTS", ScalaBundle.message("wrapping.and.braces.panel.indent"), TYPE_ARGUMENTS)
      opt("INDENT_TYPE_PARAMETERS", ScalaBundle.message("wrapping.and.braces.panel.indent"), TYPE_PARAMETERS)

      opt("INDENT_FEWER_BRACES_IN_METHOD_CALL_CHAINS", "Indent arguments with colons (Scala 3)", options.WRAPPING_CALL_CHAIN)
    }

    if (settingsType == SettingsType.SPACING_SETTINGS) {
      opt("SPACE_AFTER_MODIFIERS_CONSTRUCTOR", ScalaBundle.message("spaces.panel.constructor.parameters.with.modifiers"), options.SPACES_BEFORE_PARENTHESES)
      opt("SPACE_BEFORE_INFIX_METHOD_CALL_PARENTHESES", ScalaBundle.message("spaces.panel.infix.method.call.parentheses"), options.SPACES_BEFORE_PARENTHESES)
      opt("SPACE_BEFORE_INFIX_OPERATOR_LIKE_METHOD_CALL_PARENTHESES", ScalaBundle.message("spaces.panel.infix.operator.like.method.call.parentheses"), options.SPACES_BEFORE_PARENTHESES)
      opt("SPACE_BEFORE_INFIX_LIKE_METHOD_PARENTHESES", ScalaBundle.message("spaces.panel.infix.method.parentheses"), options.SPACES_BEFORE_PARENTHESES)
      opt("PRESERVE_SPACE_AFTER_METHOD_DECLARATION_NAME", ScalaBundle.message("spaces.panel.preserve.space.before.method.parentheses"), options.SPACES_BEFORE_PARENTHESES)

      opta("SPACE_BEFORE_BRACE_METHOD_CALL", ScalaBundle.message("spaces.panel.method.call.left.brace"), options.SPACES_BEFORE_LEFT_BRACE,
        CodeStyleSettingsCustomizable.OptionAnchor.AFTER, "SPACE_BEFORE_METHOD_LBRACE")

      opt("SPACE_AFTER_TYPE_COLON", ScalaBundle.message("spaces.panel.after.colon.before.declarations.type"), options.SPACES_OTHER)
      opt("SPACE_BEFORE_TYPE_COLON", ScalaBundle.message("spaces.panel.before.colon.after.declarations.name"), options.SPACES_OTHER)
      opt("SPACE_INSIDE_CLOSURE_BRACES", ScalaBundle.message("spaces.panel.inside.closure.braces"), options.SPACES_OTHER)
      opt("SPACES_AROUND_AT_IN_PATTERNS", ScalaBundle.message("spaces.panel.around.at.in.pattern.bindings"), options.SPACES_OTHER)
      opt("NEWLINE_AFTER_ANNOTATIONS", ScalaBundle.message("spaces.panel.newline.after.annotations"), options.SPACES_OTHER)
      opt("KEEP_COMMENTS_ON_SAME_LINE", ScalaBundle.message("spaces.panel.keep.one.line.comments.on.same.line"), options.SPACES_OTHER)

      opt("SPACE_BEFORE_TYPE_PARAMETER_IN_DEF_LIST", ScalaBundle.message("spaces.panel.before.opening.square.bracket"), options.SPACES_IN_TYPE_PARAMETERS)

      opt("SPACE_BEFORE_TYPE_PARAMETER_LEADING_CONTEXT_BOUND_COLON", ScalaBundle.message("spaces.panel.before.context.bound.colon.leading"), options.SPACES_IN_TYPE_PARAMETERS)
      opt("SPACE_BEFORE_TYPE_PARAMETER_LEADING_CONTEXT_BOUND_COLON_HK", ScalaBundle.message("spaces.panel.before.context.bound.colon.leading.higher.kinded"), options.SPACES_IN_TYPE_PARAMETERS)
      opt("SPACE_BEFORE_TYPE_PARAMETER_REST_CONTEXT_BOUND_COLONS", ScalaBundle.message("spaces.panel.before.context.bound.colon.rest"), options.SPACES_IN_TYPE_PARAMETERS)

      opt("SPACE_INSIDE_SELF_TYPE_BRACES", ScalaBundle.message("spaces.panel.self.type.braces"), options.SPACES_WITHIN)
      opt("SPACES_IN_IMPORTS", ScalaBundle.message("spaces.panel.import.braces"), options.SPACES_WITHIN)
      opt("SPACES_IN_ONE_LINE_BLOCKS", ScalaBundle.message("spaces.panel.simple.one.line.block.braces"), options.SPACES_WITHIN)
    }

    if (settingsType == SettingsType.BLANK_LINES_SETTINGS) {
      opt("BLANK_LINES_AROUND_METHOD_IN_INNER_SCOPES", ScalaBundle.message("blank.lines.panel.around.method.in.inner.scopes"), options.BLANK_LINES)
      opt("BLANK_LINES_AROUND_FIELD_IN_INNER_SCOPES",  ScalaBundle.message("blank.lines.panel.around.field.in.inner.scopes"), options.BLANK_LINES)
      opt("BLANK_LINES_AROUND_FIELD_IN_INNER_SCOPES",  ScalaBundle.message("blank.lines.panel.around.class.in.inner.scopes"), options.BLANK_LINES)
    }

    if (settingsType == SettingsType.LANGUAGE_SPECIFIC) {
      opt("SD_ALIGN_PARAMETERS_COMMENTS", ScalaBundle.message("scaladoc.panel.align.parameter.descriptions"), ScalaDocFormattingPanel.ALIGNMENT_GROUP)
      opt("SD_ALIGN_EXCEPTION_COMMENTS", ScalaBundle.message("scaladoc.panel.align.throws.exception.descriptions"), ScalaDocFormattingPanel.ALIGNMENT_GROUP)
      opt("SD_ALIGN_RETURN_COMMENTS", ScalaBundle.message("scaladoc.panel.align.return.value.description"), ScalaDocFormattingPanel.ALIGNMENT_GROUP)
      opt("SD_ALIGN_OTHER_TAGS_COMMENTS", ScalaBundle.message("scaladoc.panel.align.other.tags.descriptions"), ScalaDocFormattingPanel.ALIGNMENT_GROUP)
      opt("SD_ALIGN_LIST_ITEM_CONTENT", ScalaBundle.message("align.list.items.content"), ScalaDocFormattingPanel.ALIGNMENT_GROUP)

      opt("SD_KEEP_BLANK_LINES_BETWEEN_TAGS", ScalaBundle.message("scaladoc.panel.blank.lines.keep"), ScalaDocFormattingPanel.BLANK_LINES_GROUP)
      opt("SD_BLANK_LINE_BEFORE_TAGS", ScalaBundle.message("scaladoc.panel.before.tags"), ScalaDocFormattingPanel.BLANK_LINES_GROUP)
      opt("SD_BLANK_LINE_AFTER_PARAMETERS_COMMENTS", ScalaBundle.message("scaladoc.panel.after.parameter.comments"), ScalaDocFormattingPanel.BLANK_LINES_GROUP)
      opt("SD_BLANK_LINE_AFTER_RETURN_COMMENTS", ScalaBundle.message("scaladoc.panel.after.tags"), ScalaDocFormattingPanel.BLANK_LINES_GROUP)
      opt("SD_BLANK_LINE_BETWEEN_PARAMETERS", ScalaBundle.message("scaladoc.panel.between.parameter.descriptions"), ScalaDocFormattingPanel.BLANK_LINES_GROUP)
      opt("SD_BLANK_LINE_BEFORE_PARAMETERS", ScalaBundle.message("scaladoc.panel.before.parameter.descriptions"), ScalaDocFormattingPanel.BLANK_LINES_GROUP)

      opt("SD_PRESERVE_SPACES_IN_TAGS", ScalaBundle.message("scaladoc.panel.preserve.spaces.in.tags"), ScalaDocFormattingPanel.OTHER_GROUP)
    }
  }