Могу ли я проверить свою scala кодовую базу, чтобы найти все предупреждения типа: «Сравнение несвязанных типов»? - PullRequest
4 голосов
/ 03 марта 2020

Я хочу проверить свою кодовую базу, чтобы найти предупреждения «Тест бесплодного типа» и предупреждение «Сравнение несвязанных типов» Теперь мы хотим проверить код, чтобы выяснить, есть ли другие примеры этого в нашей кодовой базе?

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Я проверил все документированные опции компилятора Scala и не нашел аналога IntelliJ Idea (я полагаю, вы используете эту IDE с плагином Scala). Предупреждение о проверке, которое вы разместили. Я думаю, это потому, что операция ==, которая затем обессахаривается до equals, вызывает метод с точки зрения компиляции: boolean equals(Obejct obj) - как видно из сигнатуры этого метода, можно передавать любой тип объекта, следовательно компилятор не жалуется на это.

Список всех Scala опций компилятора, которые вы можете найти здесь: https://docs.scala-lang.org/overviews/compiler-options/index.html

Что вы можете сделать в этом случае

В краткосрочной перспективе : Выполнить проверку по всему проекту, используя комбинацию Ctr+Alt+Shift+I и имя типа проверки - например, Comparing Unrelated types (см. Более подробную информацию: https://www.jetbrains.com/help/idea/running-inspections.html)

В долгосрочной перспективе : используйте Eq класс типов из библиотеки cats, которая решает эту проблему: https://typelevel.org/cats/typeclasses/eq.html

Надеюсь, это поможет!

1 голос
/ 03 марта 2020

Не указано c к == ошибкам, но добавление scalacOptions ++= Seq("-Xfatal-warnings") в ваш build.sbt преобразует предупреждения в ошибки и сбой компиляции. Гораздо безопаснее пометить некоторые места кода как «игнорируемые предупреждения», чем игнорировать предупреждения по умолчанию.

У вас есть различные плагины sbt для проверки кода, которые также могут быть полезны во время компиляции.

Я делаю не советуем подключать дополнительные библиотеки (например, кошек): вы хотите, чтобы ваша среда выполнения была как можно более простой, а добавление, например, import cats.implicits._ в ваши классы, в значительной степени противоположно простому. Например, этот импорт с радостью создаст тысячи экземпляров различных вещей кошек во время выполнения, очень вероятно, что потребуется несколько секунд, чтобы создать их все, поскольку он фактически проверит всю вашу кодовую базу во время выполнения.

1 голос
/ 03 марта 2020

Если вы используете IntelliJ, попробуйте выполнить однократную проверку

  1. Analyse | Run Inspection by Name...
  2. Enter Comparing unrelated types
  3. Set Inspection scope до Whole project

Рассмотреть вопрос об избежании ванили == в пользу ===

import cats.implicits._
1 == ""   // res5: Boolean = false
1 === ""  // compiler error

Рассмотреть Wartremover

addSbtPlugin("org.wartremover" % "sbt-wartremover" % "2.4.5")
wartremoverErrors ++= Warts.all

, который дает что-то вроде

[wartremover:Equals] == is disabled - use === or equivalent instead
[error]   val x = Some("") == Some(3)
...