private void LoadSignatureTypes() { /* * SignatureTypes = * Get all loaded assemblies. Then, * Get all Types from them. Then, * Get the ones that are classes and not abstract. Then, * Get the ones that extend SignatureFileNode<>. Then, * Organize them by the base type and signature class. Then, finally, * Make a dictionary out of it for future lookups. */ SignatureTypes = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(c => c.GetTypes()) .Where(t => t.IsClass && !t.IsAbstract) .Where(t => t.IsSubclassOfRawGeneric(typeof(SignatureFileNode <>))) .Select(c => (BaseType: c, SignatureClass: c.BaseType?.GetGenericArguments().FirstOrDefault())) .Select(c => (c.BaseType, TryDelegate: SignatureParserHelper.GetTryParseDelegateForType(c.SignatureClass))) .ToDictionary(c => c.BaseType, c => c.TryDelegate); }
public void FunctionSignatureParserWorks(string name, string returnType = "", params string[] input) { var _ = NodeSignaturesManager.Instance; var result = $"function {name}({string.Join(", ", input)}){(returnType != "" ? $" :: {returnType}" : "")}"; var ctx = ParseContext.FromCode(result); var signature = SignatureParserHelper.TryParse <FunctionSignature>(ctx); Assert.NotNull(signature); Assert.Equal(result, signature.ToString()); Assert.Equal(name, signature.Name); if (!returnType.IsEmpty()) { Assert.Equal(returnType, signature.ReturnType.FinalTypeName); } Assert.Equal(input, signature.Parameters.Select(p => p.ToString())); Assert.True(ctx.HasFinishedLine, "ctx.HasFinishedLine"); }
public void CanGetDelegateForFunctionSignature() { var del = SignatureParserHelper.GetTryParseDelegateForType(typeof(FunctionSignature)); Assert.NotNull(del); }