2 votes

Faites échouer la compilation en cas de Non-Exhaustive Match en Scala 3

Depuis Scala 2.13, le drapeau de compilateur -Wconf permet de contrôler précisément quelles alertes doivent être traitées comme des erreurs. Cependant, la chaîne de configuration pour -Wconf n'est pas toujours la même lors de la migration vers Scala 3.

En particulier, j'ai du mal à trouver comment faire échouer la compilation en cas de motifs non exhaustifs en Scala 3. En Scala 2.13, j'avais l'habitude de compter sur

-Wconf:cat=other-match-analysis:error

mais la même chaîne n'est pas reconnue en Scala 3 :

 Impossible d'analyser la configuration `-Wconf`: cat=other-match-analysis:error

La documentation https://docs.scala-lang.org/scala3/guides/migration/options-lookup.html ne semble pas couvrir ce cas, à moins que je ne l'ai pas vu.

Il est toujours possible de transformer toutes les alertes en erreurs, mais ce serait formidable d'avoir le même degré de granularité offert par Scala 2.13.

Quelqu'un pourrait-il me dire comment configurer le compilateur Scala 3 pour faire échouer la compilation en cas de motif non exhaustif, sans transformer toutes les autres alertes en erreurs ?

Question similaire pour Scala 2.13 Make Compile Fail on Non-Exhaustive Match in SBT

2voto

Ivan Stanislavciuc Points 1680

Je pense que Scala 3 est bien en retard en ce qui concerne la détection des avertissements et leur catégorisation par rapport à Scala 2.13. Je n'ai pas pu trouver la documentation exacte pour -Wconf pour scala 3 pour la référencer ici, mais ce qui suit pourrait être utile.

Voici comment scala 2.13 montre ce qu'il prend en charge au format -Wconf

scala -Wconf help

Cela produit un message d'aide avec la partie suivante liée aux catégories d'erreurs/avertissements :

Liste complète des catégories de messages :
 - deprecation
 - fonctionnalité, feature-dynamics, feature-existentials, feature-higher-kinds, feature-implicit-conversions, feature-macros, feature-postfix-ops, feature-reflective-calls
 - java-source
 - lint, lint-adapted-args, lint-byname-implicit, lint-constant, lint-delayedinit-select, lint-deprecation, lint-doc-detached, lint-eta-sam, lint-eta-zero, lint-implicit-not-found, lint-inaccessible, lint-infer-any, lint-int-div-to-float, lint-missing-interpolator, lint-multiarg-infix, lint-nonlocal-return, lint-nullary-unit, lint-numeric-methods, lint-option-implicit, lint-package-object-classes, lint-performance, lint-poly-implicit-overload, lint-private-shadow, lint-recurse-with-default, lint-serial, lint-stars-align, lint-type-parameter-shadow, lint-unit-specialization, lint-universal-methods
 - optimizer
 - autre, autre-debug, autre-implicit-type, autre-match-analysis, autre-migration, autre-non-cooperative-equals, autre-nullary-override, autre-pure-statement, autre-shadowing
 - scaladoc
 - unchecked
 - unused, unused-imports, unused-locals, unused-nowarn, unused-params, unused-pat-vars, unused-privates
 - w-flag, w-flag-dead-code, w-flag-extra-implicit, w-flag-numeric-widen, w-flag-self-implicit, w-flag-value-discard

La même commande ne fonctionne pas en scala 3.3 et ce que je peux trouver de plus proche de certaines sortes de documentation est le suivant

scala -W

Une partie intéressante de la configuration des avertissements est la suivante

     -unused  Activer ou désactiver des avertissements spécifiques d'`unused`
                 Choix :
                 - nowarn,
                 - all,
                 - imports :
                    Avertir si un sélecteur d'import n'est pas référencé.
                    REMARQUE : outrepassée par -unused:strict-no-implicit-warn,
                 - privates :
                    Avertir si un membre privé est inutilisé,
                 - locals :
                    Avertir si une définition locale est inutilisée,
                 - explicits :
                    Avertir si un paramètre explicite est inutilisé,
                 - implicits :
                    Avertir si un paramètre implicite est inutilisé,
                 - params :
                    Activer -unused:explicits,implicits,
                 - linted :
                    Activer -unused:imports,privates,locals,implicits,
                 - strict-no-implicit-warn :
                    Identique à -unused:import, seulement pour les imports de membres nommés explicites.
                    REMARQUE : Ceci outrepasse -unused:imports et n'est PAS défini par -unused:all,
                 - unsafe-warn-patvars :
                    (DANGEREUX) Avertir si une variable liée dans un pattern est inutilisée.
                    Cet avertissement peut générer des faux positifs, car il ne peut pas encore être supprimé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X