public KeywordConstructorReturnBuilder(ReturnBuilder builder, int kwArgCount, int[] indexesUsed, MemberInfo[] membersSet) : base(builder.ReturnType) { _builder = builder; _kwArgCount = kwArgCount; _indexesUsed = indexesUsed; _membersSet = membersSet; }
public KeywordConstructorReturnBuilder(ReturnBuilder builder, int kwArgCount, int[]indexesUsed, MemberInfo[] membersSet) : base(builder.ReturnType) { _builder = builder; _kwArgCount = kwArgCount; _indexesUsed = indexesUsed; _membersSet = membersSet; }
public MethodTarget(MethodBinder binder, MethodBase method, int parameterCount, ArgBuilder instanceBuilder, IList<ArgBuilder> argBuilders, ReturnBuilder returnBuilder) { this._binder = binder; this._method = method; this._parameterCount = parameterCount; this._instanceBuilder = instanceBuilder; this._argBuilders = argBuilders; this._returnBuilder = returnBuilder; //argBuilders.TrimExcess(); }
public MethodTarget(MethodBinder binder, MethodBase method, int parameterCount, ArgBuilder instanceBuilder, IList <ArgBuilder> argBuilders, ReturnBuilder returnBuilder) { this._binder = binder; this._method = method; this._parameterCount = parameterCount; this._instanceBuilder = instanceBuilder; this._argBuilders = argBuilders; this._returnBuilder = returnBuilder; //argBuilders.TrimExcess(); }
private static List<MemberInfo> GetBindableMembers(ReturnBuilder returnBuilder, List<SymbolId> unusedNames) { List<MemberInfo> bindableMembers = new List<MemberInfo>(); foreach (SymbolId si in unusedNames) { string strName = SymbolTable.IdToString(si); FieldInfo fi = returnBuilder.ReturnType.GetField(strName); if (fi != null) { bindableMembers.Add(fi); } PropertyInfo pi = returnBuilder.ReturnType.GetProperty(strName); if (pi != null) { bindableMembers.Add(pi); } } return bindableMembers; }
private ReturnBuilder MakeKeywordReturnBuilder(ReturnBuilder returnBuilder, ParameterInfo[] methodParams, List<ParameterWrapper> parameters) { if (_binderType == BinderType.Constructor) { List<SymbolId> unusedNames = GetUnusedKeywordParameters(methodParams); List<MemberInfo> bindableMembers = GetBindableMembers(returnBuilder, unusedNames); List<int> kwArgIndexs = new List<int>(); if (unusedNames.Count == bindableMembers.Count) { foreach (MemberInfo mi in bindableMembers) { ParameterWrapper pw = new ParameterWrapper( _binder, mi.MemberType == MemberTypes.Property ? ((PropertyInfo)mi).PropertyType : ((FieldInfo)mi).FieldType, false, SymbolTable.StringToId(mi.Name)); parameters.Add(pw); kwArgIndexs.Add(GetKeywordIndex(mi.Name)); } KeywordConstructorReturnBuilder kwBuilder = new KeywordConstructorReturnBuilder(returnBuilder, _kwArgs.Length, kwArgIndexs.ToArray(), bindableMembers.ToArray()); return kwBuilder; } } return returnBuilder; }
private MethodCandidate MakeMethodCandidate(MethodBase method, List<ParameterWrapper> parameters, ArgBuilder instanceBuilder, List<ArgBuilder> argBuilders, ReturnBuilder returnBuilder) { return new MethodCandidate( new MethodTarget(this, method, parameters.Count, instanceBuilder, argBuilders, returnBuilder), parameters); }
private MethodCandidate MakeDefaultCandidate(MethodBase method, List<ParameterWrapper> parameters, ArgBuilder instanceBuilder, List<ArgBuilder> argBuilders, List<ArgBuilder> defaultBuilders, ReturnBuilder returnBuilder, int defaultsUsed) { List<ArgBuilder> defaultArgBuilders = new List<ArgBuilder>(argBuilders); // argBuilders.GetRange(0, argBuilders.Count - i); List<ParameterWrapper> necessaryParams = parameters.GetRange(0, parameters.Count - defaultsUsed); for (int curDefault = 0; curDefault < defaultsUsed; curDefault++) { int readIndex = defaultBuilders.Count - defaultsUsed + curDefault; int writeIndex = defaultArgBuilders.Count - defaultsUsed + curDefault; if (defaultBuilders[readIndex] != null) { defaultArgBuilders[writeIndex] = defaultBuilders[readIndex]; } else { necessaryParams.Add(parameters[parameters.Count - defaultsUsed + curDefault]); } } // shift any arguments forward that need to be... int curArg = CompilerHelpers.IsStatic(method) ? 0 : 1; for (int i = 0; i < defaultArgBuilders.Count; i++) { if (defaultArgBuilders[i] is DefaultArgBuilder || defaultArgBuilders[i] is ContextArgBuilder || defaultArgBuilders[i] is KeywordArgBuilder) { continue; } ReferenceArgBuilder rab = defaultArgBuilders[i] as ReferenceArgBuilder; if (rab != null) { defaultArgBuilders[i] = new ReferenceArgBuilder(curArg++, rab.Type); continue; } SimpleArgBuilder sab = (SimpleArgBuilder)defaultArgBuilders[i]; Debug.Assert(sab.GetType() == typeof(SimpleArgBuilder)); defaultArgBuilders[i] = new SimpleArgBuilder(curArg++, sab.Type, sab.IsParamsArray, sab.IsParamsDict); } return MakeMethodCandidate(method, necessaryParams, instanceBuilder, defaultArgBuilders, returnBuilder); }