Esempio n. 1
0
        public static IEnumerable <SyntaxNode> BuildUnaryOperator(this RoslynTranslator translator, UnaryOperatorNodeModel model, IPortModel portModel)
        {
            var semantic = model.Kind == UnaryOperatorKind.PostDecrement ||
                           model.Kind == UnaryOperatorKind.PostIncrement
                ? RoslynTranslator.PortSemantic.Write
                : RoslynTranslator.PortSemantic.Read;

            yield return(RoslynBuilder.UnaryOperator(model.Kind, translator.BuildPort(model.InputPort, semantic).SingleOrDefault()));
        }
Esempio n. 2
0
        public static IEnumerable <SyntaxNode> BuildGetPropertyNode(this RoslynTranslator translator, GetPropertyGroupNodeModel model, IPortModel portModel)
        {
            var instancePort = model.InstancePort;
            var input        = !instancePort.IsConnected ? 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.ToArray());

            yield return(access);
        }
        IEnumerable <SyntaxNode> BuildPortInner(IPortModel portModel, out INodeModel builtNode)
        {
            var connectedPort = portModel.ConnectionPortModels.FirstOrDefault();

            if (connectedPort != null && connectedPort.NodeModel.State == ModelState.Enabled)
            {
                return(BuildNode(builtNode = connectedPort.NodeModel, connectedPort));
            }

            // if it' s an embedded value, no point in recording its value, keep a null builtNode
            builtNode = null;
            if (portModel.EmbeddedValue != null)
            {
                return(BuildNode(portModel.EmbeddedValue));
            }

            // return default datatype value (null) if not connected. not recorded either
            var defaultValue = RoslynBuilder.GetDefault(portModel.DataTypeHandle.Resolve(Stencil));

            return(Enumerable.Repeat(defaultValue == null
                ? LiteralExpression(SyntaxKind.NullLiteralExpression)
                : Constant(defaultValue, Stencil), 1));
        }
        protected virtual Microsoft.CodeAnalysis.SyntaxTree ToSyntaxTree(VSGraphModel graphModel, CompilationOptions options)
        {
            //TODO fix graph name, do not use the asset name
            var className        = graphModel.TypeName;
            var baseClass        = graphModel.Stencil.GetBaseClass().Name;
            var classDeclaration = ClassDeclaration(className)
                                   .WithModifiers(
                TokenList(
                    Token(SyntaxKind.PublicKeyword)));

            if (!String.IsNullOrEmpty(baseClass))
            {
                classDeclaration = classDeclaration.WithBaseList(
                    BaseList(
                        SingletonSeparatedList <BaseTypeSyntax>(
                            SimpleBaseType(
                                IdentifierName(baseClass)))));
            }

            if (graphModel.Stencil.addCreateAssetMenuAttribute)
            {
                classDeclaration = classDeclaration.WithAttributeLists(
                    SingletonList(
                        AttributeList(
                            SingletonSeparatedList(
                                Attribute(
                                    IdentifierName("CreateAssetMenu"))
                                .WithArgumentList(
                                    AttributeArgumentList(
                                        SeparatedList <AttributeArgumentSyntax>(
                                            new SyntaxNodeOrToken[]
                {
                    AttributeArgument(
                        LiteralExpression(
                            SyntaxKind.StringLiteralExpression,
                            Literal(graphModel.Stencil.fileName)))
                    .WithNameEquals(
                        NameEquals(
                            IdentifierName("fileName"))),
                    Token(SyntaxKind.CommaToken),
                    AttributeArgument(
                        LiteralExpression(
                            SyntaxKind.StringLiteralExpression,
                            Literal(graphModel.Stencil.menuName)))
                    .WithNameEquals(
                        NameEquals(
                            IdentifierName("menuName")))
                })))))));
            }

            var allMembers = new List <MemberDeclarationSyntax>();

            m_AllFields = new List <MemberDeclarationSyntax>();
            var allRemainingMembers = new List <MemberDeclarationSyntax>();

            foreach (var fieldDecl in graphModel.GraphVariableModels)
            {
                var fieldSyntaxNode = fieldDecl.DeclareField(this);
                m_AllFields.Add(fieldSyntaxNode);
            }

            var entryPoints = graphModel.GetEntryPoints();

            Dictionary <string, MethodDeclarationSyntax> declaredMethods = new Dictionary <string, MethodDeclarationSyntax>();

            foreach (var stack in entryPoints)
            {
                var entrySyntaxNode = BuildNode(stack);
                foreach (var memberDeclaration in entrySyntaxNode.Cast <MemberDeclarationSyntax>())
                {
                    if (memberDeclaration is MethodDeclarationSyntax methodDeclarationSyntax)
                    {
                        string key = methodDeclarationSyntax.Identifier.ToString();
                        declaredMethods.Add(key, methodDeclarationSyntax);
                    }
                    else
                    {
                        allRemainingMembers.Add(memberDeclaration);
                    }
                }
            }

            allMembers.AddRange(m_AllFields);
            m_AllFields = null;
            allMembers.AddRange(allRemainingMembers);

            if (m_EventRegistrations.Any())
            {
                if (!declaredMethods.TryGetValue("Update", out var method))
                {
                    method = RoslynBuilder.DeclareMethod("Update", AccessibilityFlags.Public, typeof(void))
                             .WithParameterList(
                        ParameterList(
                            SeparatedList(
                                Enumerable.Empty <ParameterSyntax>())))
                             .WithBody(Block());
                }

                BlockSyntax blockSyntax = Block(m_EventRegistrations.Concat(method.Body.Statements));

                method = method.WithBody(blockSyntax);
                declaredMethods["Update"] = method;
            }

            allMembers.AddRange(declaredMethods.Values);
            classDeclaration = classDeclaration.AddMembers(allMembers.ToArray());

            var referencedNamespaces = UsingDirectives.OrderBy(n => n).Select(ns => UsingDirective(ParseName(ns)));
            var namespaceAliases     = UsingAliases.OrderBy(n => n.Key).Select(pair =>
                                                                               UsingDirective(ParseName(pair.Key))
                                                                               .WithAlias(NameEquals(
                                                                                              IdentifierName(pair.Value))));
            var usings          = referencedNamespaces.Concat(namespaceAliases).ToArray();
            var compilationUnit = CompilationUnit()
                                  .WithUsings(
                List(usings))
                                  .WithMembers(
                SingletonList <MemberDeclarationSyntax>(classDeclaration)).NormalizeWhitespace();

            return(compilationUnit.SyntaxTree);
        }
        public virtual ExpressionSyntax Constant(object value, Stencil stencil, Type generatedType = null)
        {
            switch (value)
            {
            case float f:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(f)));

            case decimal d:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(d)));

            case int i:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(i)));

            case double d:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(d)));

            case bool b:
                return(LiteralExpression(b ? SyntaxKind.TrueLiteralExpression : SyntaxKind.FalseLiteralExpression));

            case string s:
                return(LiteralExpression(SyntaxKind.StringLiteralExpression, Literal(s)));

            case char c:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(c)));

            case Vector2 _:
            case Vector3 _:
            case Vector4 _:
            case Quaternion _:
            case Color _:

                if (generatedType == null)
                {
                    generatedType = value.GetType();
                }
                return(RoslynBuilder.CreateConstantInitializationExpression(value, generatedType));

            case Enum _:
                return(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                              IdentifierName(value.GetType().Name),
                                              IdentifierName(value.ToString())
                                              ));

            case EnumValueReference e:
                return(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                              TypeSystem.BuildTypeSyntax(e.EnumType.Resolve(stencil)),
                                              IdentifierName(e.ValueAsEnum(stencil).ToString())
                                              ));

            case AnimationCurve _:
                return(DefaultExpression(TypeSyntaxFactory.ToTypeSyntax(typeof(AnimationCurve))));

            case LayerMask m:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(m.value)));

            case InputName inputName:
                return(inputName.name == null
                        ? LiteralExpression(SyntaxKind.NullLiteralExpression)
                        : LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(inputName.name)));

            case SceneAsset asset:
                return(LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(AssetDatabase.GetAssetPath(asset))));

            default:
                return(DefaultExpression(TypeSystem.BuildTypeSyntax(value.GetType())));
            }
        }
Esempio n. 6
0
 public static IEnumerable <SyntaxNode> BuildBinaryOperator(this RoslynTranslator translator, BinaryOperatorNodeModel model, IPortModel portModel)
 {
     yield return(RoslynBuilder.BinaryOperator(model.Kind,
                                               translator.BuildPort(model.InputPortA).SingleOrDefault(),
                                               translator.BuildPort(model.InputPortB).SingleOrDefault()));
 }