コード例 #1
0
        // Takes array of key indexs and recursively creates syntax for condition clause.
        private ExpressionSyntax CreateAndClauses(int index, List <int> keyIndexes)
        {
            var literal = MySyntaxFactory.Literal(ObjectBuilder.OuputTypes[keyIndexes[index]], ObjectBuilder.Keys[keyIndexes[index]]);

            if (index == 0)
            {
                return(SyntaxFactory.BinaryExpression(
                           SyntaxKind.EqualsExpression,
                           SyntaxFactory.IdentifierName(ObjectBuilder.OutputNames[keyIndexes[index]]),
                           literal
                           ));
            }

            var currentExpression = SyntaxFactory.BinaryExpression(
                SyntaxKind.EqualsExpression,
                SyntaxFactory.IdentifierName(ObjectBuilder.OutputNames[keyIndexes[index]]),
                literal
                );

            return(SyntaxFactory.BinaryExpression(
                       SyntaxKind.LogicalAndExpression,
                       CreateAndClauses(--index, keyIndexes),
                       currentExpression
                       ));
        }
コード例 #2
0
        internal override void CollectInputExpressions(List <StatementSyntax> expressions)
        {
            base.CollectInputExpressions(expressions);

            var entryType = MyVisualScriptingProxy.GetType(ObjectBuilder.Type);
            var listType  = typeof(List <>).MakeGenericType(entryType);

            var separatedList = new List <SyntaxNodeOrToken>();

            // Create source of arguments for array creation syntax
            for (var index = 0; index < ObjectBuilder.DefaultEntries.Count; index++)
            {
                var entry   = ObjectBuilder.DefaultEntries[index];
                var literal = MySyntaxFactory.Literal(ObjectBuilder.Type, entry);

                separatedList.Add(literal);

                if (index < ObjectBuilder.DefaultEntries.Count - 1)
                {
                    separatedList.Add(SyntaxFactory.Token(SyntaxKind.CommaToken));
                }
            }

            // Syntax of "new Type[]{arg0, arg1, ...}"
            ArrayCreationExpressionSyntax arrayCreationSyntax = null;

            if (separatedList.Count > 0)
            {
                arrayCreationSyntax = SyntaxFactory.ArrayCreationExpression(
                    SyntaxFactory.ArrayType(
                        SyntaxFactory.IdentifierName(ObjectBuilder.Type),
                        SyntaxFactory.SingletonList(
                            SyntaxFactory.ArrayRankSpecifier(
                                SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>(
                                    SyntaxFactory.OmittedArraySizeExpression()
                                    )
                                )
                            )
                        ),
                    SyntaxFactory.InitializerExpression(
                        SyntaxKind.ArrayInitializerExpression,
                        SyntaxFactory.SeparatedList <ExpressionSyntax>(
                            separatedList
                            )
                        )
                    );
            }

            // Syntax of new List<Type>(arrayCreationSyntax);
            var listCreationSyntax = MySyntaxFactory.GenericObjectCreation(listType, arrayCreationSyntax == null ? null : new[] { arrayCreationSyntax });

            var localVariableSyntax = MySyntaxFactory.LocalVariable(listType, VariableSyntaxName(), listCreationSyntax);

            expressions.Add(localVariableSyntax);
        }
コード例 #3
0
        internal override void CollectSequenceExpressions(List <StatementSyntax> expressions)
        {
            CollectInputExpressions(expressions);

            var valueVariableName = m_valueInput.VariableSyntaxName(ObjectBuilder.ValueInput.VariableName);

            var switchSections = new List <SwitchSectionSyntax>();
            var syntaxList     = new List <StatementSyntax>();

            for (int index = 0; index < m_sequenceOutputs.Count; index++)
            {
                var sequenceOutputNode = m_sequenceOutputs[index];
                if (sequenceOutputNode == null)
                {
                    continue;
                }

                syntaxList.Clear();
                // Collect
                sequenceOutputNode.CollectSequenceExpressions(syntaxList);
                // Add break to the end of the section
                syntaxList.Add(SyntaxFactory.BreakStatement());

                // New section syntax
                var section = SyntaxFactory.SwitchSection().WithLabels(
                    SyntaxFactory.SingletonList <SwitchLabelSyntax>(
                        SyntaxFactory.CaseSwitchLabel(
                            MySyntaxFactory.Literal(ObjectBuilder.NodeType, ObjectBuilder.Options[index].Option)
                            )
                        )).WithStatements(SyntaxFactory.List(syntaxList));

                switchSections.Add(section);
            }

            var switchSyntax = SyntaxFactory.SwitchStatement(
                SyntaxFactory.IdentifierName(valueVariableName)
                )
                               .WithSections(SyntaxFactory.List(switchSections));

            expressions.Add(switchSyntax);
        }
コード例 #4
0
        internal override void CollectInputExpressions(List <StatementSyntax> expressions)
        {
            var value = ObjectBuilder.Value ?? string.Empty;
            var type  = MyVisualScriptingProxy.GetType(ObjectBuilder.Type);

            base.CollectInputExpressions(expressions);

            // First handle special cases as Color and Enums
            if (type == typeof(Color) || type.IsEnum)
            {
                expressions.Add(
                    MySyntaxFactory.LocalVariable(
                        ObjectBuilder.Type,
                        VariableSyntaxName(),
                        SyntaxFactory.MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            SyntaxFactory.IdentifierName(ObjectBuilder.Type),
                            SyntaxFactory.IdentifierName(ObjectBuilder.Value)
                            )
                        )
                    );
            }
            else if (type == typeof(Vector3D))
            {
                expressions.Add(
                    MySyntaxFactory.LocalVariable(ObjectBuilder.Type, VariableSyntaxName(),
                                                  MySyntaxFactory.NewVector3D(ObjectBuilder.Value)
                                                  )
                    );
            }
            else
            {
                // Rest is generic
                expressions.Add(
                    MySyntaxFactory.LocalVariable(
                        ObjectBuilder.Type,
                        VariableSyntaxName(),
                        MySyntaxFactory.Literal(ObjectBuilder.Type, value))
                    );
            }
        }
コード例 #5
0
        internal override void CollectInputExpressions(List <StatementSyntax> expressions)
        {
            base.CollectInputExpressions(expressions);

            // MyLocalization.Static["context", "messageId"];
            var localizationAccessExpression = SyntaxFactory.ElementAccessExpression(
                SyntaxFactory.MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    SyntaxFactory.IdentifierName("VRage.Game.Localization.MyLocalization"),
                    SyntaxFactory.IdentifierName("Static")
                    )
                ).WithArgumentList(
                SyntaxFactory.BracketedArgumentList(
                    SyntaxFactory.SeparatedList <ArgumentSyntax>(
                        new SyntaxNodeOrToken[]
            {
                SyntaxFactory.Argument(
                    MySyntaxFactory.Literal(typeof(string).Signature(), ObjectBuilder.Context)),
                SyntaxFactory.Token(SyntaxKind.CommaToken),
                SyntaxFactory.Argument(
                    MySyntaxFactory.Literal(typeof(string).Signature(), ObjectBuilder.MessageId))
            })
                    )
                );

            // ToString() invocation expression
            var toStringExpression = SyntaxFactory.InvocationExpression(
                SyntaxFactory.MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    localizationAccessExpression,
                    SyntaxFactory.IdentifierName("ToString")
                    )
                );

            // String tmpVariableName = the above
            string tmpVariableName = "localizedText_" + ObjectBuilder.ID;

            if (m_inputParameterNodes.Count == 0)
            {
                tmpVariableName = VariableSyntaxName();
            }

            var localizedTextVariableSyntax = MySyntaxFactory.LocalVariable(typeof(string).Signature(),
                                                                            tmpVariableName, toStringExpression);

            if (m_inputParameterNodes.Count > 0)
            {
                // Prepare variable names for creation of string.Format call
                var parameterVariableNames = new List <string>();
                parameterVariableNames.Add(tmpVariableName);
                for (int index = 0; index < m_inputParameterNodes.Count; index++)
                {
                    var node = m_inputParameterNodes[index];
                    parameterVariableNames.Add(node.VariableSyntaxName(ObjectBuilder.ParameterInputs[index].VariableName));
                }

                // string.Format(....) call
                var stringFormatSyntax = MySyntaxFactory.MethodInvocation("Format", parameterVariableNames, "string");
                // node variable syntax creation
                var nodeVariableSyntax = MySyntaxFactory.LocalVariable(typeof(string).Signature(), VariableSyntaxName(), stringFormatSyntax);

                expressions.Add(localizedTextVariableSyntax);
                expressions.Add(nodeVariableSyntax);
            }
            else
            {
                expressions.Add(localizedTextVariableSyntax);
            }
        }
コード例 #6
0
        internal override void CollectSequenceExpressions(List <StatementSyntax> expressions)
        {
            base.CollectInputExpressions(expressions);

            // We can ignore the nodes with empty bodies
            if (m_bodySequence != null)
            {
                var bodySyntax = new List <StatementSyntax>();
                // Collect body expressions
                m_bodySequence.CollectSequenceExpressions(bodySyntax);

                // Create syntax for first index of for loop
                ExpressionSyntax firstIndexExpression;
                if (m_firstInput != null)
                {
                    firstIndexExpression = SyntaxFactory.IdentifierName(
                        m_firstInput.VariableSyntaxName(ObjectBuilder.FirstIndexValueInput.VariableName)
                        );
                }
                else
                {
                    firstIndexExpression = MySyntaxFactory.Literal(
                        typeof(int).Signature(),
                        ObjectBuilder.FirstIndexValue
                        );
                }

                // Create syntax for last index condition
                ExpressionSyntax lastIndexExpression;
                if (m_lastInput != null)
                {
                    lastIndexExpression = SyntaxFactory.IdentifierName(
                        m_lastInput.VariableSyntaxName(ObjectBuilder.LastIndexValueInput.VariableName)
                        );
                }
                else
                {
                    lastIndexExpression = MySyntaxFactory.Literal(typeof(int).Signature(), ObjectBuilder.LastIndexValue);
                }

                // Create syntax for increment
                ExpressionSyntax incrementExpression;
                if (m_incrementInput != null)
                {
                    incrementExpression = SyntaxFactory.IdentifierName(
                        m_incrementInput.VariableSyntaxName(ObjectBuilder.IncrementValueInput.VariableName)
                        );
                }
                else
                {
                    incrementExpression = MySyntaxFactory.Literal(typeof(int).Signature(), ObjectBuilder.IncrementValue);
                }

                // Put the for statement syntax together
                var forStatement = SyntaxFactory.ForStatement(
                    SyntaxFactory.Block(bodySyntax)
                    ).WithDeclaration(
                    SyntaxFactory.VariableDeclaration(
                        SyntaxFactory.PredefinedType(
                            SyntaxFactory.Token(SyntaxKind.IntKeyword)))
                    .WithVariables(
                        SyntaxFactory.SingletonSeparatedList <VariableDeclaratorSyntax>(
                            SyntaxFactory.VariableDeclarator(
                                SyntaxFactory.Identifier(VariableSyntaxName()))
                            .WithInitializer(
                                SyntaxFactory.EqualsValueClause(
                                    firstIndexExpression
                                    )
                                )
                            )
                        )
                    ).WithCondition(
                    SyntaxFactory.BinaryExpression(
                        SyntaxKind.LessThanOrEqualExpression,
                        SyntaxFactory.IdentifierName(VariableSyntaxName()),
                        lastIndexExpression
                        )
                    ).WithIncrementors(
                    SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>(
                        SyntaxFactory.AssignmentExpression(
                            SyntaxKind.AddAssignmentExpression,
                            SyntaxFactory.IdentifierName(VariableSyntaxName()),
                            incrementExpression
                            )
                        )
                    );

                expressions.Add(forStatement);
            }

            // Ignore if not present
            if (m_finishSequence != null)
            {
                m_finishSequence.CollectSequenceExpressions(expressions);
            }
        }
コード例 #7
0
        internal override void CollectSequenceExpressions(List <StatementSyntax> expressions)
        {
            // Collect input only from these nodes that are inputs for this node.
            m_toCollectNodeCache.Clear();
            foreach (var subTreeNode in SubTreeNodes)
            {
                var directConnection = false;
                foreach (var outputNode in subTreeNode.Outputs)
                {
                    // Must be an input
                    if (outputNode == this && !outputNode.Collected)
                    {
                        directConnection = true;
                        break;
                    }
                }

                if (directConnection)
                {
                    subTreeNode.CollectInputExpressions(expressions);
                }
                else
                {
                    // Cache these that are getting the input from this one.
                    m_toCollectNodeCache.Add(subTreeNode);
                }
            }

            // We can ignore the nodes with empty bodies
            if (m_bodySequence != null)
            {
                var bodySyntax = new List <StatementSyntax>();

                // Collect the assigned bodies from
                foreach (var node in m_toCollectNodeCache)
                {
                    node.CollectInputExpressions(bodySyntax);
                }

                // Collect body expressions
                m_bodySequence.CollectSequenceExpressions(bodySyntax);

                // Create syntax for first index of for loop
                ExpressionSyntax firstIndexExpression;
                if (m_firstInput != null)
                {
                    firstIndexExpression = SyntaxFactory.IdentifierName(
                        m_firstInput.VariableSyntaxName(ObjectBuilder.FirstIndexValueInput.VariableName)
                        );
                }
                else
                {
                    firstIndexExpression = MySyntaxFactory.Literal(
                        typeof(int).Signature(),
                        ObjectBuilder.FirstIndexValue
                        );
                }

                // Create syntax for last index condition
                ExpressionSyntax lastIndexExpression;
                if (m_lastInput != null)
                {
                    lastIndexExpression = SyntaxFactory.IdentifierName(
                        m_lastInput.VariableSyntaxName(ObjectBuilder.LastIndexValueInput.VariableName)
                        );
                }
                else
                {
                    lastIndexExpression = MySyntaxFactory.Literal(typeof(int).Signature(), ObjectBuilder.LastIndexValue);
                }

                // Create syntax for increment
                ExpressionSyntax incrementExpression;
                if (m_incrementInput != null)
                {
                    incrementExpression = SyntaxFactory.IdentifierName(
                        m_incrementInput.VariableSyntaxName(ObjectBuilder.IncrementValueInput.VariableName)
                        );
                }
                else
                {
                    incrementExpression = MySyntaxFactory.Literal(typeof(int).Signature(), ObjectBuilder.IncrementValue);
                }

                // Put the for statement syntax together
                var forStatement = SyntaxFactory.ForStatement(
                    SyntaxFactory.Block(bodySyntax)
                    ).WithDeclaration(
                    SyntaxFactory.VariableDeclaration(
                        SyntaxFactory.PredefinedType(
                            SyntaxFactory.Token(SyntaxKind.IntKeyword)))
                    .WithVariables(
                        SyntaxFactory.SingletonSeparatedList <VariableDeclaratorSyntax>(
                            SyntaxFactory.VariableDeclarator(
                                SyntaxFactory.Identifier(VariableSyntaxName()))
                            .WithInitializer(
                                SyntaxFactory.EqualsValueClause(
                                    firstIndexExpression
                                    )
                                )
                            )
                        )
                    ).WithCondition(
                    SyntaxFactory.BinaryExpression(
                        SyntaxKind.LessThanOrEqualExpression,
                        SyntaxFactory.IdentifierName(VariableSyntaxName()),
                        lastIndexExpression
                        )
                    ).WithIncrementors(
                    SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>(
                        SyntaxFactory.AssignmentExpression(
                            SyntaxKind.AddAssignmentExpression,
                            SyntaxFactory.IdentifierName(VariableSyntaxName()),
                            incrementExpression
                            )
                        )
                    );

                expressions.Add(forStatement);
            }

            // Ignore if not present
            if (m_finishSequence != null)
            {
                m_finishSequence.CollectSequenceExpressions(expressions);
            }
        }