public static IEnumerable <SyntaxNode> BuildSetPropertyNode(this RoslynTranslator translator, SetPropertyGroupNodeModel model, IPortModel portModel)
        {
            SyntaxNode leftHand;

            IPortModel instancePort = model.InstancePort;

            if (!instancePort.Connected)
            {
                leftHand = SyntaxFactory.ThisExpression();
            }
            else
            {
                leftHand = translator.BuildPort(instancePort).SingleOrDefault();
            }

            foreach (var member in model.Members)
            {
                string     memberId  = member.GetId();
                IPortModel inputPort = model.InputsById[memberId];

                SyntaxNode rightHandExpression = translator.BuildPort(inputPort).SingleOrDefault();
                if (rightHandExpression == null)
                {
                    continue;
                }

                MemberAccessExpressionSyntax access = RoslynBuilder.MemberReference(leftHand, member.Path[0]);
                for (int i = 1; i < member.Path.Count; i++)
                {
                    access = RoslynBuilder.MemberReference(access, member.Path[i]);
                }

                yield return(SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, access, rightHandExpression as ExpressionSyntax));
            }
        }
Exemplo n.º 2
0
        protected override StatementSyntax OnPopContext()
        {
            var coroutineParameterName = RoslynEcsBuilder.BuildCoroutineParameterName(m_ComponentTypeName);

            // Build Coroutine MoveNext call statement
            var block = Block();

            // Assign times fields
            block = block.AddStatements(ExpressionStatement(RoslynBuilder.Assignment(
                                                                RoslynBuilder.MemberReference(
                                                                    IdentifierName(coroutineParameterName),
                                                                    nameof(ICoroutine.DeltaTime)),
                                                                Parent.GetOrDeclareDeltaTime())));

            // Call MoveNext
            block = block.AddStatements(IfStatement(
                                            RoslynBuilder.MethodInvocation(
                                                k_MoveNext,
                                                IdentifierName(coroutineParameterName),
                                                m_Parameters.Keys,
                                                Enumerable.Empty <TypeSyntax>()),
                                            ReturnStatement()));

            // Remove component when coroutine is completed
            var removeStatement = Parent.GetEntityManipulationTranslator().RemoveComponent(
                Parent,
                IdentifierName(Parent.EntityName),
                m_ComponentTypeName);

            block = removeStatement.Aggregate(block, (current, syntax) => current.AddStatements(syntax));

            return(block);
        }
        public static IEnumerable <SyntaxNode> BuildGetPropertyNode(this RoslynTranslator translator, GetPropertyGroupNodeModel model, IPortModel portModel)
        {
            var instancePort = model.InstancePort;
            var input        = !instancePort.Connected ? SyntaxFactory.ThisExpression() : translator.BuildPort(instancePort).SingleOrDefault();

            if (input == null)
            {
                yield break;
            }

            var member = model.Members.FirstOrDefault(m => m.GetId() == portModel.UniqueId);

            if (member.Path == null || member.Path.Count == 0)
            {
                yield break;
            }

            var access = RoslynBuilder.MemberReference(input, member.Path[0]);

            for (int i = 1; i < member.Path.Count; i++)
            {
                access = RoslynBuilder.MemberReference(access, member.Path[i]);
            }

            yield return(access);
        }
Exemplo n.º 4
0
        static MemberAccessExpressionSyntax GetLeftValueFromCriterion(IEntityManipulationTranslator self,
                                                                      TranslationContext context, Stencil stencil, ExpressionSyntax entity, Criterion criterion)
        {
            var componentType       = criterion.ObjectType.Resolve(stencil);
            var componentExpression = self.GetComponent(context, entity, componentType).Single();

            var access = RoslynBuilder.MemberReference(componentExpression, criterion.Member.Path[0]);

            for (var i = 1; i < criterion.Member.Path.Count; i++)
            {
                access = RoslynBuilder.MemberReference(access, criterion.Member.Path[i]);
            }

            return(access);
        }