2 votes

Faites échouer la compilation en cas de correspondance non exhaustive en Scala 3

Depuis Scala 2.13, le drapeau du 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 sur les correspondances de motifs non exhaustives 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:

Échec de l'analyse de 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 manqué.

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

Est-ce que quelqu'un pourrait me montrer comment configurer le compilateur Scala 3 pour faire échouer la compilation lorsqu'une correspondance de motif est non exhaustive, 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 supporte au format -Wconf

scala -Wconf help

Cela produit un message d'aide avec la partie suivante concernant les catégories d'erreur/d'avertissement :

Liste complète des catégories de messages :
 - deprecation
 - feature, 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
 - other, other-debug, other-implicit-type, other-match-analysis, other-migration, other-non-cooperative-equals, other-nullary-override, other-pure-statement, other-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 dans Scala 3.3 et la documentation la plus proche à laquelle je puisse accéder est la suivante

scala -W

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

     -Wunused  Activer ou désactiver des avertissements `unused` spécifiques
                 Choix :
                 - nowarn,
                 - all,
                 - imports :
                    Avertissement si un sélecteur d'importation n'est pas référencé.
                    REMARQUE : remplacé par -unused:strict-no-implicit-warn,
                 - privates :
                    Avertissement si un membre privé est inutilisé,
                 - locals :
                    Avertissement si une définition locale est inutilisée,
                 - explicits :
                    Avertissement si un paramètre explicite est inutilisé,
                 - implicits :
                    Avertissement 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, uniquement pour les imports des noms explicites.
                    REMARQUE : Cela remplace -unused:imports et n'est PAS défini par 
                 -unused:all,
                 - unsafe-warn-patvars :
                    (DANGEREUX) Avertissement si une variable liée dans un motif est inutilisée.
                    Cet avertissement peut générer des faux positifs, car il ne peut pas être
                    supprimé pour l'instant.

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