Example #1
0
        private static BlockSyntax GenerateAsyncProxyCall(string proxyClass, WebIdlMemberDefinition memberDefinition)
        {
            /*
             * public static async Task<string> MethodNameAsync(string arg1, string arg2)
             * {
             *  var asyncJsRunTime = JSRuntime.Current;
             *  return await asyncJsRunTime.InvokeAsync<string>("proxyClass.methodName", arg1, arg2);
             * }
             */
            var methodName            = memberDefinition.Body.Name.Escaped;
            var asyncInvocation       = SyntaxFactory.ParseExpression($@"await asyncJsRunTime.InvokeAsync<string>(""{proxyClass}.{methodName}"", message)");
            var syntax                = SyntaxFactory.ParseStatement("var asyncJsRunTime = this.asyncJsRunTime;");
            var proxyFunctionArgument = SyntaxFactory.Argument(
                SyntaxFactory.LiteralExpression(
                    SyntaxKind.StringLiteralExpression,
                    SyntaxFactory.Literal($"{proxyClass}.{methodName}")));
            var arguments = memberDefinition.Body.Arguments.Select(CreateArgumentCallExpression);
            var proxyCallArguments = new[] { proxyFunctionArgument }.Union(arguments);

            var typeName         = memberDefinition.Body.IdlType.TypeName ?? memberDefinition.Body.IdlType.IdlType[0].TypeName;
            var isResultTypeVoid = typeName == "void";
            var resultType       = isResultTypeVoid
                ? SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ObjectKeyword))
                : SyntaxFactory.ParseTypeName(NameService.GetTypeName(memberDefinition.Body.IdlType.IdlType[0]));
            var awaitExpress = SyntaxFactory.AwaitExpression(
                SyntaxFactory.InvocationExpression(
                    SyntaxFactory.MemberAccessExpression(
                        kind: SyntaxKind.SimpleMemberAccessExpression,
                        expression: SyntaxFactory.IdentifierName("asyncJsRunTime"),
                        name: SyntaxFactory.GenericName(
                            identifier: SyntaxFactory.Identifier("InvokeAsync"),
                            typeArgumentList: SyntaxFactory.TypeArgumentList(
                                SyntaxFactory.SingletonSeparatedList <TypeSyntax>(resultType)))),
                    argumentList: SyntaxFactory.ArgumentList(
                        SyntaxFactory.SeparatedList <ArgumentSyntax>(
                            proxyCallArguments))));
            var lastStatement = isResultTypeVoid
                ? (StatementSyntax)SyntaxFactory.ExpressionStatement(awaitExpress)
                : SyntaxFactory.ReturnStatement(awaitExpress);

            return(SyntaxFactory.Block(
                       syntax,
                       lastStatement));
        }
Example #2
0
        private static MemberDeclarationSyntax CreateInterfaceField(WebIdlMemberDefinition memberDefinition)
        {
            var name = memberDefinition.Name;

            try
            {
                var constField = SyntaxFactory.FieldDeclaration(
                    SyntaxFactory.VariableDeclaration(
                        SyntaxFactory.ParseTypeName(NameService.GetTypeName(memberDefinition.IdlType)))
                    .WithVariables(
                        SyntaxFactory.SingletonSeparatedList <VariableDeclaratorSyntax>(
                            SyntaxFactory.VariableDeclarator(
                                SyntaxFactory.Identifier(NameService.GetValidIndentifier(memberDefinition.Name))))))
                                 .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword)));
                return(constField);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException($"Error during generation field {name}", ex);
            }
        }
Example #3
0
        private static MemberDeclarationSyntax CreateInterfaceOperation(string proxyClass, WebIdlMemberDefinition memberDefinition)
        {
            var name = memberDefinition.Body.Name.Escaped;

            try
            {
                var returnTypeReference = memberDefinition.Body.IdlType;
                var isAsyncCall         = NameService.IsAsync(returnTypeReference);
                if (isAsyncCall)
                {
                    name += "Async";
                }

                var returnType = CreateType(returnTypeReference);
                var arguments  = memberDefinition.Body.Arguments.Select(CreateParameter);
                var body       = isAsyncCall
                    ? GenerateAsyncProxyCall(proxyClass, memberDefinition)
                    : GenerateSyncProxyCall(proxyClass, memberDefinition);
                var methodModifier = isAsyncCall
                    ? SyntaxFactory.TokenList(
                    SyntaxFactory.Token(SyntaxKind.PublicKeyword),
                    SyntaxFactory.Token(SyntaxKind.AsyncKeyword))
                    : SyntaxFactory.TokenList(
                    SyntaxFactory.Token(SyntaxKind.PublicKeyword));
                return(SyntaxFactory.MethodDeclaration(returnType, NameService.GetValidIndentifier(name))
                       .WithModifiers(methodModifier)
                       .WithParameterList(SyntaxFactory.ParameterList(SyntaxFactory.SeparatedList(arguments)))
                       .WithBody(body));
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException($"Error during generation operation {name}", ex);
            }
        }
Example #4
0
        private static MemberDeclarationSyntax CreateInterfaceMember(string proxyClass, WebIdlMemberDefinition memberDefinition)
        {
            // var name = memberDefinition.Body;
            if (memberDefinition.Type == "operation")
            {
                return(CreateInterfaceOperation(proxyClass, memberDefinition));
            }

            if (memberDefinition.Type == "attribute")
            {
                return(CreateInterfaceAttribute(memberDefinition));
            }

            if (memberDefinition.Type == "field")
            {
                return(CreateInterfaceField(memberDefinition));
            }

            throw new InvalidDataException($"The member type {memberDefinition.Type} is not supported.");
        }