예제 #1
0
        private string GetMethodReturnTypeFromStyle(ReactMethod.MethodReturnStyle returnStyle)
        {
            switch (returnStyle)
            {
            case ReactMethod.MethodReturnStyle.Void:
                return("Void");

            case ReactMethod.MethodReturnStyle.Task:
            case ReactMethod.MethodReturnStyle.Promise:
                return("Promise");

            case ReactMethod.MethodReturnStyle.Callback:
            case ReactMethod.MethodReturnStyle.ReturnValue:
                return("Callback");

            case ReactMethod.MethodReturnStyle.TwoCallbacks:
                return("TwoCallbacks");

            default:
                throw new InvalidOperationException("Unexpected ReturnStyle");
            }
        }
        private void TestMethod(string methodDecl, ReactMethod.MethodReturnStyle returnStyle, bool isSynchronous)
        {
            TestCodeGen <IMethodSymbol>(
                methodDecl,
                (codeGen, symbol) =>
            {
                var returnType = symbol.ReturnType;
                var parameters = new List <IParameterSymbol>(symbol.Parameters);
                switch (returnStyle)
                {
                case ReactMethod.MethodReturnStyle.Promise:
                case ReactMethod.MethodReturnStyle.Callback:
                    returnType = ((INamedTypeSymbol)parameters[parameters.Count - 1].Type).TypeArguments[0];
                    parameters.RemoveAt(parameters.Count - 1);
                    break;

                case ReactMethod.MethodReturnStyle.TwoCallbacks:
                    returnType = ((INamedTypeSymbol)parameters[parameters.Count - 2].Type).TypeArguments[0];
                    parameters.RemoveRange(parameters.Count - 2, 2);
                    break;

                case ReactMethod.MethodReturnStyle.Task:
                    var namedReturnType = ((INamedTypeSymbol)returnType);
                    returnType          = namedReturnType.TypeArguments.Any()
                ? ((INamedTypeSymbol)returnType).TypeArguments[0]
                : codeGen.ReactTypes.SystemVoid;
                    break;
                }
                return(codeGen.AddMethod(new ReactMethod(
                                             symbol,
                                             "MyMethod",
                                             isSynchronous: isSynchronous,
                                             returnStyle: returnStyle,
                                             effectiveReturnType: returnType,
                                             effectiveParameters: parameters)));
            },
                lkgName: isSynchronous ? "Sync" : "Async");
        }
 private void TestMethod(string methodDecl, ReactMethod.MethodReturnStyle returnStyle)
 {
     TestMethod(methodDecl, returnStyle, isSynchronous: true);
     TestMethod(methodDecl, returnStyle, isSynchronous: false);
 }