Skip to content
Snippets Groups Projects
Commit 3b7728f2 authored by MaZiFAU's avatar MaZiFAU
Browse files

Fixed SOMDocToLambdaExpression for Lambdas

parent d0f1fddc
No related branches found
No related tags found
No related merge requests found
......@@ -135,7 +135,7 @@ protected override void RecalculateTransform() { }
{// TODO Correctness
if (((MMTGeneralFact)fact).defines is not FUN fun
&& (((MMTGeneralFact)fact).defines is not SFunctionWrapper SFW
&& (((MMTGeneralFact)fact).defines is not FallbackWrapper SFW
|| (fun = SFW.SFunction as FUN) == null)
)
return null;
......@@ -164,10 +164,11 @@ protected override bool EquivalentWrapped(FunctionFact f1, FunctionFact f2)
protected override Fact _ReInitializeMe(Dictionary<string, string> old_to_new, FactRecorder organizer)
=> new FunctionFact(this.Function_SOMDoc.MapURIs(old_to_new), organizer);
public override MMTFact MakeMMTDeclaration()
{
throw new NotImplementedException();
}
public override MMTFact MakeMMTDeclaration()
=> new MMTGeneralFact(
Label,
SOMDoc.SOMDocType(FuncExtensions.CreateFuncType(Signature)),
Function_SOMDoc);
}
public class AttachedPositionFunction : FactWrappedCRTP<AttachedPositionFunction>
......
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace REST_JSON_API
......@@ -163,10 +164,12 @@ public static class MMTConstants
typeof(List<>) },
{ AddRealLit,
typeof(float) }, //typeof(Func<,,>).MakeGenericType(typeof(float), typeof(float), typeof(float))
typeof(Func<,,>).MakeGenericType(typeof(float), typeof(float), typeof(float)) },
{ ProjL, // how?
typeof(Func<,>) }, //.MakeGenericType(typeof(Tuple))
{ MkCircle3d, null }, //typeof(CircleFact) },
{ ConeOfCircleApex, null }, //typeof(ConeVolumeFact) },
{ MkCircle3d, typeof(CircleFact) },
{ ConeOfCircleApex, typeof(ConeVolumeFact) },
{ Ded, null },
{ Sketch, null },
......@@ -175,8 +178,6 @@ public static class MMTConstants
{ pointNormalPlane, null },
{ ParallelCircles, null },
{ "R",
typeof(float) },
{ typeof(float).ToString(),
typeof(float) },
{ typeof(double).ToString(),
......
......@@ -201,7 +201,35 @@ void ThrowArgumentException(ExpressionType expression_cast, int expected)
? gf.defines
: (decl as MMTValueFact).lhs;
return df.GetLambdaExpression();
LambdaExpression lambda_orig = df.GetLambdaExpression();
if (lambda_orig.Body is not LambdaExpression lambda_lambda
|| lambda_applicant.Length == 0)
return lambda_orig;
int free_params = lambda_lambda.Parameters.Count() - lambda_applicant.Length;
if (free_params <= 0)
return Expression.Lambda(
Expression.Invoke(lambda_lambda, lambda_applicant[..^Math.Max(0, free_params)]),
found_bound_params
);
ParameterExpression[] new_params =
lambda_lambda.Parameters
.Skip(lambda_applicant.Length)
.Select(p => Expression.Parameter(p.Type))
.ToArray();
return Expression.Lambda(
Expression.Lambda(
Expression.Invoke(
lambda_lambda,
lambda_applicant.Select(app => app.Body).AppendRange(new_params)
),
new_params
),
found_bound_params
);
}
else
if (MMTtoUnaryExpressionType.TryGetValue(URI, out var unnary_type))
......@@ -342,12 +370,12 @@ private static LambdaExpression MakeObjArray(LambdaExpression[] lambda_applicant
}
return Expression.Lambda(
Expression.NewArrayInit(
typeof(object),
lambda_applicant.Select(l => Expression.Convert(l.Body, typeof(object)))
),
bound_params
);
Expression.NewArrayInit(
typeof(object),
lambda_applicant.Select(l => Expression.Convert(l.Body, typeof(object)))
),
bound_params
);
}
private static LambdaExpression MakeInstantList(LambdaExpression[] lambda_applicant, LambdaExpression[] lambda_arguments, ParameterExpression[] bound_params)
......@@ -416,7 +444,7 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
if (call_method == null)
{ // call_method is overloaded or generic
(MethodInfo m, bool Success, Dictionary<string, (Type To, int Dirty)> method_types)[] recipe =
(MethodInfo m, bool Success, Dictionary<string, (Type To, int Dirty)> method_types, Expression[] partials)[] recipe =
type.GetMethods()
.Where(m =>
m.Name.Equals(method_name) &&
......@@ -433,9 +461,9 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
if (!test.All(t => t.Success)
|| !test.All(t => method_types.TryAddAllFrom(t.GenericParameters)))
return (m, false, new());
return (m, false, new(), new LambdaExpression[0]);
else
return (m, Success: true, method_types);
return (m, Success: true, method_types, test.Select(t => t.partials).ToArray());
}).Where(t => t.Success)
.ToArray();
......@@ -445,6 +473,7 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
Debug.LogWarning($"Found methods not unique for \"{method_name}\" in Type \"{type}\" and Type Signature [{lambda_args_type}]");
call_method = recipe[0].m;
call_args = recipe[0].partials;
if (call_method.IsGenericMethod)
{
call_method = call_method.MakeGenericMethod(
......@@ -453,21 +482,6 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
.ToArray()
);
}
ParameterInfo[] call_para = call_method.GetParameters();
for (int i = 0; i < lambda_args_new.Length; i++)
{
if (!call_para[i].ParameterType
.GetGenericArguments()
.Any(arg => recipe[0].method_types[arg.Name].Dirty)
)
continue;
}
;
}
return Expression.Lambda(
......@@ -482,8 +496,6 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
IsCompatibleType(Type generic, Type from_me, Expression source_from_me, int dirty)
{
Dictionary<string, (Type To, int Dirty)> retDic = new();
(bool Success, Dictionary<string, (Type To, int Dirty)> GenericParameters, Expression partials) retVal =
(false, retDic, source_from_me);
if (generic.HasElementType
&& from_me.HasElementType)
......@@ -544,19 +556,40 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
Expression[] expr_decomp = null;
if (IsParame)
{
if (IsDirty)
{
Debug.LogWarning(
"If you see this message, you have found an example for this branch.\n" +
"I have no clue what will happen now. Good Luck!");
// What should it be?
// Call(generic)([(from_me)=>generic](from_me))
// Call([(A)=>C]=>...)([([(a,b)=>c]=>...)=>[(A)=>C]=>...]([(a,b)=>c]=>...))
// [(from_me-generic)=>Call(generic)([(from_me)=>generic](from_me))]
//
//generic: [(A)=>C]=>...
//from_me: [(a,b)=>c]=>...
//result: [(A)=>[(a,b)=>c](b)]=>...
// or?: [(a)=>[(b)=>c]]=>...
// or?: [[(a,b)=>c]=>C]=>...
//
//(from_me)=>generic]:
// [[(a,b)=>c]=>...]=>[[(A)=>C]=>...]
//Lamb(Call(from_me, (A,b)), A) -> escalate b
}
Type[] from_args = from_me.GetGenericArguments();
Type partial_type = generic
.GetGenericTypeDefinition()
.MakeGenericType(
from_args[..(gene_sig - 1)]
.MakeGenericType(!IsDirty
? from_args
: from_args[..(gene_sig - 1)]
.Append(FuncExtensions.CreateFuncType(from_args[(gene_sig - 1)..]))
.ToArray()
);
//[(a)=>c]
//[(a,b)=>c]
//
//[(a)=>[(a,b)=>c](b)]
expr_decomp = // schould it be (from_me)=>generic
expr_decomp =
partial_type.GetGenericArguments()
.Select(typ => Expression.Parameter(typ))
.ToArray();
......@@ -585,7 +618,7 @@ private static CustomFunction CallAnyFunction(bool self, string method_name, Typ
return (false, new(), source_from_me);
Expression source_partial =
IsParame ?
IsParame ?
Expression.Parameter(
FuncExtensions.CreateFuncType(
recursion.Select(t => t.partials.Type).ToArray())) :
......
......@@ -22,22 +22,40 @@ namespace REST_JSON_API
[JsonSubtypes.KnownSubType(typeof(OMC<Vector3>), "OMC<UnityEngine.Vector3>")]
[JsonSubtypes.KnownSubType(typeof(OMC<float>), "OMC<System.Single>")]
[JsonSubtypes.KnownSubType(typeof(OMC<double>), "OMC<System.Double>")]
[JsonSubtypes.FallBackSubType(typeof(SFunctionWrapper))]
[JsonSubtypes.FallBackSubType(typeof(FallbackWrapper))]
abstract public partial class SOMDoc
{
public string kind;
protected SOMDoc() { kind = this.GetType().Name; }
protected internal abstract SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params);
public SOMDoc SOMDocType()
=> SOMDocType(new SOMDoc[0]);
=> SOMDocType(new SOMDoc[0], new FUN.Param[0]);
protected internal abstract SOMDoc SOMDocType(SOMDoc[] args);
public static SOMDoc SOMDocType(Type type)
{
if (type == typeof(Vector3)) // Isomoprhismus
type = typeof(Tuple);
public Type ToType()
=> ToType(new Type[0]);
SOMDoc[] args = type.IsGenericType
? type.GetGenericArguments().Select(t => SOMDocType(t)).ToArray()
: null;
if (FuncExtensions.GenericFuncTypes.Contains(type.IsGenericType ? type.GetGenericTypeDefinition() : type))
return new FUNTYPE(args[..^1], args[^1]);
protected internal abstract Type ToType(Type[] args);
if (MMTConstants.TYPE_TO_OMS.TryGetValue(type, out string uri))
return type.IsGenericType
? new OMA(new OMS(uri), args)
: new OMS(uri);
throw new NotImplementedException();
}
protected internal abstract Type ToType(Type[] args, (string name, Type type)[] bound_params);
public Type ToType()
=> ToType(new Type[0], new (string name, Type type)[0] );
public static bool Equivalent(SOMDoc sd1, SOMDoc sd2)
=> sd1 != null && sd2 != null
......@@ -228,13 +246,13 @@ protected internal override LambdaExpression GetLambdaExpression(LambdaExpressio
throw new NotImplementedException();
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
{
throw new NotImplementedException();
}
protected internal override Type ToType(Type[] args)
=> typeof(Func<>).MakeGenericType(Enumerable.Append(@params.Select(p => p.ToType()), ret.ToType()).ToArray());
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> FuncExtensions.CreateFuncType(Enumerable.Append(@params.Select(p => p.ToType()), ret.ToType()).ToArray());
}
public class FUN : SOMDocCRTP<FUN>
......@@ -255,19 +273,23 @@ public FUN(Param[] @params, SOMDoc body)
public class Param
{
public string name;
public SOMDoc tp;
[JsonProperty("tp")]
public SOMDoc type;
[JsonConstructor]
public Param(string name, SOMDoc tp)
{
this.name = name;
this.tp = tp;
this.type = tp;
}
public override string ToString()
=> name + "(" + type.ToString() + ")";
}
public override string ToString()
=> "["
+ string.Join(", ", @params.Select(p => p.name + "(" + p.tp.ToString() + ")"))
+ string.Join(", ", @params.Select(p => p.ToString()))
+ "] => {"
+ body.ToString()
+ "}";
......@@ -275,18 +297,18 @@ public override string ToString()
protected override bool EquivalentWrapped(FUN sd2)
=> @params.Length == sd2.@params.Length
&& @params.Zip(sd2.@params, (a, b) => a.name.Equals(b.name)
&& a.tp.Equivalent(b.tp))
&& a.type.Equivalent(b.type))
.All(b => b)
&& body.Equivalent(sd2.body);
protected override FUN MapURIsWrapped(Dictionary<string, string> old_to_new)
=> new(@params.Select(p => new Param(p.name, p.tp.MapURIs(old_to_new))).ToArray()
=> new(@params.Select(p => new Param(p.name, p.type.MapURIs(old_to_new))).ToArray()
, body.MapURIs(old_to_new));
protected internal override LambdaExpression GetLambdaExpression(LambdaExpression[] lambda_applicant, LambdaExpression[] lambda_arguments, ParameterExpression[] bound_params)
{
ParameterExpression[] bind_me = bound_params.ShallowCloneAppend(
@params.Select(p => Expression.Parameter(p.tp.ToType(), p.name)).ToArray()
@params.Select(p => Expression.Parameter(p.type.ToType(), p.name)).ToArray()
);
return Expression.Lambda(
......@@ -294,11 +316,24 @@ protected internal override LambdaExpression GetLambdaExpression(LambdaExpressio
bound_params);
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
=> new FUNTYPE(@params.Select(p => p.tp.SOMDocType()).ToArray(), body.SOMDocType());
protected internal override SOMDoc SOMDocType(SOMDoc[] args, Param[] bound_params)
{
Param[] bind_me = bound_params.ShallowCloneAppend(@params);
protected internal override Type ToType(Type[] args)
=> SOMDocType().ToType();
return new FUNTYPE(
@params.Select(p => p.type).ToArray(),
body.SOMDocType(new SOMDoc[0], bind_me)
);
}
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
{
(string name, Type)[] bind_me = bound_params
.AppendRange(@params.Select(p => (p.name, p.type.ToType())))
.ToArray();
return SOMDocType().ToType(new Type[0], bind_me);
}
}
public class OMV : SOMDocCRTP<OMV>
......@@ -313,12 +348,27 @@ public OMV(string name) : base()
this.name = name;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
=> throw new NotImplementedException();
protected override bool EquivalentWrapped(OMV sd2)
=> this.name == sd2.name;
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
{
FUN.Param p = bound_params.FirstOrDefault(param => param.name.Equals(name))
?? throw new FormatException($"Unable to find {nameof(FUN.Param)} for {nameof(OMV)} with name: {name}");
return p.type;
}
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
{
(string name, Type type) p = bound_params.FirstOrDefault(param => param.name.Equals(name));
if(p == default)
throw new FormatException($"Unable to find {nameof(FUN.Param)} for {nameof(OMV)} with name: {name}");
return p.type;
}
protected internal override LambdaExpression GetLambdaExpression(LambdaExpression[] lambda_applicant, LambdaExpression[] lambda_arguments, ParameterExpression[] bound_params)
{
ParameterExpression v = bound_params.FirstOrDefault(param => param.Name.Equals(name));
......@@ -336,11 +386,6 @@ public override string ToString()
protected override OMV MapURIsWrapped(Dictionary<string, string> old_to_new)
=> (OMV)this.MemberwiseClone();
protected internal override Type ToType(Type[] args)
{
throw new NotImplementedException();
}
}
public class OMA : SOMDocCRTP<OMA>
......@@ -357,8 +402,11 @@ public OMA(SOMDoc applicant, SOMDoc[] arguments) : base()
this.arguments = arguments;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
=> applicant.SOMDocType(arguments.Select(a => a.SOMDocType()).ToArray());
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
=> applicant.SOMDocType(
arguments.Select(a => a.SOMDocType(new SOMDoc[0], bound_params)).ToArray(),
bound_params
);
protected override bool EquivalentWrapped(OMA sd2)
=> Equivalent(this.applicant, sd2.applicant)
......@@ -382,8 +430,11 @@ protected override OMA MapURIsWrapped(Dictionary<string, string> old_to_new)
arguments.Select(arg => arg.MapURIs(old_to_new)).ToArray()
);
protected internal override Type ToType(Type[] args)
=> applicant.ToType(arguments.Select(arg => arg.ToType()).ToArray());
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> applicant.ToType(
arguments.Select(arg => arg.ToType(new Type[0], bound_params)).ToArray(),
bound_params
);
}
public class OMS : SOMDocCRTP<OMS>
......@@ -398,29 +449,6 @@ public OMS(string uri) : base()
this.uri = uri;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
{
if (FactRecorder.AllFacts.TryGetValue(uri, out Fact found))
return new OMS(MMTConstants.TYPE_TO_OMS[found.GetType()]);
if (MMTConstants.HeterogenApplication_TO_TypeOF.TryGetValue(uri, out string type))
return new OMA(
new OMS(type),
args
);
if (MMTConstants.HomogenApplication_TO_TypeOF.TryGetValue(uri, out type))
return new OMA(
new OMS(type),
new[] { args[0] }
);
if (MMTConstants.URI_TO_TypeOF.TryGetValue(uri, out type))
return new OMS(type);
throw new NotImplementedException();
}
protected override bool EquivalentWrapped(OMS sd2)
=> this.uri == sd2.uri;
......@@ -438,7 +466,7 @@ protected override OMS MapURIsWrapped(Dictionary<string, string> old_to_new)
return new OMS(new_uri);
}
protected internal override Type ToType(Type[] args)
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
{
if (FactRecorder.AllFacts.TryGetValue(uri, out Fact found))
return found.GetType();
......@@ -455,6 +483,9 @@ protected internal override Type ToType(Type[] args)
type = TupleExtensions.GetGenericTupleType(args.Length);
}
else
if (type.Equals(typeof(Func<>)))
return FuncExtensions.CreateFuncType(args);
return type
.MakeGenericType(args);
......@@ -472,6 +503,38 @@ protected internal override Type ToType(Type[] args)
throw new NotImplementedException();
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
{
string _uri = uri;
bool use_uri;
if (use_uri = MMTConstants.OMS_TO_TYPE.TryGetValue(_uri, out Type tmp_type))
_uri = MMTConstants.TYPE_TO_OMS[tmp_type];
if (FactRecorder.AllFacts.TryGetValue(_uri, out Fact found))
return new OMS(MMTConstants.TYPE_TO_OMS[found.GetType()]);
if (MMTConstants.HeterogenApplication_TO_TypeOF.TryGetValue(_uri, out string type))
return new OMA(
new OMS(type),
args
);
if (MMTConstants.HomogenApplication_TO_TypeOF.TryGetValue(_uri, out type))
return new OMA(
new OMS(type),
new[] { args[0] }
);
if (MMTConstants.URI_TO_TypeOF.TryGetValue(_uri, out type))
return new OMS(type);
if (use_uri)
return SOMDocType(tmp_type);
//return new OMS(_uri);
throw new NotImplementedException(uri);
}
}
public class OMSTR : SOMDocCRTP<OMSTR>
......@@ -487,7 +550,7 @@ public OMSTR(string s) : base()
this.s = s;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
=> throw new NotImplementedException();
protected override bool EquivalentWrapped(OMSTR sd2)
......@@ -502,7 +565,7 @@ public override string ToString()
protected override OMSTR MapURIsWrapped(Dictionary<string, string> old_to_new)
=> (OMSTR)this.MemberwiseClone();
protected internal override Type ToType(Type[] args)
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> typeof(string);
}
......@@ -519,7 +582,7 @@ public OMF(float f) : base()
this.@float = f;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
=> new OMS(MMTConstants.RealLit);
protected override bool EquivalentWrapped(OMF sd2)
......@@ -534,7 +597,7 @@ public override string ToString()
protected override OMF MapURIsWrapped(Dictionary<string, string> old_to_new)
=> (OMF)this.MemberwiseClone();
protected internal override Type ToType(Type[] args)
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> typeof(float);
}
......@@ -550,8 +613,8 @@ public RAW(string xml) : base()
this.xml = xml;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
=> throw new NotImplementedException();
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
=> throw new NotSupportedException();
protected override RAW MapURIsWrapped(Dictionary<string, string> old_to_new)
{
......@@ -569,22 +632,19 @@ protected override bool EquivalentWrapped(RAW sd2)
=> throw new NotImplementedException(); //xml == sd2.xml; // only exact
protected internal override LambdaExpression GetLambdaExpression(LambdaExpression[] lambda_applicant, LambdaExpression[] lambda_arguments, ParameterExpression[] bound_params)
{
throw new NotImplementedException();
}
=> throw new NotSupportedException();
protected internal override Type ToType(Type[] args)
{
throw new NotImplementedException();
}
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> throw new NotSupportedException();
}
public class SFunctionWrapper : SOMDocCRTP<SFunctionWrapper>
// temporary fix if Serialzation is broken
public class FallbackWrapper : SOMDocCRTP<FallbackWrapper>
{
public SOMDoc SFunction;
[JsonConstructor]
public SFunctionWrapper(SOMDoc SFunction)
public FallbackWrapper(SOMDoc SFunction)
{
this.SFunction = SFunction;
}
......@@ -592,20 +652,20 @@ public SFunctionWrapper(SOMDoc SFunction)
public override string ToString()
=> SFunction.ToString();
protected override bool EquivalentWrapped(SFunctionWrapper sd2)
protected override bool EquivalentWrapped(FallbackWrapper sd2)
=> SFunction.Equivalent(sd2);
protected override SFunctionWrapper MapURIsWrapped(Dictionary<string, string> old_to_new)
protected override FallbackWrapper MapURIsWrapped(Dictionary<string, string> old_to_new)
=> new(SFunction.MapURIs(old_to_new));
protected internal override LambdaExpression GetLambdaExpression(LambdaExpression[] lambda_applicant, LambdaExpression[] lambda_arguments, ParameterExpression[] bound_params)
=> SFunction.GetLambdaExpression(lambda_applicant, lambda_arguments, bound_params);
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
=> SFunction.SOMDocType(args);
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
=> SFunction.SOMDocType(args, bound_params);
protected internal override Type ToType(Type[] args)
=> SFunction.ToType(args);
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> SFunction.ToType(args, bound_params);
}
// internal use only
......@@ -621,8 +681,8 @@ public OMC(T value) : base()
this.value = value;
}
protected internal override SOMDoc SOMDocType(SOMDoc[] args)
=> new OMS(MMTConstants.TYPE_TO_OMS[typeof(T)]);
protected internal override SOMDoc SOMDocType(SOMDoc[] args, FUN.Param[] bound_params)
=> SOMDocType(typeof(T));
protected override bool EquivalentWrapped(OMC<T> sd2)
{
......@@ -639,7 +699,7 @@ public override string ToString()
protected override OMC<T> MapURIsWrapped(Dictionary<string, string> old_to_new)
=> (OMC<T>)this.MemberwiseClone();
protected internal override Type ToType(Type[] args)
protected internal override Type ToType(Type[] args, (string name, Type type)[] bound_params)
=> typeof(T);
}
}
\ No newline at end of file
......@@ -4,7 +4,7 @@
public class FuncExtensions
{
private static readonly Type[] GenericFuncTypes = new Type[]
public static readonly Type[] GenericFuncTypes = new Type[]
{
//typeof(Action),
typeof(Func<>),
......@@ -14,7 +14,16 @@ public class FuncExtensions
typeof(Func<,,,,>),
typeof(Func<,,,,,>),
typeof(Func<,,,,,,>),
typeof(Func<,,,,,,,>)
typeof(Func<,,,,,,,>),
typeof(Func<,,,,,,,,>),
typeof(Func<,,,,,,,,,>),
typeof(Func<,,,,,,,,,,>),
typeof(Func<,,,,,,,,,,,>),
typeof(Func<,,,,,,,,,,,,>),
typeof(Func<,,,,,,,,,,,,,>),
typeof(Func<,,,,,,,,,,,,,,>),
typeof(Func<,,,,,,,,,,,,,,,>),
typeof(Func<,,,,,,,,,,,,,,,,>),
};
private static readonly IReadOnlyDictionary<Type, int> GenericFuncSignature =
......
......@@ -2,7 +2,7 @@
public static class TupleExtensions
{
private static readonly Type[] GenericTupleTypes = new Type[]
public static readonly Type[] GenericTupleTypes = new Type[]
{
typeof(Tuple),
typeof(Tuple<>),
......@@ -17,4 +17,8 @@ public static class TupleExtensions
public static Type GetGenericTupleType(int argumentsCount)
=> GenericTupleTypes[argumentsCount];
public static Type CreateTupleType(Type[] signature)
=> GetGenericTupleType(signature.Length)
.MakeGenericType(signature);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment