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); }
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))); }
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); }
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); }