public SD_Mehod_ReflectedConstructor(ConstructorInfo constructorInfo, SymbolDefinition memberOf) { modifiers = constructorInfo.IsPublic ? Modifiers.Public : constructorInfo.IsFamilyOrAssembly ? Modifiers.Internal | Modifiers.Protected : constructorInfo.IsAssembly ? Modifiers.Internal : constructorInfo.IsFamily ? Modifiers.Protected : Modifiers.Private; if (constructorInfo.IsAbstract) { modifiers |= Modifiers.Abstract; } if (constructorInfo.IsStatic) { modifiers |= Modifiers.Static; } accessLevel = AccessLevelFromModifiers(modifiers); name = ".ctor"; kind = SymbolKind.Constructor; parentSymbol = memberOf; returnType = new SymbolReference(memberOf); if (parameters == null) { parameters = new List <SD_Instance_Parameter>(); } foreach (var p in constructorInfo.GetParameters()) { var isByRef = p.ParameterType.IsByRef; var parameterType = isByRef ? p.ParameterType.GetElementType() : p.ParameterType; var parameterToAdd = new SD_Instance_Parameter { kind = SymbolKind.Parameter, parentSymbol = this, name = p.Name, type = ReflectedTypeReference.ForType(parameterType), modifiers = isByRef ? (p.IsOut ? Modifiers.Out : Modifiers.Ref) : Attribute.IsDefined(p, typeof(ParamArrayAttribute)) ? Modifiers.Params : Modifiers.None, }; if (p.RawDefaultValue != DBNull.Value) { parameterToAdd.defaultValue = p.RawDefaultValue == null ? "null" : p.RawDefaultValue.ToString(); } parameters.Add(parameterToAdd); } }
public static MethodDefinition ResolveMethodOverloads(int numArguments, List <TypeDefinitionBase> argumentTypes, Modifiers[] modifiers, List <MethodDefinition> candidates) { // find best match MethodDefinition bestMatch = null; var bestExactMatches = -1; foreach (var method in candidates) { var parameters = method.GetParameters(); var expandParams = true; tryNotExpanding: var exactMatches = 0; SD_Instance_Parameter paramsArray = null; for (var i = 0; i < UnityEngine.Mathf.Min(numArguments, parameters.Count); ++i) { if (argumentTypes[i] == null) { exactMatches = -1; break; } if (expandParams && paramsArray == null && parameters[i].IsParametersArray) { paramsArray = parameters[i]; } TypeDefinitionBase parameterType = null; if (paramsArray != null) { var arrayType = paramsArray.TypeOf() as SD_Type_Array; if (arrayType != null) { parameterType = arrayType.elementType; } } else { if (i >= parameters.Count) { exactMatches = -1; break; } parameterType = parameters[i].TypeOf() as TypeDefinitionBase; } parameterType = parameterType == null ? unknownType : parameterType.SubstituteTypeParameters(method); if (argumentTypes[i].IsSameType(parameterType)) { ++exactMatches; continue; } if (!argumentTypes[i].CanConvertTo(parameterType)) { exactMatches = -1; break; } } if (exactMatches < 0) { if (paramsArray == null) { continue; } expandParams = false; paramsArray = null; goto tryNotExpanding; } if (exactMatches > bestExactMatches) { bestExactMatches = exactMatches; bestMatch = method; } else if (exactMatches == bestExactMatches) { if (method.NumTypeParameters == 0 && bestMatch.NumTypeParameters > 0) { bestMatch = method; } } } if (bestMatch != null) { return(bestMatch); } if (candidates.Count <= 1) { return(unresolvedMethodOverload); } return(ambiguousMethodOverload);// candidates[0]; }
public SD_Method_Reflected(MethodInfo methodInfo, SymbolDefinition memberOf) { modifiers = methodInfo.IsPublic ? Modifiers.Public : methodInfo.IsFamilyOrAssembly ? Modifiers.Internal | Modifiers.Protected : methodInfo.IsAssembly ? Modifiers.Internal : methodInfo.IsFamily ? Modifiers.Protected : Modifiers.Private; if (methodInfo.IsAbstract) { modifiers |= Modifiers.Abstract; } if (methodInfo.IsVirtual) { modifiers |= Modifiers.Virtual; } if (methodInfo.IsStatic) { modifiers |= Modifiers.Static; } if (methodInfo.GetBaseDefinition().DeclaringType != methodInfo.DeclaringType) { modifiers = (modifiers & ~Modifiers.Virtual) | Modifiers.Override; } if (methodInfo.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) && IsStatic) { var parentType = memberOf.parentSymbol as TypeDefinitionBase; if (parentType.kind == SymbolKind.Class && parentType.IsStatic && parentType.NumTypeParameters == 0) { isExtensionMethod = true; ++parentType.numExtensionMethods; } } accessLevel = AccessLevelFromModifiers(modifiers); reflectedMethodInfo = methodInfo; var genericMarker = methodInfo.Name.IndexOf('`'); name = genericMarker < 0 ? methodInfo.Name : methodInfo.Name.Substring(0, genericMarker); parentSymbol = memberOf; var tp = methodInfo.GetGenericArguments(); if (tp.Length > 0) { var numGenericArgs = tp.Length; typeParameters = new List <SD_Type_Parameter>(tp.Length); for (var i = tp.Length - numGenericArgs; i < tp.Length; ++i) { var tpDef = new SD_Type_Parameter { kind = SymbolKind.TypeParameter, name = tp[i].Name, parentSymbol = this }; typeParameters.Add(tpDef); } } returnType = ReflectedTypeReference.ForType(methodInfo.ReturnType); if (parameters == null) { parameters = new List <SD_Instance_Parameter>(); } var methodParameters = methodInfo.GetParameters(); for (var i = 0; i < methodParameters.Length; ++i) { var p = methodParameters[i]; var isByRef = p.ParameterType.IsByRef; var parameterType = isByRef ? p.ParameterType.GetElementType() : p.ParameterType; var parameterToAdd = new SD_Instance_Parameter { kind = SymbolKind.Parameter, parentSymbol = this, name = p.Name, type = ReflectedTypeReference.ForType(parameterType), modifiers = isByRef ? (p.IsOut ? Modifiers.Out : Modifiers.Ref) : Attribute.IsDefined(p, typeof(ParamArrayAttribute)) ? Modifiers.Params : Modifiers.None, }; if (i == 0 && isExtensionMethod) { parameterToAdd.modifiers |= Modifiers.This; } if (p.RawDefaultValue != DBNull.Value) { //var dv = Attribute.GetCustomAttribute(p, typeof(System.ComponentModel.DefaultValueAttribute)); parameterToAdd.defaultValue = p.RawDefaultValue == null ? "null" : p.RawDefaultValue.ToString(); } parameters.Add(parameterToAdd); } }