sschmid / Entitas

Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity
MIT License
7.11k stars 1.11k forks source link

Unity 2021 hangs on code generation with Roslyn #997

Closed vasyaPP closed 2 years ago

vasyaPP commented 2 years ago

Unity 2021.3.3f1 LTS Macbook Pro M1

Steps to reproduce.

  1. Create new project and import Entitas from AssetStore with default installation as described in wiki.
  2. Code generation works.
  3. Unzip Jenny.zip to the project folder.
  4. Configure Jenny (select 2nd option in both cases).
    mono Jenny/Jenny/Jenny.exe auto-import -s
⚠️  Potential plugin collision: ComponentDataProvider
0: Keep all (no changes)
1: Keep Entitas.CodeGeneration.Plugins.ComponentDataProvider
2: Keep Entitas.Roslyn.CodeGeneration.Plugins.ComponentDataProvider
⚠️  Potential plugin collision: EntityIndexDataProvider
0: Keep all (no changes)
1: Keep Entitas.CodeGeneration.Plugins.EntityIndexDataProvider
2: Keep Entitas.Roslyn.CodeGeneration.Plugins.EntityIndexDataProvider

  1. Test Jenny configuration.
    mono Jenny/Jenny/Jenny.exe doctor
ℹ️  Available: DesperateDevs.CodeGeneration.Unity.Plugins.WarnIfCompilationErrorsPreProcessor
ℹ️  Available: Entitas.CodeGeneration.Plugins.ComponentDataProvider
ℹ️  Available: Entitas.CodeGeneration.Plugins.EntityIndexDataProvider
ℹ️  Available: DesperateDevs.CodeGeneration.Unity.Plugins.DebugLogPostProcessor
Dry Run
Game/Components/GameTestComponent.cs - Entitas.CodeGeneration.Plugins.ComponentEntityApiGenerator, Entitas.CodeGeneration.Plugins.ComponentMatcherApiGenerator
Game/GameComponentsLookup.cs - Entitas.CodeGeneration.Plugins.ComponentLookupGenerator
Input/InputComponentsLookup.cs - Entitas.CodeGeneration.Plugins.ComponentLookupGenerator
Game/GameAttribute.cs - Entitas.CodeGeneration.Plugins.ContextAttributeGenerator
Input/InputAttribute.cs - Entitas.CodeGeneration.Plugins.ContextAttributeGenerator
Game/GameContext.cs - Entitas.CodeGeneration.Plugins.ContextGenerator
Input/InputContext.cs - Entitas.CodeGeneration.Plugins.ContextGenerator
Game/GameMatcher.cs - Entitas.CodeGeneration.Plugins.ContextMatcherGenerator
Input/InputMatcher.cs - Entitas.CodeGeneration.Plugins.ContextMatcherGenerator
Contexts.cs - Entitas.CodeGeneration.Plugins.ContextsGenerator, Entitas.VisualDebugging.CodeGeneration.Plugins.ContextObserverGenerator
Game/GameEntity.cs - Entitas.CodeGeneration.Plugins.EntityGenerator
Input/InputEntity.cs - Entitas.CodeGeneration.Plugins.EntityGenerator
Feature.cs - Entitas.VisualDebugging.CodeGeneration.Plugins.FeatureClassGenerator

👨‍🔬  No problems detected. Happy coding :)

  1. Try to generate code in Unity.

Tools --> Jenny --> Generate code The editor always hangs. Force Quit and reopen.

  1. Test Jenny configuration. Doctor reports that no problems detected.
    mono Jenny/Jenny/Jenny.exe doctor
ℹ️  Available: DesperateDevs.CodeGeneration.Unity.Plugins.WarnIfCompilationErrorsPreProcessor
ℹ️  Available: Entitas.CodeGeneration.Plugins.ComponentDataProvider
ℹ️  Available: Entitas.CodeGeneration.Plugins.EntityIndexDataProvider
ℹ️  Available: DesperateDevs.CodeGeneration.Unity.Plugins.DebugLogPostProcessor
Dry Run
Game/Components/GameTestComponent.cs - Entitas.CodeGeneration.Plugins.ComponentEntityApiGenerator, Entitas.CodeGeneration.Plugins.ComponentMatcherApiGenerator
Game/GameComponentsLookup.cs - Entitas.CodeGeneration.Plugins.ComponentLookupGenerator
Input/InputComponentsLookup.cs - Entitas.CodeGeneration.Plugins.ComponentLookupGenerator
Game/GameAttribute.cs - Entitas.CodeGeneration.Plugins.ContextAttributeGenerator
Input/InputAttribute.cs - Entitas.CodeGeneration.Plugins.ContextAttributeGenerator
Game/GameContext.cs - Entitas.CodeGeneration.Plugins.ContextGenerator
Input/InputContext.cs - Entitas.CodeGeneration.Plugins.ContextGenerator
Game/GameMatcher.cs - Entitas.CodeGeneration.Plugins.ContextMatcherGenerator
Input/InputMatcher.cs - Entitas.CodeGeneration.Plugins.ContextMatcherGenerator
Contexts.cs - Entitas.CodeGeneration.Plugins.ContextsGenerator, Entitas.VisualDebugging.CodeGeneration.Plugins.ContextObserverGenerator
Game/GameEntity.cs - Entitas.CodeGeneration.Plugins.EntityGenerator
Input/InputEntity.cs - Entitas.CodeGeneration.Plugins.EntityGenerator
Feature.cs - Entitas.VisualDebugging.CodeGeneration.Plugins.FeatureClassGenerator

👨‍🔬  No problems detected. Happy coding :)

  1. Try to generate code from command line.

mono Jenny/Jenny/Jenny.exe gen Jenny.properties success

  1. One more test with doctor - Object reference not set to an instance of an object
    mono Jenny/Jenny/Jenny.exe doctor
ℹ️  Available: DesperateDevs.CodeGeneration.Unity.Plugins.WarnIfCompilationErrorsPreProcessor
ℹ️  Available: Entitas.CodeGeneration.Plugins.ComponentDataProvider
ℹ️  Available: Entitas.CodeGeneration.Plugins.EntityIndexDataProvider
ℹ️  Available: DesperateDevs.CodeGeneration.Unity.Plugins.DebugLogPostProcessor
Dry Run
Object reference not set to an instance of an object

  1. Test with -d
    mono Jenny/Jenny/Jenny.exe doctor -d
(output truncated)
[ERROR] Jenny: System.NullReferenceException: Object reference not set to an instance of an object
  at Entitas.Roslyn.CodeGeneration.Plugins.ContextsComponentDataProvider.GetContextNames (Microsoft.CodeAnalysis.INamedTypeSymbol type) [0x000b3] in <012bb52d2e624b348bb46c7b2a8f0e7c>:0 
  at Entitas.Roslyn.CodeGeneration.Plugins.ContextsComponentDataProvider.GetContextNamesOrDefault (Microsoft.CodeAnalysis.INamedTypeSymbol type) [0x00000] in <012bb52d2e624b348bb46c7b2a8f0e7c>:0 
  at Entitas.Roslyn.CodeGeneration.Plugins.ContextsComponentDataProvider.Provide (Microsoft.CodeAnalysis.INamedTypeSymbol type, Entitas.CodeGeneration.Plugins.ComponentData data) [0x00000] in <012bb52d2e624b348bb46c7b2a8f0e7c>:0 
  at Entitas.Roslyn.CodeGeneration.Plugins.ComponentDataProvider.createDataForComponent (Microsoft.CodeAnalysis.INamedTypeSymbol type) [0x00011] in <012bb52d2e624b348bb46c7b2a8f0e7c>:0 
  at System.Linq.Enumerable+WhereSelectArrayIterator`2[TSource,TResult].ToArray () [0x00030] in <14c1495deda74532849f8ec10b438611>:0 
  at System.Linq.Enumerable.ToArray[TSource] (System.Collections.Generic.IEnumerable`1[T] source) [0x0001f] in <14c1495deda74532849f8ec10b438611>:0 
  at Entitas.Roslyn.CodeGeneration.Plugins.ComponentDataProvider.GetData () [0x00087] in <012bb52d2e624b348bb46c7b2a8f0e7c>:0 
  at DesperateDevs.CodeGeneration.CodeGenerator.CodeGenerator.generate (System.String messagePrefix, DesperateDevs.CodeGeneration.IPreProcessor[] preProcessors, DesperateDevs.CodeGeneration.IDataProvider[] dataProviders, DesperateDevs.CodeGeneration.ICodeGenerator[] codeGenerators, DesperateDevs.CodeGeneration.IPostProcessor[] postProcessors) [0x00129] in <c76b1807404648b49b3d1fcb11deda9e>:0 
  at DesperateDevs.CodeGeneration.CodeGenerator.CodeGenerator.DryRun () [0x000c2] in <c76b1807404648b49b3d1fcb11deda9e>:0 
  at DesperateDevs.CodeGeneration.CodeGenerator.CLI.DoctorCommand.run () [0x00037] in <c1e168f34344456fadf29f9707a00979>:0 
  at DesperateDevs.CLI.Utils.AbstractCommand.Run (DesperateDevs.CLI.Utils.CLIProgram program, System.String[] args) [0x0001f] in <35e742b0ce2e446ba4a62972ee26493f>:0 
  at DesperateDevs.Serialization.CLI.Utils.AbstractPreferencesCommand.Run (DesperateDevs.CLI.Utils.CLIProgram program, System.String[] args) [0x00090] in <3d933fbb489144f897ea26c71a5d2c0d>:0 
  at DesperateDevs.CLI.Utils.CLIProgram.runCommand (System.String[] args) [0x0000e] in <35e742b0ce2e446ba4a62972ee26493f>:0 

Is there a workaround how to fix it?

I can confirm that Unity 2020 LTS does not have this issue. Tested on 2020.3.29f1 LTS.

sschmid commented 2 years ago

@vasyaPP Can you see on which step in hangs in Unity?

vasyaPP commented 2 years ago

@sschmid on "Validate Project Path". If I uncheck it in Jenny Preferences, Unity will start to hang on the next steps.

sschmid commented 2 years ago

While testing, I found another issue that I fixed: Unity 2021.3 LTS generates Assembly-CSharp.csproj using / as a path separator. Before that, it used to be \

I updated the UpdateCSProjPostProcessor to account for that.

Overwrite existing DesperateDevs.CodeGeneration.Plugins.dll in

with this file: DesperateDevs.CodeGeneration.Plugins.dll.zip

This fixes failing to generate after the 2nd time

sschmid commented 2 years ago

As a workaround for your issue, please keep using

mono Jenny/Jenny/Jenny.exe gen

or use the server for faster consecutive generation:

mono Jenny/Jenny/Jenny.exe server
vasyaPP commented 2 years ago

Thanks!