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)); } }
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); }
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); }