IDE Tips
Workaround e best practice per lavorare con Source Generators nel monorepo.
Source Generator — IntelliSense Lag
Section titled “Source Generator — IntelliSense Lag”Il SG genera codice a compile-time. L’IDE potrebbe non aggiornare IntelliSense immediatamente dopo una modifica agli attributi.
Workaround
Section titled “Workaround”| IDE | Fix |
|---|---|
| Visual Studio | Build → Rebuild Solution oppure Ctrl+Shift+B |
| Rider | File → Invalidate Caches → Just Restart oppure Build → Rebuild Solution |
| VS Code + C# Dev Kit | Ctrl+Shift+P → OmniSharp: Restart OmniSharp |
| CLI | dotnet build nella directory del progetto |
Se il codice generato non appare
Section titled “Se il codice generato non appare”-
Verifica che il SG sia referenziato nel
.csproj:<ProjectReference Include="...\Pragmatic.SourceGenerator.csproj"OutputItemType="Analyzer"ReferenceOutputAssembly="false" /> -
Controlla l’attributo trigger — il SG genera codice solo quando trova attributi specifici (
[Entity],[DomainAction],[MessageHandler], etc.) -
Verifica che la classe sia
partial— quasi tutti i SG richiedono classi partial -
Controlla il build output:
Terminal window dotnet build -v detailed 2>&1 | grep "Pragmatic.SourceGenerator" -
Ispeziona i file generati:
obj/Debug/net10.0/generated/Pragmatic.SourceGenerator/
Aprire il Progetto
Section titled “Aprire il Progetto”| Scenario | Soluzione da aprire |
|---|---|
| Full framework | Pragmatic.Design.slnx (root) |
| Singolo modulo | Pragmatic.{Module}/Pragmatic.{Module}.slnx |
| Showcase app | examples/showcase/Showcase.slnx |
| Solo SG | Pragmatic.SourceGenerator/Pragmatic.SourceGenerator.slnx |
Tip: aprire la solution root può essere lento (30+ progetti). Per sviluppo quotidiano su un modulo, usa la solution dedicata.
Debug Source Generator
Section titled “Debug Source Generator”Visual Studio
Section titled “Visual Studio”- Apri
Pragmatic.SourceGenerator.csproj - Aggiungi
Debugger.Launch()nel metodoInitialize()diPragmaticSourceGenerator - Build il progetto consumer → debugger si attacca
- Apri la solution del modulo consumer
Run → Attach to Process→ cercadotnetcon argomentobuild- Metti breakpoint nel SG → rebuild
CLI (diagnostics only)
Section titled “CLI (diagnostics only)”# Mostra tutti i diagnostics PRAG generatidotnet build 2>&1 | grep "PRAG"
# Mostra file generatils obj/Debug/net10.0/generated/Pragmatic.SourceGenerator/Performance Tips
Section titled “Performance Tips”Build incrementale
Section titled “Build incrementale”Il SG usa IIncrementalGenerator — solo i file modificati vengono rigenerati. Ma se cambi un attributo shared, tutto viene rigenerato.
# Build solo il modulo corrente (veloce)dotnet build Pragmatic.Actions/src/Pragmatic.Actions/
# Build incrementale dalla root (più lento, ma rileva cross-module)dotnet build Pragmatic.Design.slnxParallel test
Section titled “Parallel test”# Test di un singolo modulo (veloce)dotnet test Pragmatic.Actions/tests/ --no-build
# Test con filtro (più veloce)dotnet test --filter "FullyQualifiedName~MyTest" --no-build
# Test paralleli per modulodotnet test Pragmatic.Design.slnx --no-build -m:4.editorconfig — Naming Rules
Section titled “.editorconfig — Naming Rules”Il progetto usa .editorconfig con regole strict:
| Tipo | Convenzione | Esempio |
|---|---|---|
| Public member | PascalCase | GetAsync() |
| Private field | _camelCase | _repository |
| Parameter | camelCase | cancellationToken |
| Constant | PascalCase | DefaultTimeout |
Tip: se l’IDE mostra warning di naming, verifica che .editorconfig sia rilevato. In VS Code, potrebbe servire l’estensione EditorConfig.
Hot Reload
Section titled “Hot Reload”Hot reload non funziona con Source Generators — le modifiche agli attributi o ai model richiedono un rebuild. Questo è una limitazione di Roslyn, non del framework.
Workaround: per iterazione rapida sul codice runtime (non SG), hot reload funziona normalmente su dotnet watch.
# Per la Showcase appdotnet watch run --project examples/showcase/src/Showcase.Host/Troubleshooting Comune
Section titled “Troubleshooting Comune”| Problema | Causa | Fix |
|---|---|---|
error CS0246: type 'X' not found | SG non ha generato il codice | Rebuild, verifica attributo + partial |
warning PRAG0400 | Classe non partial | Aggiungi partial keyword |
| IntelliSense rosso ma build OK | IDE cache stale | Restart IDE / OmniSharp |
Test snapshot .received.txt diverso | Codice generato cambiato | Copia .received.txt → .verified.txt se corretto |
| Build lenta (>30s) | Full solution rebuild | Usa solution per modulo, non root |
The type 'X' exists in both assemblies | Conflitto Abstractions | Verifica che un solo package fornisca il tipo |