예제 #1
0
        public override string GetOrDeclareComponentArray(RoslynEcsTranslator.IterationContext ctx, ComponentDefinition componentDefinition, out LocalDeclarationStatementSyntax arrayInitialization, out StatementSyntax arrayDisposal)
        {
            arrayInitialization = null;
            arrayDisposal       = null;

            if (m_DeclaredComponentArray.TryGetValue(componentDefinition, out var arrayName))
            {
                return(arrayName);
            }

            Type componentType = componentDefinition.TypeHandle.Resolve(ctx.Stencil);
            Type arrayType     = typeof(NativeArray <>).MakeGenericType(componentType);

            arrayName = ctx.GetComponentDataArrayName(componentType);
            m_DeclaredComponentArray.Add(componentDefinition, arrayName);

            FieldDeclarationSyntax field = RoslynBuilder.DeclareField(arrayType, arrayName, AccessibilityFlags.Public);

            m_MemberDeclarations.Add(AddAttribute(field, nameof(DeallocateOnJobCompletionAttribute)));

            m_JobInitializers.Add(AssignmentExpression(
                                      SyntaxKind.SimpleAssignmentExpression,
                                      IdentifierName(arrayName),
                                      RootContext.MakeInitComponentDataArrayExpression(ctx, componentType)
                                      ));

            return(ctx.GetComponentDataArrayName(componentType));
        }
예제 #2
0
        public override string GetOrDeclareComponentArray(
            RoslynEcsTranslator.IterationContext ctx,
            ComponentDefinition componentDefinition,
            out LocalDeclarationStatementSyntax arrayInitialization,
            out StatementSyntax arrayDisposal)
        {
            Type resolvedType = componentDefinition.TypeHandle.Resolve(m_Stencil);
            var  arrayName    = ctx.GetComponentDataArrayName(resolvedType);

            Type arrayType = typeof(NativeArray <>).MakeGenericType(resolvedType);

            arrayInitialization = RoslynBuilder.DeclareLocalVariable(
                arrayType, arrayName,
                MakeInitComponentDataArrayExpression(ctx, resolvedType),
                RoslynBuilder.VariableDeclarationType.InferredType);

            arrayDisposal = ExpressionStatement(
                InvocationExpression(
                    MemberAccessExpression(
                        SyntaxKind.SimpleMemberAccessExpression,
                        IdentifierName(arrayName),
                        IdentifierName(nameof(IDisposable.Dispose)))))
                            .NormalizeWhitespace();

            return(arrayName);
        }
예제 #3
0
        public override string GetOrDeclareComponentArray(RoslynEcsTranslator.IterationContext ctx,
                                                          string componentTypeName, out LocalDeclarationStatementSyntax arrayInitialization,
                                                          out StatementSyntax arrayDisposal)
        {
            arrayInitialization = null;
            arrayDisposal       = null;

            if (m_DeclaredComponentArray.TryGetValue(componentTypeName, out var arrayName))
            {
                return(arrayName);
            }

            arrayName = ctx.GetComponentDataArrayName(componentTypeName);
            m_DeclaredComponentArray.Add(componentTypeName, arrayName);

            var field = FieldDeclaration(
                VariableDeclaration(
                    GenericName(
                        Identifier("NativeArray"))
                    .WithTypeArgumentList(
                        TypeArgumentList(
                            SingletonSeparatedList <TypeSyntax>(
                                IdentifierName(componentTypeName)))))
                .WithVariables(
                    SingletonSeparatedList(
                        VariableDeclarator(
                            Identifier(arrayName)))))
                        .WithModifiers(
                TokenList(
                    Token(SyntaxKind.PublicKeyword)));

            m_MemberDeclarations.Add(AddAttribute(field, nameof(DeallocateOnJobCompletionAttribute)));

            m_JobInitializers.Add(AssignmentExpression(
                                      SyntaxKind.SimpleAssignmentExpression,
                                      IdentifierName(arrayName),
                                      RootContext.MakeInitComponentDataArrayExpression(ctx, componentTypeName)
                                      ));

            return(ctx.GetComponentDataArrayName(componentTypeName));
        }
        public override string GetOrDeclareComponentArray(RoslynEcsTranslator.IterationContext ctx,
                                                          string componentTypeName,
                                                          out LocalDeclarationStatementSyntax arrayInitialization,
                                                          out StatementSyntax arrayDisposal)
        {
            var arrayName = ctx.GetComponentDataArrayName(componentTypeName);

            arrayInitialization = RoslynBuilder.DeclareLocalVariable(
                (Type)null, arrayName,
                MakeInitComponentDataArrayExpression(ctx, componentTypeName),
                RoslynBuilder.VariableDeclarationType.InferredType);

            arrayDisposal = ExpressionStatement(
                InvocationExpression(
                    MemberAccessExpression(
                        SyntaxKind.SimpleMemberAccessExpression,
                        IdentifierName(arrayName),
                        IdentifierName(nameof(IDisposable.Dispose)))))
                            .NormalizeWhitespace();

            return(arrayName);
        }