Beispiel #1
0
        static ExpressionSyntax InstantiateEntity(RoslynEcsTranslator translator, CreateEntityNodeModel model)
        {
            var context          = translator.context;
            var entityTranslator = context.GetEntityManipulationTranslator();

            return(entityTranslator.CreateEntity(translator.context).First() as ExpressionSyntax);
        }
Beispiel #2
0
        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);
            }
        }