Descubra Como Criar Roslyn Analyzers e Melhorar Seu Código
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!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!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!)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
📡 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. Analyzers?
- Tipos de Analisadores: Built-in, NuGet
📦 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. e Customizados
- Estrutura Básica de um Analyzer
- Criando um Projeto de Analyzer no Visual Studio
🛠️ 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.
- Exemplo Prático
📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável.: Validação de Nomes de Classe
- DiagnosticAnalyzer e
📊 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. DiagnosticDescriptor
- Testando seu Analyzer
- Casos de Uso
🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!Descubra como a criptografia assimétrica protege a troca de chaves e garante segurança em sistemas digitais usando RSA, C# e práticas recomendadas. Reais em Projetos Profissionais
- Integração com Pipelines
📊 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. CI/CD
- Dicas de Uso e Melhores Práticas
📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável.
- Conclusão
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!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:
- Ler e
📊 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. modificar o código-fonte.
- Criar
📡 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. ferramentas que analisam o código em tempo real.
- Implementar code fixes que sugerem correções de forma automática.
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!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!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!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🔗
Tipo | Exemplo | Quando Usar |
---|---|---|
Built-in | CAxxxx (Microsoft Code Analysis) | Padrões gerais de qualidade |
NuGet Packages | StyleCop, SonarAnalyzer.CSharp | Convenções específicas de equipe |
Customizados | Regras de negócio específicas | Validação de domínio exclusivo |
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!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:
- DiagnosticAnalyzer: Classe
🏗️ 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. onde você implementa a regra de análise.
- DiagnosticDescriptor: Descreve as características de uma regra, por exemplo, a mensagem a ser exibida, o nível de severidade (aviso, erro
🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. etc.) e um identificador único.
- CodeFixProvider (opcional): Permite oferecer uma correção automática quando
📊 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. um Analyzer detecta um problema
🤝 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..
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!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!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!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!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)!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!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!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:
- Verifica cada declaração
🧠 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. de classe.
- Se não tiver “Manager” ao final do nome, emite um alerta ou erro
🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades..
A lógica fica toda dentro do método🧠 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!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:
- DiagnosticId: deve ser único e
📊 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. identificável, pois é como seu Analyzer será reconhecido.
- DiagnosticDescriptor: descreve a regra de análise, incluindo título
🌐 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!, mensagem, severidade e categoria.
- RegisterSyntaxNodeAction: registra um método que será chamado quando um tipo específico de nó de sintaxe for encontrado (no caso, uma declaração
🧠 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. de classe).
Testando seu Analyzer🔗
Os projetos🌐 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!Descubra como implementar testes de unidade focados em tratamento de erros, evitando surpresas em produção e garantindo sistemas confiáveis e robustos. que:
- Criam um trecho de código de exemplo
🚀 Scale Out com Redis: Atenda Milhões de Conexões!Integre o Redis com SignalR no .NET e distribua mensagens entre servidores, alcançando escalabilidade e alta performance em tempo real. como string.
- Roda seu Analyzer para
🔄 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! ver se o Diagnostic esperado foi emitido.
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🔗
// Bloquear DateTime.Now em favor de DateTime.UtcNow
if (expression.ToString().Contains("DateTime.Now"))
ReportDiagnostic("SEC001", "Use UTC para timestamps");
// 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!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!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!)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!)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!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!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!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!)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🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- DevBlogs da Microsoft: devblogs.microsoft.com/dotnet/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/