Как настроить alignToken для случаев в синтаксисе сопоставления с образцом, используя scalafmt? - PullRequest
3 голосов
/ 02 апреля 2019

В scala с использованием scalafmt и имеющим следующее содержимое в моем .scalafmt.conf файле:

style = default
maxColumn = 120
continuationIndent.callSite = 2
continuationIndent.defnSite = 2
align.openParenDefnSite = false
align.openParenCallSite = false
danglingParentheses = true
indentOperator = spray
project.excludeFilters = [".*\\.sbt"]
rewrite.rules = [RedundantBraces, RedundantParens, SortModifiers, prefercurlyfors]
unindentTopLevelOperators = true
importSelectors = singleLine
spaces.afterKeywordBeforeParen = true
lineEndings = unix
newlines.penalizeSingleSelectMultiArgList = false
newlines.alwaysBeforeElseAfterCurlyIf = false
binPack.literalArgumentLists = false
runner.optimizer.forceConfigStyleMinArgCount = 1

в настоящее время он выравнивает маркер стрелки регистра из:

object Object {
  def f(s: String): Int = s match {
    case "a" => 1
    case "b" | "c" | "d" => 2
    case "e"=> 3
    case _  => 4
  }
}

по этому:

object Object {
  def f(s: String): Int = s match {
      case "a"             => 1
      case "b" | "c" | "d" => 2
      case "e"             => 3
      case _               => 4
  }
}

Я не хочу, чтобы код выравнивался по стрелке, чтобы минимизировать шумы в пробелах в запросах на извлечение, особенно во время переименования одной строки, которая изменила бы уровень отступа для всего блока.

Чтение Документы scalafmt Я узнаю только о случае по умолчанию:

align.tokens По умолчанию: [caseArrow]

Маркер выравнивания - это пара кода, который является строковым литералом оператора токена, и владелец, который является видом ближайшего узла дерева, которому принадлежит этот токен.Если владелец не указан, то будут сопоставлены все типы деревьев.

x match {
  case 1  => 1 -> 2
  case 11 => 11 -> 22
}

Конфигурация для этого примера

align.tokens = [{code = "=>", owner = "Case"}]

Я хочу не только отключить выравнивание, но я хочуscalafmt, чтобы обеспечить наличие одного пробела до и после стрелки =>.(Таким образом, в основном это должно работать в противоположность тому, что он делает в настоящее время.)

Как мне этого добиться?

1 Ответ

1 голос
/ 02 апреля 2019

Похоже, что нет удобного метода align.tokens.remove для использования метода align.tokens.add, однако эквивалентное поведение может быть достигнуто путем ручного указания параметра align.tokens.

Приведенные ниже строки будут - если они будут добавлены в конфигурацию - повторять поведение токена выравнивания по умолчанию для всего, кроме токена case =>.Он также не будет выравнивать токен case ⇒, который должен - если вы не делаете что-то необычное - поддерживать то же поведение выравнивания, что и =>.

align.tokens = [
    { code = "extends", owner = "Defn.(Class|Trait|Object)" }
    { code = "//", owner = ".*" }
    { code = "{", owner = "Template" }
    { code = "}", owner = "Template" }
    { code = "%", owner = applyInfix }
    { code = "%%",owner =  applyInfix }
    { code = "%%%",owner =  applyInfix }
    { code = "<-", owner = "Enumerator.Generator" }
    { code = "←", owner = "Enumerator.Generator" }
    { code = "->", owner = applyInfix }
    { code = "→", owner = applyInfix }
    { code = "=", owner = "(Enumerator.Val|Defn.(Va(l|r)|Def|Type))" }
]

Список токенов по умолчанию был взят из источникафайл кода AlignToken.scala , где они содержатся в объекте default.

Если вы хотите удалить другие экземпляры форматирования токена, просто удалите их экземпляры с карты.

Обратите внимание, что если в обновленной версии scalafmt будут добавлены дополнительные токены по умолчанию, вам придется добавить их вручную к этому параметру в вашей конфигурации, чтобы получить эту функциональность.

...