コード例 #1
0
        public static IEnumerable <SyntaxNode> Build(
            this RoslynEcsTranslator translator,
            GetSingletonNodeModel model)
        {
            if (model.ComponentType == TypeHandle.Unknown)
            {
                yield break;
            }

            var singletonType = model.ComponentType.Resolve(translator.Stencil);
            var typeArguments = TypeArgumentList(SingletonSeparatedList(TypeSystem.BuildTypeSyntax(singletonType)));

            var bindingFlags = BindingFlags.Public | BindingFlags.Instance;
            var methodInfo   = typeof(EntityQuery).GetMethod(nameof(EntityQuery.GetSingleton), bindingFlags)
                               ?.GetGenericMethodDefinition()
                               .MakeGenericMethod(singletonType);


            var method = RoslynBuilder.MethodInvocation(
                nameof(EntityQuery.GetSingleton),
                methodInfo,
                InvocationExpression(
                    IdentifierName("GetEntityQuery"))
                .WithArgumentList(
                    ArgumentList(
                        SingletonSeparatedList(
                            Argument(TypeOfExpression(singletonType.ToTypeSyntax()))))),
                new List <ArgumentSyntax>(),
                typeArguments) as ExpressionSyntax;

            yield return(method);
        }
コード例 #2
0
        public static IEnumerable <SyntaxNode> Build(this RoslynTranslator translator, LogNodeModel model,
                                                     IPortModel portModel)
        {
            var    obj = translator.BuildPort(model.InputPort).SingleOrDefault() as ExpressionSyntax;
            string methodName;

            switch (model.LogType)
            {
            case LogNodeModel.LogTypes.Message:
                methodName = nameof(Debug.Log);
                break;

            case LogNodeModel.LogTypes.Warning:
                methodName = nameof(Debug.LogWarning);
                break;

            case LogNodeModel.LogTypes.Error:
                methodName = nameof(Debug.LogError);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var arg = obj != null?Argument(obj) : Argument(LiteralExpression(SyntaxKind.NullLiteralExpression));

            yield return(RoslynBuilder.MethodInvocation(methodName, IdentifierName(nameof(Debug)), arg));
        }
コード例 #3
0
        public static IEnumerable <SyntaxNode> Build(
            this RoslynEcsTranslator translator,
            CountEntitiesNodeModel model,
            IPortModel portModel)
        {
            var connected = model.InputPort.ConnectionPortModels.FirstOrDefault();

            if (connected?.NodeModel is VariableNodeModel variableNode &&
                variableNode.DeclarationModel is ComponentQueryDeclarationModel queryDeclaration)
            {
                yield return(RoslynBuilder.MethodInvocation(nameof(EntityQuery.CalculateEntityCount),
                                                            SyntaxFactory.IdentifierName(queryDeclaration.VariableName), null, null));
            }
        }
コード例 #4
0
        public ExpressionSyntax BuildCall(RoslynTranslator translator, IPortModel portModel, out ExpressionSyntax inputName, out string methodName)
        {
            if (InputPort.IsConnected || InputPort.EmbeddedValue != null)
            {
                inputName = translator.BuildPort(InputPort).FirstOrDefault() as ExpressionSyntax;
            }
            else
            {
                inputName = SyntaxFactory.LiteralExpression(
                    SyntaxKind.DefaultLiteralExpression,
                    SyntaxFactory.Token(SyntaxKind.DefaultKeyword));
            }

            var method = RoslynBuilder.MethodInvocation(methodName = MethodName(portModel), typeof(Input).ToTypeSyntax(), SyntaxFactory.Argument(inputName));

            return(method);
        }
コード例 #5
0
        public static ExpressionSyntax BuildCall(RoslynTranslator translator, GetInputNodeModel model, string methodName, out ExpressionSyntax inputName)
        {
            if (model.InputPort.Connected || model.InputPort.EmbeddedValue != null)
            {
                inputName = translator.BuildPort(model.InputPort).FirstOrDefault() as ExpressionSyntax;
            }
            else
            {
                inputName = RoslynBuilder.EmptyStringLiteralExpression();
            }

            var methodParameters = new[] { SyntaxFactory.Argument(inputName) };

            var method = RoslynBuilder.MethodInvocation(methodName, typeof(Input).ToTypeSyntax(), methodParameters, Enumerable.Empty <TypeSyntax>());

            return(method);
        }