public EnumDeclarationSyntax MakeUnionSelectorEnum(TypeDefinition def)
        {
            var whichEnum = EnumDeclaration(_names.UnionDiscriminatorEnum.ToString())
                            .AddModifiers(Public)
                            .AddBaseListTypes(SimpleBaseType(_names.Type <ushort>(Nullability.NonNullable)));

            var discFields = def.Fields.Where(f => f.DiscValue.HasValue);

            foreach (var discField in discFields)
            {
                whichEnum = whichEnum.AddMembers(
                    EnumMemberDeclaration(_names.GetCodeIdentifier(discField).Identifier)
                    .WithEqualsValue(
                        EqualsValueClause(LiteralExpression(
                                              SyntaxKind.NumericLiteralExpression,
                                              Literal(discField.DiscValue.Value)))));
            }

            var ndecl = EnumMemberDeclaration(_names.UnionDiscriminatorUndefined.ToString()).WithEqualsValue(
                EqualsValueClause(
                    LiteralExpression(
                        SyntaxKind.NumericLiteralExpression,
                        Literal(SchemaModel.NoDiscriminant))));

            whichEnum = whichEnum.AddMembers(ndecl);

            return(whichEnum);
        }
예제 #2
0
 MemberDeclarationSyntax MakeUnionContentField()
 {
     return(FieldDeclaration(
                VariableDeclaration(_names.Type <object>(Nullability.NullableRef))
                .WithVariables(
                    SingletonSeparatedList <VariableDeclaratorSyntax>(
                        VariableDeclarator(_names.UnionContentField.Identifier))))
            .AddModifiers(Private));
 }
 MemberDeclarationSyntax MakeReaderImplicitConversionOperator2()
 {
     return(ConversionOperatorDeclaration(
                Token(SyntaxKind.ImplicitKeyword),
                _names.ReaderStruct.IdentifierName)
            .WithModifiers(
                TokenList(
                    new[] {
         Token(SyntaxKind.PublicKeyword),
         Token(SyntaxKind.StaticKeyword)
     }))
            .WithParameterList(
                ParameterList(
                    SingletonSeparatedList <ParameterSyntax>(
                        Parameter(_names.ReaderContextField.Identifier)
                        .WithType(_names.Type <Capnp.DeserializerState>(Nullability.NonNullable)))))
            .WithExpressionBody(
                ArrowExpressionClause(
                    ObjectCreationExpression(_names.ReaderStruct.IdentifierName)
                    .WithArgumentList(
                        ArgumentList(
                            SingletonSeparatedList <ArgumentSyntax>(
                                Argument(_names.ReaderContextField.IdentifierName))))))
            .WithSemicolonToken(
                Token(SyntaxKind.SemicolonToken)));
 }
예제 #4
0
 PropertyDeclarationSyntax MakePrimitiveProperty <T>(Field field, string readName)
 {
     return(MakeProperty(
                _names.Type <T>(Nullability.NonNullable),
                null,
                _names.GetCodeIdentifier(field).ToString(),
                readName,
                nameof(Capnp.SerializerExtensions.WriteData),
                field.BitOffset.Value,
                ValueOf(field.DefaultValue.ScalarValue),
                false,
                field.DiscValue.HasValue,
                true));
 }
        IEnumerable <MemberDeclarationSyntax> TransformStruct(TypeDefinition def)
        {
            var topDecl = ClassDeclaration(_names.MakeTypeName(def).Identifier)
                          .AddModifiers(_names.TypeVisibilityModifier);

            if (_names.EmitDomainClassesAndInterfaces)
            {
                topDecl = topDecl.AddBaseListTypes(SimpleBaseType(_names.Type <Capnp.ICapnpSerializable>(Nullability.NonNullable)));
            }
            else
            {
                topDecl = topDecl.AddModifiers(Static);
            }


            if (def.GenericParameters.Count > 0)
            {
                topDecl = topDecl
                          .AddTypeParameterListParameters(MakeTypeParameters(def).ToArray())
                          .AddConstraintClauses(MakeTypeParameterConstraints(def).ToArray());
            }

            topDecl = topDecl
                      .AddMembers(_names.MakeTypeIdConst(def.Id))
                      .AddAttributeLists(_names.MakeTypeDecorationAttributes(def.Id));

            if (def.UnionInfo != null)
            {
                topDecl = topDecl.AddMembers(_commonGen.MakeUnionSelectorEnum(def));
            }

            if (_names.EmitDomainClassesAndInterfaces)
            {
                topDecl = topDecl.AddMembers(_domClassGen.MakeDomainClassMembers(def));
            }

            topDecl = topDecl.AddMembers(
                _readerGen.MakeReaderStruct(def),
                _writerGen.MakeWriterStruct(def));

            foreach (var nestedGroup in def.NestedGroups)
            {
                topDecl = topDecl.AddMembers(Transform(nestedGroup).ToArray());
            }

            foreach (var nestedDef in def.NestedTypes)
            {
                topDecl = topDecl.AddMembers(Transform(nestedDef).ToArray());
            }

            yield return(topDecl);
        }
예제 #6
0
        public MemberDeclarationSyntax MakeProxy(TypeDefinition type)
        {
            var classDecl = ClassDeclaration(_names.MakeTypeName(type, NameUsage.Proxy).Identifier)
                            .AddAttributeLists(_names.MakeTypeDecorationAttributes(type.Id))
                            .AddModifiers(Public)
                            .AddBaseListTypes(
                SimpleBaseType(_names.Type <Capnp.Rpc.Proxy>(Nullability.NonNullable)),
                SimpleBaseType(_names.MakeGenericTypeName(type, NameUsage.Interface)));

            if (type.GenericParameters.Count > 0)
            {
                classDecl = classDecl
                            .AddTypeParameterListParameters(MakeTypeParameters(type).ToArray())
                            .AddConstraintClauses(MakeTypeParameterConstraints(type).ToArray());
            }

            var allMethods =
                from c in Types.FromDefinition(type).AllImplementedClasses
                from m in c.Methods
                select m;

            foreach (var method in allMethods)
            {
                var bodyStmts = new List <StatementSyntax>();

                bodyStmts.Add(LocalDeclarationStatement(
                                  VariableDeclaration(
                                      IdentifierName("var"))
                                  .WithVariables(
                                      SingletonSeparatedList(
                                          VariableDeclarator(
                                              _names.ParamsLocal.Identifier)
                                          .WithInitializer(
                                              EqualsValueClause(
                                                  InvocationExpression(
                                                      MemberAccessExpression(
                                                          SyntaxKind.SimpleMemberAccessExpression,
                                                          IdentifierName(nameof(Capnp.SerializerState)),
                                                          GenericName(
                                                              Identifier(nameof(Capnp.SerializerState.CreateForRpc)))
                                                          .WithTypeArgumentList(
                                                              TypeArgumentList(
                                                                  SingletonSeparatedList(
                                                                      _names.MakeTypeSyntax(
                                                                          method.ParamsStruct,
                                                                          method.ParamsStruct.Definition,
                                                                          TypeUsage.Writer, Nullability.NonNullable))))))))))));

                if (method.ParamsStruct.Definition.SpecialName == SpecialName.MethodParamsStruct)
                {
                    bodyStmts.Add(LocalDeclarationStatement(
                                      VariableDeclaration(
                                          IdentifierName("var"))
                                      .WithVariables(
                                          SingletonSeparatedList <VariableDeclaratorSyntax>(
                                              VariableDeclarator(
                                                  _names.AnonymousParameter.Identifier)
                                              .WithInitializer(
                                                  EqualsValueClause(
                                                      ObjectCreationExpression(
                                                          _names.MakeTypeSyntax(
                                                              method.ParamsStruct,
                                                              method.ParamsStruct.Definition,
                                                              TypeUsage.DomainClass,
                                                              Nullability.NonNullable))
                                                      .WithArgumentList(
                                                          ArgumentList())
                                                      .WithInitializer(
                                                          InitializerExpression(
                                                              SyntaxKind.ObjectInitializerExpression,
                                                              SeparatedList <ExpressionSyntax>(
                                                                  CommonSnippetGen.MakeCommaSeparatedList(
                                                                      MakeProxyCallInitializerAssignments(method)).ToArray())))))))));
                }

                bodyStmts.Add(ExpressionStatement(
                                  ConditionalAccessExpression(
                                      _names.AnonymousParameter.IdentifierName,
                                      InvocationExpression(
                                          MemberBindingExpression(_names.SerializeMethod.IdentifierName))
                                      .AddArgumentListArguments(
                                          Argument(_names.ParamsLocal.IdentifierName)))));

                var call = InvocationExpression(IdentifierName(nameof(Capnp.Rpc.BareProxy.Call)))
                           .AddArgumentListArguments(
                    Argument(
                        LiteralExpression(SyntaxKind.NumericLiteralExpression,
                                          Literal(method.DeclaringInterface.Id))),
                    Argument(
                        LiteralExpression(SyntaxKind.NumericLiteralExpression, Literal(method.Id))),
                    Argument(
                        InvocationExpression(
                            MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                _names.ParamsLocal.IdentifierName,
                                GenericName(nameof(Capnp.SerializerState.Rewrap))
                                .AddTypeArgumentListArguments(_names.Type <Capnp.DynamicSerializerState>(Nullability.NonNullable))))
                        .AddArgumentListArguments()),
                    Argument(
                        LiteralExpression(SyntaxKind.FalseLiteralExpression)),
                    Argument(
                        _names.CancellationTokenParameter.IdentifierName));

                MethodDeclarationSyntax methodDecl;

                if (IsSubjectToPipelining(method))
                {
                    methodDecl = MethodDeclaration(
                        TransformReturnType(method),
                        _names.GetCodeIdentifier(method).Identifier)
                                 .AddParameterListParameters(TransformParameters(method))
                                 .AddModifiers(Public);

                    var pipelineAwareCall = InvocationExpression(
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            IdentifierName(nameof(Capnp.Rpc.Impatient)),
                            IdentifierName(nameof(Capnp.Rpc.Impatient.MakePipelineAware))))
                                            .AddArgumentListArguments(
                        Argument(call),
                        Argument(SimpleLambdaExpression(
                                     Parameter(_names.DeserializerLocal.Identifier),
                                     Block(
                                         UsingStatement(
                                             Block(
                                                 MakeProxyCreateResult(method),
                                                 MakeProxyReturnResult(method)))
                                         .WithExpression(_names.DeserializerLocal.IdentifierName)))));

                    bodyStmts.Add(ReturnStatement(pipelineAwareCall));
                }
                else
                {
                    methodDecl = MethodDeclaration(
                        TransformReturnType(method),
                        _names.GetCodeIdentifier(method).Identifier)
                                 .AddParameterListParameters(TransformParameters(method))
                                 .AddModifiers(Public, Token(SyntaxKind.AsyncKeyword));

                    var whenReturned = MemberAccessExpression(
                        SyntaxKind.SimpleMemberAccessExpression,
                        call,
                        IdentifierName(nameof(Capnp.Rpc.IPromisedAnswer.WhenReturned)));

                    bodyStmts.Add(UsingStatement(
                                      Block(
                                          MakeProxyCreateResult(method),
                                          MakeProxyReturnResult(method)))
                                  .WithDeclaration(VariableDeclaration(
                                                       IdentifierName("var"))
                                                   .AddVariables(
                                                       VariableDeclarator(
                                                           _names.DeserializerLocal.Identifier)
                                                       .WithInitializer(
                                                           EqualsValueClause(
                                                               AwaitExpression(whenReturned))))));
                }

                if (method.GenericParameters.Count > 0)
                {
                    methodDecl = methodDecl
                                 .AddTypeParameterListParameters(MakeTypeParameters(method).ToArray())
                                 .AddConstraintClauses(MakeTypeParameterConstraints(method).ToArray());
                }

                methodDecl = methodDecl.AddBodyStatements(bodyStmts.ToArray());

                classDecl = classDecl.AddMembers(methodDecl);
            }

            return(classDecl);
        }