Domine o Roslyn: Crie Analyzers para Código de Qualidade

Introduzir regras de código personalizadas pode soar como algo complexo, mas, com os Roslyn Analyzers🧪 Roslyn Analyzers: Crie Regras de Qualidade para a Comunidade!🧪 Roslyn Analyzers: Crie Regras de Qualidade para a Comunidade!Descubra como criar Roslyn Analyzers para identificar erros, aplicar boas práticas e automatizar correções, elevando a qualidade dos projetos .NET., qualquer pessoa que tenha curiosidade e um pouco de vontade de experimentar pode criar suas próprias análises de código – seja para reforçar boas práticas, padronizar convenções de estilo ou até mesmo detectar problemas comuns antes de chegar na produção. A plataforma Roslyn oferece APIs que permitem inspecionar o código-fonte em tempo real, gerando avisos e erros de forma automática, como um “fiscal de código” que roda dentro do Visual Studio🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE. ou em pipelines de build.

Imagine querer forçar todos os métodos a começarem com letra maiúscula, ou evitar nomes de variáveis🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. em português misturado com inglês. Essas são apenas algumas ideias de regras que você pode criar! Vamos ver como isso funciona na prática.

Tabela de Conteúdo🔗

O que é Roslyn e por que criar Analisadores?🔗

O Roslyn é o nome dado ao “compilador como plataforma” do C#. Na prática, isso significa que o compilador C# foi aberto como um conjunto de APIs🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. que permitem:

Já imaginou ter um “robô” que lê o código e aponta se você nomeou algo fora do padrão ou se esqueceu de implementar uma interface obrigatória? É disso que tratam os Roslyn Analyzers🧪 Roslyn Analyzers: Crie Regras de Qualidade para a Comunidade!🧪 Roslyn Analyzers: Crie Regras de Qualidade para a Comunidade!Descubra como criar Roslyn Analyzers para identificar erros, aplicar boas práticas e automatizar correções, elevando a qualidade dos projetos .NET.. Eles:

1. Inspecionam o código AST (Árvore de Sintaxe Abstrata).

2. Aplicam regras personalizadas (por exemplo, “classes devem ter mais de 10 linhas de comentário”, “métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. não podem ter mais de 50 linhas de código”).

3. Emitem avisos ou erros no Visual Studio🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE. ou no build.

Tipos de Analisadores🔗

TipoExemploQuando Usar
Built-inCAxxxx (Microsoft Code Analysis)Padrões gerais de qualidade
NuGet PackagesStyleCop, SonarAnalyzer.CSharpConvenções específicas de equipe
CustomizadosRegras de negócio específicasValidação de domínio exclusivo

Exemplo NuGet📦 Crie um Pacote NuGet: Compartilhe seu Código!📦 Crie um Pacote NuGet: Compartilhe seu Código!Aprenda a empacotar, configurar e publicar pacotes NuGet em C# passo a passo, com dicas profissionais e práticas recomendadas para seu projeto.:

dotnet add package StyleCop.Analyzers --version 1.2.0-beta.435

Estrutura Básica de um Analyzer🔗

Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. falamos sobre um Analyzer, estamos lidando com alguns componentes essenciais:

A vantagem de separar o Analyzer do Code Fix é que você pode ter apenas a análise, caso não queira ou não saiba sugerir correção automática.

Criando um Projeto de Analyzer no Visual Studio🔗

O Visual Studio🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE. facilita bastante a criação de projetos de Analyzer. Você pode fazer isso em poucos cliques:

1. Vá em Criar Novo Projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. procure por Analyzer. Você encontrará um template como “Analyzer with Code Fix…”.

2. Selecione o template e defina o nome do projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes..

3. Após a criação, o projeto terá algumas classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. de exemplo, incluindo testes para você entender como escrever as regras.

Caso não encontre o template, certifique-se de ter instalado as extensões necessárias do .NET no Visual Studio🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!🛠️ Instalação do Visual Studio: Prepare sua Nave para Decolar!Prepare seu ambiente de desenvolvimento com o Visual Studio em uma aventura C#. Este tutorial prático ensina a instalar, configurar e personalizar sua IDE.. Você pode criar manualmente ou usar a linha de comando com ferramentas do .NET SDK, mas o template é o caminho mais simples.

Exemplo Prático: Validação de Nomes de Classe🔗

Vamos supor que a gente queira garantir que toda classe no nosso projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. C# tenha o sufixo “Manager” (é um exemplo meio radical, mas serve para ilustrar o poder dos Analyzers). Queremos que o compilador avise quando esse sufixo não estiver presente.

Este seria um cenário de Analyzer que:

A lógica fica toda dentro do método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. que visita as declarações de classe no seu Analyzer.

DiagnosticAnalyzer e DiagnosticDescriptor🔗

Dentro do seu projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. de Analyzer, você encontrará algo mais ou menos assim:

[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class ManagerSuffixAnalyzer : DiagnosticAnalyzer
{
    public const string DiagnosticId = "CSManagerSuffix";
    private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(
        DiagnosticId,
        "Classe sem sufixo 'Manager'",
        "A classe '{0}' não possui o sufixo 'Manager'.",
        "Naming",
        DiagnosticSeverity.Warning,
        isEnabledByDefault: true
    );
    public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
        => ImmutableArray.Create(Rule);
    public override void Initialize(AnalysisContext context)
    {
        // Chama o método de análise toda vez que encontrarem uma classe.
        context.RegisterSyntaxNodeAction(AnalyzeNode, SyntaxKind.ClassDeclaration);
    }
    private void AnalyzeNode(SyntaxNodeAnalysisContext context)
    {
        var classDeclaration = (ClassDeclarationSyntax)context.Node;
        var className = classDeclaration.Identifier.Text;
        if (!className.EndsWith("Manager"))
        {
            var diagnostic = Diagnostic.Create(Rule, classDeclaration.Identifier.GetLocation(), className);
            context.ReportDiagnostic(diagnostic);
        }
    }
}

Pontos principais:

Testando seu Analyzer🔗

Os projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! criados pelo template normalmente vêm com um projeto de teste. Você pode ver um file de teste com algo como AnalyzerVerifier. A ideia é executar testes unitários🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!Descubra como implementar testes de unidade focados em tratamento de erros, evitando surpresas em produção e garantindo sistemas confiáveis e robustos. que:

Isso ajuda muito a garantir que seu Analyzer funcione antes mesmo de você disponibilizá-lo ao time.

Exemplo (simplificado) de teste:

public class ManagerSuffixAnalyzerTests
{
    [Fact]
    public async Task ClasseSemSufixoManager_GeraDiagnostic()
    {
        var testCode = @"
            public class MinhaClasse {}
        ";
        var expected = new DiagnosticResult
        {
            Id = ManagerSuffixAnalyzer.DiagnosticId,
            Message = "A classe 'MinhaClasse' não possui o sufixo 'Manager'.",
            Severity = DiagnosticSeverity.Warning
        };
        await AnalyzerVerifier<ManagerSuffixAnalyzer>.VerifyAnalyzerAsync(testCode, expected);
    }
}

Casos de Uso Reais em Projetos Profissionais🔗

1. Validação de Segurança🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real.:

// Bloquear DateTime.Now em favor de DateTime.UtcNow
if (expression.ToString().Contains("DateTime.Now"))
    ReportDiagnostic("SEC001", "Use UTC para timestamps");

2. Padrões de Performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos!:

// Alertar sobre concatenação de strings em loops
if (IsStringConcatInLoop(context.Node))
    ReportDiagnostic("PERF001", "Use StringBuilder");

3. Regras de Domínio:

// Garantir que entidades tenham campo TenantId
if (IsEntityClass(symbol) && !HasTenantId(symbol))
    ReportDiagnostic("DOM001", "Entidades devem ter TenantId");

Integração com Pipelines CI/CD🔗

Adicione analisadores como .NET tool no pipeline📊 Pipelines: Pré-processe Dados como um Cientista!📊 Pipelines: Pré-processe Dados como um Cientista!Aprenda a criar pipelines eficientes com ML.NET, automatizando o pré-processamento de dados e garantindo modelos de Machine Learning precisos e reprodutíveis.:

  • task: DotNetCoreCLI@2
inputs: command: 'custom' custom: 'tool' arguments: 'run dotnet-analyze --project MyApp.sln'

Benefícios:

  • Bloqueia PRs com violações críticas
  • Mantém padrões em equipes distribuídas
  • Evolui regras gradualmente via severity: warning -> error

Dicas de Uso e Melhores Práticas🔗

1. Não exagere nos Analyzers: Evite criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. regras desnecessárias que gerem ruído. Foco na qualidade e pertinência.

2. Mantenha uma severidade adequada: Se for🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! algo crítico, use Error. Se for🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! apenas recomendação, use Warning ou Info.

3. Documente suas regras: Assim, sua equipe entende por que determinada regra existe.

4. Atualize o package regularmente: Se distribuir seu Analyzer como pacote NuGet📦 Crie um Pacote NuGet: Compartilhe seu Código!📦 Crie um Pacote NuGet: Compartilhe seu Código!Aprenda a empacotar, configurar e publicar pacotes NuGet em C# passo a passo, com dicas profissionais e práticas recomendadas para seu projeto., mantenha as versões em sincronia com as releases do .NET (principalmente quando há mudanças importantes no Roslyn).

Conclusão🔗

Roslyn Analyzers🧪 Roslyn Analyzers: Crie Regras de Qualidade para a Comunidade!🧪 Roslyn Analyzers: Crie Regras de Qualidade para a Comunidade!Descubra como criar Roslyn Analyzers para identificar erros, aplicar boas práticas e automatizar correções, elevando a qualidade dos projetos .NET. são uma ferramenta poderosíssima para criar um “guia” de boas práticas dentro de um projeto ou de uma organização. Com eles, você consegue subir o nível de padronização e qualidade, fazendo com que o próprio compilador dispare alertas e sugestões de correção onde você julgar necessário. A curva de aprendizado é bem menor do que parece, e ver seu time se beneficiando de validações automáticas em tempo real compensa o esforço de implementação.

Seja para projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! pequenos ou grandes, vale a pena experimentar a escrita de pelo menos um Analyzer simples para entender como tudo funciona. Você pode se surpreender com o quanto é possível personalizar o compilador de C# a seu favor!

Próximo Passo: Explore a Microsoft.CodeAnalysis no GitHub e crie seu primeiro Code Fix que transforma variáveis🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. para PascalCase automaticamente!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados