static ExpressionSyntax InstantiateEntity(RoslynEcsTranslator translator, CreateEntityNodeModel model) { var context = translator.context; var entityTranslator = context.GetEntityManipulationTranslator(); return(entityTranslator.CreateEntity(translator.context).First() as ExpressionSyntax); }
public static IEnumerable <SyntaxNode> BuildCreateEntityTranslator(this RoslynEcsTranslator translator, CreateEntityNodeModel model, IPortModel portModel) { bool hasAnyComponentInstruction = false; ExpressionSyntax newInstance = null; if (model.InstancePort.Connected) { newInstance = translator.BuildPort(model.InstancePort, RoslynTranslator.PortSemantic.Write).SingleOrDefault() as ExpressionSyntax; hasAnyComponentInstruction = true; } // always instantiate var newEntity = InstantiateEntity(translator, model); if (hasAnyComponentInstruction) // == if connected. assignment of implicit variable is done only if it's required in the foreach loop below { yield return(RoslynBuilder.Assignment(newInstance, newEntity)); } var entityTranslator = translator.context.GetEntityManipulationTranslator(); foreach (TypeHandle th in model.GetEditableComponents()) { var componentType = th.Resolve(model.GraphModel.Stencil); IEnumerable <SyntaxNode> instructions; // first instruction forces the declaration of an implicit variable if not already done if (!hasAnyComponentInstruction) { hasAnyComponentInstruction = true; string entityVariableName = translator.MakeUniqueName("entity"); yield return(RoslynBuilder.DeclareLocalVariable(typeof(Entity), entityVariableName, newEntity)); newInstance = SyntaxFactory.IdentifierName(entityVariableName); } instructions = entityTranslator.AddComponent(translator.context, newInstance, componentType, BuildNewComponent(th, componentType)); foreach (var instruction in instructions) { yield return(instruction); } } if (!hasAnyComponentInstruction) // implicit variable, never used in the loop { yield return(SyntaxFactory.ExpressionStatement(newEntity)); } ExpressionSyntax BuildNewComponent(TypeHandle componentTypeHandle, Type componentType) { var componentInput = model.GetPortsForComponent(componentTypeHandle).ToArray(); var newComponent = translator.BuildComponentFromInput(componentType, componentInput); return(newComponent); } }