Skip to content

IDE Tips

Workaround e best practice per lavorare con Source Generators nel monorepo.

Il SG genera codice a compile-time. L’IDE potrebbe non aggiornare IntelliSense immediatamente dopo una modifica agli attributi.

IDEFix
Visual StudioBuild → Rebuild Solution oppure Ctrl+Shift+B
RiderFile → Invalidate Caches → Just Restart oppure Build → Rebuild Solution
VS Code + C# Dev KitCtrl+Shift+POmniSharp: Restart OmniSharp
CLIdotnet build nella directory del progetto
  1. Verifica che il SG sia referenziato nel .csproj:

    <ProjectReference Include="...\Pragmatic.SourceGenerator.csproj"
    OutputItemType="Analyzer"
    ReferenceOutputAssembly="false" />
  2. Controlla l’attributo trigger — il SG genera codice solo quando trova attributi specifici ([Entity], [DomainAction], [MessageHandler], etc.)

  3. Verifica che la classe sia partial — quasi tutti i SG richiedono classi partial

  4. Controlla il build output:

    Terminal window
    dotnet build -v detailed 2>&1 | grep "Pragmatic.SourceGenerator"
  5. Ispeziona i file generati:

    obj/Debug/net10.0/generated/Pragmatic.SourceGenerator/
ScenarioSoluzione da aprire
Full frameworkPragmatic.Design.slnx (root)
Singolo moduloPragmatic.{Module}/Pragmatic.{Module}.slnx
Showcase appexamples/showcase/Showcase.slnx
Solo SGPragmatic.SourceGenerator/Pragmatic.SourceGenerator.slnx

Tip: aprire la solution root può essere lento (30+ progetti). Per sviluppo quotidiano su un modulo, usa la solution dedicata.

  1. Apri Pragmatic.SourceGenerator.csproj
  2. Aggiungi Debugger.Launch() nel metodo Initialize() di PragmaticSourceGenerator
  3. Build il progetto consumer → debugger si attacca
  1. Apri la solution del modulo consumer
  2. Run → Attach to Process → cerca dotnet con argomento build
  3. Metti breakpoint nel SG → rebuild
Terminal window
# Mostra tutti i diagnostics PRAG generati
dotnet build 2>&1 | grep "PRAG"
# Mostra file generati
ls obj/Debug/net10.0/generated/Pragmatic.SourceGenerator/

Il SG usa IIncrementalGenerator — solo i file modificati vengono rigenerati. Ma se cambi un attributo shared, tutto viene rigenerato.

Terminal window
# 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.slnx
Terminal window
# 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 modulo
dotnet test Pragmatic.Design.slnx --no-build -m:4

Il progetto usa .editorconfig con regole strict:

TipoConvenzioneEsempio
Public memberPascalCaseGetAsync()
Private field_camelCase_repository
ParametercamelCasecancellationToken
ConstantPascalCaseDefaultTimeout

Tip: se l’IDE mostra warning di naming, verifica che .editorconfig sia rilevato. In VS Code, potrebbe servire l’estensione EditorConfig.

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.

Terminal window
# Per la Showcase app
dotnet watch run --project examples/showcase/src/Showcase.Host/
ProblemaCausaFix
error CS0246: type 'X' not foundSG non ha generato il codiceRebuild, verifica attributo + partial
warning PRAG0400Classe non partialAggiungi partial keyword
IntelliSense rosso ma build OKIDE cache staleRestart IDE / OmniSharp
Test snapshot .received.txt diversoCodice generato cambiatoCopia .received.txt.verified.txt se corretto
Build lenta (>30s)Full solution rebuildUsa solution per modulo, non root
The type 'X' exists in both assembliesConflitto AbstractionsVerifica che un solo package fornisca il tipo