Novidades no ReSharper 2020.3

O ReSharper 2020.3 oferece compatibilidade com os recursos do C# 9, um novo ângulo em dicas de inserção, suporte para Avalonia, o recurso Dynamic Program Analysis integrado e um conjunto de pequenas atualizações para ajudar você no seu desenvolvimento diário.

Baixar

Avaliação gratuita por 30 dias disponível

Suporte para C#

Geradores de código-fonte são quase certamente o recurso mais falado no compilador C#. É compreensível: a capacidade de criar um novo código diretamente no processo de compilação e usá-lo imediatamente é empolgante e pode ser útil em muitas situações diferentes.

O que o ReSharper pode fazer aqui? Bem, ele pode fazer o que faz de melhor e levar os arquivos gerados em consideração enquanto realiza refatorações, fornecer recursos de editor de código e ajudar você a navegar até o código gerado.

Métodos parciais agora podem ter parâmetros de saída, tipos de retorno não nulos e qualquer tipo de acessibilidade, tornando-os mais úteis com Geradores de Código-fonte. Os Geradores de código-fonte podem usar a declaração de definição do método parcial para personalizar o comportamento do código gerado.

Outra adição interessante são as propriedades init-only. Essas propriedades só podem ser definidas durante a inicialização de um objeto. Então, finalmente, você pode usar inicializadores de objeto sem expor a propriedade como mutável!

O ReSharper está ciente das propriedades init-only e as leva em consideração ao completar seu código, realizando a complementação generativa, analisando se a propriedade mudou em algum lugar e oferecendo uma solução rápida para torná-la mutável se você mudar de ideia.

Os lugares perfeitos para aplicar init são nos novos tipos record. Esses são tipos de referência com semântica de valor que ajudam você a alcançar a imutabilidade, mas, desta vez, para todo o objeto. Novamente, o ReSharper está acompanhando o ritmo da linguagem, desde correções rápidas para escolher seu estilo de declaração preferido até complementação básica.

Registros posicionais têm um método Deconstruct() gerado por compilador. O ReSharper oferece suporte a todos os recursos de desconstrução nesses objetos. Observe o pop-up ao introduzir uma variável: ele oferece a você a escolha entre uma única variável ou uma declaração de desconstrução. A mesma escolha será oferecida quando uma função acessar uma propriedade de um objeto de registro.

Seguindo em frente com as grandes coisas, funções locais agora podem ter atributos (bem como parâmetros e parâmetros de tipo em funções locais). Isso tem suporte pelas correções rápidas do ReSharper, incluindo o interessante recurso de anotar o método como [NotNull] ou [CanBeNull] pressionando ! ou ?, respectivamente.

Outra adição útil do C# 9 é a capacidade de escrever programas de nível superior. Chega de lutar com classes de Programa: você pode inserir seu código de ponto de entrada logo após as diretivas de uso! Também há ajuda disponível para trabalhar com instruções de nível superior. Existem duas regras sobre instruções de nível superior: elas devem preceder qualquer tipo ou namespace e apenas um arquivo no projeto pode conter código de nível superior. Ambas as regras são fáceis de quebrar quando você está reorganizando e copiando e colando o código. O ReSharper fornece soluções rápidas para remediar isso, movendo seu código de nível superior até o topo ou outro arquivo.

Como o código de nível superior também é código, há refatorações para ele também: refatorações para Extrair variável local e Extrair método.

Com novas expressões de tipo de destino em C# 9, podemos omitir o tipo após a nova palavra-chave quando ele pode ser inferido do contexto de uso. O ReSharper fornece suporte total para o recurso, incluindo a capacidade de encontrar usos do construtor e configurar o estilo de sintaxe preferencial. Esse último permite que você use a sintaxe new() quando um tipo criado é evidente, ao mesmo tempo em que impõe uma especificação de tipo explícita em outros casos.

A propósito, as novas dicas de nome de tipo do ReSharper podem ajudar se todos os new() no seu código ficarem fora de controle.

Com a covariância de tipo de retorno, você não é mais obrigado a retornar o mesmo tipo em membros substituintes como faria no método da classe base. Não há mais necessidade de implementar soluções alternativas para retornar um tipo mais específico.

A correspondência de padrões continua a evoluir na nova versão da linguagem. Expressões de correspondência agora permitem o uso de padrões relacionais (<, >, etc.) e lógicos (not, or, and), eliminando muito do detalhamento das antigas construções switch. O ReSharper pode ajudar você a analisar os padrões e reescrevê-los no estilo desejado.

Finalmente, quando os parâmetros de descarte Lambda foram introduzidos, achamos que seria bom adicionar uma correção rápida para eles.

Isso é tudo para os principais destaques da linguagem. Há melhorias menores adicionadas à linguagem que têm suporte no ReSharper 2020.3 também. Isso inclui expressões condicionais de tipo de destino, lambdas estáticos, métodos de extensão GetEnumerator em foreach, tipos de ponteiros de função e tipos de inteiros nativos.

Dicas de inserção

Acreditamos no poder das dicas de inserção, mas também sabemos que o ambiente deve ser mantido o mais limpo e organizado possível. Criamos um novo mecanismo "Push-to-Hint" para dicas de inserção, para manter o melhor dos dois mundos.

No modo de visibilidade Push-to-Hint, as dicas não são mostradas por padrão. Elas serão exibidas se você pressionar e segurar a tecla Ctrl (e ocultas assim que você a soltar) ou se pressionar Ctrl duas vezes (nesse caso, elas permanecem visíveis até que você pressione Ctrl duas vezes novamente).

Fornecemos configurações bastante granulares: você pode dizer ao ReSharper quais dicas devem estar sempre habilitadas, quais devem ser mostradas no pressionamento e quais realmente não são importantes para você. Use a configuração "Visibility" para cada tipo de dica.

Outra coisa em que trabalhamos são as dicas para conversão implícita de tipos. Essas conversões podem resultar em perda de dados ou degradação do desempenho, e o ReSharper agora pode indicar onde uma conversão implícita está acontecendo.

Quando você usar a combinação Ctrl+clique em uma dica de conversão de tipo, será levado à implementação da conversão implícita.

Dicas de inserção para XAML, que já estavam disponíveis na versão anterior, agora também têm o menu de contexto usual que permite configurar sua aparência.

Formatador

Continuamos adicionando configurações mais granulares ao mecanismo de formatação. Isto é o que adicionamos nesta versão.

Um grupo de configurações para organizar padrões de propriedade: você pode instruir o ReSharper a colocar um padrão simples em uma única linha e também sobre como prefere que padrões longos sejam quebrados. Também há uma configuração para alinhar padrões de propriedade em colunas.

Agora, linhas em branco podem ser adicionadas em torno dos acessadores de propriedades ou eventos.

Para o Visual Basic, existe a opção de adicionar um espaço após o operador +/- unário.

Existem algumas atualizações para o suporte a .editorconfig também. Agora, o ReSharper oferece suporte às propriedades Roslyn: file_header_templates, dotnet_sort_system_directives_first e dotnet_separate_import_directive_groups.

Também existe um novo parâmetro “Spaces around ‘=’” na exportação para .editorconfig. Ele é detectado automaticamente em arquivos existentes e pode ser definido manualmente para novos arquivos. Por padrão, esse parâmetro está definido como "true".

Dynamic Program Analysis

Adicionamos o recurso Dynamic Program Analysis (DPA) ao ReSharper para ajudar você a analisar e criar um código melhor, detectando fechamentos e alocações em heaps de objetos grandes e pequenos na memória.

A melhor parte é que você não precisa fazer nada, exceto sua rotina usual de codificação, execução e depuração. O DPA continua em segundo plano e ficará pronto com um relatório após cada lançamento do seu projeto. Basta ficar de olho no ícone no canto inferior direito.

Para obter mais detalhes sobre o DPA, consulte esta postagem de blog.

Remoção estrutural

Você já deve estar familiarizado com o recurso de navegação estrutural: ele permite selecionar partes do código de acordo com sua estrutura, uma palavra-chave, um bloco, um método e assim por diante.

Quando você está usando as ações Extend ou Shrink Selection, elas exigem outra etapa para selecionar uma vírgula, um ponto ou um colchete, o que é fácil deixar passar. Se você estivesse excluindo um bloco, isso resultaria em um erro de código. O ReSharper fará uma pequena limpeza nesse caso: se algo tiver sido selecionado estruturalmente, o ReSharper tentará excluí-lo estruturalmente quando você pressionar Backspace ou Delete.

Ferramentas de linha de comando

Se você estiver trabalhando em uma base de código grande, cada operação no âmbito da solução levará muito tempo para ser executada. Você já se viu esperando que toda a solução fosse reformatada depois de alterar alguns arquivos? Bem, agora você pode executar a ferramenta de console CleanupCode sem apontar para o arquivo da solução: basta especificar um conjunto de arquivos ou pastas. A linha de comando terá a seguinte aparência: cleanupcode.exe [Caminho para a pasta] [Caminho para o arquivo] [Caminho para outro arquivo]

Observe que a ferramenta apenas formata o código: a limpeza não está disponível nesse modo.

Mais uma coisa que estava faltando nas nossas ferramentas de console por um tempo era o suporte para plug-ins. Bem, ele está de volta! Por enquanto, está disponível apenas no Windows. Para utilizá-lo, você precisará saber o ID do plug-in. Acesse o JetBrains Marketplace, abra a página do plug-in, acesse a guia Versions, clique em qualquer versão e ela mostrará o ID do plug-in. Depois disso, use a chave -x=[ID] com o ID do plug-in ao iniciar InspectCode ou CleanupCode, e a ferramenta do console baixará e habilitará automaticamente o plug-in: cleanupcode.exe -x=[ID] [Caminho para o arquivo da solução].

Observe que o plug-in deve ser compatível com a versão da ferramenta. Also, plugins are not yet supported if you’re using the .NET Core global tools mechanism to install ReSharper’s command line tools.

Navegação

Você já teve dificuldade em procurar texto? Talvez uma string no seu código ou um comentário? Ou um erro de digitação no seu texto o impediu de realmente encontrar algo?

Agora, "Find Text" realiza uma pesquisa difusa além da pesquisa exata, levando em consideração possíveis erros de digitação e palavras ausentes. Os resultados são exibidos abaixo dos resultados da pesquisa de substring regular, na seção "Fuzzy". Dica: ele pode ser muito útil caso você esteja procurando uma determinada construção de string formatada no seu código.

Suporte para Avalonia

Análise de código

Como é típico para todas os frameworks do tipo WPF, a análise de código fornece muitas inspeções de código comuns com correções rápidas apropriadas para arquivos code-behind C# e arquivos .axaml, incluindo “Possible ‘System.NullReferenceException’” e “Class/Property {...} is obsolete: Use {...}”.

Além das inspeções WPF comuns, há muitas inspeções específicas do Avalonia, como “Path to resource is case-sensitive” ou “ColumnDefinitions tag can be converted to attribute” com soluções rápidas. Para a última, há uma ação de contexto no atributo ColumnDefinitions="*,Auto,*" para convertê-la novamente em uma tag <Grid.ColumnDefinitions>.

Adicionamos suporte adequado para as sintaxes “$self", “$parent”, “^” e “#” em associações do Avalonia, bem como a validação adequada de índices no array $parent[].

Há suporte estendido para CompiledBinding e a extensão x:CompileBindings. O ReSharper sabe que DataType é necessário aqui e solicita que você o especifique para associações no seu código.

A correção rápida “Create from usage” está disponível para todos os tipos de propriedades do Avalonia.

O suporte para XAML do Avalonia inclui a compreensão do sistema de estilo CSS.

Dicas de inserção ajudam a entender melhor o código que você está visualizando.

Complementação de código

A complementação de código e informações de parâmetros estão disponíveis para todas as palavras-chave XAML, todos os tipos de extensões de marcação, x:Name, propriedades Style, propriedades Source para StyleInclude e muito mais.

Navegação

Você pode navegar facilmente até o tipo de dados de associação compilado, propriedade vinculada, tipo de controle do Avalonia e declarações x:Name. O ReSharper também pode ir diretamente do XAML até o código externo descompilado que inclui propriedades setter de estilo e até namespaces xmlns referenciados.

Find Usages

"Find Usages" ajuda a encontrar todos os usos de associações de método, atributos x:Name, classes e setters Style e todos os tipos de propriedades.

Refatorações

As refatorações "Rename" e "Safe Delete" agora estão cientes de todos os tipos de usos no código XAML do Avalonia e os atualizam de acordo.

Hierarquia e estrutura de código

Você pode observar a hierarquia e a estrutura do código XAML do Avalonia.

Atualizações do descompilador

O descompilador integrado do ReSharper também recebeu atualizações para oferecer suporte a mais recursos do C#. Também melhoramos o mecanismo de sincronização entre o IL Viewer e o código-fonte.

Especificamente para instruções de nível superior, adicionamos um nó <Top-level Entry Point> no Assembly Explorer. Você pode clicar duas vezes ou usar a navegação do menu de contexto nesse nó para obter instruções de nível superior reais no código descompilado.

Agora, há suporte para Links de origem privada Depois de navegar até as fontes externas que exigem uma conexão com um servidor de fonte privado, o ReSharper mostrará uma notificação e permitirá que você insira suas credenciais, a menos, é claro, que você já as tenha especificado nas configurações do Visual Studio. Nesse caso, elas serão aplicadas automaticamente (para o GitHub e o BitBucket).

Blazor

Continuamos adicionando mais suporte ao Blazor. Essa iteração foi sobre o suporte de parâmetros de tipo genérico e sua inferência de tipo a partir de usos e a eliminação de contratempos de desempenho na abertura de soluções. Para obter a lista completa de issues corrigidos, consulte nosso rastreador de bugs público.

Unreal Engine: o companheiro perfeito

Unreal Engine

O ReSharper C++ 2020.3 fornece integração perfeita com UnrealHeaderTool para ajudar você a detectar problemas que geralmente são descobertos apenas em tempo de compilação. O ReSharper C++ executa o UnrealHeaderTool em segundo plano e exibe os resultados da análise em tempo real diretamente no editor.

Para melhorar seu suporte para HLSL, o ReSharper C++ traz inspeções de análise de fluxo de controle para arquivos shader. O rastreamento de alterações em tempo real para compilar arquivos de configuração permite que o ReSharper sempre use o modelo de projeto mais atualizado.

Saiba mais

Suporte para C++20 ainda melhor

C++20

O ReSharper C++ 2020.3 implementa as alterações do C++20 em regras de comparação. Com ricas inspeções e mensagens de erro, você pode contar com o ReSharper C++ quando precisar entender exatamente como seu código se comporta, enquanto as novas correções rápidas ajudam você a trabalhar facilmente com operadores de comparação.

Além disso, o ReSharper C++ 2020.3 traz novas inspeções para ajudar você a adotar a biblioteca de intervalos C++20 e adiciona suporte para o modo padrão de corrotinas C++20 introduzido no Visual Studio 16.8.

Saiba mais

Inspeções na linha do tempo dotUltimate

Inspeções na linha do tempo

O dotMemory usa os dados da linha do tempo para fornecer inspeções automáticas diretamente no gráfico de linha do tempo.

Atualmente, existem três inspeções disponíveis:

  • Alta pressão de coleta de lixo
  • Objetos afixados em Gen0
  • Rápida taxa de crescimento do heap de objetos grandes

Saiba mais

Testes contínuos aprimorados dotUltimate

Testes contínuos aprimorados

Agora, você pode refinar quais projetos devem ser construídos quando uma sessão de testes contínuos é acionada. Isso permite acelerar as sessões de testes contínuos. O recurso funciona no Visual Studio e no Rider.

Saiba mais

Outras atualizações

  • Suporte para anotações anuláveis em tipos genéricos irrestritos (inclui restrição padrão).
  • Implementamos uma atualização modesta para suporte a TypeScript. Agora, o ReSharper oferece suporte a coalescência nula e encadeamento opcional.
  • Adicionamos uma nova correção rápida que ajuda a transformar uma verificação de padrão sequencial em uma verificação de correspondência de padrão complexa.
  • Dentro da refatoração "Change Signature", redesenhamos a ferramenta usada para definir o valor padrão para o parâmetro que você está adicionando – a ferramenta que é aberta quando você escolhe "Resolve with call tree". A navegação até o código agora está disponível clicando duas vezes em um nó. Há uma nova opção chamada "Create default parameter" que leva você diretamente ao código para especificar o valor. Finalmente, diferentes cores são aplicadas para diferentes correções selecionadas na árvore. Esperamos que isso facilite a resolução de usos!
Baixar

Avaliação gratuita por 30 dias disponível