private static Entrypoint GetEntrypoint(IKontrolModule module, string name, IKSPContext context)
        {
            try {
                IKontrolFunction function = module.FindFunction(name);
                if (function == null || !function.IsAsync)
                {
                    return(null);
                }

                if (function.Parameters.Count == 0)
                {
                    return(_ => (IAnyFuture)function.Invoke(context));
                }

                if (function.Parameters.Count == 1 && function.Parameters[0].type.Name == "ksp::vessel::Vessel")
                {
                    return(vessel =>
                           (IAnyFuture)function.Invoke(context, new KSPVesselModule.VesselAdapter(context, vessel)));
                }

                context.Logger.Error($"GetEntrypoint {name} failed: Invalid parameters {function.Parameters}");
                return(null);
            } catch (Exception e) {
                context.Logger.Error($"GetEntrypoint {name} failed: {e}");
                return(null);
            }
        }
        private static bool HasEntrypoint(IKontrolModule module, string name, bool allowVessel)
        {
            IKontrolFunction function = module.FindFunction(name);

            return(function != null && function.IsAsync &&
                   (function.Parameters.Count == 0 || allowVessel && function.Parameters.Count == 1 &&
                    function.Parameters[0].type.Name == "ksp::vessel::Vessel"));
        }
Ejemplo n.º 3
0
        public static TestResult RunTest(IKontrolModule module, IKontrolFunction testFunction,
                                         TestContextFactory contextFactory)
        {
            TestRunnerContext testContext = contextFactory();

            try {
                testContext.ResetTimeout();
                object testReturn = testFunction.Invoke(testContext);

                switch (testReturn)
                {
                case bool booleanResult when !booleanResult:
                    return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount,
                                          "Returned false", testContext.Messages));

                case IAnyOption option when !option.Defined:
                    return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount,
                                          "Returned None", testContext.Messages));

                case IAnyResult result when !result.Success:
                    return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount,
                                          $"Returned Err({result.ErrorString})", testContext.Messages));

                case IAnyFuture future:
                    ContextHolder.CurrentContext.Value = testContext;
                    for (int i = 0; i < 100; i++)
                    {
                        testContext.IncrYield();
                        testContext.ResetTimeout();
                        IAnyFutureResult result = future.Poll();
                        if (result.IsReady)
                        {
                            return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount,
                                                  testContext.Messages));
                        }
                    }

                    return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount,
                                          "Future did not become ready", testContext.Messages));

                default:
                    return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount,
                                          testContext.Messages));
                }
            } catch (AssertException e) {
                return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, e.Message,
                                      testContext.Messages));
            } catch (Exception e) {
                Console.Error.WriteLine(e);
                return(new TestResult(module.Name + "::" + testFunction.Name, testContext.AssertionsCount, e,
                                      testContext.Messages));
            } finally {
                ContextHolder.CurrentContext.Value = null;
            }
        }
Ejemplo n.º 4
0
        public IEnumerable <StructuralError> TryImportFunctions(ModuleContext context)
        {
            if (alias != null)
            {
                return(Enumerable.Empty <StructuralError>());
            }
            IKontrolModule module = context.FindModule(fromModule);

            if (module == null)
            {
                return(new StructuralError(
                           StructuralError.ErrorType.NoSuchModule,
                           $"Module '{fromModule}' not found",
                           Start,
                           End
                           ).Yield());
            }

            List <StructuralError> errors = new List <StructuralError>();

            foreach (string name in names ?? module.AllFunctionNames)
            {
                if (context.mappedConstants.ContainsKey(name))
                {
                    continue;
                }

                IKontrolFunction function = module.FindFunction(name);

                if (function != null)
                {
                    context.mappedFunctions.Add(name, function);
                }
                else if (!context.mappedTypes.ContainsKey(name))
                {
                    errors.Add(new StructuralError(
                                   StructuralError.ErrorType.InvalidImport,
                                   $"Module '{fromModule}' does not have public member '{name}''",
                                   Start,
                                   End
                                   ));
                }
            }

            return(errors);
        }
Ejemplo n.º 5
0
        public static string FunctionSignature(IKontrolFunction function)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("pub ");
            if (!function.IsAsync)
            {
                sb.Append("sync ");
            }
            sb.Append("fn ");
            sb.Append(function.Name);

            if (function.Parameters.Count == 0)
            {
                sb.Append(" (");
            }
            else
            {
                sb.Append(" ( ");

                string offset = new String(' ', sb.Length);

                sb.Append(FunctionParameterSignature(function.Parameters.First()));
                foreach (RealizedParameter parameter in function.Parameters.Skip(1))
                {
                    sb.Append(",\n");
                    sb.Append(offset);
                    sb.Append(FunctionParameterSignature(parameter));
                }
            }

            sb.Append(" ) -> ");
            sb.Append(function.ReturnType);

            return(sb.ToString());
        }
Ejemplo n.º 6
0
        public static void GenerateDocs(ModuleContext moduleContext, IKontrolModule module, TextWriter output)
        {
            output.WriteLine("---");
            output.WriteLine($"title: \"{module.Name}\"");
            output.WriteLine("---");
            output.WriteLine();
            output.WriteLine(module.Description);

            if (module.AllTypeNames.Any())
            {
                output.WriteLine();
                output.WriteLine("# Types");
                output.WriteLine();

                foreach (string typeName in module.AllTypeNames.OrderBy(name => name))
                {
                    RealizedType type = module.FindType(typeName)?.UnderlyingType(moduleContext);

                    output.WriteLine();
                    output.WriteLine($"## {typeName}");
                    output.WriteLine();
                    output.WriteLine(type.Description);

                    if (type.DeclaredFields.Count > 0)
                    {
                        output.WriteLine();
                        output.WriteLine("### Fields");
                        output.WriteLine();

                        output.WriteLine("Name | Type | Description");
                        output.WriteLine("--- | --- | ---");

                        foreach (var kv in type.DeclaredFields.OrderBy(kv => kv.Key))
                        {
                            output.WriteLine(
                                $"{kv.Key} | {kv.Value.DeclaredType} | {kv.Value.Description?.Replace("\n", " ")}");
                        }
                    }

                    if (type.DeclaredMethods.Count > 0)
                    {
                        output.WriteLine();
                        output.WriteLine("### Methods");

                        foreach (var kv in type.DeclaredMethods.OrderBy(kv => kv.Key))
                        {
                            output.WriteLine();
                            output.WriteLine($"#### {kv.Key}");
                            output.WriteLine();
                            output.WriteLine("```rust");
                            output.WriteLine(MethodSignature(type.LocalName, kv.Key, kv.Value));
                            output.WriteLine("```");
                            output.WriteLine();
                            output.WriteLine(kv.Value.Description);
                        }
                    }
                }
            }

            if (module.AllConstantNames.Any())
            {
                output.WriteLine();
                output.WriteLine("# Constants");
                output.WriteLine();

                output.WriteLine("Name | Type | Description");
                output.WriteLine("--- | --- | ---");
                foreach (string constantName in module.AllConstantNames.OrderBy(name => name))
                {
                    IKontrolConstant constant = module.FindConstant(constantName);

                    output.WriteLine($"{constantName} | {constant.Type} | {constant.Description?.Replace("\n", " ")}");
                }

                output.WriteLine();
            }

            if (module.AllFunctionNames.Any())
            {
                output.WriteLine();
                output.WriteLine("# Functions");
                output.WriteLine();

                foreach (string functionName in module.AllFunctionNames.OrderBy(name => name))
                {
                    IKontrolFunction function = module.FindFunction(functionName);

                    output.WriteLine();
                    output.WriteLine($"## {functionName}");
                    output.WriteLine();
                    output.WriteLine("```rust");
                    output.WriteLine(FunctionSignature(function));
                    output.WriteLine("```");
                    output.WriteLine();
                    output.WriteLine(function.Description);
                }
            }
        }
Ejemplo n.º 7
0
 public static int RequiredParameterCount(this IKontrolFunction function) =>
 function.Parameters.Count(p => !p.HasDefault);
Ejemplo n.º 8
0
 public static RealizedType DelegateType(this IKontrolFunction function)
 {
     return(new FunctionType(function.IsAsync, function.Parameters.Select(p => p.type as TO2Type).ToList(),
                             function.ReturnType));
 }