Novedades en ReSharper 2020.3

ReSharper 2020.3 es compatible con las funcionalidades de C# 9, una nueva visión de los consejos de inserción, la compatibilidad de Avalonia, el Dynamic Program Analysis integrado y una serie de actualizaciones menores que mejorarán el desarrollo diario.

Descargar

Prueba gratuita de 30 días disponible

Compatibilidad con C#

Es posible que Source Generators sea la funcionalidad de la que más se habla en el compilador de C#. Es comprensible: la capacidad de crear nuevo código en el mismo proceso de compilación y usarlo de inmediato es emocionante y puede ser útil en muchas situaciones distintas.

¿Qué puede hacer ReSharper aquí? Pues bien, puede hacer lo que mejor se le da y tener en cuenta los archivos generados al refactorizar, ofrecer funcionalidades de edición de código y ayuda para navegar hasta el código generado.

Ahora, los métodos parciales pueden tener parámetros out, tipos de retorno distintos de void y todo tipo de accesibilidad, lo que los vuelve más útiles con Source Generators. Source Generators puede utilizar la declaración de definición del método parcial para personalizar el comportamiento del código generado.

Otra buena adición son las propiedades init-only. Solo es posible cambiar dichas propiedades durante la inicialización de un objeto. Así, podrá utilizar inicializadores de objeto sin riesgo de que cambien las propiedades.

ReSharper es consciente de la existencia de propiedades init-only y las tiene en cuenta al finalizar el código, y lleva a cabo una finalización generativa, analiza si la propiedad ha cambiado en algún punto y ofrece un arreglo rápido para cambiarla si lo prefiere.

El mejor sitio para aplicar la propiedad init son los nuevos tipos record. Estos tipos de referencias tienen una semántica de valores con la que puede conseguir que el objeto no cambie, pero, en este caso, se aplica al objeto en su totalidad. De nuevo, ReSharper sigue realizando actualizaciones en el lenguaje, que van desde arreglos rápidos para elegir el estilo de declaración que prefiera a finalizaciones básicas.

Los registros posicionales tienen un método Deconstruct() generado por el compilador. ReSharper es compatible con todas las funcionalidades de deconstrucción de dichos objetos. Fíjese en la ventana emergente al introducir una variable: le da a elegir entre una variable o una declaración de deconstrucción. Ocurre lo mismo cuando una función accede a una propiedad de un objeto registrado.

Además de los aspectos importantes, ahora las funciones locales pueden tener atributos (así como parámetros y parámetros de tipo). Esto es compatible con los arreglos rápidos de ReSharper, incluida la práctica funcionalidad de anotar el método como [NotNull] o [CanBeNull] pulsando ! o ?, respectivamente.

Otra adición útil de C# 9 es la capacidad de escribir programas de primer nivel. Deje de pelearse con las clases del programa: ¡puede colocar el código de punto de entrada justo después de las directivas using! También tiene a su disposición una ayuda para trabajar con instrucciones de primer nivel. Hay dos reglas para las instrucciones de nivel superior: deberían ir antes de cualquier tipo o espacio de nombres, y solo puede haber código de nivel superior en un único archivo del proyecto. Es fácil incumplir ambas reglas al reorganizar y copiar y pegar código. Para solucionar esto, ReSharper cuenta con arreglos rápidos que trasladan el código de nivel superior a la parte superior o a otro archivo.

Dado que el código de nivel superior sigue siendo código, también tiene refactorizaciones: Extract local variable y Extract method.

Con las nuevas expresiones basadas en el tipo de destino en C# 9, podemos omitir el tipo después de la nueva palabra clave si este se sobreentiende gracias al contexto de uso. ReSharper es totalmente compatible con la funcionalidad, incluida la capacidad de buscar usos del constructor y configurar el estilo de sintaxis preferido. Esta última le permite utilizar la sintaxis new() cuando un tipo creado es evidente, mientras que en otros casos se aplica una especificación de tipo explícita.

Por cierto, si pierde la pista de los elementos new() del código, puede que los consejos para nombres de tipo de ReSharper le sean de utilidad.

Gracias a la covarianza del tipo de retorno, ya no tiene que devolver el mismo tipo en los miembros que se van a reemplazar que en el método de clase base. Ya no necesita soluciones alternativas para devolver un tipo más específico.

La concordancia de patrones sigue en desarrollo en la nueva versión del lenguaje. Ahora, las expresiones de coincidencia permiten utilizar patrones relacionales (<, >, etc.) y lógicos (not, or, and), con lo que se reduce mucho el nivel de detalle de las antiguas construcciones switch. ReSharper puede serle útil para analizar los patrones y volver a escribirlos con el estilo deseado.

Por último, al introducir parámetros lambda desechables, pensamos que sería buena idea añadir un arreglo rápido para esta característica.

Esta es la información más importante sobre el lenguaje. Hay otras mejoras menores del lenguaje que también son compatibles con ReSharper 2020.3. Como expresiones condicionales basadas en el tipo de destino, lambdas estáticas, métodos de extensión GetEnumerator en foreach, tipos de puntero de función y tipos de enteros nativos.

Consejos de inserción

Creemos en el poder de los consejos de inserción, pero también sabemos que el entorno tiene que estar lo más limpio y despejado posible. Hemos hallado un nuevo mecanismo de "Push-to-Hint" para los consejos de inserción que mantiene lo mejor de ambos mundos.

En el modo de visibilidad de Push-to-Hint, los consejos no se muestran de forma predeterminada. Se muestran si mantiene presionada la tecla Ctrl (y desaparecen en cuanto la suelta) o si pulsa Ctrl dos veces (y desaparecen en cuanto pulsa Ctrl dos veces de nuevo).

Hay bastantes ajustes detallados: le puede decir a ReSharper qué consejos deberían estar siempre habilitados, cuáles deberían mostrarse como elementos emergentes y cuáles no le interesan. Utilice la opción Visibility para cada tipo de consejo.

También hemos estado trabajando con los consejos para las conversiones de tipo implícitas. Dichas conversiones pueden suponer una pérdida de datos o una degradación del rendimiento, y ahora ReSharper puede indicarle dónde está teniendo lugar una conversión implícita.

Si pulsa Ctrl y hace clic en un consejo de conversión de tipo, se le dirigirá a la implementación de la conversión implícita.

Los consejos de inserción para XAML, que ya están disponibles en la versión anterior, ahora también cuentan con el menú contextual habitual que le permite configurar su aspecto.

Formateador

Seguimos añadiendo ajustes concretos al motor de formateo. Estos son los que hemos añadido en esta versión.

Una serie de ajustes para ordenar patrones de propiedad: puede decirle a ReSharper que coloque un patrón simple en una única línea y cómo prefiere que se ajusten los patrones largos. También hay una opción que le permite ordenar los patrones de propiedad por columnas.

Ahora, es posible añadir líneas en blanco alrededor de métodos de acceso a propiedades o eventos.

Para Visual Basic, existe la opción de añadir un espacio después del operador unario +/-.

También se ha actualizado la compatibilidad de .editorconfig. Ahora, ReSharper es compatible con la lectura de propiedades Roslyn: file_header_templates, dotnet_sort_system_directives_first y dotnet_separate_import_directive_groups.

También hay un nuevo parámetro “Spaces around ‘=’” al exportar a .editorconfig. Se detecta de forma automática en los archivos existentes y se puede establecer de forma manual en los archivos nuevos. Está establecido en ‘true’ de forma predeterminada.

Dynamic Program Analysis

Hemos añadido el complemento Dynamic Program Analysis (DPA) a ReSharper para que pueda analizar y crear código mejor mediante la detección de clausuras y asignaciones a montones de objetos grandes y pequeños en la memoria.

Lo mejor es que no tiene que hacer nada que se salga de su rutina habitual de codificación, ejecución y depuración. El DPA sigue ejecutándose en segundo plano, está listo y prepara un informe tras cada lanzamiento del proyecto. Simplemente, busque el icono en la esquina inferior derecha.

Si quiere obtener más información sobre el DPA, consulte esta entrada del blog.

Eliminación estructural

Es posible que ya esté familiarizado con la navegación estructural: le permite seleccionar trozos de código en función de su estructura, una palabra clave, un bloque o un método, entre otras cosas.

Si usa las acciones Extend o Shrink Selection, será necesario dar un paso más para seleccionar una coma, un punto o un corchete, que son fáciles de obviar. Eliminar un bloque supondría un error de código. En este caso, ReSharper hará un poco de limpieza: si hay algo seleccionado de forma estructural, ReSharper tratará de borrarlo de forma estructural al pulsar Retroceso o Suprimir.

Herramientas de línea de comando

Si trabaja con una base de código grande, todas las operaciones de solución completa tardan mucho en ejecutarse. ¿Alguna vez ha tenido que esperar a que toda la solución se reformatee después de cambiar un par de archivos? Bueno, ahora puede ejecutar la herramienta de consola CleanupCode sin apuntar al archivo de la solución: solo tiene que especificar un conjunto de archivos o carpetas. La línea de comandos tendrá este aspecto: cleanupcode.exe [ruta de la carpeta] [ruta del archivo] [ruta de otro archivo]

Tenga en cuenta que, en este modo, la herramienta solo formatea el código y la limpieza no está disponible.

Durante un tiempo, nuestras herramientas de consola no eran compatibles con algunos complementos. ¡Ya lo son! Por ahora, solo están disponibles para Windows. Para utilizarlos, tiene que conocer el ID del complemento. Vaya al Marketplace de JetBrains, abra la página de complementos, vaya a la pestaña Versions, haga clic en una de las versiones y se le mostrará el ID del complemento. Después, utilice la clave -x=[ID] con el ID del complemento al lanzar InspectCode o CleanupCode, y la herramienta de consola descargará y habilitará de forma automática el complemento: cleanupcode.exe -x=[ID] [ruta del archivo de solución].

Tenga en cuenta que el complemento tiene que ser compatible con la versión de la herramienta. Also, plugins are not yet supported if you’re using the .NET Core global tools mechanism to install ReSharper’s command line tools.

Navegación

¿Alguna vez ha tenido dificultades para buscar texto? ¿Quizás con cadenas del código o un comentario? ¿O un error tipográfico en el texto le impidió encontrar algo?

Además de búsquedas exactas, ahora Find Text también realiza búsquedas parciales, con lo que se tendrán en cuenta posibles errores tipográficos y palabras que falten. Los resultados se muestran bajo los resultados de la búsqueda normal de subcadenas, en la sección Fuzzy. Consejo: esta función puede ser muy útil al buscar una cadena compilada y formateada concreta.

Compatibilidad con Avalonia

Análisis de código

Como ocurre con todos los marcos de trabajo del tipo WPF, el análisis del código proporciona muchas inspecciones de código con los correspondientes arreglos rápidos tanto para los archivos de código detrás del modelo C# como para .axaml, incluidos “Possible ‘System.NullReferenceException’” y “Class/Property {...} is obsolete: Use {...}”.

Además de las inspecciones WPF habituales, hay muchas inspecciones específicas de Avalonia, como “Path to resource is case-sensitive” o “ColumnDefinitions tag can be converted to attribute” con arreglos rápidos. Por último, hay una acción contextual en el atributo ColumnDefinitions="*,Auto,*" para convertirlo de nuevo en una etiqueta <Grid.ColumnDefinitions>.

Ahora, $self, $parent, ^ y la sintaxis # son totalmente compatibles en las vinculaciones de Avalonia, y los índices en el vector $parent[] están validados de forma correcta.

Ahora, CompiledBinding y la extensión x:CompileBindings son más compatibles. ReSharper sabe que DataType es necesario y le solicita que especifique las vinculaciones en su código.

El arreglo rápido “Create from usage” está disponible para todo tipo de propiedades de Avalonia.

La compatibilidad con Avalonia XAML incluye el reconocimiento del sistema de estilos del tipo CSS.

Los consejos de inserciones le ayudan a entender mejor el código que tiene delante.

Finalización de código

La finalización de código y la información de los parámetros están disponibles para todas las palabras clave XAML, todo tipo de extensiones de marcado, x:Name, propiedades Style y propiedades Source para StyleInclude, entre otras cosas.

Navegación

Puede navegar fácilmente hasta los tipos de datos para enlaces compilados, propiedades enlazadas, tipos de control de Avalonia y declaraciones x:Name. ReSharper también puede ir directamente del código XAML al código externo descompilado (incluidas las propiedades de establecimiento de estilo) y a espacios de nombres xmlns referenciados.

Find Usages

Con Find Usages, puede encontrar todos los usos de enlaces de métodos, atributos x:Name, clases Style y setters, así como todo tipo de propiedades.

Refactorización

Ahora, las refactorizaciones Rename y Safe Delete reconocen todos los usos en el código XAML de Avalonia y los actualizan según corresponda.

Jerarquía y estructura del código

Puede ver la jerarquía y la estructura del código XAML de Avalonia.

Actualizaciones del descompilador

El descompilador integrado de ReSharper también se ha actualizado para que sea compatible con más funcionalidades de C#. También hemos mejorado el mecanismo de sincronización entre IL Viewer y el código fuente.

En concreto para instrucciones de primer nivel, hemos añadido un nodo <Top-level Entry Point> en Assembly Explorer. Desde este nodo, puede hacer doble clic o utilizar el menú contextual para llegar hasta las instrucciones de primer nivel en el código descompilado.

Ahora es compatible con Private Source Link. Tras navegar hasta las fuentes externas que requieran una conexión hasta un servidor de fuente privada, ReSharper le mostrará una notificación y le permitirá introducir sus credenciales, a menos que ya lo haya hecho en la configuración de Visual Studio, en cuyo caso se aplicarán de forma automática (para GitHub y BitBucke).

Blazor

Seguimos mejorando la compatibilidad con Blazor. En esta iteración destacan la compatibilidad con genéricos parámetros de tipo y sus inferencias de tipo a partir de los usos, así como la eliminación de problemas de rendimiento al abrir soluciones. La lista completa de incidencias corregidas se puede consultar en nuestro sistema público de seguimiento de errores.

Unreal Engine, el compañero perfecto

Unreal Engine

ReSharper C++ 2020.3 se integra a la perfección con UnrealHeaderTool para detectar incidencias que suelen aparecer durante la compilación. ReSharper C++ ejecuta UnrealHeaderTool en segundo plano y muestra los resultados del análisis en tiempo real en el propio editor.

Para mejorar la compatibilidad con HLSL, ReSharper C++ traslada las inspecciones de análisis de flujo de control a los archivos shader. Al realizar un seguimiento en tiempo real de los cambios para crear archivos de compilación, permita que ReSharper utilice siempre el modelo de proyecto más actualizado.

Más información

Mejor compatibilidad incluso con C++20

C++20

ReSharper C++ 2020.3 implementa los cambios de C++20 en las reglas de comparación. Con extensas inspecciones y mensajes de error, puede confiar en ReSharper C++ cuando necesite entender exactamente cómo se comporta el código. Los nuevos arreglos rápidos facilitan el trabajo con los operadores de comparación.

Además, ReSharper C++ 2020.3 incluye nuevas inspecciones para que pueda adoptar fácilmente la biblioteca de las gamas de C++20 y es compatible con el modo estándar de las corrutinas de C++20 introducidas en Visual Studio 16.8.

Más información

Inspecciones de la línea de tiempo de dotUltimate

Inspecciones de la línea de tiempo

dotMemory utiliza los datos de la línea de tiempo para proporcionar inspecciones automáticas en el gráfico de esta.

Actualmente, hay disponibles tres inspecciones:

  • Presión de la gran recogida de elementos no utilizados
  • Objetos anclados en Gen0
  • Tasa de crecimiento del montón de objetos rápidos y de gran tamaño

Más información

Mejoras en las pruebas continuas de dotUltimate

Pruebas continuas mejoradas

Ahora, puede definir qué proyectos deberían compilarse al lanzar una sesión de pruebas continua. Esto le permite acelerar las sesiones de pruebas continuas. Esta funcionalidad es compatible tanto con Visual Studio como con Rider.

Más información

Otras actualizaciones

  • Compatibilidad con anotaciones que admiten valores nulos en tipos genéricos no restringidos (incluye restricción predeterminada).
  • Hemos actualizado ligeramente la compatibilidad con TypeScript: ahora ReSharper es compatible con la fusión nula y el encadenamiento opcional.
  • Hemos agregado un nuevo arreglo rápido para que pueda transformar fácilmente una comprobación de patrones secuenciales en una comprobación compleja de concordancia de patrones.
  • Como parte de la refactorización "Change Signature", hemos rediseñado la herramienta que establece el valor predeterminado para el parámetro que está añadiendo, la herramienta que se abre cuando selecciona "Resolve with call tree". Ahora puede navegar hasta el código haciendo doble clic en un nodo. Hay una nueva opción, llamada "Create default parameter", que lo lleva directamente al código para especificar el valor. Finalmente, se aplican varios colores a los distintos arreglos seleccionados en el árbol. ¡Esperamos que todo esto facilite el uso!
Descargar

Prueba gratuita de 30 días disponible