Extensão de VSCode que aponta violações de Clean Code, SOLID e Object Calisthenics diretamente no editor — explicando o princípio violado, não só marcando um erro genérico.
Como rodar localmente
npm install
npm run compile
Depois, abra esta pasta no VSCode e aperte F5 (ou rode a task "Executar Extensão"). Isso abre uma nova janela do VSCode com a extensão carregada — a chamada "Extension Development Host".
Nessa nova janela, abra examples/sample-violations.ts. Você deve ver
sublinhados (diagnostics) nas linhas com violações, com a explicação
do princípio no hover.
Comandos disponíveis
Code Wizard: Analisar arquivo atual— força a análise e mostra quantas violações foram encontradas.Code Wizard: Explicar princípio— abre uma lista de todos os princípios cobertos, com explicação detalhada e exemplo.
Configurações (settings.json)
| Chave | Padrão | Descrição |
|---|---|---|
codeWizard.maxFunctionLines |
20 | Limite de linhas por função |
codeWizard.maxParameters |
3 | Limite de parâmetros por função |
codeWizard.disallowElse |
true | Avisa sempre que houver else |
codeWizard.maxNestingDepth |
2 | Profundidade máxima de if/for/while aninhados |
Regras já implementadas
| Regra | Princípio | Arquivo |
|---|---|---|
no-else |
Object Calisthenics #2 | src/rules/noElse.ts |
long-function |
Clean Code — Funções pequenas | src/rules/longFunction.ts |
too-many-parameters |
Clean Code — Poucos parâmetros / Primitive Obsession | src/rules/tooManyParameters.ts |
nesting-depth |
Object Calisthenics #1 | src/rules/nestingDepth.ts |
Como adicionar uma nova regra
- Crie um arquivo em
src/rules/, seguindo a interfaceRuledefinida emsrc/types.ts. Cada regra recebe o AST (ts.SourceFile) já parseado e a configuração do usuário, e retorna uma lista deRuleViolation. - Registre a regra no array
allRulesemsrc/rules/index.ts. - (Opcional) Adicione uma configuração nova em
package.json→contributes.configuration.propertiesse a regra precisar de algum limite configurável.
Ideias de próximas regras (SOLID)
- SRP: heurística simples — contar quantas "responsabilidades" aparentes uma classe tem, olhando para imports de camadas diferentes (ex: import de driver de banco + import de biblioteca HTTP no mesmo arquivo).
- OCP: detectar
switch/if-elseencadeado sobre um campo tipotipo/type, que normalmente indica que um polimorfismo está faltando. - LSP: detectar métodos de subclasse que lançam
throw new Error(...)logo no início, sobrescrevendo um método da classe base (sinal clássico de contrato quebrado). - DIP: detectar
new AlgumaClasse()dentro do corpo de outra classe/função em vez de vir via parâmetro/injeção.
A arquitetura já foi pensada pra isso: basta plugar mais um Rule na
lista, sem mexer no motor (extension.ts e rules/index.ts) ficam
praticamente intactos.
Empacotar (.vsix) para instalar localmente
npm install -g @vscode/vsce
vsce package
Isso gera um arquivo .vsix que você instala via
"Extensions: Install from VSIX..." dentro do próprio VSCode.