Correcciones rápidas para problemas de análisis

Resolver diagnósticos con un solo clic

Si eres como yo, pasas demasiado tiempo de desarrollo corrigiendo problemas (diagnósticos) que encuentra el analyzer. Si alguna vez has deseado que pudiera ser más fácil, entonces tengo buenas noticias para ti. Muchos de los diagnósticos que produce el analyzer se pueden corregir automáticamente usando correcciones rápidas.

Una corrección rápida es una edición automatizada orientada a corregir el problema reportado por un diagnóstico específico. En el artículo Mensajes de diagnóstico de Dart vimos el siguiente código:

Fragmento de código mostrando un error con sugerencias de corrección rápida.

El mensaje de corrección sugiere dos formas de resolver el problema: “Intenta hacer el acceso condicional (usando ‘?.’) o añadir una verificación de null al objetivo (‘!’).”

Si haces clic en la región resaltada (el área con el subrayado rojo ondulado), verás un icono de bombilla cerca del borde izquierdo del editor. Si pasas el cursor por encima, puedes hacer clic para abrir un menú que contiene las correcciones rápidas disponibles.

Ambas correcciones sugeridas están disponibles en el menú. Al seleccionar una se aplica el cambio a tu código. Por ejemplo, si seleccionas la primera corrección, se actualiza el código de la siguiente manera:

Código Dart después de aplicar una corrección rápida, reemplazando values.length con values?.length dentro de una verificación de null.

Primero echemos un vistazo rápido a cómo aplicar una corrección tanto en IntelliJ IDEA como en Visual Studio Code, y luego veamos un ejemplo más potente de lo que pueden hacer las correcciones rápidas.

IntelliJ IDEA

#

El menú de acciones de contexto en el editor se ve así:

Menú de acciones de contexto en IntelliJ IDEA ofreciendo reemplazar '.' con '?.' o añadir una verificación de null para values.length.

Puedes acceder a la misma lista seleccionando “Show Context Actions” en el menú contextual del editor o usando su equivalente de teclado (Alt+Enter en Windows y Linux, o Option+Enter en macOS).

También puedes invocar estas correcciones directamente desde el texto flotante cuando pasas el cursor sobre la región resaltada. Si hay demasiadas correcciones, hay un elemento More Actions que también abre el menú:

Texto flotante en IntelliJ IDEA explicando que values.length no puede ser accedido incondicionalmente y ofreciendo la corrección rápida ?..

Si eso no es suficiente, también puedes invocar las correcciones disponibles desde el menú contextual en la vista de Dart Analysis:

Menú contextual de Dart Analysis en IntelliJ IDEA ofreciendo correcciones rápidas para el diagnóstico de values.length nullable.

Visual Studio Code

#

El menú de acciones de código en el editor se ve así:

Menú de acciones de Visual Studio Code ofreciendo reemplazar '.' con '?.' o añadir una verificación de null para values.length.

Los dos primeros elementos son correcciones rápidas, los demás son refactorizaciones. Puedes acceder a la misma lista usando su equivalente de teclado (Control+. en Windows y Linux, o Command+. en MacOS), o seleccionando Quick Fix … desde el texto flotante en el editor:

Un IDE mostrando el panel de Problems en Visual Studio Code con un menú de corrección rápida abierto ofreciendo reemplazar '.' con '?.'.

También puedes invocarlas desde el menú contextual en el panel de Problems:

El menú contextual de Visual Studio Code para una entrada de problema mostrando las opciones 'Quick Fix' y 'Copy'.

Otro ejemplo

#

Aunque la corrección anterior te ahorra el tiempo y el esfuerzo de buscar el mensaje de corrección y luego hacer la edición a mano, añadir un solo carácter no es exactamente un gran ahorro de tiempo. Sin embargo, algunas correcciones proporcionan un mayor aumento de productividad. Considera el siguiente código:

Un IDE mostrando el código 'await file.readAsString();' con una línea roja ondulada debajo de 'await' y un error sobre usar await en una función no async.

El diagnóstico te dice que “la expresión await solo se puede usar en una función async.” Asumiendo que no quieres usar E/O síncrona, la corrección es marcar el cuerpo de la función con la palabra clave async. Hacer eso provoca otro error que te indica que el tipo de retorno del método debe ser Future, así que también tendrás que actualizar el tipo de retorno.

Afortunadamente, hay una corrección rápida para el problema original:

Un IDE mostrando el menú de corrección rápida con 'Add async modifier' resaltado para corregir el error de 'await'.

Al seleccionar esta corrección no solo se añade el modificador, sino que también se actualiza el tipo de retorno, permitiéndote corregir el problema en un solo paso:

Un IDE mostrando el código después de la corrección rápida, ahora con la palabra clave 'async' y el tipo de retorno actualizado a un Future de String.

Resumen

#

No todos los problemas se pueden corregir automáticamente, y no hay una corrección rápida para cada problema que podría tenerla. Sin embargo, definitivamente vale la pena comprobar si hay una corrección rápida disponible la próxima vez que tengas un diagnóstico que corregir. Y si no ves una corrección para un diagnóstico que debería tenerla, por favor avísanos creando un issue en dart-lang/sdk.

Más de Dart